o
    0j*                     @   s  d dl mZmZ d dlZd dlmZ d dlm  mZ ddl	m
Z
 ddlmZmZ ddlmZ G dd	 d	ejZG d
d dejZG dd dejZG dd dejZG dd dejZG dd dejZG dd dejZG dd dejZG dd dejZG dd deeZdS )    )AnyListN   )ACT2FN)BatchNormHFStateDictMixinPretrainedModel   )UVDocConfigc                       s8   e Zd ZdZ							d fdd		Zd
d Z  ZS )UVDocConvLayerz<Convolutional layer with batch normalization and activation.r   r   r   zerosFreluc
           
   
      s^   t    tj||||||||sdnd d| _t|| _|	d ur(t|	 | _	d S t | _	d S )NF)kernel_sizestridepaddingpadding_modedilationZ	bias_attr)
super__init__nnConv2DconvolutionZBatchNorm2Dnormalizationr   Identity
activation)
selfin_channelsout_channelsr   r   r   r   biasr   r   	__class__ x/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/paddlex/inference/models/image_unwarping/modeling/uvdoc.pyr       s    


zUVDocConvLayer.__init__c                 C   s"   |  |}| |}| |}|S N)r   r   r   )r   Zhidden_stater    r    r!   forward<   s   


zUVDocConvLayer.forward)r   r   r   r   Fr   r   __name__
__module____qualname____doc__r   r#   __classcell__r    r    r   r!   r
      s    r
   c                       s4   e Zd ZdZ					d
 fdd	Zdd	 Z  ZS )UVDocResidualBlockz%Residual block with dilation support.r   r   Fr   c	           	   
      s   t    |rt|||||d dd dnt | _t||||||dd| _t|||d|d|d d| _|d ur=t| | _	d S t | _	d S )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   
downsampler   r   r    r!   r   F   sB   

	$
zUVDocResidualBlock.__init__c                 C   s4   |  |}| |}| |}|| }| |}|S r"   )r,   r-   r.   r/   )r   hidden_statesZresidualr    r    r!   r#   t   s   



zUVDocResidualBlock.forward)r   r   r   Fr   r$   r    r    r   r!   r*   C   s    .r*   c                       (   e Zd ZdZ fddZdd Z  ZS )UVDocResNetStagez3A ResNet stage containing multiple residual blocks.c                    s`   t    |j| }t | _|D ]\}}}}| jt|||r!dnd|d |||jd qd S )Nr+   r   )r   r   r   r   r   r0   r   )	r   r   resnet_configsr   	LayerListlayersappendr*   r   )r   configstage_indexZstagesr   r   r   r0   r   r    r!   r      s    



zUVDocResNetStage.__init__c                 C      | j D ]}||}q|S r"   )r6   )r   r1   layerr    r    r!   r#         

zUVDocResNetStage.forwardr$   r    r    r   r!   r3   }   s    r3   c                       r2   )UVDocResNetz+Initial resnet_head and resnet_down stages.c              
      s   t    t | _tt|jD ]}| jt|j| d |j| d |j	d|j	d d qt | _
tt|jD ]}| j
t|| q;d S )Nr   r   r+   )r   r   r   r   r   )r   r   r   r5   resnet_headrangelenr7   r
   r   resnet_downr4   r3   )r   r8   ir9   r   r    r!   r      s    



zUVDocResNet.__init__c                 C   s,   | j D ]}||}q| jD ]}||}q|S r"   )r>   rA   )r   r1   headZstager    r    r!   r#      s
   



zUVDocResNet.forwardr$   r    r    r   r!   r=      s    r=   c                       r2   )UVDocBridgeBlockzCBridge block with dilated convolutions for long-range dependencies.c              	      sH   t    t | _|j| }|D ]\}}| jt||||d qd S )N)r   r   )r   r   r   r5   blocksstage_configsr7   r
   )r   r8   bridge_indexbridger   r   r   r    r!   r      s   


zUVDocBridgeBlock.__init__c                 C   r:   r"   )rE   )r   r1   blockr    r    r!   r#      r<   zUVDocBridgeBlock.forwardr$   r    r    r   r!   rD      s    rD   c                       r2   )UVDocBridgez0Bridge module containing multiple bridge blocks.c                    s>   t    t | _tt|jD ]}| jt	|| qd S r"   )
r   r   r   r5   rH   r?   r@   rF   r7   rD   )r   r8   rG   r   r    r!   r      s
   

zUVDocBridge.__init__c                 C   s"   g }| j D ]	}||| q|S r"   )rH   r7   )r   r1   feature_mapsr;   r    r    r!   r#      s   
zUVDocBridge.forwardr$   r    r    r   r!   rJ      s    rJ   c                       r2   )UVDocPointPositions2DzDModule for predicting 2D point positions for document rectification.c              	      s|   t    t|jd d |jd d |jd|jd |j|jd| _tj	|jd d |jd d |jd|jd |jd| _
d S )Nr   r   r+   )r   r   r   r   r   r   r   )r   r   r   r   r   r   )r   r   r
   out_point_positions2Dr   r   Z
hidden_actr,   r   r   conv_upr   r8   r   r    r!   r      s$   
	zUVDocPointPositions2D.__init__c                 C      |  |}| |}|S r"   )r,   rN   r   r1   r    r    r!   r#      r<   zUVDocPointPositions2D.forwardr$   r    r    r   r!   rL      s    rL   c                       r2   )UVDocBackbonezEUVDoc backbone with ResNet and bridge modules for feature extraction.c                    s"   t    t|| _t|| _d S r"   )r   r   r=   resnetrJ   rH   )r   backbone_configr   r    r!   r      s   

zUVDocBackbone.__init__c                 C   s   |  |}| |}|S r"   )rS   rH   )r   Zpixel_valuesr1   rK   r    r    r!   r#      r<   zUVDocBackbone.forwardr$   r    r    r   r!   rR      s    rR   c                       r2   )	UVDocHeadzFUVDoc output head with bridge connector and point position prediction.c                    sJ   t    t|jj}t|jd | |jd ddddd| _t|| _d S )Nr   r   )r   r   r   r   r   r   )	r   r   r@   rT   rF   r
   bridge_connectorrL   rM   )r   r8   Znum_bridge_layersr   r    r!   r     s   
zUVDocHead.__init__c                 C   rP   r"   )rV   rM   rQ   r    r    r!   r#     r<   zUVDocHead.forwardr$   r    r    r   r!   rU     s    rU   c                       sZ   e Zd ZdZeZdgZdef fddZdede	fdd	Z
 fd
dZ fddZ  ZS )UVDocNetz-UVDoc model for document image rectification.Znum_batches_trackedr8   c                    s6   t  | t|j| _t|| _|j| _|j| _d S r"   )	r   r   rR   rT   backbonerU   rC   upsample_sizeupsample_moderO   r   r    r!   r      s
   
zUVDocNet.__init__xreturnc                 C   s   t |d }|}|jdd  \}}tj|| j| jdd}| |}t j|dd}| 	|}tj|||f| jdd}|
g d}	tj||	dd}
|
  gS )	Nr   r+   T)sizemodealign_cornersr   )Zaxis)r   r+   r   r   )r_   )paddleZ	to_tensorshapeFZinterpolaterY   rZ   rX   concatrC   Z	transposeZgrid_samplecpunumpy)r   r[   imageZh_oriZw_orirK   ZfusedoutZbm_upZbmresultr    r    r!   r#   '  s*   

zUVDocNet.forwardc                       t   }dg}|| S )N)z7head.out_point_positions2D.conv_down.activation._weight_weightweight)r   _get_forward_key_rulesr   Zdefault_rulesZcustom_rulesr   r    r!   rl   B     
zUVDocNet._get_forward_key_rulesc                    ri   )N)z6head.out_point_positions2D.conv_down.activation.weightrk   rj   )r   _get_reverse_key_rulesrm   r   r    r!   ro   M  rn   zUVDocNet._get_reverse_key_rules)r%   r&   r'   r(   r	   Zconfig_classZ"_keys_to_ignore_on_load_unexpectedr   r   r   r#   rl   ro   r)   r    r    r   r!   rW     s    rW   )typingr   r   r`   Z	paddle.nnr   Zpaddle.nn.functionalZ
functionalrb   Zcommon.transformers.activationsr   Z common.transformers.transformersr   r   _configr	   ZLayerr
   r*   r3   r=   rD   rJ   rL   rR   rU   rW   r    r    r    r!   <module>   s"   &: