Ë
    ÛÓ^jeI  ã                   ó2  — 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 ddl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mZ  ej8                  e«      Zdeee      ee   z  ez  deee      fd„Z  G d„ ded¬«      Z!e G d„ de«      «       Z"dgZ#y)zImage processor class for Fuyu.é    N)Ú
functionalé   )ÚTorchvisionBackend)ÚBatchFeatureÚget_size_dict)Úgroup_images_by_shapeÚreorder_images)Ú
ImageInputÚPILImageResamplingÚSizeDictÚis_valid_imageÚmake_list_of_images)ÚImagesKwargsÚUnpack)Ú
TensorTypeÚauto_docstringÚloggingÚrequires_backendsÚimagesÚreturnc                 óÚ   — t        | «      r| ggS t        | t        «      rt        d„ | D «       «      r| S t        | t        «      r| D �cg c]  }t	        |«      ‘Œ c}S t        d«      ‚c c}w )Nc              3   ó<   K  — | ]  }t        |t        «      –— Œ y ­w©N)Ú
isinstanceÚlist)Ú.0Úimages     úy/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/transformers/models/fuyu/image_processing_fuyu.pyú	<genexpr>z.make_list_of_list_of_images.<locals>.<genexpr>1   s   è ø€ Ò'TÀE¬
°5¼$×(?Ñ'Tùs   ‚zHimages must be a list of list of images or a list of images or an image.)r   r   r   Úallr   Ú
ValueError)r   r   s     r   Úmake_list_of_list_of_imagesr"   +   se   € ô �fÔØ�ˆzÐä�&œ$Ô¤CÑ'TÈVÔ'TÔ$TØˆä�&œ$ÔØ8>Ö?¨uÔ# EÕ*Ò?Ð?ä
Ð_Ó
`Ð`ùò @s   ÁA(c                   ó6   — e Zd ZU dZedz  ed<   eed<   eed<   y)ÚFuyuImagesKwargsa�  
    patch_size (`dict[str, int]`, *optional*, defaults to `{"height": 30, "width": 30}`):
        Dictionary in the format `{"height": int, "width": int}` specifying the size of the patches.
    padding_value (`float`, *optional*, defaults to 1.0):
        The value to pad the image with.
    padding_mode (`str`, *optional*, defaults to "constant"):
        The padding mode to use when padding the image.
    NÚ
patch_sizeÚpadding_valueÚpadding_mode)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Ú__annotations__ÚfloatÚstr© ó    r   r$   r$   :   s   … ñð ˜4‘ÓØÓØÔr0   r$   F)Útotalc                   ó   ‡ — e Zd ZdZdddœZdddœZej                  ZdZ	dZ
dZdZdZdZdZd	Zg d
¢ZeZdee   fˆ fd„Z	 d3dededefd„Z	 	 d4dej4                  dedddedej4                  f
ˆ fd„Zd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dz  d#e e!z  dz  de"fd$„Z#d5d%ed&ed'edz  defd(„Z$d5dej4                  d'edz  dej4                  fd)„Z%	 d5d*ej4                  d+ej4                  d,ej4                  d-ej4                  d.ed/ed0ed'e&e ef   dz  de"fd1„Z'	 d5d'e&e ef   ez  dz  de&fˆ fd2„Z(ˆ xZ)S )6ÚFuyuImageProcessorTi8  i€  ©ÚheightÚwidthé   g      ð?Úconstantg      à?gp?©r   Úimage_input_idsÚimage_patchesÚimage_patch_indices_per_batchÚ#image_patch_indices_per_subsequenceÚkwargsc                 ó$   •— t        ‰| �  di |¤Ž y )Nr/   )ÚsuperÚ__init__)Úselfr>   Ú	__class__s     €r   rA   zFuyuImageProcessor.__init__`   s   ø€ Ü‰ÑÑ"˜6Ó"r0   r   Úexpected_ndimsr   c                 ó:   — | j                  |«      }t        |«      S r   )Úfetch_imagesr"   )rB   r   rD   s      r   Ú_prepare_images_structurez,FuyuImageProcessor._prepare_images_structurec   s   € ð
 ×"Ñ" 6Ó*ˆÜ*¨6Ó2Ð2r0   Nr   ÚsizeÚresamplez7PILImageResampling | tvF.InterpolationMode | int | NoneÚ	antialiasc                 ó4  •— |€t         j                  }|j                  dd \  }}|j                  |j                  }	}||	k  r||k  r|S ||z  }
|	|z  }t        |
|«      }t        ||z  «      }t        ||z  «      }t        ‰| �!  |t        ||¬«      ||¬«      S )aÖ  
        Resize an image to fit within `(size.height, size.width)` while maintaining aspect ratio.
        Only resizes if the image is larger than the target size.
        Args:
            image (`torch.Tensor`):
                Image to resize.
            size (`SizeDict`):
                Dictionary in the format `{"height": int, "width": int}` specifying the max size of the output image.
            resample (`PILImageResampling | tvF.InterpolationMode | int`, *optional*, defaults to `PILImageResampling.BILINEAR`):
                Resampling filter to use when resizing the image.
            antialias (`bool`, *optional*, defaults to `True`):
                Whether to apply antialiasing when resizing.
        Néþÿÿÿr4   )rI   rJ   )
r   ÚBILINEARÚshaper5   r6   ÚminÚintr@   Úresizer   )rB   r   rH   rI   rJ   r>   Úimage_heightÚimage_widthÚtarget_heightÚtarget_widthÚheight_scale_factorÚwidth_scale_factorÚoptimal_scale_factorÚ
new_heightÚ	new_widthrC   s                  €r   rQ   zFuyuImageProcessor.resizek   s¼   ø€ ð* ÐÜ)×2Ñ2ˆHØ$)§K¡K°°Ð$4Ñ!ˆ�kØ&*§k¡k°4·:±:�|ˆà˜,Ò&¨<¸=Ò+HØˆLà+¨lÑ:ÐØ)¨KÑ7ÐÜ"Ð#6Ð8JÓKÐä˜Ð(<Ñ<Ó=ˆ
Ü˜Ð&:Ñ:Ó;ˆ	ä‰w‰~Ø”8 :°YÔ?È(Ð^gð ó 
ð 	
r0   ztorch.TensorÚ	do_resizeÚ
do_rescaleÚrescale_factorÚdo_normalizeÚ
image_meanÚ	image_stdÚdo_padr&   r'   Údisable_groupingÚreturn_tensorsc           	      ó€  — |D �cg c]  }|sŒ|d   j                   dd  ‘Œ }}t        ||d¬«      \  }}i }|j                  «       D ]   \  }}|r| j                  |||¬«      }|||<   Œ" t	        ||d¬«      }|D �cg c]  }|sŒ|d   j                   dd  ‘Œ }}|D �cg c]  }|d   g‘Œ
 }}|D �cg c]  }|d   g‘Œ
 }}t        ||«      D ��cg c]  \  }}|d   |d   z  g‘Œ }}}|
r| j                  |||||d¬«      }t        ||d¬«      \  }}i }|j                  «       D ]   \  }}| j                  ||||||	«      }|||<   Œ" t	        ||d¬«      } t        j                  | D �!cg c]  }!|!sŒt        j                  |!«      ‘Œ c}!«      }"t        |"|||d	œ|d
g¬«      S c c}w c c}w c c}w c c}w c c}}w c c}!w )Nr   rL   T)rb   Ú	is_nested)r   rH   rI   )re   é   )Úpad_sizeÚ
fill_valuer'   rb   re   )r   Úimage_unpadded_heightsÚimage_unpadded_widthsÚimage_scale_factorsÚoverflowing_values)ÚdataÚtensor_typeÚskip_tensor_conversion)rN   r   ÚitemsrQ   r	   ÚzipÚpadÚrescale_and_normalizeÚtorchÚstackr   )#rB   r   r[   rH   rI   r\   r]   r^   r_   r`   ra   r&   r'   rb   rc   r>   Úbatch_imageÚoriginal_image_sizesÚgrouped_imagesÚgrouped_images_indexÚresized_images_groupedrN   Ústacked_imagesÚresized_imagesÚimage_sizesÚ
image_sizeri   rj   Úoriginal_sizeÚresized_sizerk   Úprocessed_images_groupedÚprocessed_imagesÚbatchÚimages_tensors#                                      r   Ú_preprocesszFuyuImageProcessor._preprocess“   sO  € ð& NTÖc¸kÒWb ¨A¡× 4Ñ 4°R°SÒ 9ÐcÐÐcÜ/DØÐ%5Àô0
Ñ,ˆÐ,ð "$ÐØ%3×%9Ñ%9Ó%;ò 	;Ñ!ˆE�>ÙØ!%§¡°>ÈÐW_ Ó!`�Ø,:Ð" 5Ò)ð	;ô (Ð(>Ð@TÐ`dÔeˆàDRÖb°[ÒVa�{ 1‘~×+Ñ+¨B¨CÒ0ÐbˆÐbØDOÖ!P°j :¨a¡=¢/Ð!PÐÐ!PØCNÖ O°Z *¨Q¡-¢Ð OÐÐ Oô 03Ð3GÈÓ/U÷
á+�˜|ð ˜!‰_˜}¨QÑ/Ñ/Ò0ð
Ðñ 
ñ Ø!ŸX™XØØØ(Ø)Ø!1Øð &ó ˆNô 0EØÐ-=Èô0
Ñ,ˆÐ,ð $&Ð Ø%3×%9Ñ%9Ó%;ò 	=Ñ!ˆE�>à!×7Ñ7Ø 
¨N¸LÈ*ÐV_óˆNð /=Ð$ UÒ+ð	=ô *Ð*BÐDXÐdhÔiÐäŸ™ÐEUÖ$_¸EÒY^¤U§[¡[°Õ%7Ò$_Ó`ˆÜà'Ø*@Ø)>Ø':ñ	ð 'Ø$8Ð#9ô	
ð 		
ùòU  dùò cùÚ!PùÚ Oùó
ùò6 %`s4   …F!�F!Á;F&ÂF&ÂF+Â0F0ÃF5Å'F;Å/F;rR   rS   r%   c                 ó4  — |€<t        | j                  t        «      r| j                  }nt        di | j                  ¤Ž}|j                  |j                  }}||z  dk7  rt        d|›d|› �«      ‚||z  dk7  rt        d|›d|› �«      ‚||z  }||z  }||z  }|S )a‚  
        Calculate number of patches required to encode an image.
        Args:
            image_height (`int`):
                Height of the image.
            image_width (`int`):
                Width of the image.
            patch_size (`SizeDict`, *optional*):
                Dictionary in the format `{"height": int, "width": int}` specifying the size of the patches.
        r   zimage_height=z must be divisible by zimage_width=r/   )r   r%   r   r5   r6   r!   )	rB   rR   rS   r%   Úpatch_heightÚpatch_widthÚnum_patches_per_dim_hÚnum_patches_per_dim_wÚnum_patchess	            r   Úget_num_patchesz"FuyuImageProcessor.get_num_patchesÛ   sº   € ð ÐÜ˜$Ÿ/™/¬8Ô4Ø!Ÿ_™_‘
ä%Ñ8¨¯©Ñ8�
Ø$.×$5Ñ$5°z×7GÑ7G�kˆØ˜,Ñ&¨!Ò+Ü  ˜Ð.DÀ\ÀNÐSÓTÐTØ˜Ñ$¨Ò)Ü  ˜~Ð-CÀKÀ=ÐQÓRÐRØ ,°Ñ <ÐØ +¨{Ñ :ÐØ+Ð.CÑCˆØÐr0   c                 óà  — t        | dg«       |€<t        | j                  t        «      r| j                  }nt        di | j                  ¤Ž}|j                  |j
                  }}|j                  \  }}}}|j                  d||«      }|j                  d||«      }	|	j                  «       }	|	j                  ||d||«      }	|	j                  ddddd«      }	|	j                  |d||z  |z  «      }	|	S )	aw  
        Convert an image into a tensor of patches using PyTorch's unfold operation.
        Args:
            image (`torch.Tensor`):
                Image to convert. Shape: [batch, channels, height, width]
            patch_size (`SizeDict`, *optional*):
                Dictionary in the format `{"height": int, "width": int}` specifying the size of the patches.
        rt   é   r   éÿÿÿÿr   é   rf   r/   )r   r   r%   r   r5   r6   rN   ÚunfoldÚ
contiguousÚviewÚpermuteÚreshape)
rB   r   r%   r‡   rˆ   Ú
batch_sizeÚchannelsÚ_Úunfolded_along_heightÚpatchess
             r   Úpatchify_imagez!FuyuImageProcessor.patchify_imageõ   sç   € ô 	˜$  	Ô*ØÐÜ˜$Ÿ/™/¬8Ô4Ø!Ÿ_™_‘
ä%Ñ8¨¯©Ñ8�
Ø$.×$5Ñ$5°z×7GÑ7G�kˆØ%*§[¡[Ñ"ˆ
�H˜a à %§¡¨Q°¸lÓ KÐØ'×.Ñ.¨q°+¸{ÓKˆØ×$Ñ$Ó&ˆà—,‘,˜z¨8°R¸À{ÓSˆØ—/‘/ ! Q¨¨1¨aÓ0ˆØ—/‘/ *¨b°(¸\Ñ2IÈKÑ2WÓXˆØˆr0   Úimage_inputÚimage_presentÚimage_unpadded_hÚimage_unpadded_wÚimage_placeholder_idÚimage_newline_idÚvariable_sizedc	           
      óB  — t        | dg«       |€=t        | j                  t        «      r| j                  }n1t        di | j                  ¤Ž}nt        |t        «      st        di |¤Ž}|j                  |j
                  }
}	g }g }g }t        |j                  d   «      D �]^  }g }g }t        |j                  d   «      D �]  }|||f   �rÏ|||f   }|j                  d   |j                  d   }}|rft        |t        j                  |||f   |	z  «      |	z  «      }t        |t        j                  |||f   |
z  «      |
z  «      }|dd…d|…d|…f   }||}}| j                  |||¬«      }t        j                  |g|t        j                  |j                  ¬«      }| j!                  |j#                  d«      |¬«      j%                  d«      }||j                  d   k(  sJ ‚|r|j'                  d	||
z  «      }t        j                  |j                  d   dg|t        j                  |j                  ¬«      }t        j(                  ||gd¬
«      }|j'                  d	«      }|j+                  |g«       |j+                  |«       |j+                  |«       �ŒÛ|j+                  t        j,                  g t        j                  |j                  ¬«      «       �Œ |j+                  |«       |j+                  |«       �Œa g }g }|D �]  }d}g }g } |D ]Õ  }!|!|k(  }"t        j.                  |"«      }t        j0                  |t        j2                  |!j                  ¬«      j5                  |!«      }#t        j6                  |!d	«      }$t        j6                  |!d	«      }%t        j8                  |"d¬«      d   }&|#|z   |$|&<   |#|%|&<   |j+                  |$«       | j+                  |%«       ||z  }Œ× |j+                  |«       |j+                  | «       �Œ t;        |||||dœ¬«      S )aš  
        Process images for model input. In particular, variable-sized images are handled here.

        Args:
            image_input (`torch.Tensor` of shape [batch_size, subsequence_size, num_channels, height, width]):
                Tensor of images padded to model input size.
            image_present (`torch.Tensor` of shape [batch_size, subsequence_size, num_images]):
                Tensor of 1s and 0s indicating whether an image is present.
            image_unpadded_h (`torch.Tensor` of shape [batch_size, subsequence_size]):
                Tensor of unpadded image heights.
            image_unpadded_w (`torch.Tensor` of shape [batch_size, subsequence_size]):
                Tensor of unpadded image widths.
            image_placeholder_id (int):
                The id of the image placeholder token. Comes from an associated tokenizer.
            image_newline_id (int):
                The id of the image newline token. Comes from an associated tokenizer.
            variable_sized (bool):
                Whether to process images as variable-sized.
            patch_size (`dict[str, int]`, *optional*):
                Size of the patches.
        rt   Nr   rf   rŽ   )rR   rS   r%   )ÚdtypeÚdevice)r   r%   r�   )ÚdimT)Úas_tupler9   )rm   r/   )r   r   r%   r   r5   r6   ÚrangerN   rO   ÚmathÚceilrŒ   rt   ÚfullÚint32r¥   r›   Ú	unsqueezeÚsqueezer•   ÚcatÚappendÚtensorÚcount_nonzeroÚarangeÚint64Útype_asÚ	full_likeÚnonzeror   )'rB   rœ   r�   rž   rŸ   r    r¡   r¢   r%   r‡   rˆ   r   Úbatch_image_patchesÚbatch_image_input_idsÚbatch_indexr:   r;   Úsubseq_indexr   rR   rS   Únew_hÚnew_wr‹   Útensor_of_image_idsrš   Únewline_idsr<   r=   Úsample_image_input_idsÚindex_offsetÚper_batch_indicesÚper_subsequence_indicesÚsubseq_image_input_idsÚpatches_maskÚindicesÚindices_in_stream_per_batchÚ!indices_in_stream_per_subsequenceÚpatches_indss'                                          r   Úpreprocess_with_tokenizer_infoz1FuyuImageProcessor.preprocess_with_tokenizer_info  sI  € ô@ 	˜$  	Ô*àÐÜ˜$Ÿ/™/¬8Ô4Ø!Ÿ_™_‘
ä%Ñ8¨¯©Ñ8‘
Ü˜J¬Ô1Ü!Ñ/ JÑ/ˆJØ$.×$5Ñ$5°z×7GÑ7G�kˆà+-ˆØ8:Ðà:<ÐÜ  ×!2Ñ!2°1Ñ!5Ó6ó /	6ˆKØ ˆOØˆMÜ % k×&7Ñ&7¸Ñ&:Ó ;ó *k�Ø  ¨lÐ!:Ó;Ø'¨°\Ð(AÑB�EØ05·±¸A±ÀÇÁÈAÁ +�LÙ%ô !$Ø(Ü ŸI™IÐ&6°{ÀLÐ7PÑ&QÐT`Ñ&`ÓaÐdpÑpó!˜ô !$Ø'Ü ŸI™IÐ&6°{ÀLÐ7PÑ&QÐT_Ñ&_Ó`ÐcnÑnó!˜ð !&¢a¨¨%¨°°%°Ð&7Ñ 8˜Ø49¸5 k˜Ø"&×"6Ñ"6Ø%1¸{ÐWað #7ó #�Kô +0¯*©*Ø$˜Ð';Ä5Ç;Á;ÐWb×WiÑWiô+Ð'ð #×1Ñ1¸¿¹ÈÓ8JÐWaÐ1Ób×jÑjÐklÓm�GØ&¨'¯-©-¸Ñ*:Ò:Ð:Ð:Ù%à.A×.IÑ.IÈ"ÈkÐ]hÑNhÓ.iÐ+Ü&+§j¡jØ0×6Ñ6°qÑ9¸1Ð=Ø,Ü"'§+¡+Ø#.×#5Ñ#5ô	'˜ô /4¯i©iÐ9LÈkÐ8ZÐ`aÔ.bÐ+Ø.A×.IÑ.IÈ"Ó.MÐ+Ø—M‘M 5 'Ô*Ø#×*Ñ*Ð+>Ô?Ø!×(Ñ(¨Ö1à#×*Ñ*¬5¯<©<¸Ä%Ç+Á+ÐVa×VhÑVhÔ+iÖjðU*kðV "×(Ñ(¨Ô9Ø×&Ñ& }Ö5ð_/	6ðb CEÐ%ØHJÐ+à&;ó 	PÐ"ØˆLØ "ÐØ&(Ð#Ø*@ò ,Ð&à5Ð9MÑM�Ü#×1Ñ1°,Ó?�ÜŸ,™, {¼%¿+¹+ÐNd×NkÑNkÔl×tÑtØ*ó�ô /4¯o©oÐ>TÐVXÓ.YÐ+Ü49·O±OÐDZÐ\^Ó4_Ð1Ü$Ÿ}™}¨\ÀDÔIÈ!ÑL�à<CÀlÑ<RÐ+¨LÑ9ØBIÐ1°,Ñ?à!×(Ñ(Ð)DÔEØ'×.Ñ.Ð/PÔQØ Ñ+‘ð#,ð& *×0Ñ0Ð1BÔCØ/×6Ñ6Ð7NÖOð1	Pô2 à Ø#8Ø!4Ø1NØ7Zñô
ð 	
r0   c                 ó€   •— t        ‰| �  di |¤Ž}|�&t        |t        «      st        di t	        |d¬«      ¤Ž}||d<   |S )zA
        Process Fuyu-specific kwargs before validation.
        r%   )Ú
param_namer/   )r@   Ú_standardize_kwargsr   r   r   )rB   r%   r>   rC   s      €r   rÍ   z&FuyuImageProcessor._standardize_kwargs–  sI   ø€ ô ‘Ñ,Ñ6¨vÑ6ˆØÐ!¬*°ZÄÔ*JÜ!ÑW¤M°*ÈÔ$VÑWˆJØ)ˆˆ|ÑØˆr0   )r   )NTr   )*r(   r)   r*   r[   rH   r%   r   rM   rI   ra   r&   r'   r^   r_   r`   r\   r]   Úmodel_input_namesr$   Úvalid_kwargsr   rA   r
   rP   rG   rt   ÚTensorr   ÚboolrQ   r   r-   r.   r   r   r…   rŒ   r›   ÚdictrÊ   rÍ   Ú__classcell__)rC   s   @r   r3   r3   I   sÓ  ø„ à€IØ TÑ*€DØ¨Ñ,€JØ!×*Ñ*€HØ€FØ€MØ€LØ€LØ€JØ€IØ€JØ€NòÐð $€Lð# Ð(8Ñ!9õ #ð  ñ3àð3ð ð3ð 
ó	3ð OSØñ&
à�|‰|ð&
ð ð&
ð Lð	&
ð
 ð&
ð 
�‰õ&
ðPF
à�^Ñ$ðF
ð ðF
ð ð	F
ð
 LðF
ð ðF
ð ðF
ð ðF
ð ˜D ™KÑ'¨$Ñ.ðF
ð ˜4 ™;Ñ&¨Ñ-ðF
ð �t‘ðF
ð ˜t‘|ðF
ð ˜D‘jðF
ð  ™+ðF
ð ˜jÑ(¨4Ñ/ðF
ð" 
ó#F
ñP¨Cð ¸cð ÈxÐZ^Éð Ðjmó ñ4 E§L¡Lð ¸hÈ¹oð ÐY^×YeÑYeó ðH -1ñD
à—\‘\ðD
ð —|‘|ðD
ð  Ÿ,™,ð	D
ð
  Ÿ,™,ðD
ð "ðD
ð ðD
ð ðD
ð ˜˜c˜‘N TÑ)ðD
ð 
óD
ðP 8<ñà˜˜c˜‘N XÑ-°Ñ4ðð 
÷	ñ r0   r3   )$r+   r©   rt   Útorchvision.transforms.v2r   ÚtvFÚimage_processing_backendsr   Úimage_processing_utilsr   r   Úimage_transformsr   r	   Úimage_utilsr
   r   r   r   r   Úprocessing_utilsr   r   Úutilsr   r   r   r   Ú
get_loggerr(   Úloggerr   r"   r$   r3   Ú__all__r/   r0   r   ú<module>rß      s¼   ðñ &ã ã Ý 7å ;ß Aß E÷õ ÷ 5÷ó ð 
ˆ×	Ñ	˜HÓ	%€ðaØ��jÑ!Ñ" T¨*Ñ%5Ñ5¸
ÑBðaà	ˆ$ˆzÑ
Ñóaô�|¨5õ ð ôXÐ+ó Xó ðXðv
  Ð
 �r0   