Ë
    ÛÓ^j/  ã            
       óJ  — 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
mZ ddl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mZ  e«       rddlZdd
lmZ  ej<                  e«      Z d„ Z!	 	 dddde"dz  de"dz  de"ez  dz  fd„Z# G d„ ded¬«      Z$e G d„ de«      «       Z%dgZ&y)z%Image processor class for LayoutLMv2.é    Né   )ÚTorchvisionBackend)ÚBatchFeature)Úgroup_images_by_shapeÚreorder_imagesÚto_pil_image)ÚChannelDimensionÚ
ImageInputÚPILImageResamplingÚSizeDict)ÚImagesKwargsÚUnpack)Ú
TensorTypeÚauto_docstringÚis_pytesseract_availableÚloggingÚrequires_backends)Ú
functionalc                 óž   — t        d| d   |z  z  «      t        d| d   |z  z  «      t        d| d   |z  z  «      t        d| d   |z  z  «      gS )Niè  r   é   é   r   )Úint)ÚboxÚwidthÚheights      ú…/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/transformers/models/layoutlmv2/image_processing_layoutlmv2.pyÚnormalize_boxr   *   s`   € äˆD�C˜‘F˜U‘NÑ#Ó$ÜˆD�C˜‘F˜V‘OÑ$Ó%ÜˆD�C˜‘F˜U‘NÑ#Ó$ÜˆD�C˜‘F˜V‘OÑ$Ó%ð	ð ó    Úimageznp.ndarray | torch.TensorÚlangÚtesseract_configÚinput_data_formatc                 óz  — t        t        dg«       t        | d«      r| j                  «       j	                  «       } n/t        | t        j                  «      st        j                  | «      } |�|nd}t        | |¬«      }|j                  \  }}t        j                  ||d|¬«      }|d   |d   |d	   |d
   |d   f\  }}	}
}}t        |«      D ��cg c]  \  }}|j                  «       rŒ|‘Œ }}}t        |«      D ��cg c]  \  }}||vsŒ|‘Œ }}}t        |	«      D ��cg c]  \  }}||vsŒ|‘Œ }	}}t        |
«      D ��cg c]  \  }}||vsŒ|‘Œ }
}}t        |«      D ��cg c]  \  }}||vsŒ|‘Œ }}}t        |«      D ��cg c]  \  }}||vsŒ|‘Œ }}}g }t        |	|
||«      D ]$  \  }}}}||||z   ||z   g}|j!                  |«       Œ& g }|D ]  }|j!                  t#        |||«      «       Œ  t%        |«      t%        |«      k(  sJ d«       ‚||fS c c}}w c c}}w c c}}w c c}}w c c}}w c c}}w )zdApplies Tesseract OCR on a document image, and returns recognized words + normalized bounding boxes.ÚpytesseractÚcpuÚ ©r"   Údict)r    Úoutput_typeÚconfigÚtextÚleftÚtopr   r   z-Not as many words as there are bounding boxes)r   Úapply_tesseractÚhasattrr%   ÚnumpyÚ
isinstanceÚnpÚndarrayÚarrayr   Úsizer$   Úimage_to_dataÚ	enumerateÚstripÚzipÚappendr   Úlen)r   r    r!   r"   Ú	pil_imageÚimage_widthÚimage_heightÚdataÚwordsr,   r-   r   r   ÚidxÚwordÚirrelevant_indicesÚcoordÚactual_boxesÚxÚyÚwÚhÚ
actual_boxÚnormalized_boxesr   s                            r   r.   r.   3   sW  € ô ”o¨ Ô7ô ˆu�eÔØ—	‘	“×!Ñ!Ó#‰Ü˜œrŸz™zÔ*Ü—‘˜“ˆà+;Ð+GÑ'ÈRÐô ˜UÐ6GÔH€IØ )§¡Ñ€K�Ü×$Ñ$ Y°TÀvÐVfÔg€DØ&*¨6¡l°D¸±LÀ$ÀuÁ+ÈtÐT[É}Ð^bÐckÑ^lÐ&lÑ#€Eˆ4��e˜Vô 09¸Ó/?×T¡) # tÀtÇzÁzÅ|š#ÐTÐÑTÜ#,¨UÓ#3×U‘i�c˜4°sÐBTÒ7TŠTÐU€EÑUÜ$-¨d£O×U‘j�c˜5°sÐBTÒ7TŠEÐU€DÑUÜ#,¨S£>×
S‘Z�S˜%°SÐ@RÒ5RŠ5Ð
S€CÑ
SÜ%.¨uÓ%5×W‘z�s˜E¸ÐDVÒ9VŠUÐW€EÑWÜ&/°Ó&7×Y™
˜˜U¸3ÐFXÒ;XŠeÐY€FÑYð €LÜ˜$  U¨FÓ3ò (‰
ˆˆ1ˆa�Ø˜˜A ™E 1 q¡5Ð)ˆ
Ø×Ñ˜JÕ'ð(ð
 ÐØò OˆØ×Ñ¤¨c°;ÀÓ MÕNðOô ˆu‹:œÐ-Ó.Ò.Ð_Ð0_Ó_Ð.àÐ"Ð"Ð"ùó) UùÛUùÛUùÛ
SùÛWùÛYsH   ÃHÃ*HÃ?HÄHÄ!H%Ä.H%ÅH+ÅH+Å%H1Å2H1ÆH7ÆH7c                   ó<   — e Zd ZU dZeed<   edz  ed<   edz  ed<   y)ÚLayoutLMv2ImageProcessorKwargsaû  
    apply_ocr (`bool`, *optional*, defaults to `self.apply_ocr`):
        Whether to apply the Tesseract OCR engine to get words + normalized bounding boxes. Can be overridden by
        the `apply_ocr` parameter in the `preprocess` method.
    ocr_lang (`str`, *optional*):
        The language, specified by its ISO code, to be used by the Tesseract OCR engine. By default, English is
        used. Can be overridden by the `ocr_lang` parameter in the `preprocess` method.
    tesseract_config (`str`, *optional*):
        Any additional custom configuration flags that are forwarded to the `config` parameter when calling
        Tesseract. For example: '--psm 6'. Can be overridden by the `tesseract_config` parameter in the
        `preprocess` method.
    Ú	apply_ocrNÚocr_langr!   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚboolÚ__annotations__Ústr© r   r   rM   rM   b   s"   … ñð ƒOØ�D‰jÓØ˜D‘jÔ r   rM   F)Útotalc                   óè   ‡ — e Zd ZeZej                  ZdddœZdZ	dZ
dZdZdZdee   fˆ fd„Zededee   d	efˆ fd
„«       Z	 	 	 dded   dededddedz  deez  dz  dededz  dedz  d	efd„Zˆ xZS )ÚLayoutLMv2ImageProcessoréà   )r   r   NTr&   Úkwargsc                 ó$   •— t        ‰| �  di |¤Ž y )NrW   )ÚsuperÚ__init__)Úselfr\   Ú	__class__s     €r   r_   z!LayoutLMv2ImageProcessor.__init__€   s   ø€ Ü‰ÑÑ"˜6Ó"r   ÚimagesÚreturnc                 ó$   •— t        ‰| �  |fi |¤ŽS )N)r^   Ú
preprocess)r`   rb   r\   ra   s      €r   re   z#LayoutLMv2ImageProcessor.preprocessƒ   s   ø€ ä‰wÑ! &Ñ3¨FÑ3Ð3r   ztorch.TensorÚ	do_resizer5   Úresamplez7PILImageResampling | tvF.InterpolationMode | int | NoneÚdisable_groupingÚreturn_tensorsrN   rO   r!   c
                 óŠ  — |rˆt        | d«       g }g }|D ]s  }|j                  rt        j                  d«       t	        |j                  «       ||	t        j                  ¬«      \  }}|j                  |«       |j                  |«       Œu t        ||¬«      \  }}i }|j                  «       D ]   \  }}|r| j                  |||¬«      }|||<   Œ" t        ||«      }t        ||¬«      \  }}i }|j                  «       D ]  \  }}|j                  d«      }|||<   Œ t        ||«      }t        d|i|¬«      }|r
|d	<   |d
<   |S )Nr$   z]apply_ocr can only be performed on cpu. Tensors will be transferred to cpu before processing.r'   )rh   )r   r5   rg   r   Úpixel_values)r?   Útensor_typer@   Úboxes)r   Úis_cudaÚloggerÚwarning_oncer.   r%   r	   ÚFIRSTr:   r   ÚitemsÚresizer   Úflipr   )r`   rb   rf   r5   rg   rh   ri   rN   rO   r!   r\   Úwords_batchÚboxes_batchr   r@   rm   Úgrouped_imagesÚgrouped_images_indexÚresized_images_groupedÚshapeÚstacked_imagesÚresized_imagesÚprocessed_images_groupedÚprocessed_imagesr?   s                            r   Ú_preprocessz$LayoutLMv2ImageProcessor._preprocess‡   s…  € ñ Ü˜d MÔ2ØˆKØˆKØò 	*�Ø—=’=Ü×'Ñ'Øwôô  /Ø—I‘I“K Ð+;ÔO_×OeÑOeô ‘��uð ×"Ñ" 5Ô)Ø×"Ñ" 5Õ)ð	*ô 0EÀVÐ^nÔ/oÑ,ˆÐ,Ø!#ÐØ%3×%9Ñ%9Ó%;ò 	;Ñ!ˆE�>ÙØ!%§¡°>ÈÐW_ Ó!`�Ø,:Ð" 5Ò)ð	;ô (Ð(>Ð@TÓUˆô 0EÀ^ÐfvÔ/wÑ,ˆÐ,Ø#%Ð Ø%3×%9Ñ%9Ó%;ò 	=Ñ!ˆE�>à+×0Ñ0°Ó3ˆNØ.<Ð$ UÒ+ð	=ô
 *Ð*BÐDXÓYÐä .Ð2BÐ!CÐQ_Ô`ˆáØ'ˆD�‰MØ'ˆD�‰Màˆr   )TNN)rP   rQ   rR   rM   Úvalid_kwargsr   ÚBILINEARrg   r5   Úrescale_factorrf   rN   rO   r!   r   r_   r   r
   r   re   ÚlistrT   r   rV   r   r   Ú__classcell__)ra   s   @r   rZ   rZ   u   s  ø„ à1€LØ!×*Ñ*€HØ CÑ(€DØ€NØ€IØ€IØ€HØÐð# Ð(FÑ!Gõ #ð ð4 ð 4°vÐ>\Ñ7]ð 4Ðbnô 4ó ð4ð Ø#Ø'+ñ7à�^Ñ$ð7ð ð7ð ð	7ð
 Lð7ð  ™+ð7ð ˜jÑ(¨4Ñ/ð7ð ð7ð ˜‘*ð7ð  ™*ð7ð 
÷7r   rZ   )NN)'rS   r0   r2   ÚtorchÚimage_processing_backendsr   Úimage_processing_utilsr   Úimage_transformsr   r   r   Úimage_utilsr	   r
   r   r   Úprocessing_utilsr   r   Úutilsr   r   r   r   r   r$   Útorchvision.transforms.v2r   ÚtvFÚ
get_loggerrP   ro   r   rV   r.   rM   rZ   Ú__all__rW   r   r   ú<module>r�      sÓ   ðñ ,ã Û å ;Ý 2ß SÑ Sß UÓ Uß 4÷õ ñ ÔÛå 7ð 
ˆ×	Ñ	˜HÓ	%€òð $(Ø7;ñ	,#Ø&ð,#à
�‰*ð,#ð ˜D‘jð,#ð Ð-Ñ-°Ñ4ó	,#ô^! \¸õ !ð& ôHÐ1ó Hó ðHðV &Ð
&�r   