ó
    qyüië  ã                   ó  • S r SSKrSSKJr  SSKJr  SSKJr  SSK	J
r
JrJr  SSKJrJr  SS	KJrJr   " S
 S\SS9r SS\S\S\S\S\S\\\4   4S jjrSSS\SS4S jr S SSS\S\S\S   4S jjr\ " S S\5      5       rS/rg)!z"Image processor class for SigLIP2.é    N)Ú
functionalé   )ÚTorchvisionBackend)ÚBatchFeature)Ú
ImageInputÚPILImageResamplingÚSizeDict)ÚImagesKwargsÚUnpack)Ú
TensorTypeÚauto_docstringc                   ó.   • \ rS rSr% Sr\\S'   \\S'   Srg)ÚSiglip2ImageProcessorKwargsé   aZ  
patch_size (`int`, *optional*, defaults to `self.patch_size`):
    The size (resolution) of each patch the image will be split to.
max_num_patches (`int`, *optional*, defaults to `self.max_num_patches`):
    The image will be resized to have at most this number of patches,
    and then padded in "patch" dimension to match this number exactly.
Ú
patch_sizeÚmax_num_patches© N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__ÚintÚ__annotations__Ú__static_attributes__r   ó    Úq/home/mande/repo/quber/.venv/lib/python3.13/site-packages/transformers/models/siglip2/image_processing_siglip2.pyr   r      s   ‡ ñð ƒOØÖr   r   F)ÚtotalÚimage_heightÚimage_widthr   r   ÚepsÚreturnc                 ó  ^• SSK mS[        S[        S[        S[        4U4S jjnUS-  S	pvXv-
  U:¼  a6  Xg-   S
-  nU" X€U5      n	U" X�U5      n
X’-  X¢-  -  nX³::  a  UnOUnXv-
  U:¼  a  M6  UnU" X€U5      n	U" X�U5      n
Xš4$ )aæ  
Determine image size based on max number of patches, ensure dimensions are divisible by patch size and image is at least 1 patch.

Args:
    image_height (`int`):
        Original image height.
    image_width (`int`):
        Original image width.
    patch_size (`int`):
        Patch size for processing.
    max_num_patches (`int`):
        Maximum number of patches.
    eps (`float`):
        Small threshold for binary search.

Returns:
    Tuple: (target_height, target_width)
r   NÚscaleÚsizer   r"   c                 ód   >• X-  nTR                  X2-  5      U-  n[        X#5      n[        U5      $ ©N)ÚceilÚmaxr   )r$   r%   r   Úscaled_sizeÚmaths       €r   Úget_scaled_image_sizeÚAget_image_size_for_max_num_patches.<locals>.get_scaled_image_sizeA   s5   ø€ Ø‘lˆØ—i‘i Ñ 8Ó9¸JÑFˆÜ˜*Ó2ˆÜ�;ÓÐr   é
   g      Y@é   )r+   Úfloatr   )r   r    r   r   r!   r,   Ú	scale_minÚ	scale_maxr$   Útarget_heightÚtarget_widthÚnum_patchesr+   s               @r   Ú"get_image_size_for_max_num_patchesr6   *   s»   ø€ ó* ð ¤Uð  ´#ð  Ä3ð  Ì3÷  ð  ™8 UˆyØÑ  SÓ
(ØÑ&¨!Ñ+ˆÙ-¨eÀ:ÓNˆÙ,¨UÀÓLˆØ$Ñ1°lÑ6OÑPˆàÓ)Ø‰IàˆIð Ñ  SÕ
(ð €EÙ)¨%¸zÓJ€MÙ(¨¸ZÓH€LØÐ&Ð&r   Úimageútorch.Tensorc                 ó¬   • U R                   u  p#nX1-  nXA-  nU R                  X%XU5      nUR                  SSSSS5      nUR                  XV-  S5      nU$ )zÁ
Convert 3D tensor image of shape (num_channels, image_height, image_width) into 2D tensor of patches of shape
(num_patches_height * num_patches_width, patch_size * patch_size * num_channels).
é   r   r/   é   r   éÿÿÿÿ)ÚshapeÚreshapeÚpermute)r7   r   Únum_channelsr   r    Únum_patches_heightÚnum_patches_widthÚpatched_images           r   Úconvert_image_to_patchesrD   Z   sl   € ð
 /4¯k©kÑ+€L Ø%Ñ3ÐØ#Ñ1ÐØ—M‘M ,ÀJÐcmÓn€MØ!×)Ñ)¨!¨Q°°1°aÓ8€MØ!×)Ñ)Ð*<Ñ*PÐRTÓU€MØÐr   ÚtensorÚtarget_lengthÚ	pad_value)r8   r8   c                 ó  • U R                   S   nX-
  n[        R                  " U4[        R                  S9nUS:”  aG  SS/U R                  S-
  -  SU/-   n[        R
                  R                  R                  XSUS9n SXT* S& X4$ )z+
Pad the tensor along the first dimension.
r   )Údtyper:   Úconstant)ÚmodeÚvalueN)r=   ÚtorchÚonesÚint32ÚndimÚnnr   Úpad)rE   rF   rG   Úcurrent_lengthÚpadding_lengthÚmaskÚpaddings          r   Úpad_along_first_dimrW   h   s�   € ð —\‘\ !‘_€NØ"Ñ3€NÜ�:Š:�}Ð&¬e¯k©kÑ:€DØ˜ÓØ�a�&˜FŸK™K¨!™OÑ,°°>Ð/BÑBˆÜ—‘×$Ñ$×(Ñ(¨¸zÐQZÐ(Ð[ˆØ!"ˆˆ_ÐÐØˆ<Ðr   c                   ó.  ^ • \ rS rSr\r\R                  r/ SQr	/ SQr
SrSrSrSrSr/ SQrS\\   4U 4S jjr\S	\S\\   S
\4U 4S jj5       rS
\4U 4S jjrS	\S   S\S\S\SSS\S\S\S\\\   -  S-  S\\\   -  S-  S\\-  S-  S
\4S jrSr U =r!$ )ÚSiglip2ImageProcessoréx   )ç      à?r[   r[   Té   é   ©Úpixel_valuesÚpixel_attention_maskÚspatial_shapesÚkwargsc                 ó&   >• [         TU ]  " S0 UD6  g )Nr   )ÚsuperÚ__init__©Úselfrb   Ú	__class__s     €r   re   ÚSiglip2ImageProcessor.__init__…   s   ø€ Ü‰ÒÑ"˜6Ó"r   Úimagesr"   c                 ó&   >• [         TU ]  " U40 UD6$ r'   )rd   Ú
preprocess)rg   rj   rb   rh   s      €r   rl   Ú Siglip2ImageProcessor.preprocessˆ   s   ø€ ä‰wÒ! &Ñ3¨FÑ3Ð3r   c                 óH   >• UR                  SS 5        [        TU ]  " S0 UD6$ )NÚ	do_resizer   )Úpoprd   Ú_validate_preprocess_kwargsrf   s     €r   rq   Ú1Siglip2ImageProcessor._validate_preprocess_kwargsŒ   s$   ø€ à�
‰
�; Ô%Ü‰wÒ2Ñ<°VÑ<Ð<r   r8   ro   r   r   Úresamplez7PILImageResampling | tvF.InterpolationMode | int | NoneÚ
do_rescaleÚrescale_factorÚdo_normalizeÚ
image_meanNÚ	image_stdÚreturn_tensorsc           	      óæ  • / n/ n/ nU HÖ  nU(       aD  [        UR                  S   UR                  S   UUS9u  nn[        UUS9nU R                  UUUS9nU R	                  UXgX‰U
5      n[        UU5      n[        UU5      u  nnUR                  S   U-  nUR                  S   U-  nUR                  UU45        UR                  U5        UR                  U5        MØ     [        UUUS.US9nU$ )Néþÿÿÿr<   )r   r    r   r   )ÚheightÚwidth)r7   r%   rs   r^   )ÚdataÚtensor_type)	r6   r=   r	   ÚresizeÚrescale_and_normalizerD   rW   Úappendr   )rg   rj   ro   r   r   rs   rt   ru   rv   rw   rx   ry   rb   Úpixel_masksr_   ra   r7   r|   r}   Ú	size_dictÚpatchesrU   rA   rB   Úbatch_features                            r   Ú_preprocessÚ!Siglip2ImageProcessor._preprocess‘   s   € ð ˆØˆØˆãˆEÞÜ BØ!&§¡¨R¡Ø %§¡¨B¡Ø)Ø$3ñ	!‘�˜ô %¨F¸%Ñ@�	ØŸ™¨%°iÈ(˜ÐS�à×.Ñ.¨u°jÐR^ÐluÓvˆEô /¨u°jÓAˆGÜ/°¸ÓI‰MˆG�Tà!&§¡¨R¡°JÑ!>ÐØ %§¡¨B¡°:Ñ =Ðà×!Ñ!Ð#5Ð7HÐ"IÔJØ×Ñ Ô(Ø×Ñ˜tÖ$ñ- ô0 %à ,Ø(3Ø"0ñð
 'ñ
ˆð Ðr   r   )"r   r   r   r   r   Úvalid_kwargsr   ÚBILINEARrs   rw   rx   ro   rt   rv   r   r   Úmodel_input_namesr   re   r   r   r   rl   Útuplerq   ÚlistÚboolr   r0   Ústrr   r‡   r   Ú__classcell__)rh   s   @r   rY   rY   x   s6  ø† à.€LØ!×*Ñ*€HÚ €JÚ€IØ€IØ€JØ€LØ€JØ€OÚRÐð# Ð(CÑ!D÷ #ð ð4 ð 4°vÐ>YÑ7Zð 4Ð_kö 4ó ð4ð=°u÷ =ð
3à�^Ñ$ð3ð ð3ð ð	3ð
 ð3ð Lð3ð ð3ð ð3ð ð3ð ˜D ™KÑ'¨$Ñ.ð3ð ˜4 ™;Ñ&¨Ñ-ð3ð ˜jÑ(¨4Ñ/ð3ð 
÷3ò 3r   rY   )gñhãˆµøä>)r   )r   rM   Útorchvision.transforms.v2r   ÚtvFÚimage_processing_backendsr   Úimage_processing_utilsr   Úimage_utilsr   r   r	   Úprocessing_utilsr
   r   Úutilsr   r   r   r   r0   rŒ   r6   rD   rW   rY   Ú__all__r   r   r   Ú<module>r™      sí   ðñ )ã Ý 7å ;Ý 2ß CÑ Cß 4÷ô
 ,°eò 
ð ^bñ-'Øð-'Ø$'ð-'Ø58ð-'ØKNð-'ØUZð-'à
ˆ3�ˆ8�_õ-'ð` Nð Àð Èô ð BCñØðØ+.ðØ;>ðà
Ð)Ñ*õð  ôKÐ.ó Kó ðKð\ #Ð
#�r   