



from typing import Dict, List, Optional, Union

import numpy as np

from ...image_processing_utils import BaseImageProcessor, BatchFeature, get_size_dict
from ...image_transforms import normalize, rescale, resize, to_channel_dimension_format
from ...image_utils import (
    IMAGENET_STANDARD_MEAN,
    IMAGENET_STANDARD_STD,
    ChannelDimension,
    ImageInput,
    PILImageResampling,
    make_list_of_images,
    to_numpy_array,
    valid_images,
)
from ...utils import TensorType, logging


UpperCamelCase_									=   logging.get_logger(__name__)







class       _snake_case				(     __snake_case ):






   '''simple docstring'''






   A__      : Optional[Any]       =						["pixel_values"]


   def __init__(    self:     Optional[Any]  ,lowerCamelCase_:     bool = True  ,lowerCamelCase_:     Optional[Dict[str, int]] = None  ,lowerCamelCase_:     PILImageResampling = PILImageResampling.BILINEAR  ,lowerCamelCase_:     bool = True  ,lowerCamelCase_:     Union[int, float] = 1 / 255  ,lowerCamelCase_:     bool = True  ,lowerCamelCase_:     Optional[Union[float, List[float]]] = None  ,lowerCamelCase_:     Optional[Union[float, List[float]]] = None  ,**lowerCamelCase_:     Dict  ,)	->      None:
       super().__init__(**lowerCamelCase_							)
       UpperCAmelCase_     :       Optional[Any]  		=					size if size is not None else {"""height""": 224, """width""": 224}
       UpperCAmelCase_     :       str  		=					get_size_dict(lowerCamelCase_							)
       UpperCAmelCase_     :       Tuple  		=					do_resize
       UpperCAmelCase_     :       Optional[Any]  		=					do_rescale
       UpperCAmelCase_     :       Optional[Any]  		=					do_normalize
       UpperCAmelCase_     :       int  		=					size
       UpperCAmelCase_     :       List[Any]  		=					resample
       UpperCAmelCase_     :       Optional[Any]  		=					rescale_factor
       UpperCAmelCase_     :       Dict  		=					image_mean if image_mean is not None else IMAGENET_STANDARD_MEAN
       UpperCAmelCase_     :       Any  		=					image_std if image_std is not None else IMAGENET_STANDARD_STD


   def       A__    (    self:     Union[str, Any]  ,lowerCamelCase_:     np.ndarray  ,lowerCamelCase_:     Dict[str, int]  ,lowerCamelCase_:     PILImageResampling = PILImageResampling.BILINEAR  ,lowerCamelCase_:     Optional[Union[str, ChannelDimension]] = None  ,**lowerCamelCase_:     Optional[int]  ,)	->      np.ndarray:
       UpperCAmelCase_     :       Dict  		=					get_size_dict(lowerCamelCase_							)
       if "height" not in size or "width" not in size:
           raise ValueError(F'''The `size` dictionary must contain the keys `height` and `width`. Got {size.keys()}'''							)
       return resize(
           lowerCamelCase_  ,size=(size["""height"""], size["""width"""])  ,resample=lowerCamelCase_  ,data_format=lowerCamelCase_  ,**lowerCamelCase_							)


   def       A__    (    self:     List[str]  ,lowerCamelCase_:     np.ndarray  ,lowerCamelCase_:     float  ,lowerCamelCase_:     Optional[Union[str, ChannelDimension]] = None  ,**lowerCamelCase_:     List[Any]							)	->      np.ndarray:
       return rescale(lowerCamelCase_  ,scale=lowerCamelCase_  ,data_format=lowerCamelCase_  ,**lowerCamelCase_							)


   def       A__    (    self:     Optional[int]  ,lowerCamelCase_:     np.ndarray  ,lowerCamelCase_:     Union[float, List[float]]  ,lowerCamelCase_:     Union[float, List[float]]  ,lowerCamelCase_:     Optional[Union[str, ChannelDimension]] = None  ,**lowerCamelCase_:     List[Any]  ,)	->      np.ndarray:
       return normalize(lowerCamelCase_  ,mean=lowerCamelCase_  ,std=lowerCamelCase_  ,data_format=lowerCamelCase_  ,**lowerCamelCase_							)






   def       A__    (    self:     Optional[int]  ,lowerCamelCase_:     ImageInput  ,lowerCamelCase_:     Optional[bool] = None  ,lowerCamelCase_:     Dict[str, int] = None  ,lowerCamelCase_:     PILImageResampling = None  ,lowerCamelCase_:     Optional[bool] = None  ,lowerCamelCase_:     Optional[float] = None  ,lowerCamelCase_:     Optional[bool] = None  ,lowerCamelCase_:     Optional[Union[float, List[float]]] = None  ,lowerCamelCase_:     Optional[Union[float, List[float]]] = None  ,lowerCamelCase_:     Optional[Union[str, TensorType]] = None  ,lowerCamelCase_:     Union[str, ChannelDimension] = ChannelDimension.FIRST  ,**lowerCamelCase_:     int  ,)	->      List[Any]:
       UpperCAmelCase_     :       str  		=					do_resize if do_resize is not None else self.do_resize
       UpperCAmelCase_     :       Dict  		=					do_rescale if do_rescale is not None else self.do_rescale
       UpperCAmelCase_     :       Dict  		=					do_normalize if do_normalize is not None else self.do_normalize
       UpperCAmelCase_     :       int  		=					resample if resample is not None else self.resample
       UpperCAmelCase_     :       str  		=					rescale_factor if rescale_factor is not None else self.rescale_factor
       UpperCAmelCase_     :       Dict  		=					image_mean if image_mean is not None else self.image_mean
       UpperCAmelCase_     :       int  		=					image_std if image_std is not None else self.image_std

       UpperCAmelCase_     :       Tuple  		=					size if size is not None else self.size
       UpperCAmelCase_     :       Union[str, Any]  		=					get_size_dict(lowerCamelCase_							)

       UpperCAmelCase_     :       Optional[int]  		=					make_list_of_images(lowerCamelCase_							)

       if not valid_images(lowerCamelCase_							):
           raise ValueError(
               """Invalid image type. Must be of type PIL.Image.Image, numpy.ndarray, """
               """torch.Tensor, tf.Tensor or jax.ndarray."""							)

       if do_resize and size is None:
           raise ValueError("""Size must be specified if do_resize is True."""							)

       if do_rescale and rescale_factor is None:
           raise ValueError("""Rescale factor must be specified if do_rescale is True."""							)

       # All transformations expect numpy arrays.
       UpperCAmelCase_     :       Optional[Any]  		=					[to_numpy_array(lowerCamelCase_							) for image in images]

       if do_resize:
           UpperCAmelCase_     :       int  		=					[self.resize(image=lowerCamelCase_  ,size=lowerCamelCase_  ,resample=lowerCamelCase_							) for image in images]

       if do_rescale:
           UpperCAmelCase_     :       Optional[Any]  		=					[self.rescale(image=lowerCamelCase_  ,scale=lowerCamelCase_							) for image in images]

       if do_normalize:
           UpperCAmelCase_     :       str  		=					[self.normalize(image=lowerCamelCase_  ,mean=lowerCamelCase_  ,std=lowerCamelCase_							) for image in images]

       UpperCAmelCase_     :       Any  		=					[to_channel_dimension_format(lowerCamelCase_  ,lowerCamelCase_							) for image in images]

       UpperCAmelCase_     :       List[str]  		=					{"""pixel_values""": images}
       return BatchFeature(data=lowerCamelCase_  ,tensor_type=lowerCamelCase_							)

'''simple docstring'''

import unittest

import requests

from transformers import MODEL_FOR_VISION_2_SEQ_MAPPING, TF_MODEL_FOR_VISION_2_SEQ_MAPPING, is_vision_available
from transformers.pipelines import pipeline
from transformers.testing_utils import (
    is_pipeline_test,
    is_torch_available,
    require_tf,
    require_torch,
    require_vision,
    slow,
)

from .test_pipelines_common import ANY


if is_torch_available():
						from transformers.pytorch_utils import is_torch_greater_or_equal_than_1_11
else:
						A_	   = False


if is_vision_available():
						from PIL import Image
else:




						class 		SCREAMING_SNAKE_CASE_					:



									"""simple docstring"""






									@staticmethod
									def   lowerCamelCase (							*snake_case_				,			**snake_case_					):
															pass




@is_pipeline_test
@require_vision
class 		SCREAMING_SNAKE_CASE_					(unittest.TestCase      ):



			"""simple docstring"""






			__magic_name__ :				Optional[int]   							=       MODEL_FOR_VISION_2_SEQ_MAPPING
			__magic_name__ :				Optional[int]   							=       TF_MODEL_FOR_VISION_2_SEQ_MAPPING



			def   lowerCamelCase (							self				,			snake_case_				,			snake_case_				,			snake_case_					):
									snake_case :       str				=    pipeline("image-to-text"				,			model=snake_case_				,			tokenizer=snake_case_				,			image_processor=snake_case_					)
									snake_case :       List[Any]				=    [
									    Image.open("./tests/fixtures/tests_samples/COCO/000000039769.png"					),
									    "./tests/fixtures/tests_samples/COCO/000000039769.png",
									]
									return pipe, examples



			def   lowerCamelCase (							self				,			snake_case_				,			snake_case_					):
									snake_case :       Union[str, Any]				=    pipe(snake_case_					)
									self.assertEqual(
									    snake_case_				,			[
									        [{"generated_text": ANY(snake_case_					)}],
									        [{"generated_text": ANY(snake_case_					)}],
									    ]				,			)



			@require_tf
			def   lowerCamelCase (							self					):
									snake_case :       Tuple				=    pipeline("image-to-text"				,			model="hf-internal-testing/tiny-random-vit-gpt2"				,			framework="tf"					)
									snake_case :       Union[str, Any]				=    "./tests/fixtures/tests_samples/COCO/000000039769.png"

									snake_case :       Dict				=    pipe(snake_case_					)
									self.assertEqual(
									    snake_case_				,			[
									        {
									            "generated_text": "growthgrowthgrowthgrowthgrowthgrowthgrowthgrowthgrowthgrowthgrowthgrowthgrowthgrowthgrowthgrowthgrowthGOGO"
									        },
									    ]				,			)

									snake_case :       Tuple				=    pipe([image, image]					)
									self.assertEqual(
									    snake_case_				,			[
									        [
									            {
									                "generated_text": "growthgrowthgrowthgrowthgrowthgrowthgrowthgrowthgrowthgrowthgrowthgrowthgrowthgrowthgrowthgrowthgrowthGOGO"
									            }
									        ],
									        [
									            {
									                "generated_text": "growthgrowthgrowthgrowthgrowthgrowthgrowthgrowthgrowthgrowthgrowthgrowthgrowthgrowthgrowthgrowthgrowthGOGO"
									            }
									        ],
									    ]				,			)

									snake_case :       List[Any]				=    pipe(snake_case_				,			max_new_tokens=1					)
									self.assertEqual(
									    snake_case_				,			[{"generated_text": "growth"}]				,			)



			@require_torch
			def   lowerCamelCase (							self					):
									snake_case :       List[Any]				=    pipeline("image-to-text"				,			model="hf-internal-testing/tiny-random-vit-gpt2"					)
									snake_case :       Tuple				=    "./tests/fixtures/tests_samples/COCO/000000039769.png"

									snake_case :       Any				=    pipe(snake_case_					)
									self.assertEqual(
									    snake_case_				,			[
									        {
									            "generated_text": "growthgrowthgrowthgrowthgrowthgrowthgrowthgrowthgrowthgrowthgrowthgrowthgrowthgrowthgrowthgrowthgrowthGOGO"
									        },
									    ]				,			)

									snake_case :       str				=    pipe([image, image]					)
									self.assertEqual(
									    snake_case_				,			[
									        [
									            {
									                "generated_text": "growthgrowthgrowthgrowthgrowthgrowthgrowthgrowthgrowthgrowthgrowthgrowthgrowthgrowthgrowthgrowthgrowthGOGO"
									            }
									        ],
									        [
									            {
									                "generated_text": "growthgrowthgrowthgrowthgrowthgrowthgrowthgrowthgrowthgrowthgrowthgrowthgrowthgrowthgrowthgrowthgrowthGOGO"
									            }
									        ],
									    ]				,			)



			@require_torch
			def   lowerCamelCase (							self					):
									snake_case :       Tuple				=    pipeline("image-to-text"				,			model="hf-internal-testing/tiny-random-BlipForConditionalGeneration"					)
									snake_case :       Dict				=    "./tests/fixtures/tests_samples/COCO/000000039769.png"
									snake_case :       List[Any]				=    "a photo of"

									snake_case :       List[str]				=    pipe(snake_case_				,			prompt=snake_case_					)
									self.assertTrue(outputs[0]["generated_text"].startswith(snake_case_					)					)



			@slow
			@require_torch
			def   lowerCamelCase (							self					):
									snake_case :       Optional[Any]				=    pipeline("image-to-text"				,			model="ydshieh/vit-gpt2-coco-en"					)
									snake_case :       Union[str, Any]				=    "./tests/fixtures/tests_samples/COCO/000000039769.png"

									snake_case :       Tuple				=    pipe(snake_case_					)
									self.assertEqual(snake_case_				,			[{"generated_text": "a cat laying on a blanket next to a cat laying on a bed "}]					)

									snake_case :       Tuple				=    pipe([image, image]					)
									self.assertEqual(
									    snake_case_				,			[
									        [{"generated_text": "a cat laying on a blanket next to a cat laying on a bed "}],
									        [{"generated_text": "a cat laying on a blanket next to a cat laying on a bed "}],
									    ]				,			)



			@slow
			@require_torch
			def   lowerCamelCase (							self					):
									snake_case :       Optional[Any]				=    pipeline("image-to-text"				,			model="Salesforce/blip-image-captioning-base"					)
									snake_case :       Any				=    "https://huggingface.co/datasets/sayakpaul/sample-datasets/resolve/main/pokemon.png"
									snake_case :       Union[str, Any]				=    Image.open(requests.get(snake_case_				,			stream=snake_case_					).raw					)

									snake_case :       Optional[Any]				=    pipe(snake_case_					)
									self.assertEqual(snake_case_				,			[{"generated_text": "a pink pokemon pokemon with a blue shirt and a blue shirt"}]					)



			@slow
			@require_torch
			def   lowerCamelCase (							self					):
									snake_case :       Tuple				=    pipeline("image-to-text"				,			model="microsoft/git-base-coco"					)
									snake_case :       Tuple				=    "https://huggingface.co/datasets/sayakpaul/sample-datasets/resolve/main/pokemon.png"
									snake_case :       Tuple				=    Image.open(requests.get(snake_case_				,			stream=snake_case_					).raw					)

									snake_case :       Any				=    pipe(snake_case_					)
									self.assertEqual(snake_case_				,			[{"generated_text": "a cartoon of a purple character."}]					)



			@slow
			@require_torch
			def   lowerCamelCase (							self					):
									snake_case :       Optional[Any]				=    pipeline("image-to-text"				,			model="Salesforce/blip-image-captioning-base"					)
									snake_case :       int				=    "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/transformers/tasks/ai2d-demo.jpg"
									snake_case :       Tuple				=    Image.open(requests.get(snake_case_				,			stream=snake_case_					).raw					)

									snake_case :       str				=    "a photography of"

									snake_case :       int				=    pipe(snake_case_				,			prompt=snake_case_					)
									self.assertEqual(snake_case_				,			[{"generated_text": "a photography of a volcano"}]					)

									with self.assertRaises(snake_case_					):
															snake_case :       List[Any]				=    pipe([image, image]				,			prompt=[prompt, prompt]					)



			@slow
			@require_torch
			def   lowerCamelCase (							self					):
									snake_case :       List[str]				=    pipeline("image-to-text"				,			model="microsoft/git-base-coco"					)
									snake_case :       Optional[Any]				=    "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/transformers/tasks/ai2d-demo.jpg"
									snake_case :       List[str]				=    Image.open(requests.get(snake_case_				,			stream=snake_case_					).raw					)

									snake_case :       Any				=    "a photo of a"

									snake_case :       Dict				=    pipe(snake_case_				,			prompt=snake_case_					)
									self.assertEqual(snake_case_				,			[{"generated_text": "a photo of a tent with a tent and a tent in the background."}]					)

									with self.assertRaises(snake_case_					):
															snake_case :       List[str]				=    pipe([image, image]				,			prompt=[prompt, prompt]					)



			@unittest.skipIf(
			    not is_torch_greater_or_equal_than_1_11				,			reason="`Pix2StructImageProcessor` requires `torch>=1.11.0`."					)
			@slow
			@require_torch
			def   lowerCamelCase (							self					):
									snake_case :       List[str]				=    pipeline("image-to-text"				,			model="google/pix2struct-ai2d-base"					)
									snake_case :       Optional[int]				=    "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/transformers/tasks/ai2d-demo.jpg"
									snake_case :       str				=    Image.open(requests.get(snake_case_				,			stream=snake_case_					).raw					)

									snake_case :       Any				=    "What does the label 15 represent? (1) lava (2) core (3) tunnel (4) ash cloud"

									snake_case :       str				=    pipe(snake_case_				,			prompt=snake_case_					)
									self.assertEqual(snake_case_				,			[{"generated_text": "ash cloud"}]					)

									with self.assertRaises(snake_case_					):
															snake_case :       List[str]				=    pipe([image, image]				,			prompt=[prompt, prompt]					)






			@slow
			@require_tf
			def   lowerCamelCase (							self					):
									snake_case :       List[str]				=    pipeline("image-to-text"				,			model="ydshieh/vit-gpt2-coco-en"				,			framework="tf"					)
									snake_case :       Union[str, Any]				=    "./tests/fixtures/tests_samples/COCO/000000039769.png"

									snake_case :       Any				=    pipe(snake_case_					)
									self.assertEqual(snake_case_				,			[{"generated_text": "a cat laying on a blanket next to a cat laying on a bed "}]					)

									snake_case :       Optional[int]				=    pipe([image, image]					)
									self.assertEqual(
									    snake_case_				,			[
									        [{"generated_text": "a cat laying on a blanket next to a cat laying on a bed "}],
									        [{"generated_text": "a cat laying on a blanket next to a cat laying on a bed "}],
									    ]				,			)





