ó
    qyüiYB  ã                   ó²  • S r SSKrSSKrSSKJr  SSKrSSKJs  Js  J	r
  SSKJr  SSKJrJrJr  SSKJr  SSKJrJr  SS	KJrJr  SS
KJrJrJr  SSKJrJr  SSK J!r!J"r"  SSK#J$r$  Sr% " S S\SS9r&         S"S\'S\(S\'S\'S\(S\(S\(S\(S\)S-  S\'S-  S\R                  4S jjr*\RV                  RX                  S 5       r-\" " S  S!\5      5       r.S!/r/g)#z%Image processor class for Pix2Struct.é    N)ÚUnion)Úhf_hub_download)ÚImageÚ	ImageDrawÚ	ImageFonté   )ÚTorchvisionBackend)ÚBatchFeatureÚget_size_dict)Úgroup_images_by_shapeÚreorder_images)ÚChannelDimensionÚ
ImageInputÚSizeDict)ÚImagesKwargsÚUnpack)Ú
TensorTypeÚauto_docstring)Úrequires_backendszybelkada/fontsc                   ó^   • \ rS rSr% Sr\\S'   \\\4   \S'   \	\S'   \
\   \-  S-  \S'   Srg)	ÚPix2StructImageProcessorKwargsé%   a]  
max_patches (`int`, *optional*):
    Maximum number of patches to extract.
patch_size (`dict[str, int]`, *optional*, defaults to `{"height": 16, "width": 16}`):
    The patch size to use for the image. According to Pix2Struct paper and code, the patch size is 16x16.
is_vqa (`bool`, *optional*, defaults to `False`):
    Whether or not the image processor is for the VQA task. If `True` and `header_text` is passed in, text is
    rendered onto the input images.
header_text (`Union[list[str], str]`, *optional*):
    Text to render as a header. Only has an effect if `image_processor.is_vqa` is `True`.
Úmax_patchesÚ
patch_sizeÚis_vqaNÚheader_text© )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__ÚintÚ__annotations__ÚdictÚstrÚboolÚlistÚ__static_attributes__r   ó    Úw/home/mande/repo/quber/.venv/lib/python3.13/site-packages/transformers/models/pix2struct/image_processing_pix2struct.pyr   r   %   s5   ‡ ñ
ð ÓØ�S˜#�X‘ÓØƒLØ�c‘˜S‘ 4Ñ'Ö'r*   r   F)ÚtotalÚtextÚ	text_sizeÚ
text_colorÚbackground_colorÚleft_paddingÚright_paddingÚtop_paddingÚbottom_paddingÚ
font_bytesÚ	font_pathÚreturnc
                 óH  • [        [        S5        [        R                  " SS9n
U
R	                  U S9nSR                  U5      nUb  U	c  [        R                  " U5      nOU	b  U	nO[        [        S5      n[        R                  " USUS9n[        R                  " S	S
5      n[        R                  " U5      nUR!                  SXÍS9u    nnnUU-   U-   nUU-   U-   n[        R                  " S	UU4U5      n[        R                  " U5      nUR#                  XF4XÂUS9  U$ )aC  
Render text. This script is entirely adapted from the original script that can be found here:
https://github.com/google-research/pix2struct/blob/main/pix2struct/preprocessing/preprocessing_utils.py

Args:
    text (`str`, *optional*, defaults to ):
        Text to render.
    text_size (`int`, *optional*, defaults to 36):
        Size of the text.
    text_color (`str`, *optional*, defaults to `"black"`):
        Color of the text.
    background_color (`str`, *optional*, defaults to `"white"`):
        Color of the background.
    left_padding (`int`, *optional*, defaults to 5):
        Padding on the left.
    right_padding (`int`, *optional*, defaults to 5):
        Padding on the right.
    top_padding (`int`, *optional*, defaults to 5):
        Padding on the top.
    bottom_padding (`int`, *optional*, defaults to 5):
        Padding on the bottom.
    font_bytes (`bytes`, *optional*):
        Bytes of the font to use. If `None`, the default font will be used.
    font_path (`str`, *optional*):
        Path to the font to use. If `None`, the default font will be used.
ÚvisionéP   )Úwidth)r-   Ú
z	Arial.TTFzUTF-8)ÚencodingÚsizeÚRGB)é   r@   ©r   r   )Úfont)ÚfillrB   )r   Úrender_textÚtextwrapÚTextWrapperÚwrapÚjoinÚioÚBytesIOr   ÚDEFAULT_FONT_PATHr   Útruetyper   Únewr   ÚDrawÚtextbboxr-   )r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   ÚwrapperÚlinesÚwrapped_textrB   Útemp_imgÚ	temp_drawÚ_ÚwÚhÚ
text_widthÚtext_heightÚimgÚdraws                          r+   rD   rD   9   s   € ôL ”k 8Ô,ô ×"Ò"¨Ñ,€GØ�L‰L˜dˆLÐ#€EØ—9‘9˜UÓ#€LàÑ )Ñ"3Ü�zŠz˜*Ó%‰Ø	Ñ	Ø‰äÔ0°+Ó>ˆÜ×Ò˜d¨W¸9ÑE€Dô �yŠy˜ Ó'€HÜ—’˜xÓ(€IØ×#Ñ# F¨LÐ#ÐD�J€A€qˆ!ˆQà�\Ñ! MÑ1€JØ�k‘/ NÑ2€Kô �)Š)�E˜J¨Ð4Ð6FÓ
G€CÜ�>Š>˜#Ó€DØ‡I�Iˆ|Ð)¨<Èt€IÑTà€Jr*   c                 ó   • U R                   u  p4pV[        R                  R                  R	                  XU4X4S9nUR                  X4XS5      nUR                  SSSSS5      R                  X5U-  Xb-  XA-  U-  5      nU$ )a_  
Extract patches from image tensor. Returns tensor of shape (batch, rows, columns, patch_height*patch_width*channels).

Args:
    image_tensor (`torch.Tensor`):
        Image tensor of shape (batch, channels, height, width).
    patch_height (`int`):
        Height of patches to extract.
    patch_width (`int`):
        Width of patches to extract.
)Ústrideéÿÿÿÿr   é   é   r   r@   )ÚshapeÚtorchÚnnÚ
functionalÚunfoldÚreshapeÚpermute)Úimage_tensorÚpatch_heightÚpatch_widthÚ
batch_sizeÚchannelsÚheightr;   Úpatchess           r+   Útorch_extract_patchesro   €   sŽ   € ð +7×*<Ñ*<Ñ'€J˜&Ü�h‰h×!Ñ!×(Ñ(¨ÀkÐ7RÐ\hÐ[vÐ(Ðw€GØ�o‰o˜j°LÈrÓR€GØ�o‰o˜a  A q¨!Ó,×4Ñ4Ø˜lÑ*¨EÑ,@À(ÑBYÐ\gÑBgó€Gð €Nr*   c                   óÄ  ^ • \ rS rSrSrSrSrSSS.rSrSr	\
rSS	/r S%S
\\\4   \-  S-  S\4U 4S jjjrS r  S&SSS\S\S-  S\S-  SS4
S jjrS'S jrSSS\S
\SS4S jr\ S%S\S\\\   -  S-  S\\
   S\4U 4S jjj5       rSS\R<                  S4S\S\\\   -  S-  S\S\S\ \S4   S-  S\\
   S\4S jjr!S\S   S \S\S
\S!\\"-  S-  S"\S\4S# jr#S$r$U =r%$ )(ÚPix2StructImageProcessoré–   NTé   ©rm   r;   i   FÚflattened_patchesÚattention_maskr   r7   c           	      ó�   >• [         TU ]  " S0 UD6nUb-  [        U[        5      (       d  [        S0 [	        USS9D6US'   U$ XS'   U$ )zS
Process custom Pix2Struct kwargs, specifically converting patch_size to SizeDict.
r   )r>   Ú
param_namer   )ÚsuperÚ_standardize_kwargsÚ
isinstancer   r   )Úselfr   ÚkwargsÚ	__class__s      €r+   rz   Ú,Pix2StructImageProcessor._standardize_kwargs¡   sY   ø€ ô ‘Ò,Ñ6¨vÑ6ˆØÑ!¬*°ZÄ×*JÑ*JÜ#+Ñ#f¬mÀÐXdÑ.eÑ#fˆF�<Ñ ð ˆð $.�<Ñ àˆr*   c                 ó   • g)zC
Skip standard validation as Pix2Struct uses custom preprocessing.
Nr   )r|   r}   s     r+   Ú_validate_preprocess_kwargsÚ4Pix2StructImageProcessor._validate_preprocess_kwargs±   s   € ð 	r*   Úimageútorch.TensorÚheaderr5   r6   c                 óp  • UR                   nUR                  nUR                  [        R                  :X  a  [        R
                  " U5      nOHUS-  R                  SS5      R                  [        R                  5      n[        R
                  " U5      n[        X#US9n	[        U	R                  UR                  5      n
[        UR                  X§R                  -  -  5      n[        U	R                  X©R                  -  -  5      n[        R                  " SX«U-   4S5      nUR                  U	R!                  X¬45      S5        UR                  UR!                  X«45      SU45        [        R"                  " U5      R                  U5      nU[        R                  :w  a  UR%                  5       S-  nU$ )aµ  
Render header text on image using torch tensors.

Args:
    image (`torch.Tensor`):
        Image tensor in channel-first format (C, H, W).
    header (`str`):
        Header text to render.
    font_bytes (`bytes`, *optional*):
        Font bytes to use for rendering.
    font_path (`str`, *optional*):
        Path to font file to use for rendering.

Returns:
    `torch.Tensor`: Image with header in channel-first format (C, H, W).
éÿ   r   ©r5   r6   r?   ÚwhiterA   g     ào@)ÚdeviceÚdtyperb   Úuint8ÚtvFÚto_pil_imageÚclampÚtorD   Úmaxr;   r#   rm   r   rM   ÚpasteÚresizeÚpil_to_tensorÚfloat)r|   rƒ   r…   r5   r6   rŠ   r‹   Ú	image_pilÚimage_uint8Úheader_imageÚ	new_widthÚ
new_heightÚnew_header_heightÚ	new_imageÚresults                  r+   Úrender_headerÚ&Pix2StructImageProcessor.render_header¹   sl  € ð. —‘ˆØ—‘ˆð �;‰;œ%Ÿ+™+Ó%Ü×(Ò(¨Ó/‰Ið ! 3™;×-Ñ-¨a°Ó5×8Ñ8¼¿¹ÓEˆKÜ×(Ò(¨Ó5ˆIô # 6ÈIÑVˆô ˜×*Ñ*¨I¯O©OÓ<ˆ	Ü˜×)Ñ)¨Y¿¹Ñ-HÑIÓJˆ
Ü × 3Ñ 3°y×CUÑCUÑ7UÑ VÓWÐô —I’I˜e iÐ>OÑ1OÐ%PÐRYÓZˆ	Ø�‰˜×+Ñ+¨YÐ,JÓKÈVÔTØ�‰˜	×(Ñ(¨)Ð)@ÓAÀAÐGXÐCYÔZô ×"Ò" 9Ó-×0Ñ0°Ó8ˆð ”E—K‘KÓØ—\‘\“^ eÑ+ˆFàˆr*   Úimagesc                 ó$  • UR                  SSS9nUR                  SSS9nUR                  S   UR                  S   -  UR                  S   -  nSUS-  -  n[        R                  " U[        R
                  " XSR                  S	95      nX-
  U-  $ )
zì
Normalize batched images using per-image mean and standard deviation.

Args:
    images (`torch.Tensor`):
        Batched float image tensor of shape (B, C, H, W).

Returns:
    `torch.Tensor`: Normalized images of shape (B, C, H, W).
)r@   r`   r   T)ÚdimÚkeepdimr@   r`   r   g      ð?ç      à?©rŠ   )ÚmeanÚstdra   rb   ÚmaximumÚtensorrŠ   )r|   r    r¦   r§   Únum_elements_per_imageÚmin_stdÚadjusted_stddevs          r+   Ú	normalizeÚ"Pix2StructImageProcessor.normalizeñ   s‹   € ð �{‰{˜y°$ˆ{Ð7ˆØ�j‰j˜Y°ˆjÐ5ˆà!'§¡¨a¡°6·<±<À±?Ñ!BÀVÇ\Á\ÐRSÁ_Ñ!TÐØÐ.°Ñ3Ñ3ˆÜŸ-š-¨¬U¯\ª\¸'Ï*É*Ñ-UÓVˆà‘ Ñ0Ð0r*   r   c           	      óš  • UR                   UR                  pTUR                  u  pgp‰X$U-  -  XY-  -  S-  n
[        [	        [        X¨-  U-  5      U5      S5      n[        [	        [        X©-  U-  5      U5      S5      n[        X´-  S5      n[        XÅ-  S5      n[        XÞS9nU R                  X[        R                  R                  SS9n[        XU5      nUR                  u  nnnnUR                  UUU-  U5      n[        R                  " UUR                  S9R                  US5      R!                  SU5      R                  SUU-  S5      n[        R                  " UUR                  S9R                  SU5      R!                  US5      R                  SUU-  S5      nUR#                  USS5      nUR#                  USS5      nUS-   R%                  5       nUS-   R%                  5       n[        R&                  " UUU/SS9n[        R(                  R*                  R-                  US	S	S	UUU-  -
  /5      R%                  5       nU$ )
a°  
Extract flattened patches from a batch of images.

Args:
    images (`torch.Tensor`):
        Batched images tensor of shape (batch, channels, height, width).
    max_patches (`int`):
        Maximum number of patches to extract.
    patch_size (`SizeDict`):
        Dictionary containing patch height and width.

Returns:
    `torch.Tensor`: Batched flattened patches with row/column IDs of shape (batch, max_patches, patch_dim).
r¤   r@   rt   T)rƒ   r>   ÚresampleÚ	antialiasr¥   r^   ©r¢   r   )rm   r;   ra   r‘   Úminr#   r   r“   r�   ÚInterpolationModeÚBILINEARro   rf   rb   ÚarangerŠ   ÚrepeatÚexpandr•   Úcatrc   rd   Úpad)r|   r    r   r   ri   rj   rk   rl   Úimage_heightÚimage_widthÚscaleÚnum_feasible_rowsÚnum_feasible_colsÚresized_heightÚresized_widthÚresize_sizern   ÚrowsÚcolumnsÚdepthÚrow_idsÚcol_idsr�   s                          r+   Úextract_flattened_patchesÚ2Pix2StructImageProcessor.extract_flattened_patches  s=  € ð( %/×$5Ñ$5°z×7GÑ7G�kØ:@¿,¹,Ñ7ˆ
˜lð ¨|Ñ ;Ñ<ÀÑ@YÑZÐ_bÑbˆÜ¤¤C¨Ñ(<¸|Ñ(KÓ$LÈkÓ ZÐ\]Ó^ÐÜ¤¤C¨Ñ(;¸kÑ(IÓ$JÈKÓ XÐZ[Ó\ÐÜÐ.Ñ=¸qÓAˆÜÐ-Ñ;¸QÓ?ˆô  nÑJˆØ—‘ 6Äc×F[ÑF[×FdÑFdÐpt�Ðuˆô (¨¸kÓJˆà+2¯=©=Ñ(ˆ
�D˜' 5ð —/‘/ *¨d°W©n¸eÓDˆô �LŠL˜ f§m¡mÑ4×<Ñ<¸TÀ1ÓE×LÑLÈQÐPWÓX×`Ñ`ÐabÐdhÐkrÑdrÐtuÓvð 	ô �LŠL˜¨¯©Ñ7ß‰W�Q˜Ó ß‰V�D˜!‹_ß‰W�Q˜˜w™¨Ó*ð	 	ð —.‘. ¨R°Ó4ˆØ—.‘. ¨R°Ó4ˆð ˜Q‘;×%Ñ%Ó'ˆØ˜Q‘;×%Ñ%Ó'ˆô —’˜G W¨gÐ6¸BÑ?ˆô —‘×$Ñ$×(Ñ(¨°!°Q¸¸;È$ÐQXÉ.Ñ;YÐ1ZÓ[×aÑaÓcˆàˆr*   r   r}   c                 ó*   >• [         TU ]  " U4SU0UD6$ )zŽ
header_text (`Union[str, list[str]]`, *optional*):
    Text to render as a header. Only has an effect if `image_processor.is_vqa` is `True`.
r   )ry   Ú
preprocess)r|   r    r   r}   r~   s       €r+   rË   Ú#Pix2StructImageProcessor.preprocessK  s   ø€ ô ‰wÒ! &ÑL°kÐLÀVÑLÐLr*   Údo_convert_rgbÚinput_data_formatrŠ   ztorch.devicec                 óª  • U R                  UUUUS9nUR                  SU R                  5      nU(       a†  Uc  [        S5      eUR	                  SS5      nUR	                  SS5      n	[        U[        5      (       a  U/[        U5      -  n[        U5       V
Vs/ s H  u  p«U R                  X²U
   X‰S9PM     nn
nU R                  " U40 UD6$ s  snn
f )z#
Preprocess images for Pix2Struct.
)r    rÍ   rÎ   rŠ   r   Nz.A header text must be provided for VQA models.r5   r6   rˆ   )Ú_prepare_image_like_inputsÚgetr   Ú
ValueErrorÚpopr{   r&   ÚlenÚ	enumeraterž   Ú_preprocess)r|   r    r   rÍ   rÎ   rŠ   r}   r   r5   r6   Úirƒ   s               r+   Ú_preprocess_image_like_inputsÚ6Pix2StructImageProcessor._preprocess_image_like_inputsX  sç   € ð ×0Ñ0ØØ)Ø/Øð	 1ð 
ˆð —‘˜H d§k¡kÓ2ˆÞØÑ"Ü Ð!QÓRÐRàŸ™ L°$Ó7ˆJØŸ
™
 ;°Ó5ˆIä˜+¤s×+Ñ+Ø*˜m¬c°&«kÑ9�ô
 !*¨&Ô 1ôâ 1‘H�Að ×"Ñ" 5°a©.ÀZÐ"ÓeÙ 1ð ñ ð
 ×Ò Ñ1¨&Ñ1Ð1ùós   ÂCÚdo_normalizeÚreturn_tensorsÚdisable_groupingc                 óö  • [        XS9u  p‰0 n
0 nUR                  5        Hƒ  u  pÍUR                  [        R                  :X  a  UR                  5       nU(       a  U R                  U5      nU R                  XÓUS9nUR                  SS9S:g  R                  5       nXêU'   XûU'   M…     [        X©5      n[        X¹5      nU(       a*  [        R                  " USS9n[        R                  " USS9n[        UUS.US9$ )z1
Preprocess images to extract flattened patches.
)rÜ   )r    r   r   r^   r²   r   )ru   rv   )ÚdataÚtensor_type)r   Úitemsr‹   rb   rŒ   r•   r­   rÈ   Úsumr   Ústackr
   )r|   r    rÚ   r   r   rÛ   rÜ   r}   Úgrouped_imagesÚgrouped_images_indexÚflattened_patches_groupedÚattention_masks_groupedra   Ústacked_imagesrn   Úmasksru   Úattention_maskss                     r+   rÖ   Ú$Pix2StructImageProcessor._preprocess€  s	  € ô 0EÀVÑ/oÑ,ˆà$&Ð!Ø"$Ðà%3×%9Ñ%9Ö%;Ñ!ˆEà×#Ñ#¤u§{¡{Ó2Ø!/×!5Ñ!5Ó!7�ö Ø!%§¡°Ó!?�à×4Ñ4Ø%È:ð 5ð ˆGð —[‘[ R�[Ð(¨AÑ-×4Ñ4Ó6ˆEà/6 eÑ,Ø-2 EÓ*ñ &<ô" +Ð+DÓ[ÐÜ(Ð)@ÓWˆö Ü %§¢Ð,=À1Ñ EÐÜ#Ÿkšk¨/¸qÑAˆOäØ'8ÈOÑ\Ø&ñ
ð 	
r*   r   )N)NN)r    r„   r7   r„   )&r   r   r    r!   Úrescale_factorrÚ   rÍ   r   r   r   r   Úvalid_kwargsÚmodel_input_namesr%   r&   r#   r   rz   r�   Úbytesrž   r­   rÈ   r   r   r(   r   r
   rË   r   ÚFIRSTr'   r   rØ   r   rÖ   r)   Ú__classcell__)r~   s   @r+   rq   rq   –   s   ø† à€NØ€LØ€NØ¨Ñ,€JØ€KØ€FØ1€LØ,Ð.>Ð?Ðð 8<ñà˜˜c˜‘N XÑ-°Ñ4ðð 
÷	ð ò ð $(Ø $ñ6àð6ð ð6ð ˜D‘Lð	6ð
 ˜‘:ð6ð 
õ6ôp1ð*CàðCð ðCð ð	Cð
 
ôCðJ ð /3ñ
Màð
Mð ˜4 ™9‘_ tÑ+ð
Mð Ð7Ñ8ð	
Mð
 
÷
Mó ð
Mð /3Ø#Ø.>×.DÑ.DØ48ñ&2àð&2ð ˜4 ™9‘_ tÑ+ð&2ð ð	&2ð
 ,ð&2ð �c˜>Ð)Ñ*¨TÑ1ð&2ð Ð7Ñ8ð&2ð 
õ&2ðP/
à�^Ñ$ð/
ð ð/
ð ð	/
ð
 ð/
ð ˜jÑ(¨4Ñ/ð/
ð ð/
ð 
÷/
ò /
r*   rq   )	é$   Úblackr‰   é   ró   ró   ró   NN)0r"   rI   rE   Útypingr   rb   Ú$torchvision.transforms.v2.functionalÚ
transformsÚv2rd   r�   Úhuggingface_hubr   ÚPILr   r   r   Úimage_processing_backendsr	   Úimage_processing_utilsr
   r   Úimage_transformsr   r   Úimage_utilsr   r   r   Úprocessing_utilsr   r   Úutilsr   r   Úutils.import_utilsr   rK   r   r&   r#   rî   rD   ÚcompilerÚdisablero   rq   Ú__all__r   r*   r+   Ú<module>r     s@  ðñ ,ã 	Û Ý ã ß 2Ó 2Ý +ß +Ñ +å ;ß Aß Eß AÑ Aß 4ß /Ý 3ð %Ð ô( \¸ò (ð, ØØ#ØØØØØ#Ø ñCØ
ðCàðCð ðCð ð	Cð
 ðCð ðCð ðCð ðCð ˜‘ðCð �T‰zðCð ‡[�[õCðN ‡�×Ññó ðð* ôX
Ð1ó X
ó ðX
ðv &Ð
&�r*   