
    cCiV                        S r SSKJrJr  SSKrSSKJrJrJ	r	  SSK
JrJrJrJrJr  SSKJrJrJrJrJrJrJrJrJrJrJrJr  SSKJrJrJ r   SS	K!J"r"J#r#  \ RH                  " \%5      r&\"" 5       (       a  SSK'r'\#" S
S9 " S S\5      5       r(S/r)g)z Image processor class for Donut.    )OptionalUnionN   )BaseImageProcessorBatchFeatureget_size_dict)convert_to_rgbget_resize_output_image_sizepadresizeto_channel_dimension_format)IMAGENET_STANDARD_MEANIMAGENET_STANDARD_STDChannelDimension
ImageInputPILImageResamplingget_image_sizeinfer_channel_dimension_formatis_scaled_imagemake_flat_list_of_imagesto_numpy_arrayvalid_imagesvalidate_preprocess_arguments)
TensorTypefilter_out_non_signature_kwargslogging)is_vision_availablerequires)vision)backendsc            %       F  ^  \ rS rSrSrS/rSS\R                  SSSSSSSS4S\S	\	\
\\4      S
\S\S\S\S\S\\\4   S\S\	\\\\   4      S\	\\\\   4      SS4U 4S jjjr  S!S\R$                  S	\
\\4   S\	\\\4      S\	\\\4      S\R$                  4
S jjr   S"S\R$                  S	\
\\4   S\S\	\\\4      S\	\\\4      S\R$                  4S jjr\R,                  SS4S\R$                  S	\
\\4   S
\S\	\\\4      S\	\\\4      S\R$                  4S jjr\R,                  SS4S\R$                  S	\
\\4   S
\S\	\\\4      S\	\\\4      S\R$                  4S jjr\" 5       SSSSSSSSSSSSS\R4                  S4S\S\	\   S	\	\
\\4      S
\	\   S\	\   S\	\   S\	\   S\S\	\   S\	\   S\	\   S\	\\\\   4      S\	\\\\   4      S\	\\\4      S\	\   S\	\\\4      S\R<                  R<                  4"S jj5       rS r U =r!$ )#DonutImageProcessor6   am	  
Constructs a Donut image processor.

Args:
    do_resize (`bool`, *optional*, defaults to `True`):
        Whether to resize the image's (height, width) dimensions to the specified `size`. Can be overridden by
        `do_resize` in the `preprocess` method.
    size (`dict[str, int]` *optional*, defaults to `{"shortest_edge": 224}`):
        Size of the image after resizing. The shortest edge of the image is resized to size["shortest_edge"], with
        the longest edge resized to keep the input aspect ratio. Can be overridden by `size` in the `preprocess`
        method.
    resample (`PILImageResampling`, *optional*, defaults to `Resampling.BILINEAR`):
        Resampling filter to use if resizing the image. Can be overridden by `resample` in the `preprocess` method.
    do_thumbnail (`bool`, *optional*, defaults to `True`):
        Whether to resize the image using thumbnail method.
    do_align_long_axis (`bool`, *optional*, defaults to `False`):
        Whether to align the long axis of the image with the long axis of `size` by rotating by 90 degrees.
    do_pad (`bool`, *optional*, defaults to `True`):
        Whether to pad the image. If `random_padding` is set to `True` in `preprocess`, each image is padded with a
        random amount of padding on each size, up to the largest image size in the batch. Otherwise, all images are
        padded to the largest image size in the batch.
    do_rescale (`bool`, *optional*, defaults to `True`):
        Whether to rescale the image by the specified scale `rescale_factor`. Can be overridden by `do_rescale` in
        the `preprocess` method.
    rescale_factor (`int` or `float`, *optional*, defaults to `1/255`):
        Scale factor to use if rescaling the image. Can be overridden by `rescale_factor` in the `preprocess`
        method.
    do_normalize (`bool`, *optional*, defaults to `True`):
        Whether to normalize the image. Can be overridden by `do_normalize` in the `preprocess` method.
    image_mean (`float` or `list[float]`, *optional*, defaults to `IMAGENET_STANDARD_MEAN`):
        Mean to use if normalizing the image. This is a float or list of floats the length of the number of
        channels in the image. Can be overridden by the `image_mean` parameter in the `preprocess` method.
    image_std (`float` or `list[float]`, *optional*, defaults to `IMAGENET_STANDARD_STD`):
        Image standard deviation.
pixel_valuesTNFgp?	do_resizesizeresampledo_thumbnaildo_align_long_axisdo_pad
do_rescalerescale_factordo_normalize
image_mean	image_stdreturnc                 L  > [         TU ]  " S0 UD6  Ub  UOSSS.n[        U[        [        45      (       a  US S S2   n[        U5      nXl        X l        X0l        X@l	        XPl
        X`l        Xpl        Xl        Xl        U
b  U
O[        U l        Ub  Xl        g ["        U l        g )Ni 
  i  )heightwidth )super__init__
isinstancetuplelistr   r%   r&   r'   r(   r)   r*   r+   r,   r-   r   r.   r   r/   )selfr%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   kwargs	__class__s                j/home/james-whalen/.local/lib/python3.13/site-packages/transformers/models/donut/image_processing_donut.pyr7   DonutImageProcessor.__init__^   s     	"6"'tt-LdUDM**":DT""	 ("4$,((2(>*DZ&/&;AV    imagedata_formatinput_data_formatc                 0   [        XS9u  pVUS   US   pUc  [        U5      nU[        R                  :X  a  Sn	O%U[        R                  :X  a  Sn	O[        SU 35      eX:  a  Xe:  d
  X:  a  Xe:  a  [        R                  " USU	S9nUb
  [        XUS	9nU$ )
aa  
Align the long axis of the image to the longest axis of the specified size.

Args:
    image (`np.ndarray`):
        The image to be aligned.
    size (`dict[str, int]`):
        The size `{"height": h, "width": w}` to align the long axis to.
    data_format (`str` or `ChannelDimension`, *optional*):
        The data format of the output image. If unset, the same format as the input image is used.
    input_data_format (`ChannelDimension` or `str`, *optional*):
        The channel dimension format of the input image. If not provided, it will be inferred.

Returns:
    `np.ndarray`: The aligned image.
channel_dimr2   r3   )r      )rG      zUnsupported data format: r   )axesinput_channel_dim)	r   r   r   LASTFIRST
ValueErrornprot90r   )
r;   rA   r&   rB   rC   input_heightinput_widthoutput_heightoutput_widthrot_axess
             r>   align_long_axis#DonutImageProcessor.align_long_axis   s    . %35$X!&*8nd7m|$ >u E 0 5 55H"2"8"88H89J8KLMM([-G([-GHHUAH5E"/VghEr@   random_paddingc                    US   US   pv[        XS9u  pXy-
  n
Xh-
  nU(       aC  [        R                  R                  SUS-   S9n[        R                  R                  SU
S-   S9nO
US-  nU
S-  nX-
  nX-
  nX4X44n[	        UUXES9$ )	ap  
Pad the image to the specified size.

Args:
    image (`np.ndarray`):
        The image to be padded.
    size (`dict[str, int]`):
        The size `{"height": h, "width": w}` to pad the image to.
    random_padding (`bool`, *optional*, defaults to `False`):
        Whether to use random padding or not.
    data_format (`str` or `ChannelDimension`, *optional*):
        The data format of the output image. If unset, the same format as the input image is used.
    input_data_format (`ChannelDimension` or `str`, *optional*):
        The channel dimension format of the input image. If not provided, it will be inferred.
r2   r3   rE   r   rG   )lowhighrH   )rB   rC   )r   rO   randomrandintr   )r;   rA   r&   rX   rB   rC   rS   rT   rQ   rR   delta_widthdelta_heightpad_toppad_left
pad_bottom	pad_rightpaddings                    r>   	pad_imageDonutImageProcessor.pad_image   s    . '+8nd7m|$25$X!"0$3ii''AL14D'EGyy((Q[1_(EH"a'G"a'H!+
*	(8*?@5'{``r@   c           	          [        XS9u  pxUS   US   p[        Xy5      n[        X5      nX:X  a  X:X  a  U$ Xx:  a  [        X-  U-  5      nOX:  a  [        X|-  U-  5      n[        U4X4USUUS.UD6$ )a  
Resize the image to make a thumbnail. The image is resized so that no dimension is larger than any
corresponding dimension of the specified size.

Args:
    image (`np.ndarray`):
        The image to be resized.
    size (`dict[str, int]`):
        The size `{"height": h, "width": w}` to resize the image to.
    resample (`PILImageResampling`, *optional*, defaults to `PILImageResampling.BICUBIC`):
        The resampling filter to use.
    data_format (`Optional[Union[str, ChannelDimension]]`, *optional*):
        The data format of the output image. If unset, the same format as the input image is used.
    input_data_format (`ChannelDimension` or `str`, *optional*):
        The channel dimension format of the input image. If not provided, it will be inferred.
rE   r2   r3   g       @)r&   r'   reducing_gaprB   rC   )r   minintr   )r;   rA   r&   r'   rB   rC   r<   rQ   rR   rS   rT   r2   r3   s                r>   	thumbnailDonutImageProcessor.thumbnail   s    2 %35$X!&*8nd7m| \1K.!e&:L%,|;<E'-;<F
#/
 
 	
r@   c                 x    [        U5      n[        US   US   5      n[        XSUS9n[        U4UUUUS.UD6n	U	$ )a  
Resizes `image` to `(height, width)` specified by `size` using the PIL library.

Args:
    image (`np.ndarray`):
        Image to resize.
    size (`dict[str, int]`):
        Size of the output image.
    resample (`PILImageResampling`, *optional*, defaults to `PILImageResampling.BICUBIC`):
        Resampling filter to use when resiizing the image.
    data_format (`str` or `ChannelDimension`, *optional*):
        The channel dimension format of the image. If not provided, it will be the same as the input image.
    input_data_format (`ChannelDimension` or `str`, *optional*):
        The channel dimension format of the input image. If not provided, it will be inferred.
r2   r3   F)r&   default_to_squarerC   )r&   r'   rB   rC   )r   ri   r
   r   )
r;   rA   r&   r'   rB   rC   r<   shortest_edgeoutput_sizeresized_images
             r>   r   DonutImageProcessor.resize  sf    0 T"DNDM:2Rc
 
#/
 
 r@   imagesreturn_tensorsc                    Ub  UOU R                   nUb  UOU R                  n[        U[        [        45      (       a  USSS2   n[        U5      nUb  UOU R                  nUb  UOU R                  nUb  UOU R                  nUb  UOU R                  nU	b  U	OU R                  n	U
b  U
OU R                  n
Ub  UOU R                  nUb  UOU R                  nUb  UOU R                  n[        U5      n[!        U5      (       d  [#        S5      e[%        U	U
UUUUUUS9  U Vs/ s H  n['        U5      PM     nnU Vs/ s H  n[)        U5      PM     nnU	(       a(  [+        US   5      (       a  [,        R/                  S5        Uc  [1        US   5      nU(       a!  U Vs/ s H  nU R3                  UUUS9PM     nnU(       a!  U Vs/ s H  nU R5                  UX4US9PM     nnU(       a!  U Vs/ s H  nU R7                  UUUS	9PM     nnU(       a!  U Vs/ s H  nU R9                  UX8US
9PM     nnU	(       a!  U Vs/ s H  nU R;                  UU
US9PM     nnU(       a!  U Vs/ s H  nU R=                  UXUS9PM     nnU Vs/ s H  n[?        UUUS9PM     nnSU0n[A        UUS9$ s  snf s  snf s  snf s  snf s  snf s  snf s  snf s  snf s  snf )a  
Preprocess an image or batch of images.

Args:
    images (`ImageInput`):
        Image to preprocess. Expects a single or batch of images with pixel values ranging from 0 to 255. If
        passing in images with pixel values between 0 and 1, set `do_rescale=False`.
    do_resize (`bool`, *optional*, defaults to `self.do_resize`):
        Whether to resize the image.
    size (`dict[str, int]`, *optional*, defaults to `self.size`):
        Size of the image after resizing. Shortest edge of the image is resized to min(size["height"],
        size["width"]) with the longest edge resized to keep the input aspect ratio.
    resample (`int`, *optional*, defaults to `self.resample`):
        Resampling filter to use if resizing the image. This can be one of the enum `PILImageResampling`. Only
        has an effect if `do_resize` is set to `True`.
    do_thumbnail (`bool`, *optional*, defaults to `self.do_thumbnail`):
        Whether to resize the image using thumbnail method.
    do_align_long_axis (`bool`, *optional*, defaults to `self.do_align_long_axis`):
        Whether to align the long axis of the image with the long axis of `size` by rotating by 90 degrees.
    do_pad (`bool`, *optional*, defaults to `self.do_pad`):
        Whether to pad the image. If `random_padding` is set to `True`, each image is padded with a random
        amount of padding on each size, up to the largest image size in the batch. Otherwise, all images are
        padded to the largest image size in the batch.
    random_padding (`bool`, *optional*, defaults to `self.random_padding`):
        Whether to use random padding when padding the image. If `True`, each image in the batch with be padded
        with a random amount of padding on each side up to the size of the largest image in the batch.
    do_rescale (`bool`, *optional*, defaults to `self.do_rescale`):
        Whether to rescale the image pixel values.
    rescale_factor (`float`, *optional*, defaults to `self.rescale_factor`):
        Rescale factor to rescale the image by if `do_rescale` is set to `True`.
    do_normalize (`bool`, *optional*, defaults to `self.do_normalize`):
        Whether to normalize the image.
    image_mean (`float` or `list[float]`, *optional*, defaults to `self.image_mean`):
        Image mean to use for normalization.
    image_std (`float` or `list[float]`, *optional*, defaults to `self.image_std`):
        Image standard deviation to use for normalization.
    return_tensors (`str` or `TensorType`, *optional*):
        The type of tensors to return. Can be one of:
        - Unset: Return a list of `np.ndarray`.
        - `TensorType.TENSORFLOW` or `'tf'`: Return a batch of type `tf.Tensor`.
        - `TensorType.PYTORCH` or `'pt'`: Return a batch of type `torch.Tensor`.
        - `TensorType.NUMPY` or `'np'`: Return a batch of type `np.ndarray`.
        - `TensorType.JAX` or `'jax'`: Return a batch of type `jax.numpy.ndarray`.
    data_format (`ChannelDimension` or `str`, *optional*, defaults to `ChannelDimension.FIRST`):
        The channel dimension format for the output image. Can be one of:
        - `ChannelDimension.FIRST`: image in (num_channels, height, width) format.
        - `ChannelDimension.LAST`: image in (height, width, num_channels) format.
        - Unset: defaults to the channel dimension format of the input image.
    input_data_format (`ChannelDimension` or `str`, *optional*):
        The channel dimension format for the input image. If unset, the channel dimension format is inferred
        from the input image. Can be one of:
        - `"channels_first"` or `ChannelDimension.FIRST`: image in (num_channels, height, width) format.
        - `"channels_last"` or `ChannelDimension.LAST`: image in (height, width, num_channels) format.
        - `"none"` or `ChannelDimension.NONE`: image in (height, width) format.
Nr4   zkInvalid image type. Must be of type PIL.Image.Image, numpy.ndarray, torch.Tensor, tf.Tensor or jax.ndarray.)r+   r,   r-   r.   r/   r%   r&   r'   r   zIt looks like you are trying to rescale already rescaled images. If the input images have pixel values between 0 and 1, set `do_rescale=False` to avoid rescaling them again.)r&   rC   )rA   r&   r'   rC   )rA   r&   rC   )rA   r&   rX   rC   )rA   scalerC   )rA   meanstdrC   rJ   r$   )datatensor_type)!r%   r&   r8   r9   r:   r   r'   r(   r)   r*   r+   r,   r-   r.   r/   r   r   rN   r   r	   r   r   loggerwarning_oncer   rV   r   rk   re   rescale	normalizer   r   )r;   rs   r%   r&   r'   r(   r)   r*   rX   r+   r,   r-   r.   r/   rt   rB   rC   rA   ry   s                      r>   
preprocessDonutImageProcessor.preprocess3  sT   V "+!6IDNN	'tTYYdUDM**":DT"'38'3'?|TEVEV3E3Q/W[WnWn!-4;;#-#9Zt
+9+E4K^K^'3'?|TEVEV#-#9Zt
!*!6IDNN	)&1F##:  	&!)%!		
 6<<VE.'V< 6<<VE.'V</&)44s
 $ >vay Iouvoufkd**5tO`*aouFv $#E %dYjk#  
 ouvoufkdnn5tO`naouFv
 $	 $E d]n   $	    $#E 5Rcd#  
  $#E U^op#   ou
ntej'{N_`nt 	 
 '>BBi = = w w

s6   $J/?J4!J9	J>1KKK)K
K)r)   r-   r*   r+   r%   r(   r.   r/   r'   r,   r&   )NN)FNN)"__name__
__module____qualname____firstlineno____doc__model_input_namesr   BILINEARboolr   dictstrrj   r   floatr:   r7   rO   ndarrayr   rV   re   BICUBICrk   r   r   rM   r   r   PILImager   __static_attributes____classcell__)r=   s   @r>   r"   r"   6   s   "H (( )-'9'B'B!#(,3!:>9=!W!W tCH~&!W %	!W
 !W !!W !W !W c5j)!W !W U5$u+#567!W E%e"456!W 
!W !WN ?CDH-zz- 38n- eC)9$9:;	-
 $E#/?*?$@A- 
-f  %>BDH(azz(a 38n(a 	(a
 eC)9$9:;(a $E#/?*?$@A(a 
(a\ (:'A'A>BDH0
zz0
 38n0
 %	0

 eC)9$9:;0
 $E#/?*?$@A0
 
0
l (:'A'A>BDH%zz% 38n% %	%
 eC)9$9:;% $E#/?*?$@A% 
%N %& %))-15'+-1!%$%)*.'+:>9=;?2B2H2HDH#`C`C D>`C tCH~&	`C
 -.`C tn`C %TN`C `C `C TN`C !`C tn`C U5$u+#567`C E%e"456`C !sJ!78`C  ./!`C" $E#/?*?$@A#`C$ 
%`C '`Cr@   r"   )*r   typingr   r   numpyrO   image_processing_utilsr   r   r   image_transformsr	   r
   r   r   r   image_utilsr   r   r   r   r   r   r   r   r   r   r   r   utilsr   r   r   utils.import_utilsr   r   
get_loggerr   r{   r   r"   __all__r5   r@   r>   <module>r      s    ' "  U U     J I ? 
		H	%  
;]C, ]C  ]C@ !
!r@   