Ë
    ÜÓ^j…  ã                   ó®   — d Z ddl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 dd	lmZmZmZmZ dd
lmZmZ ddlmZmZ e G d„ de«      «       ZdgZy)z Image processor class for LLaVa.é    )ÚUnionN)Ú
functionalé   )ÚTorchvisionBackend)ÚBatchFeature)Úgroup_images_by_shapeÚreorder_images)ÚOPENAI_CLIP_MEANÚOPENAI_CLIP_STDÚPILImageResamplingÚSizeDict)ÚImagesKwargsÚUnpack)Ú
TensorTypeÚauto_docstringc                    óD  ‡ — e Zd Zej                  ZeZeZ	ddiZ
dZdddœZdZdZdZdZdZdZdee   fˆ fd„Z	 ddd	d
eeeeef   z  dd	fd„Zded	   dedededdef   dz  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dz  deez  dz  de f d„Z!ˆ xZ"S ) ÚLlavaImageProcessorÚshortest_edgeéà   F)ÚheightÚwidthTÚkwargsc                 ó$   •— t        ‰| �  di |¤Ž y )N© )ÚsuperÚ__init__)Úselfr   Ú	__class__s     €ú{/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/transformers/models/llava/image_processing_llava.pyr   zLlavaImageProcessor.__init__4   s   ø€ Ü‰ÑÑ"˜6Ó"ó    Úimagesztorch.TensorÚbackground_colorÚreturnc                 óª  — |j                   dd \  }}||k(  r|S t        |j                   «      dk(  r|j                   d   n|j                   d   }t        |t        «      r|gdg|dz
  z  z   }nt        |«      |k7  rt	        d|› d�«      ‚t        ||«      }||z
  dz  }||z
  dz  }||z
  |z
  }	||z
  |z
  }
t        j                  ||||	|
g|¬	«      }|S )
a›  
        Pads an image to a square based on the longest edge.

        Args:
            images (`torch.Tensor`):
                The images to pad. Shape: (batch_size, num_channels, height, width) or (num_channels, height, width).
            background_color (`int` or `tuple[int, int, int]`, *optional*, defaults to 0):
                The color to use for the padding. Can be an integer for single channel or a
                tuple of integers representing for multi-channel images. If passed as integer
                in multi-channel mode, it will default to `0` in subsequent channels.
        Returns:
            `torch.Tensor`: The padded images.
        éþÿÿÿNé   é   r   z(background_color must have no more than z) elements to match the number of channelsé   )ÚpaddingÚfill)ÚshapeÚlenÚ
isinstanceÚintÚ
ValueErrorÚmaxÚtvFÚpad)r   r!   r"   r   r   Únum_channelsÚmax_dimÚpaste_x_leftÚpaste_y_leftÚpaste_x_rightÚpaste_y_rightÚpadded_imagess               r   Úpad_to_squarez!LlavaImageProcessor.pad_to_square7   s  € ð$ Ÿ™ R SÐ)‰ˆ�à�UŠ?ØˆMä*-¨f¯l©lÓ*;¸qÒ*@�v—|‘| A’ÀfÇlÁlÐSTÁoˆÜÐ&¬Ô,Ø 0Ð1°Q°C¸<È!Ñ;KÑ4LÑLÑÜÐ!Ó" lÒ2ÜØ:¸<¸.ÐHqÐróð ô �f˜eÓ$ˆØ %™¨AÑ-ˆØ &Ñ(¨QÑ.ˆØ %™¨,Ñ6ˆØ &Ñ(¨<Ñ7ˆÜŸ™Ø˜\¨<¸ÈÐVÐ]mô
ˆð Ðr    Ú	do_resizeÚsizeÚresampler   ztvF.InterpolationModeNÚdo_center_cropÚ	crop_sizeÚ
do_rescaleÚrescale_factorÚdo_normalizeÚ
image_meanÚ	image_stdÚdo_padÚpad_sizeÚdisable_groupingÚreturn_tensorsc           	      óL  — t        ||¬«      \  }}i }|j                  «       D ]/  \  }}|r#| j                  |t        d„ |
D «       «      ¬«      }|||<   Œ1 t	        ||«      }t        ||¬«      \  }}i }|j                  «       D ]   \  }}|r| j                  |||¬«      }|||<   Œ" t	        ||«      }t        ||¬«      \  }}i }|j                  «       D ]4  \  }}|r| j                  ||«      }| j                  ||||	|
|«      }|||<   Œ6 t	        ||«      }t        d|i|¬«      S )N)rG   c              3   ó8   K  — | ]  }t        |d z  «      –— Œ y­w)éÿ   N)r.   )Ú.0Úxs     r   ú	<genexpr>z2LlavaImageProcessor._preprocess.<locals>.<genexpr>z   s   è ø€ ÒAcÐSTÄ#ÀaÈ#ÁgÇ,ÑAcùs   ‚)r!   r"   )Úimager<   r=   Úpixel_values)ÚdataÚtensor_type)	r   Úitemsr:   Útupler	   ÚresizeÚcenter_cropÚrescale_and_normalizer   )r   r!   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   r   Úgrouped_imagesÚgrouped_images_indexÚresized_images_groupedr+   Ústacked_imagesr9   Úresized_imagesÚprocessed_images_groupedÚprocessed_imagess                             r   Ú_preprocesszLlavaImageProcessor._preprocessa   s‹  € ô( 0EÀVÐ^nÔ/oÑ,ˆÐ,Ø!#ÐØ%3×%9Ñ%9Ó%;ò 	;Ñ!ˆE�>ÙØ!%×!3Ñ!3Ø)¼EÑAcÐXbÔAcÓ<cð "4ó "�ð -;Ð" 5Ò)ð	;ô 'Ð'=Ð?SÓTˆô 0EÀ]ÐeuÔ/vÑ,ˆÐ,Ø!#ÐØ%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Ðä .Ð2BÐ!CÐQ_Ô`Ð`r    )r   )#Ú__name__Ú
__module__Ú__qualname__r   ÚBICUBICr=   r
   rC   r   rD   r<   Údefault_to_squarer?   rE   r;   r>   r@   rB   Údo_convert_rgbr   r   r   r.   rT   r:   ÚlistÚboolr   r   ÚfloatÚstrr   r   r_   Ú__classcell__)r   s   @r   r   r   %   s–  ø„ à!×)Ñ)€HØ!€JØ€IØ˜SÐ!€DØÐØ¨Ñ-€IØ€FØ€IØ€NØ€JØ€LØ€Nð# ¨Ñ!5õ #ð 89ñ(àð(ð   c¨3° mÑ 4Ñ4ð(ð 
ó	(ðT7aà�^Ñ$ð7að ð7að ð	7að
 Ð,Ð.EÀsÐJÑKÈdÑRð7að ð7að ð7að ð7að ð7að ð7að ˜D ™KÑ'¨$Ñ.ð7að ˜4 ™;Ñ&¨Ñ-ð7að �t‘ð7að ˜T‘/ð7að  ™+ð7að  ˜jÑ(¨4Ñ/ð!7að$ 
÷%7ar    r   )Ú__doc__Útypingr   ÚtorchÚtorchvision.transforms.v2r   r1   Úimage_processing_backendsr   Úimage_processing_utilsr   Úimage_transformsr   r	   Úimage_utilsr
   r   r   r   Úprocessing_utilsr   r   Úutilsr   r   r   Ú__all__r   r    r   ú<module>rv      s]   ðñ 'å ã Ý 7å ;Ý 2÷÷ó ÷ 5ß /ð ôraÐ,ó raó ðraðj !Ð
!�r    