
    wi                          d dl Z d dlmc mZ d dl 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j                  Z
ddZdS )    N)nnc                   (     e Zd Z	 d fd	Zd Z xZS )	ConvBNAct   Tc           	         t                                                       || _        t          j        |||||dz
  dz  |d          | _        t          j        |          | _        | j        rt          j                    | _	        d S d S )Nr      F)paddinggroupsbias)
super__init__use_actr   Conv2dconvBatchNorm2dbnReLUact)selfin_channelsout_channelskernel_sizestrider
   r   	__class__s          }/var/www/development/aibuddy-work/election-extract/venv/lib/python3.11/site-packages/rapidocr/networks/backbones/rec_hgnet.pyr   zConvBNAct.__init__   s     	I 1_*
 
 
	 ...< 	!wyyDHHH	! 	!    c                     |                      |          }|                     |          }| j        r|                     |          }|S N)r   r   r   r   r   xs     r   forwardzConvBNAct.forward   s>    IIaLLGGAJJ< 	Ar   )r   T__name__
__module____qualname__r   r!   __classcell__r   s   @r   r   r      sO        PT! ! ! ! ! !$      r   r   c                   $     e Zd Z fdZd Z xZS )	ESEModulec                     t                                                       t          j        d          | _        t          j        ||ddd          | _        t          j                    | _        d S )Nr   r   )r   r   r   r   r	   )	r   r   r   AdaptiveAvgPool2davg_poolr   r   Sigmoidsigmoid)r   channelsr   s     r   r   zESEModule.__init__"   se    ,Q//I !
 
 
	 z||r   c                     |}|                      |          }|                     |          }|                     |          }||z  S r   )r,   r   r.   )r   r    identitys      r   r!   zESEModule.forward.   s@    MM!IIaLLLLOO8|r   r"   r'   s   @r   r)   r)   !   sG        
$ 
$ 
$ 
$ 
$      r   r)   c                   (     e Zd Z	 d fd	Zd Z xZS )HG_BlockFc           	         t                                                       || _        t          j                    | _        | j                            t          ||dd                     t          |dz
            D ]-}| j                            t          ||dd                     .|||z  z   }t          ||dd          | _	        t          |          | _        d S )N   r   r   r   r   r   )r   r   r1   r   
ModuleListlayersappendr   rangeaggregation_convr)   att)	r   r   mid_channelsr   	layer_numr1   _total_channelsr   s	           r   r   zHG_Block.__init__7   s
    	 moo')	  	
 	
 	
 y1}%% 	 	AK ,!- !	      %y<'?? )&%	!
 !
 !
 \**r   c                 $   |}g }|                     |           | j        D ]"} ||          }|                     |           #t          j        |d          }|                     |          }|                     |          }| j        r||z  }|S )Nr   )dim)r9   r8   torchcatr;   r<   r1   )r   r    r1   outputlayers        r   r!   zHG_Block.forward_   s    a[ 	 	EaAMM!If!$$$!!!$$HHQKK= 	MAr   )Fr"   r'   s   @r   r3   r3   6   sR         &+ &+ &+ &+ &+ &+P      r   r3   c                   .     e Zd Zdddgf fd	Zd Z xZS )HG_StageTr   r   c           
      ~   t                                                       || _        |rt          ||d||d          | _        g }|                    t          ||||d                     t          |dz
            D ])}	|                    t          ||||d                     *t          j        | | _	        d S )Nr5   F)r   r   r   r   r
   r   )r1   r   T)
r   r   
downsampler   r9   r3   r:   r   
Sequentialblocks)r   r   r=   r   	block_numr>   rJ   r   blocks_listr?   r   s             r   r   zHG_Stage.__init__o   s     	$ 	''("  DO [,iRWXXX	
 	
 	
 y1}%% 	 	A ,iRV     
 m[1r   c                 h    | j         r|                      |          }|                     |          }|S r   )rJ   rL   r   s     r   r!   zHG_Stage.forward   s1    ? 	#""AKKNNr   r"   r'   s   @r   rH   rH   n   sY         1v 2  2  2  2  2  2D      r   rH   c                   6     e Zd ZdZ	 	 	 d fd	Zd Zd Z xZS )	PPHGNeta  
    PPHGNet
    Args:
        stem_channels: list. Stem channel list of PPHGNet.
        stage_config: dict. The configuration of each stage of PPHGNet. such as the number of channels, stride, etc.
        layer_num: int. Number of layers of HG_Block.
        use_last_conv: boolean. Whether to use a 1x1 convolutional layer before the classification layer.
        class_expand: int=2048. Number of channels for the last 1x1 convolutional layer.
        dropout_prob: float. Parameters of dropout, 0.0 means dropout is not used.
        class_num: int=1000. The number of classes.
    Returns:
        model: nn.Layer. Specific PPHGNet model depends on args.
    r5   FNc                    t                                                       || _        ||ng d| _                            d|           t          j        fdt          t                    dz
            D              | _	        | j        rt          j
        ddd          | _        t          j                    | _        g | _        t          |          D ]d\  }}||         \  }}	}
}}}| j                            t#          ||	|
||||                     || j        v r| j                            |
           e| j        s|d         d         | _        |                                  d S )	N)r   r   r   r5   r   c           	      d    g | ],}t          |         |d z            d|dk    rdnd           -S )r   r5   r   r   r6   )r   ).0istem_channelss     r   
<listcomp>z$PPHGNet.__init__.<locals>.<listcomp>   s`          -a 0!.q1u!5 ! !Q11A	    r   r   r5   r   )r   r   r	   stage4)r   r   detout_indicesinsertr   rK   r:   lenstem	MaxPool2dpoolr7   stagesr   	enumerater9   rH   _init_weights)r   rV   stage_configr>   r   rY   rZ   block_idkr=   r   rM   rJ   r   r   s    `            r   r   zPPHGNet.__init__   s    	*5*A;;||| 	Q,,,M    s=11A566  

	 8 	I1aHHHDImoo$\22 	7 	7KHa QK   
 
 
 4+++!((666x 	: ,X 6q 9Dr   c                    |                                  D ]}t          |t          j                  r%t          j                            |j                   At          |t          j                  rIt          j                            |j                   t          j        	                    |j
                   t          |t          j                  r$t          j        	                    |j
                   d S r   )modules
isinstancer   r   initkaiming_normal_weightr   ones_zeros_r   Linear)r   ms     r   rb   zPPHGNet._init_weights   s     	' 	'A!RY'' '''1111Ar~.. 'ah'''qv&&&&Ary)) 'qv&&&	' 	'r   c                 ~   |                      |          }| j        r|                     |          }g }t          | j                  D ]5\  }} ||          }| j        r|| j        v r|                    |           6| j        r|S | j        rt          j	        |ddg          }nt          j
        |ddg          }|S )Nr   (   r5   r   )r]   rY   r_   ra   r`   rZ   r9   trainingFadaptive_avg_pool2d
avg_pool2d)r   r    outrU   stages        r   r!   zPPHGNet.forward   s    IIaLL8 			!A!$+.. 	 	HAuaAx A!111

18 	J= 	(%a!R11AAQA''Ar   )r5   FN)r#   r$   r%   __doc__r   rb   r!   r&   r'   s   @r   rQ   rQ      sq         & : : : : : :x' ' '      r   rQ   Fc           
          g dg dg dg dd}ddddd	d
dggddddd	dd
ggdddd
d	d
dggddddd	d
dggd}t          dg d|r|n|d|d|}|S )a{  
    PPHGNet_small
    Args:
        pretrained: bool=False or str. If `True` load pretrained parameters, `False` otherwise.
                    If str, means the path of the pretrained model.
        use_ssld: bool=False. Whether using distillation pretrained model when pretrained=True.
    Returns:
        model: nn.Layer. Specific `PPHGNet_small` model depends on args.
    )   rz      r   Fr   )r{         r   Tr   )r}         r   Tr   )r         r   Tr   )stage1stage2stage3rX   rz   r{   r   Tr   r|   r}   r~   r   r   r   )@   r   rz      )rV   rc   r>   rY    )rQ   )
pretraineduse_ssldrY   kwargsstage_config_detstage_config_recmodels          r   PPHGNet_smallr     s     /..------...  S!TAq62S!TAq62S!TAq62T1dQF3   #mm),B%%2B	 
  E Lr   )FFF)rC   torch.nn.functionalr   
functionalrs   Moduler   r)   r3   rH   rQ   r   r   r   r   <module>r      s@                      	   6    	   *5 5 5 5 5ry 5 5 5p' ' ' ' 'ry ' ' 'Tf f f f fbi f f fR! ! ! ! ! !r   