Ë
    ÜÓ^jVB  ã                   ó´  — d Z ddlZddlZddlmZ ddlZddlmc mc m	Z
 ddlmZmZ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 dd
lmZmZ ddlmZm Z  ddl!m"Z" ddl#m$Z$ dZ% G d„ ded¬«      Z&	 	 	 	 	 	 	 	 	 d"de'de(de'de'de(de(de(de(de)dz  de'dz  dej                  fd„Z*ejV                  jX                  d„ «       Z-e  G d „ d!e«      «       Z.d!gZ/y)#z%Image processor class for Pix2Struct.é    N)ÚUnion)ÚImageÚ	ImageDrawÚ	ImageFonté   )ÚTorchvisionBackend)ÚBatchFeatureÚget_size_dict)Úgroup_images_by_shapeÚreorder_images)ÚChannelDimensionÚ
ImageInputÚSizeDict)ÚImagesKwargsÚUnpack)Ú
TensorTypeÚauto_docstring)Úhf_api)Úrequires_backendszybelkada/fontsc                   óV   — e Zd ZU dZeed<   eeef   ed<   eed<   e	e   ez  dz  ed<   y)ÚPix2StructImageProcessorKwargsa…  
    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__Ú__doc__ÚintÚ__annotations__ÚdictÚstrÚboolÚlist© ó    ú…/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/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
                 ót  — t        t        d«       t        j                  d¬«      }
|
j	                  | ¬«      }dj                  |«      }|�|	€t        j                  |«      }n#|	�|	}nt        «       j                  t        d«      }t        j                  |d|¬«      }t        j                  d	d
«      }t        j                   |«      }|j#                  d||¬«      \  }}}}||z   |z   }||z   |z   }t        j                  d	||f|«      }t        j                   |«      }|j%                  ||f|||¬«       |S )a£  
    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)Úfillr?   )r   Úrender_textÚtextwrapÚTextWrapperÚwrapÚjoinÚioÚBytesIOr   Úhf_hub_downloadÚDEFAULT_FONT_PATHr   Útruetyper   Únewr   ÚDrawÚtextbboxr*   )r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   ÚwrapperÚlinesÚwrapped_textr?   Útemp_imgÚ	temp_drawÚ_ÚwÚhÚ
text_widthÚtext_heightÚimgÚdraws                          r(   rA   rA   9   s.  € ôL ”k 8Ô,ô ×"Ñ"¨Ô,€GØ�L‰L˜dˆLÓ#€EØ—9‘9˜UÓ#€LàÐ )Ð"3Ü�z‰z˜*Ó%‰Ø	Ð	Ø‰ä‹x×'Ñ'Ô(9¸;ÓGˆÜ×Ñ˜d¨W¸9ÔE€Dô �y‰y˜ Ó'€HÜ—‘˜xÓ(€IØ×#Ñ# F¨L¸tÐ#ÓD�J€A€qˆ!ˆQà�\Ñ! MÑ1€JØ�k‘/ NÑ2€Kô �)‰)�E˜J¨Ð4Ð6FÓ
G€CÜ�>‰>˜#Ó€DØ‡I�Iˆ|˜[Ð)¨<¸jÈt€IÔTà€Jr'   c                 ó  — | j                   \  }}}}t        j                  j                  j	                  | ||f||f¬«      }|j                  ||||d«      }|j                  ddddd«      j                  |||z  ||z  ||z  |z  «      }|S )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Úheightr8   Úpatchess           r(   Útorch_extract_patchesrm   €   s¡   € ð +7×*<Ñ*<Ñ'€J�˜& %Ü�h‰h×!Ñ!×(Ñ(¨¸ÀkÐ7RÐ\hÐjuÐ[vÐ(Ów€GØ�o‰o˜j¨(°LÀ+ÈrÓR€GØ�o‰o˜a  A q¨!Ó,×4Ñ4Ø�F˜lÑ*¨E°[Ñ,@À(È\ÑBYÐ\gÑBgó€Gð €Nr'   c                   ó¢  ‡ — e Zd ZdZdZdZdddœZdZdZe	Z
ddgZ	 d#d	eeef   ez  dz  d
efˆ fd„Zd„ Z	 	 d$dddededz  dedz  d
df
d„Zd%d„Zddded	ed
dfd„Ze	 d#dedeee   z  dz  dee	   d
efˆ fd„«       Zddej:                  dfdedeee   z  dz  dededeedf   dz  dee	   d
efd„Z ded   deded	ed ee!z  dz  d!ed
efd"„Z"ˆ xZ#S )&ÚPix2StructImageProcessorNTé   ©rk   r8   i   FÚflattened_patchesÚattention_maskr   r4   c                 óŠ   •— t        ‰| �  di |¤Ž}|�+t        |t        «      st        di t	        |d¬«      ¤Ž|d<   |S ||d<   |S )zc
        Process custom Pix2Struct kwargs, specifically converting patch_size to SizeDict.
        r   )r;   Ú
param_namer&   )ÚsuperÚ_standardize_kwargsÚ
isinstancer   r
   )Úselfr   ÚkwargsÚ	__class__s      €r(   rw   z,Pix2StructImageProcessor._standardize_kwargs¡   sX   ø€ ô ‘Ñ,Ñ6¨vÑ6ˆØÐ!¬*°ZÄÔ*JÜ#+Ñ#f¬mÀÐXdÔ.eÑ#fˆF�<Ñ ð ˆð $.ˆF�<Ñ àˆr'   c                  ó   — y)zS
        Skip standard validation as Pix2Struct uses custom preprocessing.
        Nr&   )ry   rz   s     r(   Ú_validate_preprocess_kwargsz4Pix2StructImageProcessor._validate_preprocess_kwargs±   s   € ð 	r'   Úimageútorch.TensorÚheaderr2   r3   c                 óv  — |j                   }|j                  }|j                  t        j                  k(  rt	        j
                  |«      }nG|dz  j                  dd«      j                  t        j                  «      }t	        j
                  |«      }t        |||¬«      }	t        |	j                  |j                  «      }
t        |j                  |
|j                  z  z  «      }t        |	j                  |
|	j                  z  z  «      }t        j                  d|
||z   fd«      }|j                  |	j!                  |
|f«      d«       |j                  |j!                  |
|f«      d|f«       t	        j"                  |«      j                  |«      }|t        j                  k7  r|j%                  «       dz  }|S )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   ©r2   r3   r<   Úwhiter>   g     ào@)ÚdeviceÚdtyper`   Úuint8ÚtvFÚto_pil_imageÚclampÚtorA   Úmaxr8   r    rk   r   rK   ÚpasteÚresizeÚpil_to_tensorÚfloat)ry   r~   r€   r2   r3   r…   r†   Ú	image_pilÚimage_uint8Úheader_imageÚ	new_widthÚ
new_heightÚnew_header_heightÚ	new_imageÚresults                  r(   Úrender_headerz&Pix2StructImageProcessor.render_header¹   sy  € ð. —‘ˆØ—‘ˆð �;‰;œ%Ÿ+™+Ò%Ü×(Ñ(¨Ó/‰Ið ! 3™;×-Ñ-¨a°Ó5×8Ñ8¼¿¹ÓEˆKÜ×(Ñ(¨Ó5ˆIô # 6°jÈ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Ð8IÐ,JÓKÈVÔTØ�‰˜	×(Ñ(¨)°ZÐ)@ÓAÀAÐGXÐCYÔZô ×"Ñ" 9Ó-×0Ñ0°Ó8ˆð ”E—K‘KÒØ—\‘\“^ eÑ+ˆFàˆr'   Úimagesc                 ó6  — |j                  dd¬«      }|j                  dd¬«      }|j                  d   |j                  d   z  |j                  d   z  }d|dz  z  }t        j                  |t        j
                  ||j                  ¬	«      «      }||z
  |z  S )
a$  
        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Ústdr_   r`   ÚmaximumÚtensorr…   )ry   rš   r    r¡   Únum_elements_per_imageÚmin_stdÚadjusted_stddevs          r(   Ú	normalizez"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           	      óÊ  — |j                   |j                  }}|j                  \  }}}}	|||z  z  ||	z  z  dz  }
t        t	        t        |
|z  |z  «      |«      d«      }t        t	        t        |
|	z  |z  «      |«      d«      }t        ||z  d«      }t        ||z  d«      }t        ||¬«      }| j                  ||t        j                  j                  d¬«      }t        |||«      }|j                  \  }}}}|j                  |||z  |«      }t        j                  ||j                  ¬«      j                  |d«      j!                  d|«      j                  d||z  d«      }t        j                  ||j                  ¬«      j                  d|«      j!                  |d«      j                  d||z  d«      }|j#                  |dd«      }|j#                  |dd«      }|dz   j%                  «       }|dz   j%                  «       }t        j&                  |||gd¬«      }t        j(                  j*                  j-                  |d	d	d	|||z  z
  g«      j%                  «       }|S )
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=   rq   T)r~   r;   ÚresampleÚ	antialiasrŸ   r\   ©rœ   r   )rk   r8   r_   rŒ   Úminr    r   rŽ   rˆ   ÚInterpolationModeÚBILINEARrm   rd   r`   Úaranger…   ÚrepeatÚexpandr�   Úcatra   rb   Úpad)ry   rš   r   r   rg   rh   ri   rj   Úimage_heightÚimage_widthÚscaleÚnum_feasible_rowsÚnum_feasible_colsÚresized_heightÚresized_widthÚresize_sizerl   ÚrowsÚcolumnsÚdepthÚrow_idsÚcol_idsr˜   s                          r(   Úextract_flattened_patchesz2Pix2StructImageProcessor.extract_flattened_patches  sU  € ð( %/×$5Ñ$5°z×7GÑ7G�kˆØ:@¿,¹,Ñ7ˆ
�H˜l¨Kð  ¨|Ñ ;Ñ<ÀÈkÑ@YÑZÐ_bÑbˆÜ¤¤C¨°Ñ(<¸|Ñ(KÓ$LÈkÓ ZÐ\]Ó^ÐÜ¤¤C¨°Ñ(;¸kÑ(IÓ$JÈKÓ XÐZ[Ó\ÐÜÐ.°Ñ=¸qÓAˆÜÐ-°Ñ;¸QÓ?ˆô  n¸MÔ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   rz   c                 ó(   •— t        ‰| �  |fd|i|¤ŽS )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   )rv   Ú
preprocess)ry   rš   r   rz   r{   s       €r(   rÃ   z#Pix2StructImageProcessor.preprocessK  s   ø€ ô ‰wÑ! &ÑL°kÐLÀVÑLÐLr'   Údo_convert_rgbÚinput_data_formatr…   ztorch.devicec           
      ó   — | j                  ||||¬«      }|j                  d| j                  «      }|rƒ|€t        d«      ‚|j	                  dd«      }|j	                  dd«      }	t        |t        «      r|gt        |«      z  }t        |«      D �
�cg c]  \  }
}| j                  |||
   ||	¬«      ‘Œ }}
} | j                  |fi |¤ŽS c c}}
w )z3
        Preprocess images for Pix2Struct.
        )rš   rÄ   rÅ   r…   r   Nz.A header text must be provided for VQA models.r2   r3   rƒ   )Ú_prepare_image_like_inputsÚgetr   Ú
ValueErrorÚpoprx   r#   ÚlenÚ	enumerater™   Ú_preprocess)ry   rš   r   rÄ   rÅ   r…   rz   r   r2   r3   Úir~   s               r(   Ú_preprocess_image_like_inputsz6Pix2StructImageProcessor._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÷á�A�uð ×"Ñ" 5¨+°a©.ÀZÐ[dÐ"ÕeðˆFñ ð
  ˆt×Ñ Ñ1¨&Ñ1Ð1ùós   Â"C
Údo_normalizeÚreturn_tensorsÚdisable_groupingc                 ó  — t        ||¬«      \  }}	i }
i }|j                  «       D ]†  \  }}|j                  t        j                  k(  r|j                  «       }|r| j                  |«      }| j                  |||¬«      }|j                  d¬«      dk7  j                  «       }||
|<   |||<   Œˆ t        |
|	«      }t        ||	«      }|r.t        j                  |d¬«      }t        j                  |d¬«      }t        ||dœ|¬«      S )zA
        Preprocess images to extract flattened patches.
        )rÒ   )rš   r   r   r\   r«   r   )rr   rs   )ÚdataÚtensor_type)r   Úitemsr†   r`   r‡   r�   r§   rÁ   Úsumr   Ústackr	   )ry   rš   rÐ   r   r   rÑ   rÒ   rz   Úgrouped_imagesÚgrouped_images_indexÚflattened_patches_groupedÚattention_masks_groupedr_   Ústacked_imagesrl   Úmasksrr   Úattention_maskss                     r(   rÍ   z$Pix2StructImageProcessor._preprocess€  s$  € ô 0EÀVÐ^nÔ/oÑ,ˆÐ,à$&Ð!Ø"$Ðà%3×%9Ñ%9Ó%;ò 	3Ñ!ˆE�>à×#Ñ#¤u§{¡{Ò2Ø!/×!5Ñ!5Ó!7�ñ Ø!%§¡°Ó!?�à×4Ñ4Ø%°;È:ð 5ó ˆGð —[‘[ R�[Ó(¨AÑ-×4Ñ4Ó6ˆEà/6Ð% eÑ,Ø-2Ð# EÒ*ð	3ô" +Ð+DÐFZÓ[ÐÜ(Ð)@ÐBVÓWˆñ Ü %§¡Ð,=À1Ô EÐÜ#Ÿk™k¨/¸qÔAˆOäØ'8ÈOÑ\Ø&ô
ð 	
r'   )N)NN)rš   r   r4   r   )$r   r   r   Úrescale_factorrÐ   rÄ   r   r   r   r   Úvalid_kwargsÚmodel_input_namesr"   r#   r    r   rw   r}   Úbytesr™   r§   rÁ   r   r   r%   r   r	   rÃ   r   ÚFIRSTr$   r   rÏ   r   rÍ   Ú__classcell__)r{   s   @r(   ro   ro   –   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'   ro   )	é$   Úblackr„   é   rè   rè   rè   NN)0r   rF   rB   Útypingr   r`   Ú$torchvision.transforms.v2.functionalÚ
transformsÚv2rb   rˆ   ÚPILr   r   r   Úimage_processing_backendsr   Úimage_processing_utilsr	   r
   Úimage_transformsr   r   Úimage_utilsr   r   r   Úprocessing_utilsr   r   Úutilsr   r   Ú	utils.hubr   Úutils.import_utilsr   rI   r   r#   r    rã   rA   ÚcompilerÚdisablerm   ro   Ú__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'   