
    i4                     ^   d dl Z d dlm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j:                        Z G d dej:                        Z G d dej:                        Z  G d dej:                        Z! G d de
      Z" G d dej:                        Z#e G d de             Z$ G d de$      Z% ed        G d! d"ee$             Z& G d# d$ej:                        Z' ed%        G d& d'e$             Z(g d(Z)y))    N)Tensor   )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                   h     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de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             y/var/www/vps2.regionflexible.com/Desarrollo/venv/lib/python3.12/site-packages/transformers/models/uvdoc/modeling_uvdoc.pyr"   zUVDocConvLayer.__init__)   si     	99#%	
  ^^L90:0F&,BKKM    inputreturnc                 l    | j                  |      }| j                  |      }| j                  |      }|S N)r%   r'   r   )r)   r-   hidden_states      r+   forwardzUVDocConvLayer.forwardD   s6    ''.)),7|4r,   )r   r   r   zerosFr   relu)__name__
__module____qualname____doc__intstrboolr"   r   r2   __classcell__r*   s   @r+   r   r   &   s    F # ZZ Z 	Z
 Z Z Z Z Z Z6V  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   r@   r   r*   s
            r+   r"   zUVDocResidualBlock.__init__N   s     	  ')'#q(  	 )#%#
 )$%#	
 -7,BfZ(r,   hidden_statesr.   c                     | j                  |      }| j                  |      }| j                  |      }||z   }| j                  |      }|S r0   )rC   rD   rE   rF   )r)   rG   residuals      r+   r2   zUVDocResidualBlock.forward   sJ    >>-066%0M2r,   )r   r   r   Fr4   )r5   r6   r7   r8   r9   r;   r:   r"   torchr   r2   r<   r=   s   @r+   r?   r?   K   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 )NrB   r   )r   r   r   r   r   r@   r   )	r!   r"   resnet_configsr#   
ModuleListlayersappendr?   r   )	r)   configstage_indexstagesr   r   r   r@   r*   s	           r+   r"   zUVDocResNetStage.__init__   s    &&{3mmB'?E 	;KxKK" +!- *1$qL%) & 2 2
	r,   rG   r.   c                 8    | j                   D ]
  } ||      } |S r0   )rP   )r)   rG   layers      r+   r2   zUVDocResNetStage.forward   s%    [[ 	1E!-0M	1r,   	r5   r6   r7   r8   r"   rJ   r   r2   r<   r=   s   @r+   rL   rL      s&    =$U\\ ell r,   rL   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   rB   )r   r   r   r   r   )r!   r"   r#   rO   resnet_headrangelenrQ   r   r   resnet_downrN   rL   )r)   rR   irS   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,   rG   r.   c                 j    | j                   D ]
  } ||      } | j                  D ]
  } ||      } |S r0   )r[   r^   )r)   rG   headr`   s       r+   r2   zUVDocResNet.forward   sF    $$ 	0D /M	0%% 	1E!-0M	1r,   rW   r=   s   @r+   rY   rY      s&    .+&U\\ ell r,   rY   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#   rO   blocksstage_configsrQ   r   )r)   rR   bridge_indexbridger   r   r*   s         r+   r"   zUVDocBridgeBlock.__init__   sc    mmB'%%l3%+ 	n!KKK~k;PXcklm	nr,   rG   kwargsr.   c                 8    | j                   D ]
  } ||      } |S r0   )rf   )r)   rG   rj   blocks       r+   r2   zUVDocBridgeBlock.forward   s'    
 [[ 	1E!-0M	1r,   )r5   r6   r7   r8   r"   rJ   r   r   r   r2   r<   r=   s   @r+   rd   rd      s;    Nn|| +, 
	r,   rd   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   rB   )r   r   r   r   r   r   r   )r   r   r   r   r   r   )r!   r"   r   out_point_positions2Dr   r   
hidden_actrC   r#   r$   conv_upr)   rR   r*   s     r+   r"   zUVDocPointPositions2D.__init__   s    '44Q7:55a8;**&&!+,,((
 yy44Q7:55a8;**&&!+,,
r,   rG   r.   c                 J    | j                  |      }| j                  |      }|S r0   )rC   rr   )r)   rG   s     r+   r2   zUVDocPointPositions2D.forward   s$    }5]3r,   rW   r=   s   @r+   rn   rn      s&    N
,U\\ ell r,   rn   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.
    rR   uvdocpixel_values)imageTrG   c                 |    t         |   |       	 t        |t        j                        r|j                          y y r0   )r!   _init_weights
isinstancer#   PReLUreset_parameters)r)   moduler*   s     r+   r{   z"UVDocPreTrainedModel._init_weights  s2    f%%fbhh'##% (r,   )r5   r6   r7   r8   r   __annotations__base_model_prefixmain_input_nameinput_modalities_can_compile_fullgraphsupports_gradient_checkpointingrd   _can_record_outputsrJ   no_gradr{   r<   r=   s   @r+   rv   rv      sW    
 $O!!&*#) U]]_& &r,   rv   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 r0   )r!   r"   r#   rO   ri   r\   r]   rg   rQ   rd   	post_init)r)   rR   rh   r*   s      r+   r"   zUVDocBridge.__init__  se     mmB'!#f&:&:";< 	GLKK/EF	Gr,   rG   rj   r.   c                 L    | j                   D ]
  } ||      } t              S )N)last_hidden_state)ri   r
   )r)   rG   rj   rV   features        r+   r2   zUVDocBridge.forward  s,     [[ 	+EM*G	+-HHr,   )r5   r6   r7   r"   r   r   rJ   r   r   r   r2   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backbonerR   c                    t         |   |       |j                  d   d   g}|j                  D ]  }|j	                  |d   d           || _        t        |      | _        t        |      | _	        | j                          y )Nr   r   )r!   r"   r[   rg   rQ   num_featuresrY   resnetr   ri   r   )r)   rR   r   r`   r*   s       r+   r"   zUVDocBackbone.__init__+  s}     **2.r23)) 	-Ea,	-(!&)!&)r,   rx   rj   r.   c                    d|d<   | j                  |      } | j                  |fi |}d}t        | j                        D ]'  \  }}|| j                  v s||j
                  |   fz  }) t        ||j
                        S )NToutput_hidden_states )feature_mapsrG   )r   ri   	enumeratestage_namesout_featuresrG   r	   )r)   rx   rj   rG   outputsr   idxr`   s           r+   r2   zUVDocBackbone.forward8  s     *.%&L1$++m6v6#D$4$45 	>JC)))!6!6s!; ==	> %!//
 	
r,   )r5   r6   r7   has_attentionsr   r   r"   r   r   r   rJ   FloatTensorr   r   r	   r2   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_configrg   num_bridge_layersr   bridge_connectorrn   rp   rs   s     r+   r"   zUVDocHead.__init__P  sv    !$V%;%;%I%I!J .//2T5K5KK003!
 &;6%B"r,   rG   rj   r.   c                 J    | j                  |      }| j                  |      }|S r0   )r   rp   )r)   rG   rj   s      r+   r2   zUVDocHead.forward_  s*    
 --m<22=Ar,   )
r5   r6   r7   r"   rJ   r   r   r   r2   r<   r=   s   @r+   r   r   O  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 )
UVDocModelrR   c                     t         |   |       t        |j                        | _        t        |      | _        | j                          y r0   )r!   r"   r   r   r   r   rb   r   rs   s     r+   r"   zUVDocModel.__init__p  s8     %f&<&<=f%	r,   rx   rj   r.   c                      | j                   |fi |}t        j                  |j                  d      } | j                  |fi |}t        ||j                        S )Nr   )dim)r   rG   )r   rJ   catr   rb   r
   rG   )r)   rx   rj   backbone_outputsfused_outputsr   s         r+   r2   zUVDocModel.forwardw  s`     )4==@@		"2"?"?QG%DIIm>v>-/*88
 	
r,   )r5   r6   r7   r   r"   r   r   rJ   r   r   r   tupler
   r2   r<   r=   s   @r+   r   r   i  sd    {  
''
 +,
 
u  	!$B	B	
  
r,   r   )r   r   r   rv   )*rJ   torch.nnr#   r   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?   rL   rY   rd   rn   rv   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 %

%
P		 4 
% 

2 Qr,   