o
    h d                  
   @   s  d dl Z d dlZd dlmZ d dlmZmZmZmZm	Z	m
Z
mZ d dlZd dlZd dlmZ ddlmZmZmZmZmZmZmZmZ ddlmZmZmZmZmZm Z  e rtd dl!Z"d dl#Z"e$e$e"j%j&e$dkrqe"j'j(Z)ne"j'Z)er}e r}d dl*Z*ed	ej+d
ed	 eej+ ed
 f Z,G dd deZ-dd Z.dd Z/dd Z0dd Z1dej+de2fddZ3d8de4dee, fddZ5dej+fddZ6	d9dej+de	ee4e
e4d f f  de-fd!d"Z7	d9dej+d#e	ee-e8f  de4fd$d%Z9d9dej+d&e-de
e4e4f fd'd(Z:d)ee8eee
f f de2fd*d+Z;d)ee8eee
f f de2fd,d-Z<d.eee8eee
f f  de2fd/d0Z=d.eee8eee
f f  de2fd1d2Z>d9dee8d	f d3e	e? dd	fd4d5Z@G d6d7 d7ZAdS ):    N)BytesIO)TYPE_CHECKINGDictIterableListOptionalTupleUnion)version   )ExplicitEnumis_jax_tensoris_tf_tensoris_torch_availableis_torch_tensoris_vision_availablerequires_backendsto_numpy)IMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STDIMAGENET_STANDARD_MEANIMAGENET_STANDARD_STDOPENAI_CLIP_MEANOPENAI_CLIP_STDz9.1.0zPIL.Image.Imageztorch.Tensorc                   @   s   e Zd ZdZdZdS )ChannelDimensionchannels_firstchannels_lastN)__name__
__module____qualname__FIRSTLAST r"   r"   N/var/www/html/ai/venv/lib/python3.10/site-packages/transformers/image_utils.pyr   @   s    r   c                 C   s   t  o	t| tjjS N)r   
isinstancePILImageimgr"   r"   r#   is_pil_imageE   s   r*   c                 C   s8   t  r
t| tjjpt| tjpt| pt| pt| S r$   )	r   r%   r&   r'   npndarrayr   r   r   r(   r"   r"   r#   is_valid_imageI   s   
r-   c                 C   s:   t | ttfr| D ]	}t|s dS q	dS t| sdS dS )NFT)r%   listtuplevalid_imagesr-   )imgsr)   r"   r"   r#   r0   S   s   r0   c                 C   s   t | ttfrt| d S dS )Nr   F)r%   r.   r/   r-   r(   r"   r"   r#   
is_batched_   s   r2   imagereturnc                 C   s,   | j tjkrdS t| dkot| dkS )zV
    Checks to see whether the pixel values have already been rescaled to [0, 1].
    Fr   r   )dtyper+   uint8minmax)r3   r"   r"   r#   is_scaled_imagee   s   r9      expected_ndimsc                 C   s   t | r| S t| tjjr| gS t| r<| j|d kr!t| } | S | j|kr+| g} | S td|d  d| d| j dtdt|  d)a  
    Ensure that the input is a list of images. If the input is a single image, it is converted to a list of length 1.
    If the input is a batch of images, it is converted to a list of images.

    Args:
        images (`ImageInput`):
            Image of images to turn into a list of images.
        expected_ndims (`int`, *optional*, defaults to 3):
            Expected number of dimensions for a single input image. If the input image has a different number of
            dimensions, an error is raised.
    r   z%Invalid image shape. Expected either z or z dimensions, but got z dimensions.ztInvalid image type. Expected either PIL.Image.Image, numpy.ndarray, torch.Tensor, tf.Tensor or jax.ndarray, but got .)	r2   r%   r&   r'   r-   ndimr.   
ValueErrortype)imagesr;   r"   r"   r#   make_list_of_imagesp   s*   	
rA   c                 C   s@   t | stdt|  t rt| tjjrt| S t	| S )NzInvalid image type: )
r-   r>   r?   r   r%   r&   r'   r+   arrayr   r(   r"   r"   r#   to_numpy_array   s
   
rC   num_channels.c                 C   s   |dur|nd}t |tr|fn|}| jdkrd\}}n| jdkr&d\}}ntd| j | j| |v r8tjS | j| |v rBtjS td)a[  
    Infers the channel dimension format of `image`.

    Args:
        image (`np.ndarray`):
            The image to infer the channel dimension of.
        num_channels (`int` or `Tuple[int, ...]`, *optional*, defaults to `(1, 3)`):
            The number of channels of the image.

    Returns:
        The channel dimension of the image.
    Nr   r:   r:   )r         z(Unsupported number of image dimensions: z(Unable to infer channel dimension format)r%   intr=   r>   shaper   r    r!   )r3   rD   	first_dimlast_dimr"   r"   r#   infer_channel_dimension_format   s   



rL   input_data_formatc                 C   sF   |du rt | }|tjkr| jd S |tjkr| jd S td| )a  
    Returns the channel dimension axis of the image.

    Args:
        image (`np.ndarray`):
            The image to get the channel dimension axis of.
        input_data_format (`ChannelDimension` or `str`, *optional*):
            The channel dimension format of the image. If `None`, will infer the channel dimension from the image.

    Returns:
        The channel dimension axis of the image.
    Nr:   r   Unsupported data format: )rL   r   r    r=   r!   r>   )r3   rM   r"   r"   r#   get_channel_dimension_axis   s   



rO   channel_dimc                 C   sZ   |du rt | }|tjkr| jd | jd fS |tjkr&| jd | jd fS td| )a  
    Returns the (height, width) dimensions of the image.

    Args:
        image (`np.ndarray`):
            The image to get the dimensions of.
        channel_dim (`ChannelDimension`, *optional*):
            Which dimension the channel dimension is in. If `None`, will infer the channel dimension from the image.

    Returns:
        A tuple of the image's height and width.
    NrN   )rL   r   r    rI   r!   r>   )r3   rP   r"   r"   r#   get_image_size   s   

rT   
annotationc                 C   sV   t | tr)d| v r)d| v r)t | d ttfr)t| d dks't | d d tr)dS dS )Nimage_idannotationsr   TFr%   dictr.   r/   lenrU   r"   r"   r#   "is_valid_annotation_coco_detection   s   "r\   c                 C   s^   t | tr-d| v r-d| v r-d| v r-t | d ttfr-t| d dks+t | d d tr-dS dS )NrV   segments_info	file_namer   TFrX   r[   r"   r"   r#   !is_valid_annotation_coco_panoptic   s   "r_   rW   c                 C      t dd | D S )Nc                 s       | ]}t |V  qd S r$   )r\   .0annr"   r"   r#   	<genexpr>      z3valid_coco_detection_annotations.<locals>.<genexpr>allrW   r"   r"   r#    valid_coco_detection_annotations     rj   c                 C   r`   )Nc                 s   ra   r$   )r_   rb   r"   r"   r#   re     rf   z2valid_coco_panoptic_annotations.<locals>.<genexpr>rg   ri   r"   r"   r#   valid_coco_panoptic_annotations  rk   rl   timeoutc              
   C   s   t tdg t| trd| ds| dr#tjtj	| d|dj
} nOtj| r0tj| } nB| dr<| dd } ztj| dd	}tjt|} W n$ tyc } z
td
|  d| d}~ww t| tjjrn| } ntdtj| } | d} | S )a3  
    Loads `image` to a PIL Image.

    Args:
        image (`str` or `PIL.Image.Image`):
            The image to convert to the PIL Image format.
        timeout (`float`, *optional*):
            The timeout value in seconds for the URL request.

    Returns:
        `PIL.Image.Image`: A PIL Image.
    visionzhttp://zhttps://T)streamrm   zdata:image/,r   )validatezIncorrect image source. Must be a valid URL starting with `http://` or `https://`, a valid path to an image file, or a base64 encoded string. Got z. Failed with NzuIncorrect format used for image. Should be an url linking to an image, a base64 string, a local path, or a PIL image.RGB)r   
load_imager%   str
startswithr&   r'   openrequestsgetrawospathisfilesplitbase64	b64decoder   	Exceptionr>   ImageOpsexif_transposeconvert)r3   rm   b64er"   r"   r#   rs     s2   


rs   c                   @   s   e Zd ZdZdd ZdddZdd Zd	ejd
e	e
ef dejfddZd ddZdd Zd!ddZd"ddZdd Zdd Zd#ddZdS )$ImageFeatureExtractionMixinzD
    Mixin that contain utilities for preparing image features.
    c                 C   s8   t |tjjtjfst|stdt| dd S d S )Nz	Got type zS which is not supported, only `PIL.Image.Image`, `np.array` and `torch.Tensor` are.)r%   r&   r'   r+   r,   r   r>   r?   selfr3   r"   r"   r#   _ensure_format_supportedI  s
   z4ImageFeatureExtractionMixin._ensure_format_supportedNc                 C   s   |  | t|r| }t|tjrE|du r t|jd tj}|jdkr3|j	d dv r3|
ddd}|r9|d }|tj}tj|S |S )a"  
        Converts `image` to a PIL Image. Optionally rescales it and puts the channel dimension back as the last axis if
        needed.

        Args:
            image (`PIL.Image.Image` or `numpy.ndarray` or `torch.Tensor`):
                The image to convert to the PIL Image format.
            rescale (`bool`, *optional*):
                Whether or not to apply the scaling factor (to make pixel values integers between 0 and 255). Will
                default to `True` if the image type is a floating type, `False` otherwise.
        Nr   r:   rE   r   rF      )r   r   numpyr%   r+   r,   flatfloatingr=   rI   	transposeastyper6   r&   r'   	fromarray)r   r3   rescaler"   r"   r#   to_pil_imageP  s   
z(ImageFeatureExtractionMixin.to_pil_imagec                 C   s&   |  | t|tjjs|S |dS )z
        Converts `PIL.Image.Image` to RGB format.

        Args:
            image (`PIL.Image.Image`):
                The image to convert.
        rr   )r   r%   r&   r'   r   r   r"   r"   r#   convert_rgbn  s   

z'ImageFeatureExtractionMixin.convert_rgbr3   scaler4   c                 C   s   |  | || S )z7
        Rescale a numpy image by scale amount
        )r   )r   r3   r   r"   r"   r#   r   |  s   
z#ImageFeatureExtractionMixin.rescaleTc                 C   s   |  | t|tjjrt|}t|r| }|du r&t|jd tj	n|}|r4| 
|tjd}|rB|jdkrB|ddd}|S )a  
        Converts `image` to a numpy array. Optionally rescales it and puts the channel dimension as the first
        dimension.

        Args:
            image (`PIL.Image.Image` or `np.ndarray` or `torch.Tensor`):
                The image to convert to a NumPy array.
            rescale (`bool`, *optional*):
                Whether or not to apply the scaling factor (to make pixel values floats between 0. and 1.). Will
                default to `True` if the image is a PIL Image or an array/tensor of integers, `False` otherwise.
            channel_first (`bool`, *optional*, defaults to `True`):
                Whether or not to permute the dimensions of the image to put the channel dimension first.
        Nr   p?r:   rF   r   )r   r%   r&   r'   r+   rB   r   r   r   integerr   r   float32r=   r   )r   r3   r   channel_firstr"   r"   r#   rC     s   

z*ImageFeatureExtractionMixin.to_numpy_arrayc                 C   sD   |  | t|tjjr|S t|r|d}|S tj|dd}|S )z
        Expands 2-dimensional `image` to 3 dimensions.

        Args:
            image (`PIL.Image.Image` or `np.ndarray` or `torch.Tensor`):
                The image to expand.
        r   )axis)r   r%   r&   r'   r   	unsqueezer+   expand_dimsr   r"   r"   r#   r     s   

z'ImageFeatureExtractionMixin.expand_dimsFc                 C   s8  |  | t|tjjr| j|dd}n|r3t|tjr'| |tj	d}nt
|r3| | d}t|tjrXt|tjsHt||j}t|tjsWt||j}nt
|rvddl}t||jsk||}t||jsv||}|jdkr|jd dv r||ddddf  |ddddf  S || | S )a  
        Normalizes `image` with `mean` and `std`. Note that this will trigger a conversion of `image` to a NumPy array
        if it's a PIL Image.

        Args:
            image (`PIL.Image.Image` or `np.ndarray` or `torch.Tensor`):
                The image to normalize.
            mean (`List[float]` or `np.ndarray` or `torch.Tensor`):
                The mean (per channel) to use for normalization.
            std (`List[float]` or `np.ndarray` or `torch.Tensor`):
                The standard deviation (per channel) to use for normalization.
            rescale (`bool`, *optional*, defaults to `False`):
                Whether or not to rescale the image to be between 0 and 1. If a PIL image is provided, scaling will
                happen automatically.
        T)r   r   r   Nr:   rE   )r   r%   r&   r'   rC   r+   r,   r   r   r   r   floatrB   r5   torchTensortensorr=   rI   )r   r3   meanstdr   r   r"   r"   r#   	normalize  s.   


(z%ImageFeatureExtractionMixin.normalizec                 C   sJ  |dur|nt j}| | t|tjjs| |}t|tr#t|}t|t	s.t
|dkr|rBt|t	r9||fn|d |d f}n\|j\}}||krO||fn||f\}}	t|t	r\|n|d }
||
krf|S |
t	|
|	 | }}|dur||
krtd| d| ||krt	|| | |}}||kr||fn||f}|j||dS )a  
        Resizes `image`. Enforces conversion of input to PIL.Image.

        Args:
            image (`PIL.Image.Image` or `np.ndarray` or `torch.Tensor`):
                The image to resize.
            size (`int` or `Tuple[int, int]`):
                The size to use for resizing the image. If `size` is a sequence like (h, w), output size will be
                matched to this.

                If `size` is an int and `default_to_square` is `True`, then image will be resized to (size, size). If
                `size` is an int and `default_to_square` is `False`, then smaller edge of the image will be matched to
                this number. i.e, if height > width, then image will be rescaled to (size * height / width, size).
            resample (`int`, *optional*, defaults to `PILImageResampling.BILINEAR`):
                The filter to user for resampling.
            default_to_square (`bool`, *optional*, defaults to `True`):
                How to convert `size` when it is a single int. If set to `True`, the `size` will be converted to a
                square (`size`,`size`). If set to `False`, will replicate
                [`torchvision.transforms.Resize`](https://pytorch.org/vision/stable/transforms.html#torchvision.transforms.Resize)
                with support for resizing only the smallest edge and providing an optional `max_size`.
            max_size (`int`, *optional*, defaults to `None`):
                The maximum allowed for the longer edge of the resized image: if the longer edge of the image is
                greater than `max_size` after being resized according to `size`, then the image is resized again so
                that the longer edge is equal to `max_size`. As a result, `size` might be overruled, i.e the smaller
                edge may be shorter than `size`. Only used if `default_to_square` is `False`.

        Returns:
            image: A resized `PIL.Image.Image`.
        Nr   r   zmax_size = zN must be strictly greater than the requested size for the smaller edge size = )resample)PILImageResamplingBILINEARr   r%   r&   r'   r   r.   r/   rH   rZ   sizer>   resize)r   r3   r   r   default_to_squaremax_sizewidthheightshortlongrequested_new_short	new_shortnew_longr"   r"   r#   r     s4   


$
z"ImageFeatureExtractionMixin.resizec                 C   s  |  | t|ts||f}t|st|tjr8|jdkr"| |}|jd dv r0|jdd n|jdd }n
|j	d |j	d f}|d |d  d }||d  }|d |d  d }||d  }t|t
jjrr|||||fS |jd dv r{dnd}|st|tjr|ddd}t|r|ddd}|dkr||d kr|dkr||d kr|d||||f S |jdd	 t|d |d t|d |d f }	t|tjrtj||	d
}
n	t|r||	}
|	d	 |d  d }||d  }|	d |d  d }||d  }||
d||||f< ||7 }||7 }||7 }||7 }|
dtd|t|
jd	 |td|t|
jd |f }
|
S )a  
        Crops `image` to the given size using a center crop. Note that if the image is too small to be cropped to the
        size given, it will be padded (so the returned result has the size asked).

        Args:
            image (`PIL.Image.Image` or `np.ndarray` or `torch.Tensor` of shape (n_channels, height, width) or (height, width, n_channels)):
                The image to resize.
            size (`int` or `Tuple[int, int]`):
                The size to which crop the image.

        Returns:
            new_image: A center cropped `PIL.Image.Image` or `np.ndarray` or `torch.Tensor` of shape: (n_channels,
            height, width).
        rF   r   rE   r   NTF.rQ   )rI   rR   )r   r%   r/   r   r+   r,   r=   r   rI   r   r&   r'   cropr   permuter8   
zeros_like	new_zerosr7   )r   r3   r   image_shapetopbottomleftrightr   	new_shape	new_imagetop_pad
bottom_padleft_pad	right_padr"   r"   r#   center_crop(  sP   



,(2
4z'ImageFeatureExtractionMixin.center_cropc                 C   s>   |  | t|tjjr| |}|dddddddf S )a  
        Flips the channel order of `image` from RGB to BGR, or vice versa. Note that this will trigger a conversion of
        `image` to a NumPy array if it's a PIL Image.

        Args:
            image (`PIL.Image.Image` or `np.ndarray` or `torch.Tensor`):
                The image whose color channels to flip. If `np.ndarray` or `torch.Tensor`, the channel dimension should
                be first.
        NrR   )r   r%   r&   r'   rC   r   r"   r"   r#   flip_channel_orders  s   


z.ImageFeatureExtractionMixin.flip_channel_orderr   c                 C   sL   |dur|nt jj}| | t|t jjs| |}|j||||||dS )a  
        Returns a rotated copy of `image`. This method returns a copy of `image`, rotated the given number of degrees
        counter clockwise around its centre.

        Args:
            image (`PIL.Image.Image` or `np.ndarray` or `torch.Tensor`):
                The image to rotate. If `np.ndarray` or `torch.Tensor`, will be converted to `PIL.Image.Image` before
                rotating.

        Returns:
            image: A rotated `PIL.Image.Image`.
        N)r   expandcenter	translate	fillcolor)r&   r'   NEARESTr   r%   r   rotate)r   r3   angler   r   r   r   r   r"   r"   r#   r     s   

z"ImageFeatureExtractionMixin.rotater$   )NT)F)NTN)Nr   NNN)r   r   r   __doc__r   r   r   r+   r,   r	   r   rH   r   rC   r   r   r   r   r   r   r"   r"   r"   r#   r   D  s    
"
 

.CKr   )r:   r$   )Br~   rz   ior   typingr   r   r   r   r   r   r	   r   r+   rw   	packagingr
   utilsr   r   r   r   r   r   r   r   utils.constantsr   r   r   r   r   r   	PIL.Imager&   PIL.ImageOpsparse__version__base_versionr'   
Resamplingr   r   r,   
ImageInputr   r*   r-   r0   r2   boolr9   rH   rA   rC   rL   rt   rO   rT   r\   r_   rj   rl   r   rs   r   r"   r"   r"   r#   <module>   sh   $( 



'

!
"""&&$-