Ë
    ÜÓ^jë  ã                   ó  — d 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 ddlmZmZ dd	lmZmZ  G d
„ ded¬«      Z	 ddedededededeeef   fd„Zdddeddfd„Z	 d dddededed   fd„Ze G d„ de«      «       ZdgZy)!z"Image processor class for SigLIP2.é    N)Ú
functionalé   )ÚTorchvisionBackend)ÚBatchFeature)Ú
ImageInputÚPILImageResamplingÚSizeDict)ÚImagesKwargsÚUnpack)Ú
TensorTypeÚauto_docstringc                   ó&   — e Zd ZU dZeed<   eed<   y)ÚSiglip2ImageProcessorKwargsar  
    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_patchesN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚintÚ__annotations__© ó    ú/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/transformers/models/siglip2/image_processing_siglip2.pyr   r      s   … ñð ƒOØÔr   r   F)ÚtotalÚimage_heightÚimage_widthr   r   ÚepsÚreturnc                 ó  ‡— ddl Šdt        dt        dt        dt        fˆfd„}|dz  d	}}||z
  |k\  r:||z   d
z  } ||| |«      }	 ||||«      }
|	|z  |
|z  z  }||k  r|}n|}||z
  |k\  rŒ:|} ||| |«      }	 ||||«      }
|	|
fS )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                 ój   •— || z  }‰j                  ||z  «      |z  }t        ||«      }t        |«      S ©N)ÚceilÚmaxr   )r!   r"   r   Úscaled_sizeÚmaths       €r   Úget_scaled_image_sizezAget_image_size_for_max_num_patches.<locals>.get_scaled_image_sizeA   s;   ø€ Ø˜U‘lˆØ—i‘i ¨jÑ 8Ó9¸JÑFˆÜ˜* kÓ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_patchesr2   *   sÓ   ø€ ó* ð ¤Uð  ´#ð  Ä3ð  Ì3õ  ð  ™8 Uˆy€IØ�yÑ  SÒ
(Ø˜YÑ&¨!Ñ+ˆÙ-¨e°\À:ÓNˆÙ,¨U°KÀÓLˆØ$ zÑ1°lÀZÑ6OÑPˆà˜/Ò)Ø‰IàˆIð �yÑ  SÓ
(ð €EÙ)¨%°¸zÓJ€MÙ(¨°¸ZÓH€LØ˜,Ð&Ð&r   Úimageútorch.Tensorc                 ó¸   — | j                   \  }}}||z  }||z  }| j                  |||||«      }|j                  ddddd«      }|j                  ||z  d«      }|S )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)r3   r   Únum_channelsr   r   Únum_patches_heightÚnum_patches_widthÚpatched_images           r   Úconvert_image_to_patchesr@   Z   s{   € ð
 /4¯k©kÑ+€L�, Ø%¨Ñ3ÐØ# zÑ1ÐØ—M‘M ,Ð0BÀJÐPaÐcmÓn€MØ!×)Ñ)¨!¨Q°°1°aÓ8€MØ!×)Ñ)Ð*<Ð?PÑ*PÐRTÓU€MØÐr   ÚtensorÚtarget_lengthÚ	pad_value)r4   r4   c                 ó   — | j                   d   }||z
  }t        j                  |ft        j                  ¬«      }|dkD  rLddg| j                  dz
  z  d|gz   }t        j
                  j                  j                  | |d|¬«      } d|| d | |fS )z3
    Pad the tensor along the first dimension.
    r   )Údtyper6   Úconstant)ÚmodeÚvalueN)r9   ÚtorchÚonesÚint32ÚndimÚnnr   Úpad)rA   rB   rC   Úcurrent_lengthÚpadding_lengthÚmaskÚpaddings          r   Úpad_along_first_dimrS   h   s—   € ð —\‘\ !‘_€NØ" ^Ñ3€NÜ�:‰:�}Ð&¬e¯k©kÔ:€DØ˜ÒØ�a�&˜FŸK™K¨!™OÑ,°°>Ð/BÑBˆÜ—‘×$Ñ$×(Ñ(¨°¸zÐQZÐ(Ó[ˆØ!"ˆˆnˆ_ÐÐØ�4ˆ<Ðr   c                   ó  ‡ — e Zd ZeZej                  Zg d¢Zg d¢Z	dZ
dZdZdZdZg d¢Zdee   fˆ fd„Zededee   d	efˆ fd
„«       Zd	efˆ fd„Zded   dedededddedededeee   z  dz  deee   z  dz  deez  dz  d	efd„Zˆ xZS )ÚSiglip2ImageProcessor)ç      à?rV   rV   Té   é   ©Úpixel_valuesÚpixel_attention_maskÚspatial_shapesÚkwargsc                 ó$   •— t        ‰| �  di |¤Ž y )Nr   )ÚsuperÚ__init__©Úselfr]   Ú	__class__s     €r   r`   zSiglip2ImageProcessor.__init__…   s   ø€ Ü‰ÑÑ"˜6Ó"r   Úimagesr   c                 ó$   •— t        ‰| �  |fi |¤ŽS r$   )r_   Ú
preprocess)rb   rd   r]   rc   s      €r   rf   z Siglip2ImageProcessor.preprocessˆ   s   ø€ ä‰wÑ! &Ñ3¨FÑ3Ð3r   c                 óF   •— |j                  dd «       t        ‰| �  di |¤ŽS )NÚ	do_resizer   )Úpopr_   Ú_validate_preprocess_kwargsra   s     €r   rj   z1Siglip2ImageProcessor._validate_preprocess_kwargsŒ   s$   ø€ à�
‰
�; Ô%Ü‰wÑ2Ñ<°VÑ<Ð<r   r4   rh   r   r   Úresamplez7PILImageResampling | tvF.InterpolationMode | int | NoneÚ
do_rescaleÚrescale_factorÚdo_normalizeÚ
image_meanNÚ	image_stdÚreturn_tensorsc           	      óô  — g }g }g }|D ]Û  }|rMt        |j                  d   |j                  d   ||¬«      \  }}t        ||¬«      }| j                  |||¬«      }| j	                  |||||	|
«      }t        ||«      }t        ||«      \  }}|j                  d   |z  }|j                  d   |z  }|j                  ||f«       |j                  |«       |j                  |«       ŒÝ t        |||dœ|¬«      }|S )Néþÿÿÿr8   )r   r   r   r   )ÚheightÚwidth)r3   r"   rk   rY   )ÚdataÚtensor_type)	r2   r9   r	   ÚresizeÚrescale_and_normalizer@   rS   Úappendr   )rb   rd   rh   r   r   rk   rl   rm   rn   ro   rp   rq   r]   Úpixel_masksrZ   r\   r3   rt   ru   Ú	size_dictÚpatchesrQ   r=   r>   Úbatch_features                            r   Ú_preprocessz!Siglip2ImageProcessor._preprocess‘   s*  € ð ˆØˆØˆàò 	%ˆEÙÜ BØ!&§¡¨R¡Ø %§¡¨B¡Ø)Ø$3ô	!‘�˜ô %¨F¸%Ô@�	ØŸ™¨%°iÈ(˜ÓS�à×.Ñ.¨u°jÀ.ÐR^Ð`jÐ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   Úvalid_kwargsr   ÚBILINEARrk   ro   rp   rh   rl   rn   r   r   Úmodel_input_namesr   r`   r   r   r   rf   Útuplerj   ÚlistÚboolr   r,   Ústrr   r   Ú__classcell__)rc   s   @r   rU   rU   x   s1  ø„ à.€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r   rU   )gñhãˆµøä>)r   )r   rI   Útorchvision.transforms.v2r   ÚtvFÚimage_processing_backendsr   Úimage_processing_utilsr   Úimage_utilsr   r   r	   Úprocessing_utilsr
   r   Úutilsr   r   r   r   r,   rƒ   r2   r@   rS   rU   Ú__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   