§
    m�’jÈg  ã                   ó4  — 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¦  «        ¦   «         ZBeAZCdS )é    )Ú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                    óÆ  ‡ — e Zd ZdZdee         fˆ fd„Zedefd„¦   «         Z	dee
e         z  e
e
e                  z  fd„Z	 	 	 d<d	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  d0ee
e         z  dz  d1edz  d2edz  ded         defd3„¦   «         Zddd1ed2ed.ed/ee
e         z  d0ee
e         z  ddfd4„Z d	ddeddfd5„Z!de
d         d6ededd d7ed8ed1ed2ed.ed/ee
e         z  dz  d0ee
e         z  dz  d9edz  dedz  dedz  d:ee"z  dz  de#f d;„Z$ˆ xZ%S )@ÚTorchvisionBackendzATorchvision backend for GPU-accelerated batched image processing.Úkwargsc                 óT   •—  t          ¦   «         j        di |¤Ž  | j        di |¤Ž d S ©N© ©ÚsuperÚ__init__Ú_set_attributes©Úselfr4   Ú	__class__s     €úTC:\Projects\DSCons\.venv\Lib\site-packages\transformers\image_processing_backends.pyr:   zTorchvisionBackend.__init__Y   ó?   ø€ Ø�‰ŒÔÐ"Ð"˜6Ð"Ð"Ð"ØˆÔÐ&Ð&˜vÐ&Ð&Ð&Ð&Ð&ó    Úreturnc                 ó   — dS )úB
        `str`: The backend used by this image processor.
        r0   r7   ©r=   s    r?   ÚbackendzTorchvisionBackend.backend]   s	   € ð
 ˆ}rA   Úimage_url_or_urlsc                 ó   ‡ — t          |t          t          f¦  «        rˆ fd„|D ¦   «         S t          |t          ¦  «        rt	          |¦  «        S t          |¦  «        r|S t          dt          |¦  «        › �¦  «        ‚)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.
        c                 ó:   •— g | ]}‰                      |¦  «        ‘ŒS r7   )Úfetch_images)Ú.0Úxr=   s     €r?   ú
<listcomp>z3TorchvisionBackend.fetch_images.<locals>.<listcomp>l   s'   ø€ ÐDÐDÐD¨Q�D×%Ò% aÑ(Ô(ÐDÐDÐDrA   z=only a single or a list of entries is supported but got type=)Ú
isinstanceÚlistÚtupleÚstrr   r   Ú	TypeErrorÚtype)r=   rG   s   ` r?   rJ   zTorchvisionBackend.fetch_imagesd   s”   ø€ õ Ð'­$µ¨Ñ7Ô7ð 	wØDÐDÐDÐDÐ2CÐDÑDÔDÐDÝÐ)­3Ñ/Ô/ð 	wÝ'Ð(9Ñ:Ô:Ð:ÝÐ-Ñ.Ô.ð 	wØ$Ð$åÐuÕ\`ÐarÑ\sÔ\sÐuÐuÑvÔvÐvrA   NÚimageÚdo_convert_rgbÚinput_data_formatÚdeviceztorch.deviceútorch.Tensorc                 óx  — t          |¦  «        }|t          j        t          j        t          j        fvrt          d|› �¦  «        ‚|r|                      |¦  «        }|t          j        k    rt          j        |¦  «        }n6|t          j        k    r&t          j
        |¦  «                             ¦   «         }|j        dk    r|                     d¦  «        }|€t          |¦  «        }|t          j        k    r)|                     ddd¦  «                             ¦   «         }|�|                     |¦  «        }|S )z/Process a single image for torchvision backend.úUnsupported input image type é   r   Nr   )r   r   ÚPILÚTORCHÚNUMPYÚ
ValueErrorr   ÚtvFÚpil_to_tensorr/   Ú
from_numpyÚ
contiguousÚndimÚ	unsqueezer   r   ÚLASTÚpermuteÚto)r=   rT   rU   rV   rW   r4   Ú
image_types          r?   Úprocess_imagez TorchvisionBackend.process_imaget   s  € õ $ EÑ*Ô*ˆ
Ø�iœm­Y¬_½i¼oÐNÐNÐNÝÐI¸ZÐIÐIÑJÔJÐJàð 	/Ø×'Ò'¨Ñ.Ô.ˆEà�œÒ&Ð&ÝÔ% eÑ,Ô,ˆEˆEØ�9œ?Ò*Ð*ÝÔ$ UÑ+Ô+×6Ò6Ñ8Ô8ˆEàŒ:˜Š?ˆ?Ø—O’O AÑ&Ô&ˆEàÐ$Ý >¸uÑ EÔ EÐàÕ 0Ô 5Ò5Ð5Ø—M’M ! Q¨Ñ*Ô*×5Ò5Ñ7Ô7ˆEàÐØ—H’H˜VÑ$Ô$ˆEàˆrA   c                 ó    — t          |¦  «        S ©zConvert an image to RGB format.©r   ©r=   rT   s     r?   r   z!TorchvisionBackend.convert_to_rgb—   ó   € å˜eÑ$Ô$Ð$rA   r   ÚconstantFÚimagesÚpad_sizeÚ
fill_valueÚpadding_modeÚreturn_maskÚdisable_groupingÚ	is_nested)rX   rX   c                 óÔ  — |�0|j         r|j        st          d|› d�¦  «        ‚|j         |j        f}nt          |¦  «        }t	          |||¬¦  «        \  }	}
i }i }|	                     ¦   «         D ]Î\  }}|j        dd…         }|d         |d         z
  }|d         |d         z
  }|dk     s|dk     rt          d|› d	|› d�¦  «        ‚||k    rdd||f}t          j        ||||¬
¦  «        }|||<   |rKt          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=ú.)rv   rw   éþÿÿÿ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=)Úfillrt   ©Údtype.)rw   )ÚheightÚwidthr_   r   r   ÚitemsÚshaper`   Úpadr/   Ú
zeros_likeÚint64r   )r=   rq   rr   rs   rt   ru   rv   rw   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ð t¨¬ð tÝ Ð!rÐgoÐ!rÐ!rÐ!rÑsÔsÐsØ œ¨¬Ð8ˆHˆHå+¨FÑ3Ô3ˆHå/DØÐ%5Àð0
ñ 0
ô 0
Ñ,ˆÐ,ð $&Ð Ø"$ÐØ%3×%9Ò%9Ñ%;Ô%;ð 	?ð 	?Ñ!ˆE�>Ø'Ô-¨b¨c¨cÔ2ˆJØ% aœ[¨:°a¬=Ñ8ˆNØ$ QœK¨*°Q¬-Ñ7ˆMØ Ò!Ð! ]°QÒ%6Ð%6Ý ðUØ08ðUð UØGQðUð Uð Uñô ð ð ˜XÒ%Ð%Ø˜a °Ð?�Ý!$¤¨¸ÀzÐ`lÐ!mÑ!mÔ!m�Ø.<Ð$ UÑ+àð ?Ý %Ô 0°ÅuÄ{Ð SÑ SÔ SÐTWÐYZÐ\]Ð\]Ð\]Ð_`Ð_`Ð_`ÐT`Ô a�ØGH�˜c ? Z°¤] ?°O°jÀ´m°OÐCÑDØ1>Ð'¨Ñ.øå)Ð*BÐDXÐdmÐnÑnÔnÐØð 	5Ý,Ð-DÐFZÐfoÐpÑpÔpˆOØ# _Ð4Ð4àÐrA   TÚ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           
                    d¦  «         t          j        j        }|j        r=|j        r6t          |                     ¦   «         dd…         |j        |j        ¦  «        }nž|j        r#t!          ||j        dt"          j        ¬¦  «        }nt|j        r=|j        r6t+          |                     ¦   «         dd…         |j        |j        ¦  «        }n0|j        r|j        r|j        |j        f}nt1          d|› d�¦  «        ‚t3          ¦   «         r&t5          ¦   «         r|                      ||||¦  «        S t	          j        ||||¬	¦  «        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_squarerV   újSize must contain 'height' and 'width' keys, or 'max_height' and 'max_width', or 'shortest_edge' key. Got rz   ©Úinterpolationr”   )rN   r+   Úintr-   r`   ÚInterpolationModeÚBILINEARÚLANCZOSr)   ÚloggerÚwarning_onceÚBICUBICÚshortest_edgeÚlongest_edger   r’   r   r   ÚFIRSTÚ
max_heightÚ	max_widthr   r   r€   r_   r(   r'   Ú_compile_friendly_resizer   )r=   rT   r’   r“   r”   r4   rš   Únew_sizes           r?   r   zTorchvisionBackend.resizeÍ   sæ  € ð ÐÝ˜(Õ%7½Ð$=Ñ>Ô>ð )Ý ?ÀÔ I��à (��åÔ1Ô:ˆMØ�CÔ1Ô9Ò9Ð9ÕBaÐbhÑBiÔBiÐ9Ý×ÒðAñô ð õ  Ô1Ô9ˆMàÔð 	 $Ô"3ð 	Ý1Ø—
’
‘”˜R˜S˜SÔ!ØÔ"ØÔ!ñô ˆHˆHð
 Ôð 	Ý3ØØÔ'Ø"'Ý"2Ô"8ð	ñ ô ˆHˆHð Œ_ð 	 ¤ð 	Ý:¸5¿:º:¹<¼<ÈÈÈÔ;LÈdÌoÐ_cÔ_mÑnÔnˆHˆHØŒ[ð 	˜TœZð 	Øœ T¤ZÐ0ˆHˆHåðØðð ð ñô ð õ $Ñ%Ô%ð 	\Õ*:Ñ*<Ô*<ð 	\Ø×0Ò0°¸À-ÐQZÑ[Ô[Ð[ÝŒz˜% ¸ÐR[Ð\Ñ\Ô\Ð\rA   r¨   rš   ztvF.InterpolationModec                 ó”  — | j         t          j        k    rš|                      ¦   «         dz  } t	          j        | |||¬¦  «        } | dz  } t          j        | dk    d| ¦  «        } t          j        | dk     d| ¦  «        } |                      ¦   «                              t          j        ¦  «        } nt	          j        | |||¬¦  «        } | S )zOA wrapper around tvF.resize for torch.compile compatibility with uint8 tensors.é   r™   éÿ   r   )	r~   r/   Úuint8Úfloatr`   r   ÚwhereÚroundrh   )rT   r¨   rš   r”   s       r?   r§   z+TorchvisionBackend._compile_friendly_resize  s²   € ð Œ;�%œ+Ò%Ð%Ø—K’K‘M”M CÑ'ˆEÝ”J˜u h¸mÐW`ÐaÑaÔaˆEØ˜C‘KˆEÝ”K ¨¢¨S°%Ñ8Ô8ˆEÝ”K ¨¢	¨1¨eÑ4Ô4ˆEØ—K’K‘M”M×$Ò$¥U¤[Ñ1Ô1ˆEˆEå”J˜u h¸mÐW`ÐaÑaÔaˆEØˆrA   Úscalec                 ó   — ||z  S )z5Rescale an image by a scale factor using Torchvision.r7   ©r=   rT   r°   r4   s       r?   r   zTorchvisionBackend.rescale  s   € ð �u‰}ÐrA   ÚmeanÚstdc                 ó.   — t          j        |||¦  «        S )z%Normalize an image using Torchvision.)r`   r   ©r=   rT   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)rW   g      ð?F)r/   Útensor)r=   r¹   rº   r»   r¼   r½   rW   s          r?   Ú!_fuse_mean_std_and_rescale_factorz4TorchvisionBackend._fuse_mean_std_and_rescale_factor)  sa   € ð ð 	˜,ð 	åœ j¸Ð@Ñ@Ô@ÀCÈ.ÑDXÑYˆJÝœ Y°vÐ>Ñ>Ô>À#ÈÑBVÑWˆIØˆJØ˜9 jÐ0Ð0rA   c                 óî   — |                       ||||||j        ¬¦  «        \  }}}|r6|                      |                     t          j        ¬¦  «        ||¦  «        }n|r|                      ||¦  «        }|S )zFRescale and normalize images using Torchvision (fused for efficiency).)r¹   rº   r»   r¼   r½   rW   r}   )rÀ   rW   r   rh   r/   Úfloat32r   )r=   rq   r¼   r½   r¹   rº   r»   s          r?   Úrescale_and_normalizez(TorchvisionBackend.rescale_and_normalize:  sŒ   € ð -1×,RÒ,RØ%Ø!ØØ!Ø)Ø”=ð -Sñ -
ô -
Ñ)ˆ
�I˜zð ð 	:Ø—^’^ F§I¢IµE´M IÑ$BÔ$BÀJÐPYÑZÔZˆFˆFØð 	:Ø—\’\ &¨.Ñ9Ô9ˆFàˆrA   c                 ó8  — |j         �|j        €$t          d|                     ¦   «         › �¦  «        ‚|j        dd…         \  }}|j         |j        }}||k    s||k    r{||k    r||z
  dz  nd||k    r||z
  dz  nd||k    r||z
  dz   dz  nd||k    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€   r_   Úkeysr‚   r`   rƒ   r›   Úcrop)r=   rT   r’   r4   Úimage_heightÚimage_widthÚcrop_heightÚ
crop_widthÚpadding_ltrbÚcrop_topÚ	crop_lefts              r?   r   zTorchvisionBackend.center_cropS  s€  € ð Œ;Ð $¤*Ð"4ÝÐjÐ]a×]fÒ]fÑ]hÔ]hÐjÐjÑkÔkÐkØ$)¤K°°°Ô$4Ñ!ˆ�kØ"&¤+¨t¬z�Zˆà˜Ò#Ð# {°\Ò'AÐ'Aà3=ÀÒ3KÐ3K�˜kÑ)¨aÑ/Ð/ÐQRØ5@À<Ò5OÐ5O�˜|Ñ+°Ñ1Ð1ÐUVØ7AÀKÒ7OÐ7O�˜kÑ)¨AÑ-°!Ñ3Ð3ÐUVØ9DÀ|Ò9SÐ9S�˜|Ñ+¨aÑ/°AÑ5Ð5ÐYZð	ˆLõ ”G˜E <°aÐ8Ñ8Ô8ˆEØ(-¬°B°C°CÔ(8Ñ%ˆL˜+Ø˜[Ò(Ð(¨[¸LÒ-HÐ-HØ�å˜ {Ñ2°cÑ9Ñ:Ô:ˆÝ˜ zÑ1°SÑ8Ñ9Ô9ˆ	ÝŒx˜˜x¨°KÀÑLÔLÐLrA   Ú	do_resizeÚdo_center_cropÚ	crop_sizeÚdo_padÚreturn_tensorsc           	      ó  — t          ||¬¦  «        \  }}i }|                     ¦   «         D ]$\  }}|r|                      |||¬¦  «        }|||<   Œ%t          ||¦  «        }t          ||¬¦  «        \  }}i }|                     ¦   «         D ]<\  }}|r|                      ||¦  «        }|                      ||||	|
|¦  «        }|||<   Œ=t          ||¦  «        }|r|                      |||¬¦  «        }t          d|i|¬¦  «        S )z=Preprocess using Torchvision backend (fast, GPU-accelerated).)rv   ©rT   r’   r“   )rr   rv   Úpixel_values©ÚdataÚtensor_type)r   r�   r   r   r   rÃ   rƒ   r	   )r=   rq   rÏ   r’   r“   rÐ   rÑ   r¼   r½   r¹   rº   r»   rÒ   rr   rv   rÓ   r4   r†   r‡   Úresized_images_groupedr‚   rŠ   Úresized_imagesrˆ   r�   s                            r?   Ú_preprocesszTorchvisionBackend._preprocesso  sf  € õ* 0EÀVÐ^nÐ/oÑ/oÔ/oÑ,ˆÐ,Ø!#ÐØ%3×%9Ò%9Ñ%;Ô%;ð 	;ð 	;Ñ!ˆE�>Øð aØ!%§¢°>ÈÐW_ Ñ!`Ô!`�Ø,:Ð" 5Ñ)Ð)Ý'Ð(>Ð@TÑUÔUˆõ 0EÀ^ÐfvÐ/wÑ/wÔ/wÑ,ˆÐ,Ø#%Ð Ø%3×%9Ò%9Ñ%;Ô%;ð 	=ð 	=Ñ!ˆE�>Øð MØ!%×!1Ò!1°.À)Ñ!LÔ!L�à!×7Ò7Ø 
¨N¸LÈ*ÐV_ñô ˆNð /=Ð$ UÑ+Ð+Ý)Ð*BÐDXÑYÔYÐàð 	pØ#ŸxšxÐ(8À8Ð^n˜xÑoÔoÐå .Ð2BÐ!CÐQ_Ð`Ñ`Ô`Ð`rA   )NNN)Nr   rp   FFF)NT)NNNNNN)&Ú__name__Ú
__module__Ú__qualname__Ú__doc__r!   r    r:   ÚpropertyrQ   rF   rO   rJ   r   Úboolr   r   rj   r   r   r›   r   rP   rƒ   r   Ústaticmethodr§   r­   r   r   r   r   rÀ   rÃ   r   r"   r	   rÜ   Ú__classcell__©r>   s   @r?   r3   r3   U   s†  ø€ € € € € àKÐKð' ¨Ô!5ð 'ð 'ð 'ð 'ð 'ð 'ð ð˜ð ð ð ñ „Xððw¨c°D¸´I©oÀÀTÈ#ÄYÄÑ.Oð wð wð wð wð& '+Ø;?Ø+/ð!ð !àð!ð ˜t™ð!ð Ð!1Ñ1°DÑ8ð	!ð
 ˜Ô(ð!ð ˜Ô&ð!ð 
ð!ð !ð !ð !ðF% Jð %°:ð %ð %ð %ð %ð "Ø!"Ø#-Ø!Ø(-Ø!&ð0 ð 0 à�^Ô$ð0 ð ð0 ð ˜$‘Jð	0 ð
 ˜D‘jð0 ð ð0 ð  ™+ð0 ð ˜$‘;ð0 ð 
ˆuÐ3Ô4°nÐDÔ	Eð0 ð 0 ð 0 ð 0 ðl OSØð4]ð 4]àð4]ð ð4]ð Lð	4]ð
 ð4]ð 
ð4]ð 4]ð 4]ð 4]ðl ð <@Øð	ð Øðà˜˜S˜”/ðð  Ð 7Ô8ðð ð	ð
 
ðð ð ñ „\ðð$àðð ðð
 
ðð ð ð ð/àð/ð �h˜u”oÑ%ð/ð �X˜e”_Ñ$ð	/ð 
ð/ð /ð /ð /ð €Y�rÐÑÔð %)Ø15Ø04Ø"&Ø'+Ø+/ð1ð 1à˜T‘kð1ð ˜D œKÑ'¨$Ñ.ð1ð ˜4 œ;Ñ&¨Ñ-ð	1ð
 ˜4‘Kð1ð  ™ð1ð ˜Ô(ð1ð 
ð1ð 1ð 1ñ Ôð1ð àðð ðð ð	ð
 ðð ˜D œKÑ'ðð ˜4 œ;Ñ&ðð 
ðð ð ð ð2MàðMð ðMð
 
ð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ð -að -að -að -að -að -að -arA   r3   )Úvisionc                   óì  ‡ — e Zd ZdZdee         fˆ 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                 óT   •—  t          ¦   «         j        di |¤Ž  | j        di |¤Ž d S r6   r8   r<   s     €r?   r:   zPilBackend.__init__£  r@   rA   rB   c                 ó   — dS )rD   Úpilr7   rE   s    r?   rF   zPilBackend.backend§  s	   € ð
 ˆurA   NrT   rU   rV   c                 ój  — t          |¦  «        }|t          j        t          j        t          j        fvrt          d|› �¦  «        ‚|r|                      |¦  «        }|t          j        k    r0t          j        |¦  «        }|j	        dk    r|€t          j        n|}n$|t          j        k    r|                     ¦   «         }|j	        dk    rt          j        |d¬¦  «        }|€t          |¦  «        }|t          j        k    r/t          |t          j        ¦  «        rt          j        |d¦  «        }|S )z'Process a single image for PIL backend.rZ   é   Nr[   r   )Úaxis)r[   r   r   )r   r   r\   r]   r^   r_   r   ÚnpÚarrayrd   r   rf   ÚnumpyÚexpand_dimsr   rN   ÚndarrayÚ	transpose)r=   rT   rU   rV   r4   ri   s         r?   rj   zPilBackend.process_image®  s  € õ $ EÑ*Ô*ˆ
Ø�iœm­Y¬_½i¼oÐNÐNÐNÝÐI¸ZÐIÐIÑJÔJÐJàð 	/Ø×'Ò'¨Ñ.Ô.ˆEà�œÒ&Ð&Ý”H˜U‘O”OˆEàŒz˜QŠˆØ=NÐ=VÕ$4Ô$9Ð$9Ð\mÐ!øØ�9œ?Ò*Ð*Ø—K’K‘M”MˆEàŒ:˜Š?ˆ?Ý”N 5¨qÐ1Ñ1Ô1ˆEàÐ$Ý >¸uÑ EÔ EÐàÕ 0Ô 5Ò5Ð5å˜%¥¤Ñ,Ô,ð 7Ýœ U¨IÑ6Ô6�àˆrA   c                 ó    — t          |¦  «        S rl   rm   rn   s     r?   r   zPilBackend.convert_to_rgbÒ  ro   rA   r   rp   Frq   rr   rs   rt   ru   c                 ó”  — |�0|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	�	¦  «        ‚||k    s||k    r?d
d|fd|ff}|dk    rt          j        ||d|¬¦  «        }nt          j        |||¬¦  «        }|	 	                    |¦  «         |rBt          j
        ||ft          j        ¬¦  «        }d|d|…d|…f<   |
 	                    |¦  «         Œ÷|r|	|
fS |	S )z)Pad images to specified size using NumPy.Nry   rz   ©Ú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   rp   )ÚmodeÚconstant_values)rù   r}   r   )r   r€   r_   r   r   r   r¤   rï   rƒ   ÚappendÚzerosr…   )r=   rq   rr   rs   rt   ru   r4   Útarget_heightÚtarget_widthr�   r‘   rT   r   r€   rŒ   r�   Ú	pad_widthÚmasks                     r?   rƒ   zPilBackend.padÖ  sø  € ð ÐØ”Oð t¨¬ð tÝ Ð!rÐgoÐ!rÐ!rÐ!rÑsÔsÐsØ*2¬/¸8¼>˜<ˆMˆMå*>¸vÑ*FÔ*FÑ'ˆM˜<àÐØˆàð 	-ð 	-ˆEÝ*¨5Õ>NÔ>TÐUÑUÔU‰MˆF�EØ*¨VÑ3ˆNØ(¨5Ñ0ˆMà Ò!Ð! ]°QÒ%6Ð%6Ý ðsØ1>ðsð sØBNðsð sØ_eðsð sØinðsð sð sñô ð ð
 ˜Ò&Ð&¨%°<Ò*?Ð*?ð $ a¨Ð%8¸1¸mÐ:LÐM�	Ø :Ò-Ð-ÝœF 5¨)¸*ÐV`ÐaÑaÔa�E�EåœF 5¨)¸,ÐGÑGÔG�Eà×#Ò# EÑ*Ô*Ð*àð -Ý”x °Ð =ÅRÄXÐNÑNÔN�Ø()��W�f�W˜f˜u˜f�_Ñ%Ø×&Ò& tÑ,Ô,Ð,øàð 	5Ø# _Ð4Ð4ØÐrA   r’   r“   zPILImageResampling | NoneÚreducing_gapc                 óà  — |�Ft          |t          t          f¦  «        s*t          �|t          v rt          |         }nt          j        }|�|nt          j        }|j        rC|j        r<t          |t          j	        ¬¦  «        \  }}t          ||f|j        |j        ¦  «        }n¤|j        r#t          ||j        dt          j	        ¬¦  «        }nz|j        rC|j        r<t          |t          j	        ¬¦  «        \  }}t          ||f|j        |j        ¦  «        }n0|j        r|j        r|j        |j        f}nt#          d|› d�¦  «        ‚t%          ||||t          j	        t          j	        ¬¦  «        S )z Resize an image using PIL/NumPy.Nr÷   Fr–   r˜   rz   )r’   r“   r  Údata_formatrV   )rN   r+   r›   r.   r�   r¢   r£   r   r   r¤   r   r   r¥   r¦   r   r   r€   r_   Ú	np_resize)	r=   rT   r’   r“   r  r4   r   r€   r¨   s	            r?   r   zPilBackend.resize	  s¨  € ð Ð­
°8Õ>PÕRUÐ=VÑ(WÔ(WÐÝ.Ð:¸xÕKjÐ?jÐ?jÝ:¸8ÔD��å-Ô6�Ø'Ð3�8�8Õ9KÔ9TˆàÔð 	 $Ô"3ð 	Ý*¨5Õ>NÔ>TÐUÑUÔU‰MˆF�EÝ1Ø˜�ØÔ"ØÔ!ñô ˆHˆHð
 Ôð 	Ý3ØØÔ'Ø"'Ý"2Ô"8ð	ñ ô ˆHˆHð Œ_ð 		 ¤ð 		Ý*¨5Õ>NÔ>TÐUÑUÔU‰MˆF�EÝ:¸FÀE¸?ÈDÌOÐ]aÔ]kÑlÔlˆHˆHØŒ[ð 	˜TœZð 	Øœ T¤ZÐ0ˆHˆHåðØðð ð ñô ð õ
 ØØØØ%Ý(Ô.Ý.Ô4ð
ñ 
ô 
ð 	
rA   r°   c                 óP   — t          ||t          j        t          j        ¬¦  «        S )z/Rescale an image by a scale factor using NumPy.)r°   r  rV   )Ú
np_rescaler   r¤   r²   s       r?   r   zPilBackend.rescale<  s-   € õ ØØÝ(Ô.Ý.Ô4ð	
ñ 
ô 
ð 	
rA   r³   r´   c                 óR   — t          |||t          j        t          j        ¬¦  «        S )zNormalize an image using NumPy.)r³   r´   r  rV   )Únp_normalizer   r¤   r¶   s        r?   r   zPilBackend.normalizeJ  s0   € õ ØØØÝ(Ô.Ý.Ô4ð
ñ 
ô 
ð 	
rA   c                 óÌ   — |j         �|j        €$t          d|                     ¦   «         › �¦  «        ‚t	          ||j         |j        ft
          j        t
          j        ¬¦  «        S )z!Center crop an image using NumPy.NrÅ   )r’   r  rV   )r   r€   r_   rÆ   Únp_center_cropr   r¤   )r=   rT   r’   r4   s       r?   r   zPilBackend.center_cropZ  si   € ð Œ;Ð $¤*Ð"4ÝÐjÐ]a×]fÒ]fÑ]hÔ]hÐjÐjÑkÔkÐkåØØ”+˜tœzÐ*Ý(Ô.Ý.Ô4ð	
ñ 
ô 
ð 	
rA   rÏ   rÐ   rÑ   r¼   r½   r¹   rº   r»   rÒ   rÓ   c                 óX  — g }|D ]z}|r|                       |||¬¦  «        }|r|                      ||¦  «        }|r|                      ||¦  «        }|	r|                      ||
|¦  «        }|                     |¦  «         Œ{|r|                      ||¬¦  «        }t          d|i|¬¦  «        S )z2Preprocess using PIL backend (portable, CPU-only).rÕ   )rr   rÖ   r×   )r   r   r   r   rû   rƒ   r	   )r=   rq   rÏ   r’   r“   rÐ   rÑ   r¼   r½   r¹   rº   r»   rÒ   rr   rÓ   r4   r�   rT   s                     r?   rÜ   zPilBackend._preprocessk  sà   € ð& ÐØð 		+ð 		+ˆEØð OØŸš¨%°dÀX˜ÑNÔN�Øð ;Ø×(Ò(¨°	Ñ:Ô:�Øð <ØŸš U¨NÑ;Ô;�Øð EØŸš u¨j¸)ÑDÔD�Ø×#Ò# EÑ*Ô*Ð*Ð*àð 	MØ#ŸxšxÐ(8À8˜xÑLÔLÐå .Ð2BÐ!CÐQ_Ð`Ñ`Ô`Ð`rA   c                 óÀ   •— t          ¦   «                              ¦   «         }|                     dd¦  «                             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�  sa   ø€ Ý™œŸšÑ*Ô*ˆà×ÒÐ4°bÑ9Ô9×BÒBÀ5ÑIÔIð 	aØ5CÐDZÔ5[Ð\_Ð]_Ð\_Ô5`ˆNÐ1Ñ2ØÐrA   )NN)Nr   rp   F)#rÝ   rÞ   rß   rà   r!   r    r:   rá   rQ   rF   r   râ   r   rï   ró   rj   r   rO   r   r›   rP   rƒ   r   r­   r   r   r   r   r"   r	   rÜ   Údictr   r  rä   rå   s   @r?   rè   rè   Ÿ  sÅ  ø€ € € € € àCÐCð' ¨Ô!5ð 'ð 'ð 'ð 'ð 'ð 'ð ð˜ð ð ð ñ „Xðð '+Ø;?ð	"ð "àð"ð ˜t™ð"ð Ð!1Ñ1°DÑ8ð	"ð
 ˜Ô&ð"ð 
Œð"ð "ð "ð "ðH% Jð %°:ð %ð %ð %ð %ð "Ø!"Ø#-Ø!ð1 ð 1 à�R”ZÔ ð1 ð ð1 ð ˜$‘Jð	1 ð
 ˜D‘jð1 ð ð1 ð 
ˆt�B”JÔ  b¤jÔ!1Ð1Ô	2°T¸"¼*Ô5EÑ	Eð1 ð 1 ð 1 ð 1 ðn 15Ø#'ð1
ð 1
àŒzð1
ð ð1
ð .ð	1
ð
 ˜D‘jð1
ð 
Œð1
ð 1
ð 1
ð 1
ðf
àŒzð
ð ð
ð
 
Œð
ð 
ð 
ð 
ð
àŒzð
ð �h˜u”oÑ%ð
ð �X˜e”_Ñ$ð	
ð 
Œð
ð 
ð 
ð 
ð 
àŒzð
ð ð
ð
 
Œð
ð 
ð 
ð 
ð""aà�R”ZÔ ð"að ð"að ð	"að
 .ð"að ð"að ð"að ð"að ð"að ð"að ˜D œKÑ'¨$Ñ.ð"að ˜4 œ;Ñ&¨Ñ-ð"að �t‘ð"að ˜T‘/ð"að ˜jÑ(¨4Ñ/ð"að" 
ð#"að "að "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,   r`   r-   r.   Ú
get_loggerrÝ   rŸ   r3   rè   ÚBaseImageProcessorFastr7   rA   r?   ú<module>r#     sš  ðð %Ð $Ð $Ð $Ð $Ð $Ø Ð Ð Ð Ð Ð Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'à Ð Ð Ð à /Ð /Ð /Ð /Ð /Ð /Ø 6Ð 6Ð 6Ð 6Ð 6Ð 6ðð ð ð ð ð ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ðð ð ð ð ð ðð ð ð ð ð ðð ð ð ð ð ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð 3Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2ðð ð ð ð ð ð ð ð ð ð ð ð ð ð vÐ uÐ uÐ uÐ uÐ uÐ uÐ uÐ uÐ uÐ uÐ uð ÐÑÔð 0Ø/Ð/Ð/Ð/Ð/Ð/àÐÑÔð Ø€L€L€LàÐÑÔð +Ø;Ð;Ð;Ð;Ð;Ð;à]Ð]Ð]Ð]Ð]Ð]Ð]Ð]Ð]à&*Ð#Ø&*Ð#ð 
ˆÔ	˜HÑ	%Ô	%€ð 
€Ð+Ð,Ñ,Ô,ðFað Fað Fað Fað FaÐ+ñ Faô Fañ -Ô,ðFaðR
 
€�;ÐÑÔðtð tð tð tð tÐ#ñ tô tñ  Ôðtðp ,Ð Ð Ð rA   