Ë
    ÛÓ^j_,  ã                   óX  — d Z ddlZddl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mZmZ ddlmZmZ dd	lmZmZmZ  e«       rdd
lmZ ddlmZ dedeeef   fd„Z dedefd„Z! G d„ ded¬«      Z"de#e#d      deeef   fd„Z$dddeeef   ddfd„Z%e G d„ de«      «       Z&dgZ'y)z#Image processor class for Idefics2.é    Né   )ÚTorchvisionBackend)ÚBatchFeature)Úgroup_images_by_shapeÚreorder_images)ÚIMAGENET_STANDARD_MEANÚIMAGENET_STANDARD_STDÚ
ImageInputÚPILImageResamplingÚSizeDictÚmake_nested_list_of_images)ÚImagesKwargsÚUnpack)Ú
TensorTypeÚauto_docstringÚis_vision_available)ÚImage)Ú
functionalÚsizeÚreturnc                 ó  — | j                   dd \  }}|j                  }|j                  }||z  }||k\  r||kD  r|}t        ||z  «      }n||kD  r||kD  r|}t        ||z  «      }t	        ||«      }t	        ||«      }||fS )zš
    Get the output size of the image after resizing given a dictionary specifying the max and min sizes.
    Images are always channels-first (CHW).
    éþÿÿÿN)ÚshapeÚshortest_edgeÚlongest_edgeÚintÚmax)Úimager   ÚheightÚwidthÚmin_lenÚmax_lenÚaspect_ratios          ú�/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/transformers/models/idefics2/image_processing_idefics2.pyÚget_resize_output_image_sizer%   (   sœ   € ð
 —K‘K  Ð$�M€FˆEà× Ñ €GØ×Ñ€GØ˜6‘>€Là�‚˜5 7š?ØˆÜ�U˜\Ñ)Ó*‰Ø	�%Š˜F WÒ,ØˆÜ�F˜\Ñ)Ó*ˆÜ�˜Ó!€FÜ��wÓ€EØ�5ˆ=Ðó    r   c                 ó&  — t        «       rt        | t        j                  «      s| S | j                  dk(  r| S | j	                  d«      }t        j
                  d|j                  d«      }t        j                  ||«      }|j	                  d«      }|S )zˆ
    Converts an image to RGB format. Only converts if the image is of type PIL.Image.Image, otherwise returns the image
    as is.
    ÚRGBÚRGBA)éÿ   r*   r*   )r   Ú
isinstancer   ÚmodeÚconvertÚnewr   Úalpha_composite)r   Ú
image_rgbaÚ
backgroundr/   s       r$   Úconvert_to_rgbr2   >   sy   € ô
 Ô ¬
°5¼%¿+¹+Ô(FØˆà‡z�z�UÒØˆà—‘˜vÓ&€JÜ—‘˜6 :§?¡?°OÓD€JÜ×+Ñ+¨J¸
ÓC€OØ%×-Ñ-¨eÓ4€OØÐr&   c                   ó   — e Zd ZU dZeed<   y)ÚIdefics2ImageProcessorKwargszÅ
    do_image_splitting (`bool`, *optional*, defaults to `self.do_image_splitting`):
        Whether to split the image into a sequence 4 equal sub-images concatenated with the original image.
    Údo_image_splittingN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚboolÚ__annotations__© r&   r$   r4   r4   P   s   … ñð
 Ôr&   r4   F)ÚtotalÚimages_listztorch.Tensor|np.ndarrayc                 ó®   — g }| D ]'  }|D ]   }|j                  |j                  dd «       Œ" Œ) t        d„ |D «       «      }t        d„ |D «       «      }||fS )zH
    Get the maximum height and width across all images in a batch.
    r   Nc              3   ó&   K  — | ]	  }|d    –— Œ y­w)r   Nr<   ©Ú.0r   s     r$   ú	<genexpr>z'get_max_height_width.<locals>.<genexpr>b   s   è ø€ Ò5 �T˜!•WÑ5ùó   ‚c              3   ó&   K  — | ]	  }|d    –— Œ y­w)é   Nr<   rA   s     r$   rC   z'get_max_height_width.<locals>.<genexpr>c   s   è ø€ Ò4 �D˜•GÑ4ùrD   )Úappendr   r   )r>   Úimage_sizesÚimagesr   Ú
max_heightÚ	max_widths         r$   Úget_max_height_widthrL   Y   sm   € ð €KØò 1ˆØò 	1ˆEØ×Ñ˜uŸ{™{¨2¨3Ð/Õ0ñ	1ð1ô Ñ5¨Ô5Ó5€JÜÑ4¨Ô4Ó4€IØ˜	Ð"Ð"r&   útorch.TensorÚoutput_sizec                 ó    — | j                   dd \  }}t        j                  |t        j                  | j                  ¬«      }d|d|…d|…f<   |S )zc
    Make a pixel mask for the image, where 1 indicates a valid pixel and 0 indicates padding.
    r   N©ÚdtypeÚdevicerF   )r   ÚtorchÚzerosÚint64rR   )r   rN   Úinput_heightÚinput_widthÚmasks        r$   Úmake_pixel_maskrY   g   sO   € ð !&§¡¨B¨CÐ 0Ñ€L�+Ü�;‰;�{¬%¯+©+¸e¿l¹lÔK€DØ()€Dˆˆ,ˆ˜˜˜Ð	$Ñ%Ø€Kr&   c                   óÀ  ‡ — e Zd ZeZej                  ZeZ	e
ZdZdZdZdZdZdZdZdddœZddgZdee   fˆ fd	„Zed
edee   defˆ fd„«       Zdedefd„Z	 d'dddeddddfˆ fd„Zd(d
ededefd„Zd
dde e d      fd„Z!	 d)ddde"eef   dede"d   fd„Z#d
e e d      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$dz  d#e$dz  d$e$dz  d%e&e'z  dz  defd&„Z(ˆ xZ)S )*ÚIdefics2ImageProcessorTFiz  iÔ  )r   r   Úpixel_valuesÚpixel_attention_maskÚkwargsc                 ó$   •— t        ‰| �  di |¤Ž y )Nr<   )ÚsuperÚ__init__)Úselfr^   Ú	__class__s     €r$   ra   zIdefics2ImageProcessor.__init__�   s   ø€ Ü‰ÑÑ"˜6Ó"r&   rI   r   c                 ó$   •— t        ‰| �  |fi |¤ŽS ©N)r`   Ú
preprocess)rb   rI   r^   rc   s      €r$   rf   z!Idefics2ImageProcessor.preprocess„   s   ø€ ä‰wÑ! &Ñ3¨FÑ3Ð3r&   r   c                 ó   — t        |«      S )zConvert an image to RGB format.)r2   )rb   r   s     r$   r2   z%Idefics2ImageProcessor.convert_to_rgbˆ   s   € ä˜eÓ$Ð$r&   NrM   r   Úresamplez7PILImageResampling | tvF.InterpolationMode | int | Nonec                 ó  •— |j                   r|j                  rt        ||«      }n<|j                  r%|j                  r|j                  |j                  f}nt        d«      ‚t        ‰| �  |t        |d   |d   ¬«      fd|i|¤ŽS )z7Resize using Idefics2 shortest_edge/longest_edge logic.zWSize must contain 'height' and 'width' keys or 'shortest_edge' and 'longest_edge' keys.r   rF   )r   r    rh   )	r   r   r%   r   r    Ú
ValueErrorr`   Úresizer   )rb   r   r   rh   r^   Únew_sizerc   s         €r$   rk   zIdefics2ImageProcessor.resizeŒ   sz   ø€ ð ×Ò $×"3Ò"3Ü3°E¸4Ó@‰HØ�[Š[˜TŸZšZØŸ™ T§Z¡ZÐ0‰HäÐvÓwÐwä‰w‰~˜e¤X°X¸a±[ÈÐQRÉÔ%TÑrÐ_gÐrÐkqÑrÐrr&   Úexpected_ndimsc                 ó>   — | j                  |«      }t        ||¬«      S )z1Prepare a nested images structure for processing.)rm   )Úfetch_imagesr   )rb   rI   rm   s      r$   Ú_prepare_images_structurez0Idefics2ImageProcessor._prepare_images_structure�   s   € à×"Ñ" 6Ó*ˆÜ)¨&ÀÔPÐPr&   c           	      ó   — |j                   dd \  }}|dz  }|dz  }|dd|…d|…f   |dd|…|d…f   |d|d…d|…f   |d|d…|d…f   |g}t        t        |d   «      «      D ��cg c]  }|D �cg c]  }||   ‘Œ	 c}‘Œ }}}|S c c}w c c}}w )zy
        Split a batch of images into 4 equal sub-images, and concatenate that sequence with the original image.
        r   Né   .r   )r   ÚrangeÚlen)	rb   rI   r   r    Ú	mid_widthÚ
mid_heightÚbatch_split_imagesÚir   s	            r$   Úsplit_imagesz#Idefics2ImageProcessor.split_images¢   sÔ   € ð Ÿ™ R SÐ)‰ˆ�à˜Q‘Jˆ	Ø˜q‘[ˆ
ð �3˜˜˜ Z i ZÐ/Ñ0Ø�3˜˜˜ Y¡ZÐ/Ñ0Ø�3˜
™ Z i ZÐ/Ñ0Ø�3˜
™ Y¡ZÐ/Ñ0Øð
Ðô SXÔX[Ð\nÐopÑ\qÓXrÓRs×tÈQÐ5GÖH¨E˜u Q›xÔHÐtÐÑtØ!Ð!ùò IùÓts   Á&	B
Á/BÁ;B
ÂB
Úpadded_sizeÚfill)rM   rM   c                 óV  — |j                   dd }|d   |d   z
  }|d   |d   z
  }|dk  s|dk  rt        d|› d|› d�«      ‚||k7  rdd||f}t        j                  |||d¬	«      }t	        j
                  |t        j                  |j                  ¬
«      }d|d|d   …d|d   …f<   ||fS )z]
        Pad an image to the specified size and create the corresponding pixel mask.
        r   Nr   rF   zzPadding dimensions are negative. Please make sure that the padded size is larger than the original size. Got padded size: z, original size: ú.Úconstant)r{   Úpadding_moderP   )r   rj   ÚtvFÚpadrS   rT   rU   rR   )	rb   r   rz   r{   Úoriginal_sizeÚpadding_bottomÚpadding_rightÚpaddingÚ
pixel_masks	            r$   r�   zIdefics2ImageProcessor.pad¶   sè   € ð Ÿ™ B CÐ(ˆØ$ Q™¨-¸Ñ*:Ñ:ˆØ# A™¨°qÑ)9Ñ9ˆà˜AÒ °Ò!2Üð3Ø3>°-Ð?PÐQ^ÐP_Ð_`ðbóð ð
 ˜KÒ'Ø˜!˜]¨NÐ;ˆGÜ—G‘G˜E 7°ÀJÔOˆEä—[‘[ ´E·K±KÈÏÉÔUˆ
Ø=>ˆ
Ð%�] 1Ñ%Ð%Ð'9¨°qÑ)9Ð'9Ð9Ñ:à�jÐ Ð r&   Ú	do_resizeÚ
do_rescaleÚrescale_factorÚdo_normalizeÚ
image_meanÚ	image_stdÚdo_padr5   Údisable_groupingÚreturn_tensorsc           	      óì  — t        ||d¬«      \  }}i }|j                  «       D ]  \  }}|r| j                  |«      }|||<   Œ t        ||d¬«      }|r/t	        |«      D ]!  \  }}|D ��cg c]  }|D ]  }|‘Œ Œ c}}||<   Œ# t        ||d¬«      \  }}i }|j                  «       D ]   \  }}|r| j                  |||¬«      }|||<   Œ" t        ||d¬«      }t        ||d¬«      \  }}i }|j                  «       D ]   \  }}| j                  ||||||	«      }|||<   Œ" t        ||d¬«      }|
rçt        d„ |D «       «      }t        |«      \  }}t        j                  t        |«      |g|d   d   j                  d   ||f¢­d|d   d   j                  iŽ} t        j                  t        |«      |g||f¢­d|d   d   j                  iŽ}!t	        |«      D ]9  \  }}t	        |«      D ]&  \  }"}| j                  |||f«      \  | ||"f<   |!||"f<   Œ( Œ; | }|
r|!dœ}#nB|d	k(  r9d
t        j                  |D �cg c]  }t        j                  |«      ‘Œ c}«      i}#nd
|i}#t!        |#|¬«      S c c}}w c c}w )NT)rŽ   Ú	is_nested)r‘   )rh   c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wre   )rt   )rB   Úimages_s     r$   rC   z5Idefics2ImageProcessor._preprocess.<locals>.<genexpr>  s   è ø€ Ò N°'¤ W§Ñ Nùs   ‚r   rR   )r\   r]   Úptr\   )ÚdataÚtensor_type)r   Úitemsry   r   Ú	enumeraterk   Úrescale_and_normalizer   rL   rS   rT   rt   r   rR   r�   Ústackr   )$rb   rI   r‡   r   rh   rˆ   r‰   rŠ   r‹   rŒ   r�   r5   rŽ   r�   r^   Úgrouped_imagesÚgrouped_images_indexÚsplit_images_groupedr   Ústacked_imagesry   rx   Úgroup_imagesÚsublistr   Úresized_images_groupedÚresized_imagesÚprocessed_images_groupedÚprocessed_imagesÚmax_num_imagesrJ   rK   Úprocessed_images_paddedÚpixel_attention_masksÚjr•   s$                                       r$   Ú_preprocessz"Idefics2ImageProcessor._preprocessÏ   s:  € ô" 0EØÐ%5Àô0
Ñ,ˆÐ,ð  "ÐØ%3×%9Ñ%9Ó%;ò 	9Ñ!ˆE�>Ù!Ø!%×!2Ñ!2°>Ó!B�Ø*8Ð  Ò'ð	9ô &Ð&:Ð<PÐ\`ÔaˆÙÜ#,¨\Ó#:ò [‘��<Ø8D×"Z¨WÐRYÒ"ZÈ¢5Ð"Z 5Ó"Z�˜Q’ð[ô 0EØÐ+;Àtô0
Ñ,ˆÐ,ð "$ÐØ%3×%9Ñ%9Ó%;ò 	;Ñ!ˆE�>ÙØ!%§¡¨^¸TÈH Ó!U�Ø,:Ð" 5Ò)ð	;ô (Ð(>Ð@TÐ`dÔeˆä/DØÐ-=Èô0
Ñ,ˆÐ,ð $&Ð Ø%3×%9Ñ%9Ó%;ò 	=Ñ!ˆE�>Ø!×7Ñ7Ø 
¨N¸LÈ*ÐV_óˆNð /=Ð$ UÒ+ð		=ô
 *Ð*BÐDXÐdhÔiÐáÜ Ñ NÐ=MÔ NÓNˆNÜ$8Ð9IÓ$JÑ!ˆJ˜	ä&+§k¡kÜÐ$Ó%Øð'ð # 1Ñ% aÑ(×.Ñ.¨qÑ1°:¸yÐIò'ð (¨Ñ*¨1Ñ-×4Ñ4ñ	'Ð#ô %*§K¡KÜÐ$Ó%Øð%ð ˜iÐ(ò%ð (¨Ñ*¨1Ñ-×4Ñ4ñ	%Ð!ô 'Ð'7Ó8ò ‘	��6Ü )¨&Ó 1ò ‘H�A�uØQU×QYÑQYØ 
¨IÐ6óRÑNÐ+¨A¨q¨DÑ1Ð3HÈÈAÈÒ3Nñðð
  7ÐÙØ$4ÐNcÑd‰DØ˜tÒ#Ø"¤E§K¡KÐScÖ0dÈ´·±¸VÕ1DÒ0dÓ$eÐf‰Dà"Ð$4Ð5ˆDÜ °>ÔBÐBùóg #[ùò` 1es   Á*I+È5I1
re   )r   )r   )*r6   r7   r8   r4   Úvalid_kwargsr   ÚBILINEARrh   r   r‹   r	   rŒ   r‡   rˆ   rŠ   r�   Údo_convert_rgbr5   Údefault_to_squarer   Úmodel_input_namesr   ra   r   r
   r   rf   r2   r   rk   r   rp   Úlistry   Útupler�   r:   ÚfloatÚstrr   r©   Ú__classcell__)rc   s   @r$   r[   r[   q   sE  ø„ à/€LØ!×*Ñ*€HØ'€JØ%€IØ€IØ€JØ€LØ€FØ€NØÐØÐØ °#Ñ6€DØ'Ð)?Ð@Ðð# Ð(DÑ!Eõ #ð ð4 ð 4°vÐ>ZÑ7[ð 4Ð`lô 4ó ð4ð% Jð %°:ó %ð OSñ	sàðsð ðsð Lð	sð 
õsñ"Q°
ð QÈCð QÐXbó Qð
" >ð "°d¸4ÀÑ;OÑ6Pó "ð* PQñ!Ø#ð!Ø27¸¸S¸±/ð!ØILð!à	Ð-Ñ	.ó!ð2OCà�T˜.Ñ)Ñ*ðOCð ðOCð ð	OCð
 LðOCð ðOCð ðOCð ðOCð ˜D ™KÑ'¨$Ñ.ðOCð ˜4 ™;Ñ&¨Ñ-ðOCð �t‘ðOCð ! 4™KðOCð  ™+ðOCð ˜jÑ(¨4Ñ/ðOCð  
÷!OCr&   r[   )(r9   ÚnumpyÚnprS   Úimage_processing_backendsr   Úimage_processing_utilsr   Úimage_transformsr   r   Úimage_utilsr   r	   r
   r   r   r   Úprocessing_utilsr   r   Úutilsr   r   r   ÚPILr   Útorchvision.transforms.v2r   r€   r°   r   r%   r2   r4   r¯   rL   rY   r[   Ú__all__r<   r&   r$   ú<module>r¿      sò   ðñ *ã Û å ;Ý 2ß E÷÷ ÷ 5ß DÑ Dñ ÔÝå 7ð¨hð ¸5ÀÀcÀ¹?ó ð,˜*ð ¨ó ô$ <°uõ ð# d¨4Ð0IÑ+JÑ&Kð #ÐPUÐVYÐ[^ÐV^ÑP_ó #ð˜>ð ¸¸cÀ3¸h¹ð ÈNó ð ôlCÐ/ó lCó ðlCð^ $Ð
$�r&   