
    ^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`    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   r.   r.   3   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)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DjDj 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!&3F33r   ztorch.Tensor	do_resizer5   resamplez7PILImageResampling | tvF.InterpolationMode | int | Nonedisable_groupingreturn_tensorsrN   rO   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 ]  \  }}|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    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>+003N.<$U+	=
 **BDXY.2B!CQ_`'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   1L!**HC(DNIIH#(F!G # 4 4v>\7] 4bn 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;	,#&,#
*,# Dj,# --4	,#^!\ !& H1 H HV &
&r   