ó
    qyüiw   ã            
       óZ  • S r SSKrSSKrSSKJr  SSKJr  SSKJ	r	J
r
JrJr  SSKJrJrJrJrJr  SSKJrJr  SS	KJrJrJrJrJr  \" 5       (       a  SSKrSS
KJr  \R@                  " \!5      r"S r#  SSSS\$S-  S\$S-  S\$\	-  S-  4S jjr% " S S\SS9r&\ " S S\5      5       r'S/r(g)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                 óž   • [        SU S   U-  -  5      [        SU S   U-  -  5      [        SU S   U-  -  5      [        SU S   U-  -  5      /$ )Niè  r   é   é   r   )Úint)ÚboxÚwidthÚheights      Úw/home/mande/repo/quber/.venv/lib/python3.13/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                 óÂ  • [        [        S/5        [        U S5      (       a  U R                  5       R	                  5       n O5[        U [        R                  5      (       d  [        R                  " U 5      n Ub  UOSn[        XS9nUR                  u  pV[        R                  " XASUS9nUS   US   US	   US
   US   4u  p‰p«n[        U5       VVs/ s H  u  pÞUR                  5       (       a  M  UPM      nnn[        U5       VVs/ s H  u  pÞXß;  d  M  UPM     nnn[        U	5       VVs/ s H  u  nnXß;  d  M  UPM     n	nn[        U
5       VVs/ s H  u  nnXß;  d  M  UPM     n
nn[        U5       VVs/ s H  u  nnXß;  d  M  UPM     nnn[        U5       VVs/ s H  u  nnXß;  d  M  UPM     nnn/ n[        XšX¼5       H%  u  nnnnUUUU-   UU-   /nUR!                  U5        M'     / nU H  nUR!                  [#        UXV5      5        M      [%        U5      [%        U5      :X  d   S5       eUU4$ s  snnf s  snnf s  snnf s  snnf s  snnf s  snnf )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   s;  € ô ”o¨ Ô7ô ˆu�e×ÑØ—	‘	“×!Ñ!Ó#‰Ü˜œrŸz™z×*Ñ*Ü—’˜“ˆà+;Ñ+GÑ'ÈRÐô ˜UÑH€IØ )§¡Ñ€KÜ×$Ò$ YÀvÐVfÑg€DØ&*¨6¡l°D¸±LÀ$ÀuÁ+ÈtÐT[É}Ð^bÐckÑ^lÐ&lÑ#€E�˜Vô 09¸Ô/?ÔTÒ/?¡) #ÀtÇzÁzÇ|Ÿ#Ñ/?ÐÑTÜ#,¨UÔ#3ÔUÒ#3‘i�c°sÑ7T�TÑ#3€EÑUÜ$-¨d¤OÔU¢O‘j�c˜5°sÑ7T�E¡O€DÑUÜ#,¨S¤>Ô
S¢>‘Z�S˜%°SÑ5R�5¡>€CÑ
SÜ%.¨uÔ%5ÔWÒ%5‘z�s˜E¸Ñ9V�UÑ%5€EÑWÜ&/°Ô&7ÔYÒ&7™
˜˜U¸3Ñ;X�eÑ&7€FÑYð €LÜ˜$ UÖ3‰
ˆˆ1ˆa�Ø˜˜A ™E 1 q¡5Ð)ˆ
Ø×Ñ˜JÖ'ñ 4ð
 ÐÛˆØ×Ñ¤¨c°;Ó MÖNñ ô ˆu‹:œÐ-Ó.Ó.Ð_Ð0_Ó_Ð.àÐ"Ð"Ð"ùó) UùÛUùÛUùÛ
SùÛWùÛYsH   ÃH=Ã2H=Ä	IÄIÄ/I	Ä?I	ÅIÅ&IÅ=IÆIÆ$IÆ4Ic                   óD   • \ rS rSr% Sr\\S'   \S-  \S'   \S-  \S'   Srg)ÚLayoutLMv3ImageProcessorKwargséh   aÅ  
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__Ú__firstlineno__Ú__doc__ÚboolÚ__annotations__ÚstrÚ__static_attributes__rS   r    r   rO   rO   h   s"   ‡ ñð ƒOØ�D‰jÓØ˜D‘jÖ r    rO   F)Útotalc            #       óH  ^ • \ rS rSr\r\R                  r\	r
\rSSS.rSrSrSrSrSrSrS\\   4U 4S jjr\S	\S\\   S
\4U 4S jj5       r   SS	\S   S\S\SSS\S\S\S\S\S\\\   -  S-  S\\\   -  S-  S\S-  S\\-  S-  S\S\S-  S\S-  S
\4"S jjr Sr!U =r"$ ) ÚLayoutLMv3ImageProcessoré{   éà   )r   r   TNr(   Úkwargsc                 ó&   >• [         TU ]  " S0 UD6  g )NrS   )ÚsuperÚ__init__)Úselfrb   Ú	__class__s     €r   re   Ú!LayoutLMv3ImageProcessor.__init__‰   s   ø€ Ü‰ÒÑ"˜6Ó"r    ÚimagesÚreturnc                 ó&   >• [         TU ]  " U40 UD6$ )N)rd   Ú
preprocess)rf   ri   rb   rg   s      €r   rl   Ú#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_tensorsrQ   rR   r#   c           	      óÔ  • U(       aŒ  [        U S5        / n/ nU Hv  nUR                  (       a  [        R                  S5        [	        UR                  5       UU[        R                  S9u  nnUR                  U5        UR                  U5        Mx     [        XS9u  nn0 nUR                  5        H"  u  nnU(       a  U R                  UX4S9nUUU'   M$     [        UU5      n[        UUS9u  nn0 nUR                  5        H8  u  nnU(       a  U R                  UU5      nU R                  UXxXšU5      nUUU'   M:     [        UU5      n[        SU0US9nU(       a
  WUS'   WUS	'   U$ )
Nr&   z]apply_ocr can only be performed on cpu. Tensors will be transferred to cpu before processing.r)   )rw   )r!   r7   ro   Úpixel_values)rA   Útensor_typerB   Úboxes)r   Úis_cudaÚloggerÚwarning_oncer0   r'   r   ÚFIRSTr<   r   ÚitemsÚresizer   Úcenter_cropÚrescale_and_normalizer   ) rf   ri   rn   r7   ro   rp   rq   rr   rs   rt   ru   rv   rw   rx   rQ   rR   r#   rb   Úwords_batchÚboxes_batchr!   rB   r|   Úgrouped_imagesÚgrouped_images_indexÚresized_images_groupedÚshapeÚstacked_imagesÚresized_imagesÚprocessed_images_groupedÚprocessed_imagesrA   s                                    r   Ú_preprocessÚ$LayoutLMv3ImageProcessor._preprocess�   s‘  € ö* Ü˜d MÔ2ØˆKØˆKÛ�Ø—=—=Ü×'Ñ'Øwôô  /Ø—I‘I“K Ð+;ÔO_×OeÑOeñ ‘��uð ×"Ñ" 5Ô)Ø×"Ñ" 5Ö)ñ  ô 0EÀVÑ/oÑ,ˆÐ,Ø!#ÐØ%3×%9Ñ%9Ö%;Ñ!ˆE�>ÞØ!%§¡°>È Ð!`�Ø,:Ð" 5Ó)ñ &<ô (Ð(>Ð@TÓUˆô 0EÀ^ÐfvÑ/wÑ,ˆÐ,Ø#%Ð Ø%3×%9Ñ%9Ö%;Ñ!ˆE�>ÞØ!%×!1Ñ!1°.À)Ó!L�à!×7Ñ7Ø 
¸LÐV_óˆNð /=Ð$ UÓ+ñ &<ô *Ð*BÐDXÓYÐä .Ð2BÐ!CÐQ_Ñ`ˆæØ'ˆD�‰MØ'ˆD�‰Màˆr    rS   )TNN)#rT   rU   rV   rW   rO   Úvalid_kwargsr   ÚBILINEARro   r
   ru   r   rv   r7   rn   rr   rt   rQ   rR   r#   r   re   r   r   r   rl   ÚlistrY   r   Úfloatr[   r   r�   r\   Ú__classcell__)rg   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ó Br    r_   )NN))rX   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_loggerrT   r~   r   r[   r0   rO   r_   Ú__all__rS   r    r   Ú<module>r¡      sÚ   ðñ ,ã Û å ;Ý 2ß eÓ e÷õ ÷ 5÷õ ñ ×ÑÛå 7ð 
×	Ò	˜HÓ	%€òð $(Ø7;ñ	,#Ø&ð,#à
�‰*ð,#ð ˜D‘jð,#ð Ð-Ñ-°Ñ4õ	,#ô^! \¸ò !ð& ôVÐ1ó Vó ðVðr &Ð
&�r    