
    ^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`    DCFUN#$DCFVO$%DCFUN#$DCFVO$%	     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 ue		!!#rzz*+;+G'R U6GHI )K$$YTvVfgD&*6lDL$u+tT[}^bck^l&l#E4eV 09/?T)#ttzz|#TT#,U#3Uic4sBT7TTUEU$-dOUjc5sBT7TEUDU#,S>
SZS%S@R5R5
SC
S%.u%5WzsEDV9VUWEW&/&7Y
U3FX;XeYFY L$UF3 (
1aAE1q5)
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DjDj 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!&3F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           	         |rt        | 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   * dM2KK 	*==''w  /IIK+;O_OeOe 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
NL*V_N /=$U+	= **BDXY.2B!CQ_`'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   1L!**H'J%IC(DIJLIH#(F!G # 4 4v>\7] 4bn 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;	,#&,#
*,# Dj,# --4	,#^!\ !& V1 V Vr &
&r    