Ë
    ÜÓ^jÖ>  ã                   óH  — d dl Z d dlZd dlZd dlmc mc mZ ddl	m
Z
 ddlmZ ddlmZmZmZmZ ddlmZmZmZmZmZ ddlmZmZmZmZ ddlmZ d	d
lm Z  d	dl!m"Z"  e«       rd dl#m$Z% d„ Z&d„ Z'd„ Z(e G d„ de «      «       Z)e ed¬«       G d„ de"«      «       «       Z*ddgZ+y)é    Né   )ÚTorchvisionBackend)ÚBatchFeature)Úgroup_images_by_shapeÚpadÚreorder_imagesÚto_channel_dimension_format)ÚOPENAI_CLIP_MEANÚOPENAI_CLIP_STDÚChannelDimensionÚPILImageResamplingÚSizeDict)Ú
TensorTypeÚauto_docstringÚis_scipy_availableÚrequires_backends)Úrequiresé   )ÚOwlViTImageProcessor)ÚOwlViTImageProcessorPil)Úndimagec                 óP  — t        |«      }t        |«      }| j                  }|| j                  kD  r/|d|| j                  z
  z  z  }t	        j
                  | |«      } | |fS || j                  dz
  k(  r|| j                  d   fz   }| |fS || j                  k  rt        d«      ‚| |fS )a%  Validate resize output shape according to input image.

    Args:
        image (`np.ndarray`):
         Image to be resized.
        output_shape (`iterable`):
            Size of the generated output image `(rows, cols[, ...][, dim])`. If `dim` is not provided, the number of
            channels is preserved.

    Returns
        image (`np.ndarray`):
            The input image, but with additional singleton dimensions appended in the case where `len(output_shape) >
            input.ndim`.
        output_shape (`Tuple`):
            The output shape converted to tuple.

    Raises ------ ValueError:
        If output_shape length is smaller than the image number of dimensions.

    Notes ----- The input image is reshaped if its number of dimensions is not equal to output_shape_length.

    )é   r   éÿÿÿÿzIoutput_shape length cannot be smaller than the image number of dimensions)ÚtupleÚlenÚshapeÚndimÚnpÚreshapeÚ
ValueError)ÚimageÚoutput_shapeÚoutput_ndimÚinput_shapes       úr/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/transformers/models/owlv2/modular_owlv2.pyÚ_preprocess_resize_output_shaper'   3   s»   € ô. ˜Ó&€LÜ�lÓ#€KØ—+‘+€KØ�U—Z‘ZÒà�t˜{¨U¯Z©ZÑ7Ñ8Ñ8ˆÜ—
‘
˜5 +Ó.ˆð �,ÐÐð 
˜Ÿ
™
 Q™Ò	&à# u§{¡{°2¡Ð&8Ñ8ˆð �,ÐÐð 
�u—z‘zÒ	!ÜÐdÓeÐeà�,ÐÐó    c                 ó*  — t        j                  | «      }t        j                  |«      r)t         j                  }t         j                  } || «      }n t         j                  }t         j
                  } || «      }t        j                  |||«      }|S )a¯  Clip output image to range of values of input image.

    Note that this function modifies the values of *output_image* in-place.

    Taken from:
    https://github.com/scikit-image/scikit-image/blob/b4b521d6f0a105aabeaa31699949f78453ca3511/skimage/transform/_warps.py#L640.

    Args:
        input_image : ndarray
            Input image.
        output_image : ndarray
            Output image, which is modified in-place.
    )r   ÚminÚisnanÚnanminÚnanmaxÚmaxÚclip)Úinput_imageÚoutput_imageÚmin_valÚmin_funcÚmax_funcÚmax_vals         r&   Ú_clip_warp_outputr6   Z   sn   € ô �f‰f�[Ó!€GÜ	‡x�x�Ôä—9‘9ˆÜ—9‘9ˆÙ˜;Ó'‰ä—6‘6ˆÜ—6‘6ˆÙ�{Ó#€Gä—7‘7˜<¨°'Ó:€LàÐr(   c                 ó  — t        |t        t        f«      rMt        j                  |D �cg c]  }|d   ‘Œ	 c}«      }t        j                  |D �cg c]  }|d   ‘Œ	 c}«      }n:t        |t        j
                  «      r|j                  d«      \  }}nt        d«      ‚t        j                  ||«      }t        j                  ||||gd¬«      }|j                  d«      j                  | j                  «      }| |z  } | S c c}w c c}w )a  
    Scale batch of bounding boxes to the target sizes.

    Args:
        boxes (`torch.Tensor` of shape `(batch_size, num_boxes, 4)`):
            Bounding boxes to scale. Each box is expected to be in (x1, y1, x2, y2) format.
        target_sizes (`list[tuple[int, int]]` or `torch.Tensor` of shape `(batch_size, 2)`):
            Target sizes to scale the boxes to. Each target size is expected to be in (height, width) format.

    Returns:
        `torch.Tensor` of shape `(batch_size, num_boxes, 4)`: Scaled bounding boxes.
    r   r   z4`target_sizes` must be a list, tuple or torch.Tensor)Údim)Ú
isinstanceÚlistr   ÚtorchÚtensorÚTensorÚunbindÚ	TypeErrorr.   ÚstackÚ	unsqueezeÚtoÚdevice)ÚboxesÚtarget_sizesÚiÚimage_heightÚimage_widthÚmax_sizeÚscale_factors          r&   Ú_scale_boxesrK   x   sÝ   € ô �,¤¤u Ô.Ü—|‘|°<Ö$@¨a Q q£TÒ$@ÓAˆÜ—l‘l°,Ö#?¨Q A a£DÒ#?Ó@‰Ü	�L¤%§,¡,Ô	/Ø$0×$7Ñ$7¸Ó$:Ñ!ˆ‘käÐNÓOÐOô �y‰y˜ {Ó3€Hä—;‘; ¨(°H¸hÐGÈQÔO€LØ×)Ñ)¨!Ó,×/Ñ/°·±Ó=€LØ�LÑ €EØ€Lùò %AùÚ#?s   ªD ÁDc                   ó,  — e Zd Zej                  ZeZeZ	dddœZ
dZdZdZdZdZdZdZdddded	dfd
„Z	 dded   dedz  ded	ed   fd„Z	 	 ddddeded	dfd„Zded   dededd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ez  dz  d	efd„Zy)ÚOwlv2ImageProcessoréÀ  ©ÚheightÚwidthçp?TNÚimagesztorch.TensorÚconstant_valueÚreturnc                 ó’   — |j                   dd \  }}t        ||«      }||z
  }||z
  }dd||f}t        j                  |||¬«      }	|	S )ú<
        Pad an image with zeros to the given size.
        éþÿÿÿNr   )Úfill)r   r.   ÚtvFr   )
ÚselfrS   rT   rP   rQ   ÚsizeÚ
pad_bottomÚ	pad_rightÚpaddingÚpadded_images
             r&   Ú_pad_imageszOwlv2ImageProcessor._pad_images¥   s\   € ð Ÿ™ R SÐ)‰ˆ�Ü�6˜5Ó!ˆØ˜F‘]ˆ
Ø˜5‘Lˆ	à�a˜ JÐ/ˆÜ—w‘w˜v w°^ÔDˆØÐr(   Údisable_groupingc                 ó¢   — t        ||¬«      \  }}i }|j                  «       D ]  \  }}	| j                  |	|¬«      }	|	||<   Œ t        ||«      }
|
S )z�
        Unlike the Base class `self.pad` where all images are padded to the maximum image size,
        Owlv2 pads an image to square.
        ©rb   )rT   )r   Úitemsra   r   )r[   rS   rb   rT   ÚkwargsÚgrouped_imagesÚgrouped_images_indexÚprocessed_images_groupedr   Ústacked_imagesÚprocessed_imagess              r&   r   zOwlv2ImageProcessor.pad²   sz   € ô 0EÀVÐ^nÔ/oÑ,ˆÐ,Ø#%Ð Ø%3×%9Ñ%9Ó%;ò 	=Ñ!ˆE�>Ø!×-Ñ-ØØ-ð .ó ˆNð /=Ð$ UÒ+ð	=ô *Ð*BÐDXÓYÐàÐr(   r"   r\   Úanti_aliasingc                 óh  — |j                   |j                  f}|j                  }t        j                  |dd «      j                  |j                  «      t        j                  |«      j                  |j                  «      z  }|�r|€|dz
  dz  j                  d¬«      }n�t        j                  |«      t        j                  |«      z  }t        j                  |dk  «      rt        d«      ‚t        j                  |dkD  |dk  z  «      rt        j                  d«       t        j                  |dk(  «      r|}	n]dt        j                  d|z  «      j                  «       z  dz   }
t!        j"                  ||
d   |
d   f|j%                  «       ¬	«      }	n|}	t'        j(                  |	|d
¬«      S )az  
        Resize an image as per the original implementation.

        Args:
            image (`Tensor`):
                Image to resize.
            size (`dict[str, int]`):
                Dictionary containing the height and width to resize the image to.
            anti_aliasing (`bool`, *optional*, defaults to `True`):
                Whether to apply anti-aliasing when downsampling the image.
            anti_aliasing_sigma (`float`, *optional*, defaults to `None`):
                Standard deviation for Gaussian kernel when downsampling the image. If `None`, it will be calculated
                automatically.
        r   Nr   r   )r*   úFAnti-aliasing standard deviation must be greater than or equal to zeroúWAnti-aliasing standard deviation greater than zero but not down-sampling along all axesr   )ÚsigmaF)r\   Ú	antialias)rP   rQ   r   r;   r<   rB   rC   ÚclampÚ
atleast_1dÚ	ones_likeÚanyr!   ÚwarningsÚwarnÚceilÚintrZ   Úgaussian_blurÚtolistr   Úresize)r[   r"   r\   rl   Úanti_aliasing_sigmarf   r#   r%   ÚfactorsÚfilteredÚkernel_sizess              r&   r|   zOwlv2ImageProcessor.resizeÊ   s~  € ð, Ÿ™ T§Z¡ZÐ0ˆà—k‘kˆô —,‘,˜{¨1¨2˜Ó/×2Ñ2°5·<±<Ó@Ä5Ç<Á<ÐP\ÓC]×C`ÑC`Ðaf×amÑamÓCnÑnˆâØ"Ð*Ø(/°!©°qÑ'8×&?Ñ&?ÀAÐ&?Ó&FÑ#ä&+×&6Ñ&6Ð7JÓ&KÌeÏoÉoÐ^eÓNfÑ&fÐ#Ü—9‘9Ð0°1Ñ4Ô5Ü$Ð%mÓnÐnÜ—Y‘YÐ 3°aÑ 7¸GÀq¹LÑIÔJÜ—M‘MØqôô �y‰yÐ,°Ñ1Ô2Ø ‘à ¤5§:¡:¨aÐ2EÑ.EÓ#F×#JÑ#JÓ#LÑLÈqÑP�ä×,Ñ,Ø˜L¨™O¨\¸!©_Ð=ÐEX×E_ÑE_ÓEaô‘ð
 ˆHä!×(Ñ(¨¸ÈÔNÐNr(   Ú	do_resizeÚresampleúPILImageResampling | NoneÚdo_padÚ
do_rescaleÚrescale_factorÚdo_normalizeÚ
image_meanÚ	image_stdÚreturn_tensorsc           	      ó4  — t        ||¬«      \  }}i }|j                  «       D ]   \  }}| j                  |||d|	|
«      }|||<   Œ" t        ||«      }|r| j	                  |d|¬«      }t        ||¬«      \  }}i }|j                  «       D ]!  \  }}|sŒ	| j                  |||¬«      }|||<   Œ# t        ||«      }t        ||¬«      \  }}i }|j                  «       D ]   \  }}| j                  |d|||	|
«      }|||<   Œ" t        ||«      }t        d|i|¬«      S )Nrd   Fç        )rT   rb   )r"   r\   r‚   Úpixel_values©ÚdataÚtensor_type)r   re   Úrescale_and_normalizer   r   r|   r   )r[   rS   r�   r\   r‚   r„   r…   r†   r‡   rˆ   r‰   rb   rŠ   rf   rg   rh   ri   r   rj   rk   Úresized_images_groupedÚresized_stackÚresized_imagess                          r&   Ú_preprocesszOwlv2ImageProcessor._preprocess   s‡  € ô" 0EÀVÐ^nÔ/oÑ,ˆÐ,Ø#%Ð à%3×%9Ñ%9Ó%;ò 	=Ñ!ˆE�>à!×7Ñ7Ø 
¨N¸EÀ:ÈyóˆNð /=Ð$ UÒ+ð	=ô *Ð*BÐDXÓYÐáØ#Ÿx™xÐ(8ÈÐ_o˜xÓpÐä/DØÐ/?ô0
Ñ,ˆÐ,ð "$ÐØ%3×%9Ñ%9Ó%;ò 	>Ñ!ˆE�>ÚØ $§¡°.ÀtÐV^ Ó _�Ø0=Ð& uÒ-ð	>ô (Ð(>Ð@TÓUˆô 0EÀ^ÐfvÔ/wÑ,ˆÐ,Ø#%Ð Ø%3×%9Ñ%9Ó%;ò 	=Ñ!ˆE�>à!×7Ñ7Ø  ~°|ÀZÐQZóˆNð /=Ð$ UÒ+ð	=ô *Ð*BÐDXÓYÐä .Ð2BÐ!CÐQ_Ô`Ð`r(   ©rŒ   ©TN)Ú__name__Ú
__module__Ú__qualname__r   ÚBILINEARr‚   r
   rˆ   r   r‰   r\   r†   r�   r…   r‡   r„   Ú	crop_sizeÚdo_center_cropÚfloatra   r:   Úboolr   r   r|   Ústrr   r   r•   © r(   r&   rM   rM   —   s˜  „ à!×*Ñ*€HØ!€JØ€IØ CÑ(€DØ€NØ€IØ€JØ€LØ€FØ€IØ€Nñ .ð À%ð ÐR`ó ð" !$ñ	 à�^Ñ$ð ð  ™+ð ð ð	 ð 
ˆnÑ	ó ð8 #Ø ñ4Oàð4Oð ð4Oð ð	4Oð 
ó4Oðl7aà�^Ñ$ð7að ð7að ð	7að
 .ð7að ð7að ð7að ð7að ð7að ˜D ™KÑ'¨$Ñ.ð7að ˜4 ™;Ñ&¨Ñ-ð7að  ™+ð7að ˜jÑ(¨4Ñ/ð7að 
ô7ar(   rM   )r;   )Úbackendsc                   ób  — e Zd Zej                  ZeZeZ	dddœZ
dZdZdZdZdZdZdZddej&                  dedej&                  fd	„Z	 	 ddej&                  d
eeef   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ee   z  dz  deee   z  dz  deez  dz  defd„Zy)ÚOwlv2ImageProcessorPilrN   rO   rR   TNr"   rT   rU   c                 ó~   — |j                   dd \  }}t        ||«      }||z
  }||z
  }t        |d|fd|ff|¬«      }|S )rW   rX   Nr   )r"   r_   Úconstant_values)r   r.   r   )r[   r"   rT   rP   rQ   r\   r]   r^   s           r&   r   zOwlv2ImageProcessorPil.padI  s]   € ð Ÿ™ B CÐ(‰ˆ�Ü�6˜5Ó!ˆØ˜F‘]ˆ
Ø˜5‘Lˆ	ÜØØ˜�_ q¨) nÐ5Ø*ô
ˆð
 ˆr(   r\   rl   c                 ó   — t        | d«       |d   |d   f}t        |t        j                  «      }t	        ||«      \  }}|j
                  }t        j                  ||«      }d}	d}
d}|rº|€t        j                  d|dz
  dz  «      }n�t        j                  |«      t        j                  |«      z  }t        j                  |dk  «      rt        d«      ‚t        j                  |dkD  |dk  z  «      rt        j                  d	«       t        j                   |||
|	¬
«      }n|}|D �cg c]  }d|z  ‘Œ	 }}t        j"                  ||||	|
d¬«      }t%        ||«      }t        |t        j&                  «      }|S c c}w )a~  
        Resize an image as per the original implementation.

        Args:
            image (`np.ndarray`):
                Image to resize.
            size (`dict[str, int]`):
                Dictionary containing the height and width to resize the image to.
            anti_aliasing (`bool`, *optional*, defaults to `True`):
                Whether to apply anti-aliasing when downsampling the image.
            anti_aliasing_sigma (`float`, *optional*, defaults to `None`):
                Standard deviation for Gaussian kernel when downsampling the image. If `None`, it will be calculated
                automatically.
        ÚscipyrP   rQ   Úmirrorr   r   r   rn   ro   )ÚcvalÚmodeT)Úorderr«   rª   Ú	grid_mode)r   r	   r   ÚLASTr'   r   r   ÚdivideÚmaximumrs   rt   ru   r!   rv   rw   ÚndiÚgaussian_filterÚzoomr6   ÚFIRST)r[   r"   r\   rl   r}   rf   r#   r%   r~   Úndi_moderª   r¬   r   ÚfÚzoom_factorsÚouts                   r&   r|   zOwlv2ImageProcessorPil.resizeX  sq  € ô, 	˜$ Ô(à˜X™¨¨W©Ð6ˆÜ+¨EÔ3C×3HÑ3HÓIˆÜ=¸eÀ\ÓRÑˆˆ|Ø—k‘kˆÜ—)‘)˜K¨Ó6ˆð ˆØˆØˆÙØ"Ð*Ü&(§j¡j°°W¸q±[ÀAÑ4EÓ&FÑ#ä&(§m¡mÐ4GÓ&HÌ2Ï<É<ÐX_ÓK`Ñ&`Ð#Ü—6‘6Ð-°Ñ1Ô2Ü$Ð%mÓnÐnÜ—V‘VÐ0°1Ñ4¸ÀA¹ÑFÔGÜ—M‘MØqôô ×*Ñ*¨5Ð2EÈDÐW_Ô`‰HàˆHà'.Ö/ !˜˜A›Ð/ˆÐ/Ü�h‰h�x °UÀÐPTÐ`dÔeˆä! %¨Ó-ˆä+¨EÔ3C×3IÑ3IÓJˆØˆùò 0s   Ä*E;rS   r�   r‚   rƒ   r„   r…   r†   r‡   rˆ   r‰   rŠ   c                 óö   — g }|D ]d  }|r| j                  ||«      }|r| j                  |«      }|r| j                  |||«      }|r| j                  ||	|
«      }|j	                  |«       Œf t        d|i|¬«      S )Nr�   rŽ   )Úrescaler   r|   Ú	normalizeÚappendr   )r[   rS   r�   r\   r‚   r„   r…   r†   r‡   rˆ   r‰   rŠ   rf   rk   r"   s                  r&   r•   z"Owlv2ImageProcessorPil._preprocess‘  sŠ   € ð ÐØò 		+ˆEÙØŸ™ U¨NÓ;�ÙØŸ™ ›�ÙØŸ™ E¨4°Ó:�ÙØŸ™ u¨j¸)ÓD�Ø×#Ñ# EÕ*ð		+ô  .Ð2BÐ!CÐQ_Ô`Ð`r(   r–   r—   ) r˜   r™   rš   r   r›   r‚   r
   rˆ   r   r‰   r\   r†   r�   r…   r‡   r„   rœ   r�   r   Úndarrayrž   r   Údictr    ry   rŸ   r|   r:   r   r   r   r•   r¡   r(   r&   r¤   r¤   :  sc  „ ð "×*Ñ*€HØ!€JØ€IØ CÑ(€DØ€NØ€IØ€JØ€LØ€FØ€IØ€Nñ˜Ÿ™ð °Uð ÀRÇZÁZó ð& #Ø ñ7à�z‰zð7ð �3˜�8‰nð7ð ð	7ð 
�‰ó7ðraà�R—Z‘ZÑ ðað ðað ð	að
 .ðað ðað ðað ðað ðað ˜D ™KÑ'¨$Ñ.ðað ˜4 ™;Ñ&¨Ñ-ðað ˜jÑ(¨4Ñ/ðað 
ôar(   r¤   ),rv   Únumpyr   r;   Ú$torchvision.transforms.v2.functionalÚ
transformsÚv2Ú
functionalrZ   Úimage_processing_backendsr   Úimage_processing_utilsr   Úimage_transformsr   r   r   r	   Úimage_utilsr
   r   r   r   r   Úutilsr   r   r   r   Úutils.import_utilsr   Úowlvit.image_processing_owlvitr   Ú"owlvit.image_processing_pil_owlvitr   r¨   r   r±   r'   r6   rK   rM   r¤   Ú__all__r¡   r(   r&   ú<module>rÍ      sÀ   ðó ã Û ß 2Ó 2å ;Ý 2÷ó ÷õ ÷ó õ +Ý AÝ Hñ ÔÝ$ò$òNò<ð> ô_aÐ.ó _aó ð_aðD Ù	�:ÔôoaÐ4ó oaó ó ðoaðd !Ð":Ð
;�r(   