Ë
    ÛÓ^j×i  ã                   ó   — d dl mZ d dlmZ d dlmZmZm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mZmZmZmZ dd
lmZ ddlm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%m&Z&m'Z'm(Z( ddl)m*Z*m+Z+ ddl,m-Z-m.Z.m/Z/m0Z0m1Z1 ddl2m3Z3m4Z4m5Z5m6Z6  e0«       rddlm7Z7  e.«       rd dl8Z8 e/«       rd dl9m:Z; ddlm<Z<m=Z= ndZ<dZ= e1j|                  e?«      Z@ e6d¬«       G d„ de«      «       ZA e6d¬«       G d„ de«      «       ZBeAZCy)é    )ÚIterable)Ú	lru_cache)ÚAnyÚOptionalÚUnionNé   )ÚBatchFeature)ÚBaseImageProcessor)Úcenter_crop)Úconvert_to_rgbÚdivide_to_patchesÚget_resize_output_image_sizeÚget_size_with_aspect_ratioÚgroup_images_by_shapeÚreorder_images)Ú	normalize)Úrescale)Úresize)ÚChannelDimensionÚ
ImageInputÚ	ImageTypeÚSizeDictÚget_image_sizeÚ#get_image_size_for_max_height_widthÚget_image_typeÚget_max_height_widthÚinfer_channel_dimension_formatÚis_valid_imageÚload_image_as_tensor)ÚImagesKwargsÚUnpack)Ú
TensorTypeÚis_torch_availableÚis_torchvision_availableÚis_vision_availableÚlogging)Úis_rocm_platformÚis_torchdynamo_compilingÚis_torchvision_greater_or_equalÚrequires)ÚPILImageResampling)Ú
functional)Úpil_torch_interpolation_mappingÚtorch_pil_interpolation_mapping)ÚtorchÚtorchvision)Úbackendsc                    óF  ‡ — e Zd ZdZdee   fˆ fd„Zedefd„«       Z	ede
fd„«       Zde
ee
   z  eee
      z  fd„Z	 	 	 d9d
eded	z  de
ez  d	z  ded   dee   ddfd„Zd
edefd„Z	 	 	 	 	 	 d:ded   deded	z  de
d	z  deded	z  ded	z  deed   df   fd„Z	 	 d;d
ddedddeddf
d„Ze	 	 d;d
dd eeef   d!ed"   deddf
d#„«       Zd
dd$eddfd%„Zd
dd&eee   z  d'eee   z  ddfd(„Z ed)¬*«      	 	 	 	 	 	 d<d+ed	z  d,eee   z  d	z  d-eee   z  d	z  d.ed	z  d/ed	z  ded   defd0„«       Z ddd.ed/ed+ed,eee   z  d-eee   z  ddfd1„Z!d
ddeddfd2„Z"ded   d3ededdd4ed5ed.ed/ed+ed,eee   z  d	z  d-eee   z  d	z  d6ed	z  ded	z  ded	z  d7e
e#z  d	z  de$f d8„Z%ˆ xZ&S )=ÚTorchvisionBackendzATorchvision backend for GPU-accelerated batched image processing.Úkwargsc                 óH   •— t        ‰| �  di |¤Ž  | j                  di |¤Ž y ©N© ©ÚsuperÚ__init__Ú_set_attributes©Úselfr4   Ú	__class__s     €úq/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/transformers/image_processing_backends.pyr:   zTorchvisionBackend.__init__Y   ó&   ø€ Ü‰ÑÑ"˜6Ò"Øˆ×ÑÑ&˜vÓ&ó    Úreturnc                 ó.   — t         j                  d«       y)á  
        `bool`: Whether or not this image processor is using the fast (Torchvision) backend.
        The `is_fast` property is deprecated and will be removed in v5.3 of Transformers.
        Use the `backend` attribute instead (e.g., `processor.backend == "torchvision"`).
        ú£The `is_fast` property is deprecated and will be removed in v5.3 of Transformers. Use the `backend` attribute instead (e.g., `processor.backend == 'torchvision'`).T©ÚloggerÚwarning_once©r=   s    r?   Úis_fastzTorchvisionBackend.is_fast]   s   € ô 	×Ñð`ô	
ð rA   c                  ó   — y)úB
        `str`: The backend used by this image processor.
        r0   r7   rI   s    r?   ÚbackendzTorchvisionBackend.backendj   s   € ð
 rA   Úimage_url_or_urlsc                 óô   — t        |t        t        f«      r|D �cg c]  }| j                  |«      ‘Œ c}S t        |t        «      rt        |«      S t        |«      r|S t        dt        |«      › �«      ‚c c}w )zû
        Convert a single or a list of URLs / paths into `torch.Tensor` objects.

        Already-valid image objects (tensors, numpy arrays, PIL Images) are passed through
        unchanged so that callers who pre-load images are unaffected.
        z=only a single or a list of entries is supported but got type=)	Ú
isinstanceÚlistÚtupleÚfetch_imagesÚstrr   r   Ú	TypeErrorÚtype)r=   rN   Úxs      r?   rS   zTorchvisionBackend.fetch_imagesq   sv   € ô Ð'¬$´¨Ô7Ø2CÖD¨Q�D×%Ñ% aÕ(ÒDÐDÜÐ)¬3Ô/Ü'Ð(9Ó:Ð:ÜÐ-Ô.Ø$Ð$äÐ[Ô\`ÐarÓ\sÐ[tÐuÓvÐvùò Es   ›A5NÚimageÚdo_convert_rgbÚinput_data_formatÚdeviceztorch.deviceútorch.Tensorc                 óf  — t        |«      }|t        j                  t        j                  t        j                  fvrt        d|› �«      ‚|r| j                  |«      }|t        j                  k(  rt        j                  |«      }n6|t        j                  k(  r#t        j                  |«      j                  «       }|j                  dk(  r|j                  d«      }|€t        |«      }|t        j                   k(  r!|j#                  ddd«      j                  «       }|�|j%                  |«      }|S )z/Process a single image for torchvision backend.úUnsupported input image type é   r   r   )r   r   ÚPILÚTORCHÚNUMPYÚ
ValueErrorr   ÚtvFÚpil_to_tensorr/   Ú
from_numpyÚ
contiguousÚndimÚ	unsqueezer   r   ÚLASTÚpermuteÚto)r=   rX   rY   rZ   r[   r4   Ú
image_types          r?   Úprocess_imagez TorchvisionBackend.process_image�   sý   € ô $ EÓ*ˆ
ØœiŸm™m¬Y¯_©_¼i¿o¹oÐNÑNÜÐ<¸Z¸LÐIÓJÐJáØ×'Ñ'¨Ó.ˆEàœŸ™Ò&Ü×%Ñ% eÓ,‰EØœ9Ÿ?™?Ò*Ü×$Ñ$ UÓ+×6Ñ6Ó8ˆEà�:‰:˜Š?Ø—O‘O AÓ&ˆEàÐ$Ü >¸uÓ EÐàÔ 0× 5Ñ 5Ò5Ø—M‘M ! Q¨Ó*×5Ñ5Ó7ˆEàÐØ—H‘H˜VÓ$ˆEàˆrA   c                 ó   — t        |«      S ©zConvert an image to RGB format.©r   ©r=   rX   s     r?   r   z!TorchvisionBackend.convert_to_rgb¤   ó   € ä˜eÓ$Ð$rA   ÚimagesÚpad_sizeÚ
fill_valueÚpadding_modeÚreturn_maskÚdisable_groupingÚ	is_nested)r\   r\   c                 ó¦  — |�@|j                   r|j                  st        d|› d�«      ‚|j                   |j                  f}nt        |«      }t	        |||¬«      \  }	}
i }i }|	j                  «       D ]¹  \  }}|j                  dd }|d   |d   z
  }|d   |d   z
  }|dk  s|dk  rt        d|› d	|› d�«      ‚||k7  rdd||f}t        j                  ||||¬
«      }|||<   |sŒst        j                  |t        j                  ¬«      dddd…dd…f   }d|dd|d   …d|d   …f<   |||<   Œ» t        ||
|¬«      }|rt        ||
|¬«      }||fS |S )z5Pad images using Torchvision with batched operations.NúCPad size must contain 'height' and 'width' keys only. Got pad_size=ú.)ry   rz   éþÿÿÿr   r   zrPadding dimensions are negative. Please make sure that the `pad_size` is larger than the image size. Got pad_size=z, image_size=)Úfillrw   ©Údtype.)rz   )ÚheightÚwidthrc   r   r   ÚitemsÚshaperd   Úpadr/   Ú
zeros_likeÚint64r   )r=   rt   ru   rv   rw   rx   ry   rz   r4   Úgrouped_imagesÚgrouped_images_indexÚprocessed_images_groupedÚprocessed_masks_groupedr…   Ústacked_imagesÚ
image_sizeÚpadding_heightÚpadding_widthÚpaddingÚstacked_masksÚprocessed_imagesÚprocessed_maskss                         r?   r†   zTorchvisionBackend.pad¨   sÁ  € ð ÐØ—O’O¨¯ªÜ Ð#fÐgoÐfpÐpqÐ!rÓsÐsØ Ÿ™¨¯©Ð8‰Hä+¨FÓ3ˆHä/DØÐ%5Àô0
Ñ,ˆÐ,ð $&Ð Ø"$ÐØ%3×%9Ñ%9Ó%;ò 	?Ñ!ˆE�>Ø'×-Ñ-¨b¨cÐ2ˆJØ% a™[¨:°a©=Ñ8ˆNØ$ Q™K¨*°Q©-Ñ7ˆMØ Ò! ]°QÒ%6Ü ð0Ø08¨z¸ÀzÀlÐRSðUóð ð ˜XÒ%Ø˜a °Ð?�Ü!$§¡¨¸ÀzÐ`lÔ!m�Ø.<Ð$ UÑ+âÜ %× 0Ñ 0°ÄuÇ{Á{Ô SÐTWÐYZÒ\]Ò_`ÐT`Ñ a�ØGH�˜c ? Z°¡] ?°O°jÀ±m°OÐCÑDØ1>Ð'¨Ò.ð#	?ô& *Ð*BÐDXÐdmÔnÐÙÜ,Ð-DÐFZÐfoÔpˆOØ# _Ð4Ð4àÐrA   ÚsizeÚresamplez7PILImageResampling | tvF.InterpolationMode | int | NoneÚ	antialiasc                 óÄ  — |�#t        |t        t        f«      r
t        |   }n|}nt        j
                  j                  }|t        j
                  j                  k(  r:t        d«      s/t        j                  d«       t        j
                  j                  }|j                  r?|j                  r3t        |j                  «       dd |j                  |j                  «      }n¿|j                  r(t!        ||j                  dt"        j$                  ¬«      }n‹|j&                  r?|j(                  r3t+        |j                  «       dd |j&                  |j(                  «      }n@|j,                  r%|j.                  r|j,                  |j.                  f}nt1        d|› d�«      ‚t3        «       rt5        «       r| j7                  ||||«      S t	        j8                  ||||¬	«      S )
z"Resize an image using Torchvision.Nz0.27aC  You have used a torchvision backend image processor with LANCZOS resample which is not supported for torch.Tensor with torchvision < 0.27. BICUBIC resample will be used as an alternative. Please upgrade torchvision to 0.27+ or fall back to a pil backend image processor if you want full consistency with the original model.r~   F©r•   Údefault_to_squarerZ   újSize must contain 'height' and 'width' keys, or 'max_height' and 'max_width', or 'shortest_edge' key. Got r}   ©Úinterpolationr—   )rP   r+   Úintr-   rd   ÚInterpolationModeÚBILINEARÚLANCZOSr)   rG   rH   ÚBICUBICÚshortest_edgeÚlongest_edger   r•   r   r   ÚFIRSTÚ
max_heightÚ	max_widthr   r‚   rƒ   rc   r(   r'   Ú_compile_friendly_resizer   )r=   rX   r•   r–   r—   r4   r�   Únew_sizes           r?   r   zTorchvisionBackend.resizeÚ   s–  € ð ÐÜ˜(Ô%7¼Ð$=Ô>Ü ?ÀÑ I‘à (‘ä×1Ñ1×:Ñ:ˆMØœC×1Ñ1×9Ñ9Ò9ÔBaÐbhÔBiÜ×ÑðAôô  ×1Ñ1×9Ñ9ˆMà×Ò $×"3Ò"3Ü1Ø—
‘
“˜R˜SÐ!Ø×"Ñ"Ø×!Ñ!ó‰Hð
 ×ÒÜ3ØØ×'Ñ'Ø"'Ü"2×"8Ñ"8ô	‰Hð �_Š_ §¢Ü:¸5¿:¹:»<ÈÈÐ;LÈdÏoÉoÐ_c×_mÑ_mÓn‰HØ�[Š[˜TŸZšZØŸ™ T§Z¡ZÐ0‰HäðØ�6˜ðóð ô $Ô%Ô*:Ô*<Ø×0Ñ0°¸À-ÐQZÓ[Ð[Ü�z‰z˜% ¸ÐR[Ô\Ð\rA   r©   r�   ztvF.InterpolationModec                 óš  — | j                   t        j                  k(  r”| j                  «       dz  } t	        j
                  | |||¬«      } | dz  } t        j                  | dkD  d| «      } t        j                  | dk  d| «      } | j                  «       j                  t        j                  «      } | S t	        j
                  | |||¬«      } | S )zOA wrapper around tvF.resize for torch.compile compatibility with uint8 tensors.é   rœ   éÿ   r   )	r�   r/   Úuint8Úfloatrd   r   ÚwhereÚroundrl   )rX   r©   r�   r—   s       r?   r¨   z+TorchvisionBackend._compile_friendly_resize  s«   € ð �;‰;œ%Ÿ+™+Ò%Ø—K‘K“M CÑ'ˆEÜ—J‘J˜u h¸mÐW`ÔaˆEØ˜C‘KˆEÜ—K‘K ¨¡¨S°%Ó8ˆEÜ—K‘K ¨¡	¨1¨eÓ4ˆEØ—K‘K“M×$Ñ$¤U§[¡[Ó1ˆEð ˆô —J‘J˜u h¸mÐW`ÔaˆEØˆrA   Úscalec                 ó   — ||z  S )z5Rescale an image by a scale factor using Torchvision.r7   ©r=   rX   r±   r4   s       r?   r   zTorchvisionBackend.rescale#  s   € ð �u‰}ÐrA   ÚmeanÚstdc                 ó0   — t        j                  |||«      S )z%Normalize an image using Torchvision.)rd   r   ©r=   rX   r´   rµ   r4   s        r?   r   zTorchvisionBackend.normalize,  s   € ô �}‰}˜U D¨#Ó.Ð.rA   é
   )ÚmaxsizeÚdo_normalizeÚ
image_meanÚ	image_stdÚ
do_rescaleÚrescale_factorc                 óŒ   — |r>|r<t        j                  ||¬«      d|z  z  }t        j                  ||¬«      d|z  z  }d}|||fS )N)r[   g      ð?F)r/   Útensor)r=   rº   r»   r¼   r½   r¾   r[   s          r?   Ú!_fuse_mean_std_and_rescale_factorz4TorchvisionBackend._fuse_mean_std_and_rescale_factor6  sO   € ñ ™,äŸ™ j¸Ô@ÀCÈ.ÑDXÑYˆJÜŸ™ Y°vÔ>À#ÈÑBVÑWˆIØˆJØ˜9 jÐ0Ð0rA   c                 óâ   — | j                  ||||||j                  ¬«      \  }}}|r3| j                  |j                  t        j
                  ¬«      ||«      }|S |r| j                  ||«      }|S )zFRescale and normalize images using Torchvision (fused for efficiency).)rº   r»   r¼   r½   r¾   r[   r€   )rÁ   r[   r   rl   r/   Úfloat32r   )r=   rt   r½   r¾   rº   r»   r¼   s          r?   Úrescale_and_normalizez(TorchvisionBackend.rescale_and_normalizeG  s   € ð -1×,RÑ,RØ%Ø!ØØ!Ø)Ø—=‘=ð -Só -
Ñ)ˆ
�I˜zñ Ø—^‘^ F§I¡I´E·M±M IÓ$BÀJÐPYÓZˆFð ˆñ Ø—\‘\ &¨.Ó9ˆFàˆrA   c                 ó4  — |j                   �|j                  €t        d|j                  «       › �«      ‚|j                  dd \  }}|j                   |j                  }}||kD  s||kD  rv||kD  r||z
  dz  nd||kD  r||z
  dz  nd||kD  r||z
  dz   dz  nd||kD  r||z
  dz   dz  ndg}t        j                  ||d¬«      }|j                  dd \  }}||k(  r||k(  r|S t        ||z
  dz  «      }	t        ||z
  dz  «      }
t        j                  ||	|
||«      S )	z'Center crop an image using Torchvision.Nú=The size dictionary must have keys 'height' and 'width'. Got r~   r_   r   r   )r   g       @)	r‚   rƒ   rc   Úkeysr…   rd   r†   rž   Úcrop)r=   rX   r•   r4   Úimage_heightÚimage_widthÚcrop_heightÚ
crop_widthÚpadding_ltrbÚcrop_topÚ	crop_lefts              r?   r   zTorchvisionBackend.center_crop`  sS  € ð �;‰;Ð $§*¡*Ð"4ÜÐ\Ð]a×]fÑ]fÓ]hÐ\iÐjÓkÐkØ$)§K¡K°°Ð$4Ñ!ˆ�kØ"&§+¡+¨t¯z©z�Zˆà˜Ò# {°\Ò'Aà3=ÀÒ3K�˜kÑ)¨aÒ/ÐQRØ5@À<Ò5O�˜|Ñ+°Ò1ÐUVØ7AÀKÒ7O�˜kÑ)¨AÑ-°!Ò3ÐUVØ9DÀ|Ò9S�˜|Ñ+¨aÑ/°AÒ5ÐYZð	ˆLô —G‘G˜E <°aÔ8ˆEØ(-¯©°B°CÐ(8Ñ%ˆL˜+Ø˜[Ò(¨[¸LÒ-HØ�ä˜ {Ñ2°cÑ9Ó:ˆÜ˜ zÑ1°SÑ8Ó9ˆ	Ü�x‰x˜˜x¨°KÀÓLÐLrA   Ú	do_resizeÚdo_center_cropÚ	crop_sizeÚdo_padÚreturn_tensorsc           	      ó¸  — t        ||¬«      \  }}i }|j                  «       D ]   \  }}|r| j                  |||¬«      }|||<   Œ" t        ||«      }t        ||¬«      \  }}i }|j                  «       D ]4  \  }}|r| j	                  ||«      }| j                  ||||	|
|«      }|||<   Œ6 t        ||«      }|r| j                  |||¬«      }t        d|i|¬«      S )z=Preprocess using Torchvision backend (fast, GPU-accelerated).)ry   ©rX   r•   r–   )ru   ry   Úpixel_values©ÚdataÚtensor_type)r   r„   r   r   r   rÄ   r†   r	   )r=   rt   rÐ   r•   r–   rÑ   rÒ   r½   r¾   rº   r»   r¼   rÓ   ru   ry   rÔ   r4   r‰   rŠ   Úresized_images_groupedr…   r�   Úresized_imagesr‹   r“   s                            r?   Ú_preprocesszTorchvisionBackend._preprocess|  s&  € ô* 0EÀVÐ^nÔ/oÑ,ˆÐ,Ø!#ÐØ%3×%9Ñ%9Ó%;ò 	;Ñ!ˆE�>ÙØ!%§¡°>ÈÐW_ Ó!`�Ø,:Ð" 5Ò)ð	;ô (Ð(>Ð@TÓUˆô 0EÀ^ÐfvÔ/wÑ,ˆÐ,Ø#%Ð Ø%3×%9Ñ%9Ó%;ò 	=Ñ!ˆE�>ÙØ!%×!1Ñ!1°.À)Ó!L�à!×7Ñ7Ø 
¨N¸LÈ*ÐV_óˆNð /=Ð$ UÒ+ð	=ô *Ð*BÐDXÓYÐáØ#Ÿx™xÐ(8À8Ð^n˜xÓoÐä .Ð2BÐ!CÐQ_Ô`Ð`rA   )NNN)Nr   ÚconstantFFF)NT)NNNNNN)'Ú__name__Ú
__module__Ú__qualname__Ú__doc__r!   r    r:   ÚpropertyÚboolrJ   rT   rM   rQ   rS   r   r   r   rn   r   r   rž   r   rR   r†   r   Ústaticmethodr¨   r®   r   r   r   r   rÁ   rÄ   r   r"   r	   rÝ   Ú__classcell__©r>   s   @r?   r3   r3   U   s|  ø„ áKð' ¨Ñ!5õ 'ð ð
˜ò 
ó ð
ð ð˜ò ó ððw¨c°D¸±I©oÀÀTÈ#ÁYÁÑ.Oó wð& '+Ø;?Ø+/ñ!àð!ð ˜t™ð!ð Ð!1Ñ1°DÑ8ð	!ð
 ˜Ñ(ð!ð ˜Ñ&ð!ð 
ó!ðF% Jð %°:ó %ð "Ø!"Ø#-Ø!Ø(-Ø!&ñ0 à�^Ñ$ð0 ð ð0 ð ˜$‘Jð	0 ð
 ˜D‘jð0 ð ð0 ð  ™+ð0 ð ˜$‘;ð0 ð 
ˆuÐ3Ñ4°nÐDÑ	Eó0 ðl OSØñ4]àð4]ð ð4]ð Lð	4]ð
 ð4]ð 
ó4]ðl ð <@Øñ	Øðà˜˜S˜‘/ðð  Ð 7Ñ8ðð ð	ð
 
òó ðð$àðð ðð
 
óð/àð/ð �h˜u‘oÑ%ð/ð �X˜e‘_Ñ$ð	/ð 
ó/ñ �rÔð %)Ø15Ø04Ø"&Ø'+Ø+/ñ1à˜T‘kð1ð ˜D ™KÑ'¨$Ñ.ð1ð ˜4 ™;Ñ&¨Ñ-ð	1ð
 ˜4‘Kð1ð  ™ð1ð ˜Ñ(ð1ð 
ò1ó ð1ð àðð ðð ð	ð
 ðð ˜D ™KÑ'ðð ˜4 ™;Ñ&ðð 
óð2MàðMð ðMð
 
óMð8-aà�^Ñ$ð-að ð-að ð	-að
 Lð-að ð-að ð-að ð-að ð-að ð-að ˜D ™KÑ'¨$Ñ.ð-að ˜4 ™;Ñ&¨Ñ-ð-að �t‘ð-að ˜T‘/ð-að  ™+ð-að  ˜jÑ(¨4Ñ/ð!-að$ 
÷%-arA   r3   )Úvisionc                   ó:  ‡ — e Zd ZdZdee   fˆ fd„Zedefd„«       Z	ede
fd„«       Z	 	 d*ded	edz  d
e
ez  dz  dee   dej                  f
d„Zdedefd„Z	 	 	 	 d+deej                     dededz  de
dz  dedeeej                     eej                     f   eej                     z  fd„Z	 	 d*dej                  dedddedz  dej                  f
d„Zdej                  dedej                  fd„Zdej                  deee   z  deee   z  dej                  fd„Zdej                  dedej                  fd„Zdeej                     dededdded ed!ed"ed#ed$eee   z  dz  d%eee   z  dz  d&edz  dedz  d'e
ez  dz  defd(„Zde e
e!f   fˆ fd)„Z"ˆ xZ#S ),Ú
PilBackendz9PIL/NumPy backend for portable CPU-only image processing.r4   c                 óH   •— t        ‰| �  di |¤Ž  | j                  di |¤Ž y r6   r8   r<   s     €r?   r:   zPilBackend.__init__°  r@   rA   rB   c                 ó.   — t         j                  d«       y)rD   rE   FrF   rI   s    r?   rJ   zPilBackend.is_fast´  s   € ô 	×Ñð`ô	
ð rA   c                  ó   — y)rL   Úpilr7   rI   s    r?   rM   zPilBackend.backendÁ  s   € ð
 rA   NrX   rY   rZ   c                 óŠ  — t        |«      }|t        j                  t        j                  t        j                  fvrt        d|› �«      ‚|r| j                  |«      }|t        j                  k(  r9t        j                  |«      }|j                  dk\  r8|€t        j                  n|}n#|t        j                  k(  r|j                  «       }|j                  dk(  rt        j                  |d¬«      }|€t        |«      }|t        j                  k(  r0t        |t        j                   «      rt        j"                  |d«      }|S )z'Process a single image for PIL backend.r^   é   r_   r   )Úaxis)r_   r   r   )r   r   r`   ra   rb   rc   r   ÚnpÚarrayrh   r   rj   ÚnumpyÚexpand_dimsr   rP   ÚndarrayÚ	transpose)r=   rX   rY   rZ   r4   rm   s         r?   rn   zPilBackend.process_imageÈ  sý   € ô $ EÓ*ˆ
ØœiŸm™m¬Y¯_©_¼i¿o¹oÐNÑNÜÐ<¸Z¸LÐIÓJÐJáØ×'Ñ'¨Ó.ˆEàœŸ™Ò&Ü—H‘H˜U“OˆEà�z‰z˜QŠØ=NÐ=VÔ$4×$9Ò$9Ð\mÑ!Øœ9Ÿ?™?Ò*Ø—K‘K“MˆEà�:‰:˜Š?Ü—N‘N 5¨qÔ1ˆEàÐ$Ü >¸uÓ EÐàÔ 0× 5Ñ 5Ò5ä˜%¤§¡Ô,ÜŸ™ U¨IÓ6�àˆrA   c                 ó   — t        |«      S rp   rq   rr   s     r?   r   zPilBackend.convert_to_rgbì  rs   rA   rt   ru   rv   rw   rx   c                 óž  — |�@|j                   r|j                  st        d|› d�«      ‚|j                   |j                  }}nt        |«      \  }}g }	g }
|D ]í  }t	        |t
        j                  ¬«      \  }}||z
  }||z
  }|dk  s|dk  rt        d|› d|› d|› d|› d	�	«      ‚||k7  s||k7  r@d
d|fd|ff}|dk(  rt        j                  ||d|¬«      }nt        j                  |||¬«      }|	j                  |«       |sŒ«t        j                  ||ft        j                  ¬«      }d|d|…d|…f<   |
j                  |«       Œï |r|	|
fS |	S )z)Pad images to specified size using NumPy.Nr|   r}   ©Úchannel_dimr   zsPadding dimensions are negative. Please make sure that the `pad_size` is larger than the image size. Got pad_size=(z, z), image_size=(z).)r   r   rÞ   )ÚmodeÚconstant_values)rü   r€   r   )r‚   rƒ   rc   r   r   r   r¥   rò   r†   ÚappendÚzerosrˆ   )r=   rt   ru   rv   rw   rx   r4   Útarget_heightÚtarget_widthr“   r”   rX   r‚   rƒ   r�   r�   Ú	pad_widthÚmasks                     r?   r†   zPilBackend.padð  s–  € ð ÐØ—O’O¨¯ªÜ Ð#fÐgoÐfpÐpqÐ!rÓsÐsØ*2¯/©/¸8¿>¹>˜<‰Mä*>¸vÓ*FÑ'ˆM˜<àÐØˆàò 	-ˆEÜ*¨5Ô>N×>TÑ>TÔU‰MˆF�EØ*¨VÑ3ˆNØ(¨5Ñ0ˆMà Ò! ]°QÒ%6Ü ð1Ø1>°¸rÀ,ÀÈÐ_eÐ^fÐfhÐinÐhoÐoqðsóð ð
 ˜Ò&¨%°<Ò*?ð $ a¨Ð%8¸1¸mÐ:LÐM�	Ø :Ò-ÜŸF™F 5¨)¸*ÐV`Ôa‘EäŸF™F 5¨)¸,ÔG�Eà×#Ñ# EÔ*âÜ—x‘x °Ð =ÄRÇXÁXÔN�Ø()��W�f�W˜f˜u˜f�_Ñ%Ø×&Ñ& tÕ,ð3	-ñ6 Ø# _Ð4Ð4ØÐrA   r•   r–   zPILImageResampling | NoneÚreducing_gapc                 óT  — |�>t        |t        t        f«      s(t        �|t        v r
t        |   }nt        j                  }|�|nt        j                  }|j
                  rN|j                  rBt        |t        j                  ¬«      \  }}t        ||f|j
                  |j                  «      }nÎ|j
                  r(t        ||j
                  dt        j                  ¬«      }nš|j                  rN|j                  rBt        |t        j                  ¬«      \  }}t        ||f|j                  |j                  «      }n@|j                  r%|j                   r|j                  |j                   f}nt#        d|› d�«      ‚t%        ||||t        j                  t        j                  ¬«      S )z Resize an image using PIL/NumPy.rú   Fr™   r›   r}   )r•   r–   r  Údata_formatrZ   )rP   r+   rž   r.   r    r£   r¤   r   r   r¥   r   r   r¦   r§   r   r‚   rƒ   rc   Ú	np_resize)	r=   rX   r•   r–   r  r4   r‚   rƒ   r©   s	            r?   r   zPilBackend.resize#  su  € ð Ð¬
°8Ô>PÔRUÐ=VÔ(WÜ.Ð:¸xÔKjÑ?jÜ:¸8ÑD‘ä-×6Ñ6�Ø'Ð3‘8Ô9K×9TÑ9Tˆà×Ò $×"3Ò"3Ü*¨5Ô>N×>TÑ>TÔU‰MˆF�EÜ1Ø˜�Ø×"Ñ"Ø×!Ñ!ó‰Hð
 ×ÒÜ3ØØ×'Ñ'Ø"'Ü"2×"8Ñ"8ô	‰Hð �_Š_ §¢Ü*¨5Ô>N×>TÑ>TÔU‰MˆF�EÜ:¸FÀE¸?ÈDÏOÉOÐ]a×]kÑ]kÓl‰HØ�[Š[˜TŸZšZØŸ™ T§Z¡ZÐ0‰HäðØ�6˜ðóð ô
 ØØØØ%Ü(×.Ñ.Ü.×4Ñ4ô
ð 	
rA   r±   c                 óX   — t        ||t        j                  t        j                  ¬«      S )z/Rescale an image by a scale factor using NumPy.)r±   r  rZ   )Ú
np_rescaler   r¥   r³   s       r?   r   zPilBackend.rescaleV  s)   € ô ØØÜ(×.Ñ.Ü.×4Ñ4ô	
ð 	
rA   r´   rµ   c                 óZ   — t        |||t        j                  t        j                  ¬«      S )zNormalize an image using NumPy.)r´   rµ   r  rZ   )Únp_normalizer   r¥   r·   s        r?   r   zPilBackend.normalized  s,   € ô ØØØÜ(×.Ñ.Ü.×4Ñ4ô
ð 	
rA   c                 óì   — |j                   �|j                  €t        d|j                  «       › �«      ‚t	        ||j                   |j                  ft
        j                  t
        j                  ¬«      S )z!Center crop an image using NumPy.rÆ   )r•   r  rZ   )r‚   rƒ   rc   rÇ   Únp_center_cropr   r¥   )r=   rX   r•   r4   s       r?   r   zPilBackend.center_cropt  sg   € ð �;‰;Ð $§*¡*Ð"4ÜÐ\Ð]a×]fÑ]fÓ]hÐ\iÐjÓkÐkäØØ—+‘+˜tŸz™zÐ*Ü(×.Ñ.Ü.×4Ñ4ô	
ð 	
rA   rÐ   rÑ   rÒ   r½   r¾   rº   r»   r¼   rÓ   rÔ   c                 ó$  — g }|D ]f  }|r| j                  |||¬«      }|r| j                  ||«      }|r| j                  ||«      }|	r| j                  ||
|«      }|j	                  |«       Œh |r| j                  ||¬«      }t        d|i|¬«      S )z2Preprocess using PIL backend (portable, CPU-only).rÖ   )ru   r×   rØ   )r   r   r   r   rþ   r†   r	   )r=   rt   rÐ   r•   r–   rÑ   rÒ   r½   r¾   rº   r»   r¼   rÓ   ru   rÔ   r4   r“   rX   s                     r?   rÝ   zPilBackend._preprocess…  s¨   € ð& ÐØò 		+ˆEÙØŸ™¨%°dÀX˜ÓN�ÙØ×(Ñ(¨°	Ó:�ÙØŸ™ U¨NÓ;�ÙØŸ™ u¨j¸)ÓD�Ø×#Ñ# EÕ*ð		+ñ Ø#Ÿx™xÐ(8À8˜xÓLÐä .Ð2BÐ!CÐQ_Ô`Ð`rA   c                 ó|   •— t         ‰| �  «       }|j                  dd«      j                  d«      r|d   d d |d<   |S )NÚimage_processor_typeÚ ÚPiléýÿÿÿ)r9   Úto_dictÚgetÚendswith)r=   Úprocessor_dictr>   s     €r?   r  zPilBackend.to_dict©  sK   ø€ Ü™™Ó*ˆà×ÑÐ4°bÓ9×BÑBÀ5ÔIØ5CÐDZÑ5[Ð\_Ð]_Ð5`ˆNÐ1Ñ2ØÐrA   )NN)Nr   rÞ   F)$rß   rà   rá   râ   r!   r    r:   rã   rä   rJ   rT   rM   r   r   rò   rö   rn   r   rQ   r   rž   rR   r†   r   r®   r   r   r   r   r"   r	   rÝ   Údictr   r  ræ   rç   s   @r?   rê   rê   ¬  s  ø„ áCð' ¨Ñ!5õ 'ð ð
˜ò 
ó ð
ð ð˜ò ó ðð '+Ø;?ñ	"àð"ð ˜t™ð"ð Ð!1Ñ1°DÑ8ð	"ð
 ˜Ñ&ð"ð 
�‰ó"ðH% Jð %°:ó %ð "Ø!"Ø#-Ø!ñ1 à�R—Z‘ZÑ ð1 ð ð1 ð ˜$‘Jð	1 ð
 ˜D‘jð1 ð ð1 ð 
ˆt�B—J‘JÑ  b§j¡jÑ!1Ð1Ñ	2°T¸"¿*¹*Ñ5EÑ	Eó1 ðn 15Ø#'ñ1
à�z‰zð1
ð ð1
ð .ð	1
ð
 ˜D‘jð1
ð 
�‰ó1
ðf
à�z‰zð
ð ð
ð
 
�‰ó
ð
à�z‰zð
ð �h˜u‘oÑ%ð
ð �X˜e‘_Ñ$ð	
ð 
�‰ó
ð 
à�z‰zð
ð ð
ð
 
�‰ó
ð""aà�R—Z‘ZÑ ð"að ð"að ð	"að
 .ð"að ð"að ð"að ð"að ð"að ð"að ˜D ™KÑ'¨$Ñ.ð"að ˜4 ™;Ñ&¨Ñ-ð"að �t‘ð"að ˜T‘/ð"að ˜jÑ(¨4Ñ/ð"að" 
ó#"aðH˜˜c 3˜h™÷ ñ rA   rê   )DÚcollections.abcr   Ú	functoolsr   Útypingr   r   r   rô   rò   Úimage_processing_baser	   Úimage_processing_utilsr
   Úimage_transformsr   r  r   r   r   r   r   r   r   r  r   r	  r   r  Úimage_utilsr   r   r   r   r   r   r   r   r   r   r   Úprocessing_utilsr    r!   Úutilsr"   r#   r$   r%   r&   Úutils.import_utilsr'   r(   r)   r*   r+   r/   Útorchvision.transforms.v2r,   rd   r-   r.   Ú
get_loggerrß   rG   r3   rê   ÚBaseImageProcessorFastr7   rA   r?   ú<module>r&     sÿ   ðõ %Ý ß 'Ñ 'ã å /Ý 6õ÷÷ õõõ÷÷ ÷ ñ ÷ 3÷õ ÷ vÓ uñ ÔÝ/áÔÛáÔÝ;ç]Ð]à&*Ð#Ø&*Ð#ð 
ˆ×	Ñ	˜HÓ	%€ñ 
Ð+Ô,ôSaÐ+ó Saó -ðSañl
 
�;ÔôAÐ#ó Aó  ðAðJ ,Ñ rA   