
    謜iz                         d dl Z d dlZd dlmZ d dlmZ d dlmZ d dlm	Z	m
Z
 d dlZd dlZddlmZ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       rd dlZ d dl!Z e jD                  jF                  Z$ e       rd d	l%m&Z& e$jN                  e&jP                  e$jR                  e&jR                  e$jT                  e&jT                  e$jV                  e&jV                  e$jX                  e&jX                  e$jZ                  e&jZ                  iZ.ni Z. e       rd dl/Z/ ej`                  e1      Z2e
d
ejf                  de4d
   e4ejf                     e4d   f   Z5 G d de      Z6 G d de      Z7e8e9e:e9z  e4e8   z  f   Z;d Z< G d de      Z=d Z>d Z?de4fdZ@d ZAd ZBd ZCdejf                  deDfdZEdRde:de4e5   fdZF	 dRde4e5   e5z  de:de5fdZG	 dRde4e5   e5z  de:de4e5   fd ZHdejf                  fd!ZI	 dSdejf                  d"e:eJe:d#f   z  dz  de6fd$ZKdSdejf                  d%e6e9z  dz  de:fd&ZLdSdejf                  d'e6dz  deJe:e:f   fd(ZMd)eJe:e:f   d*e:d+e:deJe:e:f   fd,ZNd-e8e9e4eJz  f   deDfd.ZOd-e8e9e4eJz  f   deDfd/ZPd0ee8e9e4eJz  f      deDfd1ZQd0ee8e9e4eJz  f      deDfd2ZRdSde
e9d
f   d3eSdz  dd
fd4ZT	 dSde
e4eJe9d
f   d3eSdz  de
d
e4d
   e4e4d
      f   fd5ZU	 	 	 	 	 	 	 	 	 	 	 	 	 dTd6eDdz  d7eSdz  d8eDdz  d9eSe4eS   z  dz  d:eSe4eS   z  dz  d;eDdz  d<e8e9e:f   e:z  dz  d=eDdz  d>e8e9e:f   dz  d?eDdz  d@e8e9e:f   dz  dAe	dB   dCe	dD   fdEZV G dF dG      ZWdHe7dIeJe7d#f   d0e4e8   ddfdJZXdKe4e9   dLe4e9   fdMZY edNO       G dP dQ             ZZy)U    N)Iterable)	dataclass)BytesIO)OptionalUnion   )	ExplicitEnumis_numpy_arrayis_torch_availableis_torch_tensoris_torchvision_availableis_vision_availableloggingrequires_backendsto_numpy)IMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STDIMAGENET_STANDARD_MEANIMAGENET_STANDARD_STDOPENAI_CLIP_MEANOPENAI_CLIP_STD)InterpolationModezPIL.Image.Imageztorch.Tensorc                       e Zd ZdZdZy)ChannelDimensionchannels_firstchannels_lastN)__name__
__module____qualname__FIRSTLAST     T/mnt/e/genesis-system/.venv/lib/python3.12/site-packages/transformers/image_utils.pyr   r   O   s    EDr#   r   c                       e Zd ZdZdZy)AnnotationFormatcoco_detectioncoco_panopticN)r   r   r   COCO_DETECTIONCOCO_PANOPTICr"   r#   r$   r&   r&   T   s    %N#Mr#   r&   c                 b    t               xr$ t        | t        j                  j                        S N)r   
isinstancePILImageimgs    r$   is_pil_imager2   \   s     EZSYY__%EEr#   c                       e Zd ZdZdZdZy)	ImageTypepillowtorchnumpyN)r   r   r   r.   TORCHNUMPYr"   r#   r$   r4   r4   `   s    
CEEr#   r4   c                     t        |       rt        j                  S t        |       rt        j                  S t        |       rt        j                  S t        dt        |              )NzUnrecognized image type )	r2   r4   r.   r   r8   r
   r9   
ValueErrortypeimages    r$   get_image_typer?   f   sO    E}}ue
/U}=
>>r#   c                 L    t        |       xs t        |       xs t        |       S r,   )r2   r
   r   r0   s    r$   is_valid_imagerA   p   s!    Ks 3Ks7KKr#   imagesc                 .    | xr t        d | D              S )Nc              3   2   K   | ]  }t        |        y wr,   )rA   ).0r>   s     r$   	<genexpr>z*is_valid_list_of_images.<locals>.<genexpr>u   s     DE./D   all)rB   s    r$   is_valid_list_of_imagesrJ   t   s    DcDVDDDr#   c                 8   t        | d   t              r| D cg c]  }|D ]  }|  c}}S t        | d   t        j                        rt        j                  | d      S t        | d   t
        j                        rt        j                  | d      S y c c}}w )Nr   axis)dim)r-   listnpndarrayconcatenater6   Tensorcat)
input_listsublistitems      r$   concatenate_listrX   x   s~    *Q-&$.C7C4CCC	JqM2::	.~~jq11	JqM5<<	0yy++ 
1 Ds   Bc                 r    t        | t        t        f      r| D ]  }t        |      r y yt	        |       syy)NFT)r-   rO   tuplevalid_imagesrA   )imgsr1   s     r$   r[   r[      s?    $u& 	C$	  D!r#   c                 L    t        | t        t        f      rt        | d         S y)Nr   F)r-   rO   rZ   rA   r0   s    r$   
is_batchedr^      s"    #e}%c!f%%r#   r>   returnc                     | j                   t        j                  k(  ryt        j                  |       dk\  xr t        j                  |       dk  S )zV
    Checks to see whether the pixel values have already been rescaled to [0, 1].
    Fr   r   )dtyperP   uint8minmaxr=   s    r$   is_scaled_imagere      s>     {{bhh 66%=A4"&&-1"44r#   expected_ndimsc           	      (   t        |       r| S t        |       r| gS t        |       rU| j                  |dz   k(  rt	        |       } | S | j                  |k(  r| g} | S t        d|dz    d| d| j                   d      t        dt        |        d      )a  
    Ensure that the output 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.z]Invalid image type. Expected either PIL.Image.Image, numpy.ndarray, or torch.Tensor, but got .)r^   r2   rA   ndimrO   r;   r<   )rB   rf   s     r$   make_list_of_imagesrj      s     & Fxf;;.1,,&\F  [[N*XF 	 78J7K4P^O_ `KK=. 
 
ghlmshtguuvw r#   c                 H   t        | t        t        f      r=t        d | D              r+t        d | D              r| D cg c]  }|D ]  }|  c}}S t        | t        t        f      r[t	        |       rPt        | d         s| d   j                  |k(  r| S | d   j                  |dz   k(  r| D cg c]  }|D ]  }|  c}}S t        |       r:t        |       s| j                  |k(  r| gS | j                  |dz   k(  rt        |       S t        d|        c c}}w c c}}w )a  
    Ensure that the output is a flat list of images. If the input is a single image, it is converted to a list of length 1.
    If the input is a nested list of images, it is converted to a flat list of images.
    Args:
        images (`Union[list[ImageInput], ImageInput]`):
            The input image.
        expected_ndims (`int`, *optional*, defaults to 3):
            The expected number of dimensions for a single input image.
    Returns:
        list: A list of images or a 4d array of images.
    c              3   H   K   | ]  }t        |t        t        f        y wr,   r-   rO   rZ   rE   images_is     r$   rF   z+make_flat_list_of_images.<locals>.<genexpr>        K
8dE]3K    "c              3   <   K   | ]  }t        |      xs |   y wr,   rJ   rn   s     r$   rF   z+make_flat_list_of_images.<locals>.<genexpr>         Yh'1A\AY   r   r   z*Could not make a flat list of images from 	r-   rO   rZ   rI   rJ   r2   ri   rA   r;   )rB   rf   img_listr1   s       r$   make_flat_list_of_imagesrx      s   " 	6D%=)KFKKYRXYY$*?h?s???&4-(-DV-Lq	"fQinn&FM!9>>^a//(.CH(C3CCCCCf6;;.#@8O;;.1,,<
A&J
KK @ Ds    D1Dc                    t        | t        t        f      r&t        d | D              rt        d | D              r| S t        | t        t        f      r\t	        |       rQt        | d         s| d   j                  |k(  r| gS | d   j                  |dz   k(  r| D cg c]  }t        |       c}S t        |       r<t        |       s| j                  |k(  r| ggS | j                  |dz   k(  rt        |       gS t        d      c c}w )as  
    Ensure that the output is a nested list of images.
    Args:
        images (`Union[list[ImageInput], ImageInput]`):
            The input image.
        expected_ndims (`int`, *optional*, defaults to 3):
            The expected number of dimensions for a single input image.
    Returns:
        list: A list of list of images or a list of 4d array of images.
    c              3   H   K   | ]  }t        |t        t        f        y wr,   rm   rn   s     r$   rF   z-make_nested_list_of_images.<locals>.<genexpr>   rp   rq   c              3   <   K   | ]  }t        |      xs |   y wr,   rs   rn   s     r$   rF   z-make_nested_list_of_images.<locals>.<genexpr>   rt   ru   r   r   z]Invalid input type. Must be a single image, a list of images, or a list of batches of images.rv   )rB   rf   r>   s      r$   make_nested_list_of_imagesr|      s      	6D%=)KFKKYRXYY &4-(-DV-Lq	"fQinn&F8O!9>>^a//-34EDK44 f6;;.#@H:;;.1,,L>!
t
uu 5s   Dc                     t        |       st        dt        |              t               r9t	        | t
        j                  j                        rt        j                  |       S t        |       S )NzInvalid image type: )
rA   r;   r<   r   r-   r.   r/   rP   arrayr   r0   s    r$   to_numpy_arrayr     sP    #/S	{;<<C!Axx}C=r#   num_channels.c                 *   ||nd}t        |t              r|fn|}| j                  dk(  rd\  }}nB| j                  dk(  rd\  }}n-| j                  dk(  rd\  }}nt        d| j                         | j                  |   |v rD| j                  |   |v r3t
        j                  d| j                   d	       t        j                  S | j                  |   |v rt        j                  S | j                  |   |v rt        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.
    r      r   )r            )r   r   z(Unsupported number of image dimensions: z4The channel dimension is ambiguous. Got image shape z. Assuming channels are the first dimension. Use the [input_data_format](https://huggingface.co/docs/transformers/main/internal/image_processing_utils#transformers.image_transforms.rescale.input_data_format) parameter to assign the channel dimension.z(Unable to infer channel dimension format)
r-   intri   r;   shapeloggerwarningr   r    r!   )r>   r   	first_dimlast_dims       r$   infer_channel_dimension_formatr     s    $0#;<L&0s&CL?LzzQ"	8	q"	8	q"	8CEJJ<PQQ{{9-%++h2G<2WB5;;-  PJ  K	
  %%%	Y	<	/%%%	X	,	.$$$
?
@@r#   input_data_formatc                     |t        |       }|t        j                  k(  r| j                  dz
  S |t        j                  k(  r| j                  dz
  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.
    r   r   Unsupported data format: )r   r   r    ri   r!   r;   )r>   r   s     r$   get_channel_dimension_axisr   A  sd      :5A,222zzA~	.33	3zzA~
01B0CD
EEr#   channel_dimc                     |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.
    r   )r   r   r    r   r!   r;   )r>   r   s     r$   get_image_sizer   W  s{     4U;&,,,{{2B//	(--	-{{2B//4[MBCCr#   
image_size
max_height	max_widthc                 x    | \  }}||z  }||z  }t        ||      }t        ||z        }t        ||z        }	||	fS )a  
    Computes the output image size given the input image and the maximum allowed height and width. Keep aspect ratio.
    Important, even if image_height < max_height and image_width < max_width, the image will be resized
    to at least one of the edges be equal to max_height or max_width.

    For example:
        - input_size: (100, 200), max_height: 50, max_width: 50 -> output_size: (25, 50)
        - input_size: (100, 200), max_height: 200, max_width: 500 -> output_size: (200, 400)

    Args:
        image_size (`tuple[int, int]`):
            The image to resize.
        max_height (`int`):
            The maximum allowed height.
        max_width (`int`):
            The maximum allowed width.
    )rc   r   )
r   r   r   heightwidthheight_scalewidth_scale	min_scale
new_height	new_widths
             r$   #get_image_size_for_max_height_widthr   o  sV    , MFE&Le#KL+.IVi'(JEI%&Iy  r#   
annotationc                     t        | t              rId| v rEd| v rAt        | d   t        t        f      r(t	        | d         dk(  st        | d   d   t              ryy)Nimage_idannotationsr   TFr-   dictrO   rZ   lenr   s    r$   "is_valid_annotation_coco_detectionr     s`    :t$*$Z'z-04-@ 
=)*a/:j>WXY>Z\`3a r#   c                     t        | t              rMd| v rId| v rEd| v rAt        | d   t        t        f      r(t	        | d         dk(  st        | d   d   t              ryy)Nr   segments_info	file_namer   TFr   r   s    r$   !is_valid_annotation_coco_panopticr     sh    :t$*$z):%z/2T5MB 
?+,1Z
?@[\]@^`d5e r#   r   c                 &    t        d | D              S )Nc              3   2   K   | ]  }t        |        y wr,   )r   rE   anns     r$   rF   z3valid_coco_detection_annotations.<locals>.<genexpr>  s     N31#6NrG   rH   r   s    r$    valid_coco_detection_annotationsr     s    N+NNNr#   c                 &    t        d | D              S )Nc              3   2   K   | ]  }t        |        y wr,   )r   r   s     r$   rF   z2valid_coco_panoptic_annotations.<locals>.<genexpr>  s     M#05MrG   rH   r   s    r$   valid_coco_panoptic_annotationsr     s    MMMMr#   timeoutc           	         t        t        dg       t        | t              r| j	                  d      s| j	                  d      rIt
        j                  j                  t        t        j                  | |d      j                              } nt        j                  j                  |       r t
        j                  j                  |       } n| j	                  d      r| j                  d      d   } 	 t!        j"                  | j%                               }t
        j                  j                  t        |            } n/t        | t
        j                  j                        st+        d      t
        j,                  j/                  |       } | j1                  d      } | S # t&        $ r}t)        d	|  d
|       d}~ww xY w)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)r   follow_redirectszdata:image/,r   zIncorrect 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/   openr   httpxgetcontentospathisfilesplitbase64decodebytesencode	Exceptionr;   	TypeErrorImageOpsexif_transposeconvert)r>   r   b64es       r$   r   r     st    j8*-%I&%*:*::*F IINN7599UG^b+c+k+k#lmEWW^^E"IINN5)E.C(+((8		ws|4
 syy/ D
 	
 LL''.EMM% EL    i  jo  ip  p~  @  ~A  B s   3AF   	F?)F::F?c                 <   t        | t        t        f      rjt        |       rDt        | d   t        t        f      r+| D cg c]  }|D cg c]  }t	        ||       c} c}}S | D cg c]  }t	        ||       c}S t	        | |      S c c}w c c}}w c c}w )a  Loads images, handling different levels of nesting.

    Args:
      images: A single image, a list of images, or a list of lists of images to load.
      timeout: Timeout for loading images.

    Returns:
      A single image, a list of images, a list of lists of images.
    r   )r   )r-   rO   rZ   r   r   )rB   r   image_groupr>   s       r$   load_imagesr     s     &4-(v;:fQi$?eklVa[QEZw7QllDJK5Jug6KK&'22	 RlKs    	B	BB*BB
do_rescalerescale_factordo_normalize
image_mean	image_stddo_padpad_sizedo_center_crop	crop_size	do_resizesizeresamplePILImageResamplinginterpolationr   c                     | r|t        d      |r|t        d      |r||t        d      |r|t        d      ||t        d      |	r|
||t        d      yyy)a  
    Checks validity of typically used arguments in an `ImageProcessor` `preprocess` method.
    Raises `ValueError` if arguments incompatibility is caught.
    Many incompatibilities are model-specific. `do_pad` sometimes needs `size_divisor`,
    sometimes `size_divisibility`, and sometimes `size`. New models and processors added should follow
    existing arguments when possible.

    Nz=`rescale_factor` must be specified if `do_rescale` is `True`.zgDepending on the model, `size_divisor` or `pad_size` or `size` must be specified if `do_pad` is `True`.zP`image_mean` and `image_std` must both be specified if `do_normalize` is `True`.z<`crop_size` must be specified if `do_center_crop` is `True`.zbOnly one of `interpolation` and `resample` should be specified, depending on image processor type.zO`size` and `resample/interpolation` must be specified if `do_resize` is `True`.)r;   )r   r   r   r   r   r   r   r   r   r   r   r   r   s                r$   validate_preprocess_argumentsr     s    . n,XYY(" u
 	
 +y/@kll)+WXX X%9p
 	
 $*0DHajkk Ib0Dyr#   c                       e Zd ZdZd ZddZd Zdej                  de	e
z  dej                  fd	Zdd
Zd ZddZddZd Zd ZddZy)ImageFeatureExtractionMixinzD
    Mixin that contain utilities for preparing image features.
    c                     t        |t        j                  j                  t        j                  f      s$t        |      st        dt        |       d      y y )Nz	Got type zU which is not supported, only `PIL.Image.Image`, `np.ndarray` and `torch.Tensor` are.)r-   r.   r/   rP   rQ   r   r;   r<   selfr>   s     r$   _ensure_format_supportedz4ImageFeatureExtractionMixin._ensure_format_supported-  sQ    %#))//2::!>?X]H^DK= )& &  I_?r#   Nc                    | j                  |       t        |      r|j                         }t        |t        j
                        r|'t        |j                  d   t        j                        }|j                  dk(  r$|j                  d   dv r|j                  ddd      }|r|dz  }|j                  t        j                        }t        j                  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.
        r   r   r   r   r      )r   r   r7   r-   rP   rQ   flatfloatingri   r   	transposeastyperb   r.   r/   	fromarray)r   r>   rescales      r$   to_pil_imagez(ImageFeatureExtractionMixin.to_pil_image4  s     	%%e,5!KKMEeRZZ($UZZ]BKK@zzQ5;;q>V#;1a0LL*E99&&u--r#   c                     | j                  |       t        |t        j                  j                        s|S |j	                  d      S )z
        Converts `PIL.Image.Image` to RGB format.

        Args:
            image (`PIL.Image.Image`):
                The image to convert.
        r   )r   r-   r.   r/   r   r   s     r$   convert_rgbz'ImageFeatureExtractionMixin.convert_rgbR  s8     	%%e,%1L}}U##r#   r>   scaler_   c                 .    | j                  |       ||z  S )z7
        Rescale a numpy image by scale amount
        )r   )r   r>   r   s      r$   r   z#ImageFeatureExtractionMixin.rescale`  s     	%%e,u}r#   c                    | j                  |       t        |t        j                  j                        rt	        j
                  |      }t        |      r|j                         }|'t        |j                  d   t        j                        n|}|r/| j                  |j                  t        j                        d      }|r"|j                  dk(  r|j                  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.
        r   p?r   r   r   )r   r-   r.   r/   rP   r~   r   r7   r   integerr   r   float32ri   r   )r   r>   r   channel_firsts       r$   r   z*ImageFeatureExtractionMixin.to_numpy_arrayg  s     	%%e,eSYY__-HHUOE5!KKME;B?*UZZ]BJJ7PWLLbjj!99EEUZZ1_OOAq!,Er#   c                     | j                  |       t        |t        j                  j                        r|S t	        |      r|j                  d      }|S t        j                  |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   rL   )r   r-   r.   r/   r   	unsqueezerP   expand_dimsr   s     r$   r  z'ImageFeatureExtractionMixin.expand_dims  s_     	%%e, eSYY__-L5!OOA&E  NN5q1Er#   c                    | j                  |       t        |t        j                  j                        r| j	                  |d      }nw|rut        |t
        j                        r0| j                  |j                  t
        j                        d      }n+t        |      r | j                  |j                         d      }t        |t
        j                        rt        |t
        j                        s.t        j                  |      j                  |j                        }t        |t
        j                        st        j                  |      j                  |j                        }nt        |      rddl}t        ||j                        s?t        |t
        j                        r |j                   |      }n |j"                  |      }t        ||j                        s?t        |t
        j                        r |j                   |      }n |j"                  |      }|j$                  dk(  r)|j&                  d   dv r||ddddf   z
  |ddddf   z  S ||z
  |z  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   r   )r   r-   r.   r/   r   rP   rQ   r   r   r   r   floatr~   ra   r6   rS   
from_numpytensorri   r   )r   r>   meanstdr   r6   s         r$   	normalizez%ImageFeatureExtractionMixin.normalize  s     	%%e,eSYY__-''t'<E %,U\\"**%=yI 'U[[]I>eRZZ(dBJJ/xx~,,U[[9c2::.hhsm**5;;7U#dELL1dBJJ/+5++D1D'5<<-Dc5<<0c2::.*%**3/C&%,,s+C::?u{{1~7DD$//3q$}3EEEDLC''r#   c                    ||nt         j                  }| j                  |       t        |t        j
                  j
                        s| j                  |      }t        |t              rt        |      }t        |t              st        |      dk(  r|rt        |t              r||fn	|d   |d   f}n|j                  \  }}||k  r||fn||f\  }}	t        |t              r|n|d   }
||
k(  r|S |
t        |
|	z  |z        }}|.||
k  rt        d| d|       ||kD  rt        ||z  |z        |}}||k  r||fn||f}|j                  ||      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`.
        r   r   zmax_size = zN must be strictly greater than the requested size for the smaller edge size = )r   )r   BILINEARr   r-   r.   r/   r   rO   rZ   r   r   r   r;   resize)r   r>   r   r   default_to_squaremax_sizer   r   shortlongrequested_new_short	new_shortnew_longs                r$   r  z"ImageFeatureExtractionMixin.resize  sy   <  (389K9T9T%%e,%1%%e,EdD!;DdC CIN '1$'<d|47DQRGBT %

v16&ufovuot.8s.Cda#// L&93?RUY?Y\a?a;b8	'#66()( 4@@DvG   (*.1(Y2F2Q.RT\8	05	8,hPYEZ||D8|44r#   c                    | j                  |       t        |t              s||f}t        |      st        |t        j
                        rP|j                  dk(  r| j                  |      }|j                  d   dv r|j                  dd n|j                  dd }n|j                  d   |j                  d   f}|d   |d   z
  dz  }||d   z   }|d   |d   z
  dz  }||d   z   }t        |t        j                  j                        r|j                  ||||f      S |j                  d   dv }|sKt        |t        j
                        r|j                  ddd      }t        |      r|j                  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z   }	t        |t        j
                        rt	        j                   ||	      }
nt        |      r|j#                  |	      }
|	d   |d   z
  dz  }||d   z   }|	d	   |d   z
  dz  }||d   z   }|
d||||f<   ||z  }||z  }||z  }||z  }|
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).
        r   r   r   r   N.r   )r   r   )r   r-   rZ   r   rP   rQ   ri   r  r   r   r.   r/   cropr   permuterd   
zeros_like	new_zerosrc   )r   r>   r   image_shapetopbottomleftrightr   	new_shape	new_imagetop_pad
bottom_padleft_pad	right_pads                  r$   center_cropz'ImageFeatureExtractionMixin.center_crop  s    	%%e,$&$<D 5!Zrzz%BzzQ((/-2[[^v-E%++ab/5;;WYXY?K ::a=%**Q-8K1~Q'A-tAwAa(Q.tAw eSYY__-::tS%899 A&0 %,1a0u%aA. !8+a.0TQY5KXYNCZc&j$u*455 KK$DG[^(Dc$q'S^_`SaFb'cc	eRZZ(e9=IU#	2IR=;q>1a7{1~-
bMKN2q8{1~-	AF	#wz)8I+==>w'Qs9??2#6??QPST]TcTcdfTginPoAoo
	 r#   c                     | j                  |       t        |t        j                  j                        r| j	                  |      }|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.
        Nr   )r   r-   r.   r/   r   r   s     r$   flip_channel_orderz.ImageFeatureExtractionMixin.flip_channel_order]  sI     	%%e,eSYY__-''.ETrT1aZ  r#   c                     ||nt         j                  j                  }| j                  |       t	        |t         j                  j                        s| j                  |      }|j                  ||||||      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`.
        )r   expandcenter	translate	fillcolor)r.   r/   NEARESTr   r-   r   rotate)r   r>   angler   r(  r)  r*  r+  s           r$   r-  z"ImageFeatureExtractionMixin.rotaten  sn      (389J9J%%e,%1%%e,E||HVFicl  
 	
r#   r,   )NT)F)NTN)Nr   NNN)r   r   r   __doc__r   r   r   rP   rQ   r  r   r   r   r  r	  r  r$  r&  r-  r"   r#   r$   r   r   (  se    <$RZZ  

 @(2(hA5FIV!"
r#   r   annotation_formatsupported_annotation_formatsc                     | |vrt        dt         d|       | t        j                  u rt	        |      st        d      | t        j
                  u rt        |      st        d      y y )NzUnsupported annotation format: z must be one of zInvalid COCO detection annotations. Annotations must a dict (single image) or list of dicts (batch of images) with the following keys: `image_id` and `annotations`, with the latter being a list of annotations in the COCO format.zInvalid COCO panoptic annotations. Annotations must a dict (single image) or list of dicts (batch of images) with the following keys: `image_id`, `file_name` and `segments_info`, with the latter being a list of annotations in the COCO format.)r;   formatr&   r)   r   r*   r   )r0  r1  r   s      r$   validate_annotationsr4    s    
  <<:6(BRSoRpqrr,;;;/<B  ,:::.{;M  < ;r#   valid_processor_keyscaptured_kwargsc                     t        |      j                  t        |             }|r+dj                  |      }t        j	                  d| d       y y )Nz, zUnused or unrecognized kwargs: rh   )set
differencejoinr   r   )r5  r6  unused_keysunused_key_strs       r$   validate_kwargsr=    sJ    o&11#6J2KLK;/88HJK r#   T)frozenc                       e Zd ZU dZdZedz  ed<   dZedz  ed<   dZedz  ed<   dZ	edz  ed<   dZ
edz  ed<   dZedz  ed<   d	 Zy)
SizeDictz>
    Hashable dictionary to store image size information.
    Nr   r   longest_edgeshortest_edger   r   c                 P    t        | |      rt        | |      S t        d| d      )NzKey z not found in SizeDict.)hasattrgetattrKeyError)r   keys     r$   __getitem__zSizeDict.__getitem__  s.    44%%cU"9:;;r#   )r   r   r   r/  r   r   __annotations__r   rA  rB  r   r   rH  r"   r#   r$   r@  r@    sb     FC$JE3:#L#*# $M3:$!Jd
! IsTz <r#   r@  )r   r,   )NNNNNNNNNNNNN)[r   r   collections.abcr   dataclassesr   ior   typingr   r   r   r7   rP   utilsr	   r
   r   r   r   r   r   r   r   utils.constantsr   r   r   r   r   r   	PIL.Imager.   PIL.ImageOpsr/   
Resamplingr   torchvision.transformsr   r,  NEAREST_EXACTBOXr  HAMMINGBICUBICLANCZOSpil_torch_interpolation_mappingr6   
get_loggerr   r   rQ   rO   
ImageInputr   r&   r   r   r   AnnotationTyper2   r4   r?   rA   rJ   rX   r[   r^   boolre   rj   rx   r|   r   rZ   r   r   r   r   r   r   r   r   r  r   r   r   r   r4  r=  r@  r"   r#   r$   <module>r^     s    	 $ !  "  
 
 
  --!< &&(9(G(G""$5$9$9''):)C)C&&(9(A(A&&(9(A(A&&(9(A(A+
' +-'  
		H	% rzz>48I3JDQSQ[Q[L\^bcq^rr

| 
$| $
 c39tDz112F ?LED E,	52:: 5$ 5# #D<L #P #Lz)#L#L #LP $vz)$v$v 
*$vN2::  EI$A::$A%(5c?%:T%A$A$ANFbjj FEUX[E[^bEb Fnq F,D"** D3Cd3J DV[\_ad\dVe D0!c3h!! ! 38_	!>4TE\8I3J t $sD5L7H2I d  O(4TE\@Q;R2S OX\ ON$sD5L?P:Q1R NW[ N'eC!223 'edl 'Vg 'V QU3$s$5563AF3
d#45tDAR<S7TTU3, ##' $-1,0,0"&'+!"&/3371lt1lDL1l +1l U#d*	1l
 tE{"T)1l 4K1l 38ns"T)1l 4K1l CH~$1l d{1l sCx.4
1l +,1l /01lh\
 \
~
'"'(8#(="> d 
	2L$s) Ld3i L $< < <r#   