Ë
    ÛÓ^jw   ã            
       óR  — 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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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 LayoutLMv3.é    Né   )ÚTorchvisionBackend)ÚBatchFeature)ÚChannelDimensionÚgroup_images_by_shapeÚreorder_imagesÚto_pil_image)ÚIMAGENET_STANDARD_MEANÚIMAGENET_STANDARD_STDÚ
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/layoutlmv3/image_processing_layoutlmv3.pyÚnormalize_boxr   0   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   r0   r0   9   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)ÚLayoutLMv3ImageProcessorKwargsañ  
    apply_ocr (`bool`, *optional*, defaults to `True`):
        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   rO   rO   h   s"   … ñð ƒOØ�D‰jÓØ˜D‘jÔ r    rO   F)Útotalc            #       ó4  ‡ — e Zd ZeZej                  ZeZ	e
ZdddœZ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e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ez  dz  dededz  dedz  d	ef"d„Zˆ xZ S )ÚLayoutLMv3ImageProcessoréà   )r   r   TNr(   Úkwargsc                 ó$   •— t        ‰| �  di |¤Ž y )NrY   )ÚsuperÚ__init__)Úselfr^   Ú	__class__s     €r   ra   z!LayoutLMv3ImageProcessor.__init__‰   s   ø€ Ü‰ÑÑ"˜6Ó"r    ÚimagesÚreturnc                 ó$   •— t        ‰| �  |fi |¤ŽS )N)r`   Ú
preprocess)rb   rd   r^   rc   s      €r   rg   z#LayoutLMv3ImageProcessor.preprocessŒ   s   ø€ ä‰wÑ! &Ñ3¨FÑ3Ð3r    ztorch.TensorÚ	do_resizer7   Úresamplez7PILImageResampling | tvF.InterpolationMode | int | NoneÚdo_center_cropÚ	crop_sizeÚ
do_rescaleÚrescale_factorÚdo_normalizeÚ
image_meanÚ	image_stdÚdisable_groupingÚreturn_tensorsrP   rQ   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 ]4  \  }}|r| j                  ||«      }| j                  ||||	|
|«      }|||<   Œ6 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)   )rq   )r!   r7   ri   Úpixel_values)rA   Útensor_typerB   Úboxes)r   Úis_cudaÚloggerÚwarning_oncer0   r'   r   ÚFIRSTr<   r   ÚitemsÚresizer   Úcenter_cropÚrescale_and_normalizer   ) rb   rd   rh   r7   ri   rj   rk   rl   rm   rn   ro   rp   rq   rr   rP   rQ   r#   r^   Úwords_batchÚboxes_batchr!   rB   rv   Úgrouped_imagesÚgrouped_images_indexÚresized_images_groupedÚshapeÚstacked_imagesÚresized_imagesÚprocessed_images_groupedÚprocessed_imagesrA   s                                    r   Ú_preprocessz$LayoutLMv3ImageProcessor._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�>ÙØ!%×!1Ñ!1°.À)Ó!L�à!×7Ñ7Ø 
¨N¸LÈ*ÐV_óˆNð /=Ð$ UÒ+ð	=ô *Ð*BÐDXÓYÐä .Ð2BÐ!CÐQ_Ô`ˆáØ'ˆD�‰MØ'ˆD�‰Màˆr    )TNN)!rR   rS   rT   rO   Úvalid_kwargsr   ÚBILINEARri   r
   ro   r   rp   r7   rh   rl   rn   rP   rQ   r#   r   ra   r   r   r   rg   ÚlistrV   r   ÚfloatrX   r   r‰   Ú__classcell__)rc   s   @r   r\   r\   {   sŠ  ø„ à1€LØ!×*Ñ*€HØ'€JØ%€IØ CÑ(€DØ€IØ€JØ€LØ€IØ€HØÐð# Ð(FÑ!Gõ #ð ð4 ð 4°vÐ>\Ñ7]ð 4Ðbnô 4ó ð4ð$ Ø#Ø'+ñ#Bà�^Ñ$ðBð ðBð ð	Bð
 LðBð ðBð ðBð ðBð ðBð ðBð ˜D ™KÑ'¨$Ñ.ðBð ˜4 ™;Ñ&¨Ñ-ðBð  ™+ðBð ˜jÑ(¨4Ñ/ðBð ðBð  ˜‘*ð!Bð"  ™*ð#Bð& 
÷'Br    r\   )NN))rU   r2   r4   ÚtorchÚimage_processing_backendsr   Úimage_processing_utilsr   Úimage_transformsr   r   r   r	   Úimage_utilsr
   r   r   r   r   Úprocessing_utilsr   r   Úutilsr   r   r   r   r   r&   Útorchvision.transforms.v2r   ÚtvFÚ
get_loggerrR   rx   r   rX   r0   rO   r\   Ú__all__rY   r    r   ú<module>rš      sÙ   ðñ ,ã Û å ;Ý 2ß eÓ e÷õ ÷ 5÷õ ñ ÔÛå 7ð 
ˆ×	Ñ	˜HÓ	%€òð $(Ø7;ñ	,#Ø&ð,#à
�‰*ð,#ð ˜D‘jð,#ð Ð-Ñ-°Ñ4ó	,#ô^! \¸õ !ð& ôVÐ1ó Vó ðVðr &Ð
&�r    