
    ^j4                     R   d dl Z d dlmZ ddlmZ ddlmZmZ ddlm	Z	 ddl
mZm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 ddlmZ ddlmZmZ  G d dej8                        Z G d dej8                        Z G d dej8                        Z G d dej8                        Z  G d de	      Z! G d dej8                        Z"e G d de             Z# G d de#      Z$ ed       G d  d!ee#             Z% G d" d#ej8                        Z& ed$       G d% d&e#             Z'g d'Z(y)(    N   )ACT2FN)BackboneMixinfilter_output_hidden_states)GradientCheckpointingLayer)BackboneOutputBaseModelOutputWithNoAttention)PreTrainedModel)Unpack)TransformersKwargsauto_docstringcan_return_tuple)merge_with_config_defaults)capture_outputs   )UVDocBackboneConfigUVDocConfigc                        e Zd ZdZ	 	 	 	 	 	 	 ddededededededed	ed
ef fdZdej                  dej                  fdZ
 xZS )UVDocConvLayerz<Convolutional layer with batch normalization and activation.in_channelsout_channelskernel_sizestridepaddingpadding_modebiasdilation
activationc
           
          t         
|           t        j                  ||||||||      | _        t        j
                  |      | _        |	t        |	   | _	        y t        j                         | _	        y )N)r   r   r   r   r   r   )
super__init__nnConv2dconvolutionBatchNorm2dnormalizationr   Identityr   )selfr   r   r   r   r   r   r   r   r   	__class__s             s/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/transformers/models/uvdoc/modeling_uvdoc.pyr!   zUVDocConvLayer.__init__(   si     	99#%	
  ^^L90:0F&,BKKM    hidden_statesreturnc                 l    | j                  |      }| j                  |      }| j                  |      }|S N)r$   r&   r   r(   r,   s     r*   forwardzUVDocConvLayer.forwardC   s6    ((7**=96r+   )r   r   r   zerosFr   relu)__name__
__module____qualname____doc__intstrboolr!   torchTensorr1   __classcell__r)   s   @r*   r   r   %   s    F # ZZ Z 	Z
 Z Z Z Z Z Z6U\\ ell r+   r   c                        e Zd ZdZ	 	 	 	 	 ddededededededed	ef fd
Zdej                  dej                  fdZ
 xZS )UVDocResidualBlockz*Base residual block with dilation support.r   r   r   r   r   r   
downsampler   c	           
      4   t         	|           |rt        |||||dz  dd       nt        j                         | _        t        ||||||d      | _        t        |||d|d|d       | _        |t        |   | _	        y t        j                         | _	        y )N   T)r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   )
r    r!   r   r"   r'   	conv_down
conv_start
conv_finalr   act_fn)
r(   r   r   r   r   r   r   rA   r   r)   s
            r*   r!   zUVDocResidualBlock.__init__M   s     	  ')'#q(  	 )#%#
 )$%#	
 -7,BfZ(r+   r,   r-   c                     | j                  |      }| j                  |      }| j                  |      }||z   }| j                  |      }|S r/   )rD   rE   rF   rG   )r(   r,   residuals      r*   r1   zUVDocResidualBlock.forward   sJ    >>-066%0M2r+   )r   r   r   Fr3   )r4   r5   r6   r7   r8   r:   r9   r!   r;   r<   r1   r=   r>   s   @r*   r@   r@   J   s    4   0V0V 0V 	0V
 0V 0V 0V 0V 0VdU\\ ell r+   r@   c                   Z     e Zd ZdZ fdZdej                  dej                  fdZ xZS )UVDocResNetStagez3A ResNet stage containing multiple residual blocks.c                    t         |           |j                  |   }t        j                  g       | _        |D ]C  \  }}}}| j
                  j                  t        |||rdnd|dz  |||j                               E y )NrC   r   )r   r   r   r   r   rA   r   )	r    r!   resnet_configsr"   
ModuleListlayersappendr@   r   )	r(   configstage_indexstagesr   r   r   rA   r)   s	           r*   r!   zUVDocResNetStage.__init__   s    &&{3mmB'?E 	;KxKK" +!- *1$qL%) & 2 2
	r+   r,   r-   c                 8    | j                   D ]
  } ||      } |S r/   )rO   )r(   r,   layers      r*   r1   zUVDocResNetStage.forward   s%    [[ 	1E!-0M	1r+   	r4   r5   r6   r7   r!   r;   r<   r1   r=   r>   s   @r*   rK   rK      s&    =$U\\ ell r+   rK   c                   Z     e Zd ZdZ fdZdej                  dej                  fdZ xZS )UVDocResNetz$Initial resnet_head and resnet_down.c                 $   t         |           t        j                  g       | _        t        t        |j                              D ]b  }| j                  j                  t        |j                  |   d   |j                  |   d   |j                  d|j                  dz               d t        j                  g       | _
        t        t        |j                              D ])  }t        ||      }| j                  j                  |       + y )Nr   r   rC   )r   r   r   r   r   )r    r!   r"   rN   resnet_headrangelenrP   r   r   resnet_downrM   rK   )r(   rQ   irR   stager)   s        r*   r!   zUVDocResNet.__init__   s    ==,s6--./ 		A## & 2 21 5a 8!'!3!3A!6q!9 & 2 2"..!3		 ==, V%:%:!;< 	+K$V[9E##E*	+r+   r,   r-   c                 j    | j                   D ]
  } ||      } | j                  D ]
  } ||      } |S r/   )rZ   r]   )r(   r,   headr_   s       r*   r1   zUVDocResNet.forward   sF    $$ 	0D /M	0%% 	1E!-0M	1r+   rV   r>   s   @r*   rX   rX      s&    .+&U\\ ell r+   rX   c                   d     e Zd ZdZ fdZdej                  dee   dej                  fdZ	 xZ
S )UVDocBridgeBlockzDBridge module with dilated convolutions for long-range dependencies.c           	          t         |           t        j                  g       | _        |j
                  |   }|D ]-  \  }}| j                  j                  t        ||||             / y )N)r   r   )r    r!   r"   rN   blocksstage_configsrP   r   )r(   rQ   bridge_indexbridger   r   r)   s         r*   r!   zUVDocBridgeBlock.__init__   sc    mmB'%%l3%+ 	n!KKK~k;PXcklm	nr+   r,   kwargsr-   c                 8    | j                   D ]
  } ||      } |S r/   )re   )r(   r,   ri   blocks       r*   r1   zUVDocBridgeBlock.forward   s'    
 [[ 	1E!-0M	1r+   )r4   r5   r6   r7   r!   r;   r<   r   r   r1   r=   r>   s   @r*   rc   rc      s;    Nn|| +, 
	r+   rc   c                   Z     e Zd ZdZ fdZdej                  dej                  fdZ xZS )UVDocPointPositions2DzDModule for predicting 2D point positions for document rectification.c           	         t         |           t        |j                  d   d   |j                  d   d   |j                  d|j                  dz  |j
                  |j                        | _        t        j                  |j                  d   d   |j                  d   d   |j                  d|j                  dz  |j
                        | _
        y )Nr   r   rC   )r   r   r   r   r   r   r   )r   r   r   r   r   r   )r    r!   r   out_point_positions2Dr   r   
hidden_actrD   r"   r#   conv_upr(   rQ   r)   s     r*   r!   zUVDocPointPositions2D.__init__   s    '44Q7:55a8;**&&!+,,((
 yy44Q7:55a8;**&&!+,,
r+   r,   r-   c                 J    | j                  |      }| j                  |      }|S r/   )rD   rq   r0   s     r*   r1   zUVDocPointPositions2D.forward   s$    }5]3r+   rV   r>   s   @r*   rm   rm      s&    N
,U\\ ell r+   rm   c                   r     e Zd ZU dZeed<   dZdZdZdZ	dZ
deiZ ej                          fd       Z xZS )	UVDocPreTrainedModelz
    Base class for all PPOCRV5 Server Det pre-trained models. Handles model initialization,
    configuration, and loading of pre-trained weights, following the Transformers library conventions.
    rQ   uvdocpixel_values)imageTr,   c                 z    t         |   |       t        |t        j                        r|j                          yy)zInitialize the weights.N)r    _init_weights
isinstancer"   PReLUreset_parameters)r(   moduler)   s     r*   rz   z"UVDocPreTrainedModel._init_weights  s1     	f%fbhh'##% (r+   )r4   r5   r6   r7   r   __annotations__base_model_prefixmain_input_nameinput_modalities_can_compile_fullgraphsupports_gradient_checkpointingrc   _can_record_outputsr;   no_gradrz   r=   r>   s   @r*   ru   ru      sW    
 $O!!&*#) U]]_& &r+   ru   c                   t     e Zd Z fdZeedej                  dee	   dej                  fd              Z
 xZS )UVDocBridgec                    t         |   |       t        j                  g       | _        t        t        |j                              D ]'  }| j                  j                  t        ||             ) | j                          y r/   )r    r!   r"   rN   rh   r[   r\   rf   rP   rc   	post_init)r(   rQ   rg   r)   s      r*   r!   zUVDocBridge.__init__  se     mmB'!#f&:&:";< 	GLKK/EF	Gr+   r,   ri   r-   c                 L    | j                   D ]
  } ||      } t              S )N)last_hidden_state)rh   r	   )r(   r,   ri   rU   features        r*   r1   zUVDocBridge.forward  s,     [[ 	+EM*G	+-HHr+   )r4   r5   r6   r!   r   r   r;   r<   r   r   r1   r=   r>   s   @r*   r   r     sS      I||I +,I 
	I   Ir+   r   z6
    UVDoc backbone model for feature extraction.
    )custom_introc            	       x     e Zd ZdZdZdef fdZeee	de
j                  dee   defd                     Z xZS )	UVDocBackboneFbackbonerQ   c                    t         |   |       |j                  d   d   g}|j                  D ]  }|j	                  |d   d           || _        t        |      | _        t        |      | _	        | j                          y )Nr   r   )r    r!   rZ   rf   rP   num_featuresrX   resnetr   rh   r   )r(   rQ   r   r_   r)   s       r*   r!   zUVDocBackbone.__init__*  s}     **2.r23)) 	-Ea,	-(!&)!&)r+   rw   ri   r-   c                     | j                  |      } | j                  |fi |}d}t        | j                        D ]'  \  }}|| j                  v s||j
                  |   fz  }) t        ||j
                        S )N )feature_mapsr,   )r   rh   	enumeratestage_namesout_featuresr,   r   )r(   rw   ri   r,   outputsr   idxr_   s           r*   r1   zUVDocBackbone.forward7  s     L1$++m6v6#D$4$45 	>JC)))!6!6s!; ==	> %!//
 	
r+   )r4   r5   r6   has_attentionsr   r   r!   r   r   r   r;   FloatTensorr   r   r   r1   r=   r>   s   @r*   r   r   !  si     N"2   
''
 +,
 
	
  ! 
r+   r   c                   t     e Zd Z fdZdej
                  dee   dej                  j
                  fdZ xZ	S )	UVDocHeadc                    t         |           t        |j                  j                        | _        t        |j                  d   | j
                  z  |j                  d   dddd      | _        t        |      | _	        y )Nr   r   )r   r   r   r   r   r   )
r    r!   r\   backbone_configrf   num_bridge_layersr   bridge_connectorrm   ro   rr   s     r*   r!   zUVDocHead.__init__N  sv    !$V%;%;%I%I!J .//2T5K5KK003!
 &;6%B"r+   r,   ri   r-   c                 J    | j                  |      }| j                  |      }|S r/   )r   ro   )r(   r,   ri   s      r*   r1   zUVDocHead.forward]  s*    
 --m<22=Ar+   )
r4   r5   r6   r!   r;   r<   r   r   r1   r=   r>   s   @r*   r   r   M  s>    C|| +, 
			r+   r   z
    The model takes raw document images (pixel values) as input, processes them through the UVDoc backbone to predict spatial transformation parameters,
    and outputs the rectified (corrected) document image tensor.
    c            	            e Zd Zdef fdZeedej                  de	e
   deej                     ez  fd              Z xZS )
UVDocModelrQ   c                     t         |   |       t        |j                        | _        t        |      | _        | j                          y r/   )r    r!   r   r   r   r   ra   r   rr   s     r*   r!   zUVDocModel.__init__n  s8     %f&<&<=f%	r+   rw   ri   r-   c                      | j                   |fi |}t        j                  |j                  d      } | j                  |fi |}t        ||j                        S )Nr   )dim)r   r,   )r   r;   catr   ra   r	   r,   )r(   rw   ri   backbone_outputsfused_outputsr   s         r*   r1   zUVDocModel.forwardu  s`     )4==@@		"2"?"?QG%DIIm>v>-/*88
 	
r+   )r4   r5   r6   r   r!   r   r   r;   r   r   r   tupler	   r1   r=   r>   s   @r*   r   r   g  sd    {  
''
 +,
 
u  	!$B	B	
  
r+   r   )r   r   r   ru   ))r;   torch.nnr"   activationsr   backbone_utilsr   r   modeling_layersr   modeling_outputsr   r	   modeling_utilsr
   processing_utilsr   utilsr   r   r   utils.genericr   utils.output_capturingr   configuration_uvdocr   r   Moduler   r@   rK   rX   rc   rm   ru   r   r   r   r   __all__r   r+   r*   <module>r      s  ,   ! H 9 N - & I I 7 5 A"RYY "J; ;|ryy 6")) <1 (BII > &? & &0I& I( 
$
M#7 $

$
N		 4 
% 

2 Qr+   