ó
    qyüi_,  ã                   ód  • S r SSKrSSKrSSKJr  SSKJr  SSKJ	r	J
r
  SSKJrJrJrJrJrJr  SSKJrJr  SS	KJrJrJr  \" 5       (       a  SS
KJr  SSKJr  S\S\\\4   4S jr S\S\4S jr! " S S\SS9r"S\#\#S      S\\\4   4S jr$SSS\\\4   SS4S jr%\ " S S\5      5       r&S/r'g)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                 óô   • U R                   SS u  p#UR                  nUR                  nX2-  nX2:¼  a  X5:”  a  Un[        X6-  5      nOX#:”  a  X%:”  a  Un[        X&-  5      n[	        X$5      n[	        X45      nX#4$ )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          Ús/home/mande/repo/quber/.venv/lib/python3.13/site-packages/transformers/models/idefics2/image_processing_idefics2.pyÚget_resize_output_image_sizer%   (   s†   € ð
 —K‘K  Ð$�M€Fà× Ñ €GØ×Ñ€GØ‘>€Làƒ˜5›?ØˆÜ�UÑ)Ó*‰Ø	‹˜FÓ,ØˆÜ�FÑ)Ó*ˆÜ�Ó!€FÜ�Ó€EØˆ=Ðó    r   c                 ó>  • [        5       (       a  [        U [        R                  5      (       d  U $ U R                  S:X  a  U $ U R	                  S5      n[        R
                  " SUR                  S5      n[        R                  " X!5      nUR	                  S5      nU$ )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   >   s}   € ô
 × Ñ ¬
°5¼%¿+¹+×(FÑ(FØˆà‡z�z�UÓØˆà—‘˜vÓ&€JÜ—’˜6 :§?¡?°OÓD€JÜ×+Ò+¨JÓC€OØ%×-Ñ-¨eÓ4€OØÐr&   c                   ó$   • \ rS rSr% Sr\\S'   Srg)ÚIdefics2ImageProcessorKwargséP   z¹
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_splitting© N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__ÚboolÚ__annotations__Ú__static_attributes__r7   r&   r$   r4   r4   P   s   ‡ ñð
 Ör&   r4   F)ÚtotalÚimages_listztorch.Tensor|np.ndarrayc                 ó´   • / nU  H*  nU H!  nUR                  UR                  SS 5        M#     M,     [        S U 5       5      n[        S U 5       5      nXE4$ )z@
Get the maximum height and width across all images in a batch.
r   Nc              3   ó*   #   • U  H	  oS    v •  M     g7f)r   Nr7   ©Ú.0r   s     r$   Ú	<genexpr>Ú'get_max_height_width.<locals>.<genexpr>b   s   é € Ð5ª ˜!–Wªùó   ‚c              3   ó*   #   • U  H	  oS    v •  M     g7f)é   Nr7   rD   s     r$   rF   rG   c   s   é € Ð4ª ˜–GªùrH   )Úappendr   r   )rA   Úimage_sizesÚimagesr   Ú
max_heightÚ	max_widths         r$   Úget_max_height_widthrP   Y   sa   € ð €KÛˆÛˆEØ×Ñ˜uŸ{™{¨2¨3Ð/Ö0ó ñ ô Ñ5©Ó5Ó5€JÜÑ4©Ó4Ó4€IØÐ"Ð"r&   útorch.TensorÚoutput_sizec                 óš   • U R                   SS u  p#[        R                  " U[        R                  U R                  S9nSUSU2SU24'   U$ )z[
Make a pixel mask for the image, where 1 indicates a valid pixel and 0 indicates padding.
r   N©ÚdtypeÚdevicerJ   )r   ÚtorchÚzerosÚint64rV   )r   rR   Úinput_heightÚinput_widthÚmasks        r$   Úmake_pixel_maskr]   g   sM   € ð !&§¡¨B¨CÐ 0Ñ€LÜ�;Š;�{¬%¯+©+¸e¿l¹lÑK€DØ()€Dˆˆ,ˆ˜˜˜Ð	$Ñ%Ø€Kr&   c                   óä  ^ • \ rS rSr\r\R                  r\	r
\rSrSrSrSrSrSrSrSSS.rSS/rS	\\   4U 4S
 jjr\S\S	\\   S\4U 4S jj5       rS\S\4S jr S)SSS\SSSS4U 4S jjjrS*S\S\S\4S jjr SSS\!\!S      4S jr" S+SSS\#\\4   S\S\#S   4S jjr$S\!\!S      S\%S\S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+$ ),ÚIdefics2ImageProcessoréq   TFiz  iÔ  )r   r   Úpixel_valuesÚpixel_attention_maskÚkwargsc                 ó&   >• [         TU ]  " S0 UD6  g )Nr7   )ÚsuperÚ__init__)Úselfrc   Ú	__class__s     €r$   rf   ÚIdefics2ImageProcessor.__init__�   s   ø€ Ü‰ÒÑ"˜6Ó"r&   rM   r   c                 ó&   >• [         TU ]  " U40 UD6$ ©N)re   Ú
preprocess)rg   rM   rc   rh   s      €r$   rl   Ú!Idefics2ImageProcessor.preprocess„   s   ø€ ä‰wÒ! &Ñ3¨FÑ3Ð3r&   r   c                 ó   • [        U5      $ )zConvert an image to RGB format.)r2   )rg   r   s     r$   r2   Ú%Idefics2ImageProcessor.convert_to_rgbˆ   s   € ä˜eÓ$Ð$r&   NrQ   r   Úresamplez7PILImageResampling | tvF.InterpolationMode | int | Nonec                 ó0  >• UR                   (       a  UR                  (       a  [        X5      nOFUR                  (       a*  UR                  (       a  UR                  UR                  4nO[        S5      e[        TU ]  " U[        US   US   S94SU0UD6$ )z7Resize using Idefics2 shortest_edge/longest_edge logic.zWSize must contain 'height' and 'width' keys or 'shortest_edge' and 'longest_edge' keys.r   rJ   )r   r    rp   )	r   r   r%   r   r    Ú
ValueErrorre   Úresizer   )rg   r   r   rp   rc   Únew_sizerh   s         €r$   rs   ÚIdefics2ImageProcessor.resizeŒ   sx   ø€ ð ×× $×"3×"3Ü3°EÓ@‰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                 ó6   • U R                  U5      n[        XS9$ )z1Prepare a nested images structure for processing.)rv   )Úfetch_imagesr   )rg   rM   rv   s      r$   Ú_prepare_images_structureÚ0Idefics2ImageProcessor._prepare_images_structure�   s   € à×"Ñ" 6Ó*ˆÜ)¨&ÑPÐPr&   c           	      ó&  • UR                   SS u  p#US-  nUS-  nUSSU2SU24   USSU2US24   USUS2SU24   USUS2US24   U/n[        [        US   5      5       VVs/ s H  ov Vs/ s H  oˆU   PM	     snPM     nnnU$ s  snf s  snnf )zi
Split a batch of images into 4 equal sub-images, and concatenate that sequence with the original image.
r   Né   .r   )r   ÚrangeÚlen)	rg   rM   r   r    Ú	mid_widthÚ
mid_heightÚbatch_split_imagesÚir   s	            r$   Úsplit_imagesÚ#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ÒRsÈQÐ5GÓHÒ5G¨E QœxÑ5GÔHÑRsÐÑtØ!Ð!ùò IùÓts   Á%	BÁ.BÁ<BÂBÚpadded_sizeÚfill)rQ   rQ   c                 óL  • UR                   SS nUS   US   -
  nUS   US   -
  nUS:  d  US:  a  [        SU SU S35      eXB:w  a  SSXe4n[        R                  " XUSS	9n[        R
                  " U[        R                  UR                  S
9nSUSUS   2SUS   24'   X4$ )zM
Pad an image to the specified size and create the corresponding pixel mask.
r   Nr   rJ   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_moderT   )r   rr   ÚtvFÚpadrW   rX   rY   rV   )	rg   r   r…   r†   Úoriginal_sizeÚpadding_bottomÚpadding_rightÚpaddingÚ
pixel_masks	            r$   rŒ   ÚIdefics2ImageProcessor.pad¶   sà   € ð Ÿ™ B CÐ(ˆØ$ Q™¨-¸Ñ*:Ñ:ˆØ# A™¨°qÑ)9Ñ9ˆà˜AÓ °Ó!2Üð3Ø3>°-Ð?PÐQ^ÐP_Ð_`ðbóð ð
 Ó'Ø˜!˜]Ð;ˆGÜ—G’G˜E°ÀJÑOˆEä—[’[ ´E·K±KÈÏÉÑUˆ
Ø=>ˆ
Ð%�] 1Ñ%Ð%Ð'9¨°qÑ)9Ð'9Ð9Ñ:àÐ Ð r&   Ú	do_resizeÚ
do_rescaleÚrescale_factorÚdo_normalizeÚ
image_meanÚ	image_stdÚdo_padr6   Údisable_groupingÚreturn_tensorsc           	      ó  • [        XSS9u  nn0 nUR                  5        H#  u  nnU(       a  U R                  U5      nUUU'   M%     [        UUSS9nU(       a7  [	        U5       H(  u  nnU VVs/ s H  nU  H  nUPM     M     snnUU'   M*     [        UUSS9u  nn0 nUR                  5        H"  u  nnU(       a  U R                  UX4S9nUUU'   M$     [        UUSS9n[        UUSS9u  nn0 nUR                  5        H  u  nnU R                  UXVXxU	5      nUUU'   M!     [        UUSS9nU
(       aí  [        S U 5       5      n[        U5      u  nn[        R                  " [        U5      U/US   S   R                  S   UU4Q7SUS   S   R                  06n [        R                  " [        U5      U/UU4Q7SUS   S   R                  06n![	        U5       H<  u  nn[	        U5       H'  u  n"nU R                  UUU45      u  U UU"4'   U!UU"4'   M)     M>     U nU
(       a  UW!S.n#OHUS	:X  a>  S
[        R                  " U Vs/ s H  n[        R                  " U5      PM     sn5      0n#OS
U0n#[!        U#US9$ s  snnf s  snf )NT)rš   Ú	is_nested)r�   )rp   c              3   ó8   #   • U  H  n[        U5      v •  M     g 7frk   )r~   )rE   Úimages_s     r$   rF   Ú5Idefics2ImageProcessor._preprocess.<locals>.<genexpr>  s   é € Ð NÒ=M°'¤ W§ Ò=Mùs   ‚r   rV   )ra   rb   Úptra   )ÚdataÚtensor_type)r   Úitemsrƒ   r   Ú	enumeraters   Úrescale_and_normalizer   rP   rW   rX   r~   r   rV   rŒ   Ústackr   )$rg   rM   r“   r   rp   r”   r•   r–   r—   r˜   r™   r6   rš   r›   rc   Úgrouped_imagesÚgrouped_images_indexÚsplit_images_groupedr   Ústacked_imagesrƒ   r‚   Úgroup_imagesÚsublistr   Úresized_images_groupedÚresized_imagesÚprocessed_images_groupedÚprocessed_imagesÚmax_num_imagesrN   rO   Úprocessed_images_paddedÚpixel_attention_masksÚjr¢   s$                                       r$   Ú_preprocessÚ"Idefics2ImageProcessor._preprocessÏ   s  € ô" 0EØÀñ0
Ñ,ˆÐ,ð  "ÐØ%3×%9Ñ%9Ö%;Ñ!ˆE�>Þ!Ø!%×!2Ñ!2°>Ó!B�Ø*8Ð  Ó'ñ &<ô &Ð&:Ð<PÐ\`ÑaˆÞÜ#,¨\Ö#:‘��<Ù8DÔ"Zº¨WÔRYÈ£5ÑRY¡5¹Ò"Z�˜Q“ñ $;ô 0EØÐ+;Àtñ0
Ñ,ˆÐ,ð "$ÐØ%3×%9Ñ%9Ö%;Ñ!ˆE�>ÞØ!%§¡¨^¸T Ð!U�Ø,:Ð" 5Ó)ñ &<ô (Ð(>Ð@TÐ`dÑeˆä/DØÐ-=Èñ0
Ñ,ˆÐ,ð $&Ð Ø%3×%9Ñ%9Ö%;Ñ!ˆE�>Ø!×7Ñ7Ø 
¸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ó !2ñ 9ð
  7ÐÞØ$4ÐNcÑd‰DØ˜tÓ#Ø"¤E§K¢KÑScÓ0dÒScÈ´·²¸VÖ1DÑScÑ0dÓ$eÐf‰Dà"Ð$4Ð5ˆDÜ °>ÑBÐBùóg #[ùò` 1es   Á/JÉ J
r7   rk   )r   )r   ),r8   r9   r:   r;   r4   Úvalid_kwargsr   ÚBILINEARrp   r   r—   r	   r˜   r“   r”   r–   r™   Údo_convert_rgbr6   Údefault_to_squarer   Úmodel_input_namesr   rf   r   r
   r   rl   r2   r   rs   r   ry   Úlistrƒ   ÚtuplerŒ   r=   ÚfloatÚstrr   r¶   r?   Ú__classcell__)rh   s   @r$   r_   r_   q   sR  ø† à/€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ð 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ò OCr&   r_   )(r<   ÚnumpyÚnprW   Ú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½   rP   r]   r_   Ú__all__r7   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&   