o
    *j+p                     @   s  d dl mZ d dlZd dlZd dlmZ d dlm  mZ	 dd Z
dd Zdd 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dd 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dS )    )OrderedDictNc                 C   sp   t | tr!t| dksJ d|  t| d }t| d }||fS t | ts*J d| d dks4J d| d S )N   zinvalid kernel size: %sr      z-kernel size should be either `int` or `tuple`z kernel size should be odd number)
isinstancetuplelenget_same_paddingint)kernel_sizep1Zp2 r   r/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/modelscope/models/cv/ocr_detection/modules/layers.pyr   	   s   
r   c                 C   sb   t |d| jd  }t |d| jd  }| j| j | jd  | jd  | | | j }|S )Nr   r      r   )r	   sizestridein_channelsout_channelsr
   groups)layerxZout_hZout_wZ	delta_opsr   r   r   count_conv_flop   s   r   c                 C   s>   | d u rd S t jt tjttjti}| d}|| }|| S Nname)	ZeroLayer__name__MBInvertedConvLayerIdentityLayerpopbuild_from_config)Zlayer_configZ
name2layerZ
layer_namer   r   r   r   set_layer_from_config   s   

r   c                       sP   e Zd Z fddZdd Zedd Zedd Zed	d
 Z	dd Z
  ZS )MobileInvertedResidualBlockc                    s   t t|   || _|| _d S N)superr    __init__mobile_inverted_convshortcut)selfr$   r%   	__class__r   r   r#   ,   s   
z$MobileInvertedResidualBlock.__init__c                 C   sT   | j  r	|}|S | jd u s| j r|  |}|S |  |}| |}|| }|S r!   )r$   is_zero_layerr%   )r&   r   resZconv_xZskip_xr   r   r   forward1   s   



z#MobileInvertedResidualBlock.forwardc                 C   s&   d| j j| jd ur| jjf S d f S )Nz(%s, %s))r$   
module_strr%   r&   r   r   r   r,   <   s   
z&MobileInvertedResidualBlock.module_strc                 C   s(   t j| jj| jd ur| jjdS d dS )N)r   r$   r%   )r    r   r$   configr%   r-   r   r   r   r.   B   s   z"MobileInvertedResidualBlock.configc                 C   s"   t | d }t | d }t||S )Nr$   r%   )r   r    )r.   r$   r%   r   r   r   r   M   s
   
z-MobileInvertedResidualBlock.build_from_configc                 C   s>   | j |\}}| jr| j|\}}nd}|| | |fS Nr   )r$   	get_flopsr%   r+   )r&   r   Zflops1_Zflops2r   r   r   r0   T   s
   z%MobileInvertedResidualBlock.get_flops)r   
__module____qualname__r#   r+   propertyr,   r.   staticmethodr   r0   __classcell__r   r   r'   r   r    *   s    



r    c                       f   e Zd Z				d fdd	Zdd Zed	d
 Zedd Zedd Z	edd Z
dd Z  ZS )r   r   r   r      Nc           	         s"  t t|   || _|| _|| _|| _|| _|| _|d u r%t	| j| j n|}| jdkr0d | _
n ttdtj| j|dddddfdt|fdt fg| _
t| j}ttdtj||||||ddfdt|fdt fg| _ttdtj||dddddfdt|fg| _d S )	Nr   convr   Fbiasbnactr   r<   )r"   r   r#   r   r   r
   r   expand_ratiomid_channelsroundinverted_bottlenecknn
Sequentialr   Conv2dBatchNorm2dPReLUr   
depth_conv
point_conv)	r&   r   r   r
   r   r@   rA   feature_dimpadr'   r   r   r#   _   sl   


	

zMBInvertedConvLayer.__init__c                 C   (   | j r|  |}| |}| |}|S r!   )rC   rI   rJ   r&   r   r   r   r   r+      
   


zMBInvertedConvLayer.forwardc                 C   s   d| j | j | jf S )Nz%dx%d_MBConv%d)r
   r@   r-   r   r   r   r,      s   
zMBInvertedConvLayer.module_strc                 C   "   t j| j| j| j| j| j| jdS )N)r   r   r   r
   r   r@   rA   )r   r   r   r   r
   r   r@   rA   r-   r   r   r   r.         zMBInvertedConvLayer.configc                 C      t di | S Nr   )r   r.   r   r   r   r         z%MBInvertedConvLayer.build_from_configc                   C      dS NFr   r   r   r   r   r)         z!MBInvertedConvLayer.is_zero_layerc                 C   sf   d}| j r|t| j j|7 }|  |}|t| jj|7 }| |}|t| jj|7 }| |}||fS 8count conv flops, skip BN and other small flops
        r   )rC   r   r:   rI   rJ   r&   r   total_flopsr   r   r   r0      s   


zMBInvertedConvLayer.get_flops)r   r8   r9   Nr   r2   r3   r#   r+   r4   r,   r.   r5   r   r)   r0   r6   r   r   r'   r   r   ]   s     3



r   c                       \   e Zd Z fddZdd Zedd Zedd Zed	d
 Z	edd Z
dd Z  ZS )r   c                    s   t t|   d S r!   )r"   r   r#   r-   r'   r   r   r#      s   zIdentityLayer.__init__c                 C   s   |S r!   r   rN   r   r   r   r+      s   zIdentityLayer.forwardc                 C   rV   )NZIdentityr   r-   r   r   r   r,      rX   zIdentityLayer.module_strc                 C   s
   dt jiS r   )r   r   r-   r   r   r   r.      s   zIdentityLayer.configc                 C   rR   rS   )r   rT   r   r   r   r      rU   zIdentityLayer.build_from_configc                   C   rV   rW   r   r   r   r   r   r)      rX   zIdentityLayer.is_zero_layerc                 C      d|  |fS r/   r+   rN   r   r   r   r0         zIdentityLayer.get_flopsr]   r   r   r'   r   r      s    



r   c                       r^   )r   c                    s   t t|   || _d S r!   )r"   r   r#   r   )r&   r   r'   r   r   r#      s   
zZeroLayer.__init__c                 C   sJ   |j \}}}}|| jd  }|| jd  }|j}tj|||||dd}|S )Nr   r   F)devicerequires_grad)shaper   rb   torchzeros)r&   r   nchwrb   paddingr   r   r   r+      s   zZeroLayer.forwardc                 C   rV   )NZZeror   r-   r   r   r   r,      rX   zZeroLayer.module_strc                 C   s   t j| jdS )N)r   r   )r   r   r   r-   r   r   r   r.      rU   zZeroLayer.configc                 C   rR   rS   )r   rT   r   r   r   r      rU   zZeroLayer.build_from_configc                   C   rV   )NTr   r   r   r   r   r)      rX   zZeroLayer.is_zero_layerc                 C   r_   r/   r`   rN   r   r   r   r0      ra   zZeroLayer.get_flopsr]   r   r   r'   r   r      s    



r   c                    s8    fddt  D }| d   t| 7  < |S )Nc                    s   g | ]}t t  qS r   )r	   npceil).0r1   
num_groupstotal_channelsr   r   
<listcomp>  s    zsplit_layer.<locals>.<listcomp>r   )rangesum)rq   rp   splitr   ro   r   split_layer   s
   rv   c                       sj   e Zd Zg ddddf fdd	Zdd Zed	d
 Zedd Zedd Z	edd Z
dd Z  ZS )MBInvertedMixConvLayerr   r      r8   r9   Nc                    s`  t t|   || _|| _|| _|| _|| _|| _|d u r%t	| j| j n|}t
tdt
j| j|dddddfdt
|fdt
 fg| _|| _t|| _t|| j| _t
 | _t| jD ]3}| j| }	t|	}
| j| }| jt
tdt
j|||	||
|ddfdt
|fdt
 fg q`t
tdt
j||dddddfdt
|fg| _d S 	Nr:   r   r   Fr;   r=   r>   r?   )r"   rw   r#   r   r   mix_conv_sizer   r@   rA   rB   rD   rE   r   rF   rG   rH   rC   r   n_chunksrv   split_in_channels
ModuleListmix_convrs   r   appendrJ   )r&   r   r   r{   r   r@   rA   rK   idxr
   rL   Zsplit_in_channels_r'   r   r   r#   
  sz   
	



	

zMBInvertedMixConvLayer.__init__c                 C   sJ   |  |}tj|| jdd}tjdd t| j|D dd}| |}|S )Nr   dimc                 S   s   g | ]\}}||qS r   r   )rn   r   sr   r   r   rr   H  s    z2MBInvertedMixConvLayer.forward.<locals>.<listcomp>)rC   re   ru   r}   catzipr   rJ   )r&   r   ru   r   r   r   r+   E  s   

zMBInvertedMixConvLayer.forwardc                 C      dt | j| jf S )Nz%s_MixConv%d)strr{   r@   r-   r   r   r   r,   N     z!MBInvertedMixConvLayer.module_strc                 C   rP   )N)r   r   r   r{   r   r@   rA   )rw   r   r   r   r{   r   r@   rA   r-   r   r   r   r.   R  rQ   zMBInvertedMixConvLayer.configc                 C   rR   rS   rw   rT   r   r   r   r   ^  rU   z(MBInvertedMixConvLayer.build_from_configc                   C   rV   rW   r   r   r   r   r   r)   b  rX   z$MBInvertedMixConvLayer.is_zero_layerc                 C   s   d}|t | jj|7 }| |}tj|| jdd}g }t| j|D ]\}}||| |t |j|7 }q!tj	|dd}|t | j
j|7 }| 
|}||fS rZ   r   r   r   )r   rC   r:   re   ru   r}   r   r   r   r   rJ   )r&   r   r\   ru   outr   r   r   r   r   r0   f  s   

z MBInvertedMixConvLayer.get_flopsr]   r   r   r'   r   rw     s     ;	



rw   c                       sh   e Zd Zg dddf fdd	Zdd Zedd	 Zed
d Zedd Z	edd Z
dd Z  ZS )LinearMixConvLayerrx   r8   Nc           	         s   t t|   || _|| _|| _|| _|| _|| _t|| _	t
 | _t| j	D ]0}| j| }t|}| jt
tdt
j||||||ddfdt
|fdt
jddfg q(t
tdt
j|| j	 |ddd	dd
fdt
|fg| _d S )Nr:   Fr?   r=   r>   TZinplacer   r   r;   )r"   r   r#   r   r   r{   r   rA   r   r|   rD   r~   r   rs   r   r   rE   r   rF   rG   ReLU6rJ   )	r&   r   r   r{   r   rA   r   r
   rL   r'   r   r   r#   y  s\   


	
zLinearMixConvLayer.__init__c                    s,   t j fdd| jD dd |    S )Nc                    s   g | ]}| qS r   r   )rn   r   r   r   r   rr     s    z.LinearMixConvLayer.forward.<locals>.<listcomp>r   r   )re   r   r   rJ   rN   r   r   r   r+     s   
zLinearMixConvLayer.forwardc                 C   s   dt | j S )Nz%s_LinearMixConv)r   r{   r-   r   r   r   r,     rU   zLinearMixConvLayer.module_strc                 C   s   t j| j| j| j| j| jdS )N)r   r   r   r{   r   rA   )r   r   r   r   r{   r   rA   r-   r   r   r   r.     s   zLinearMixConvLayer.configc                 C   rR   rS   )r   rT   r   r   r   r     rU   z$LinearMixConvLayer.build_from_configc                   C   rV   rW   r   r   r   r   r   r)     rX   z LinearMixConvLayer.is_zero_layerc                 C   sd   d}g }| j D ]}||| |t|j|7 }qtj|dd}|t| jj|7 }| |}||fS r   )r   r   r   r:   re   r   rJ   )r&   r   r\   r   r   r   r   r   r0     s   

zLinearMixConvLayer.get_flopsr]   r   r   r'   r   r   w  s    1




r   c                       st   e Zd ZdZddedef fddZdd Zd	d
 Zedd Z	edd Z
edd Zedd Zdd Z  ZS )SELayerz
       input_channelssqueeze_factorc                    s^   t t|   || _|| _|| | _t| j| jd| _tj	dd| _
t| j| jd| _d S )Nr   Tr   )r"   r   r#   r   r   squeeze_channelsrD   rF   fc1ZReLUrelufc2)r&   r   r   r'   r   r   r#     s   
zSELayer.__init__c                 C   s4   t |d}| |}| |}| |}t|S )Nr   )FZadaptive_avg_pool2dr   r   r   re   Zsigmoidr&   inputscaler   r   r   _scale  s
   



zSELayer._scalec                 C   s   |  |}|| S r!   )r   r   r   r   r   r+     s   
zSELayer.forwardc                 C   
   d| j  S )NzSE_%d)r   r-   r   r   r   r,        
zSELayer.module_strc                 C      t j| j| j| jdS )N)r   r   r   r   )r   r   r   r   r   r-   r   r   r   r.     
   zSELayer.configc                 C   rR   rS   )r   rT   r   r   r   r     rU   zSELayer.build_from_configc                   C   rV   rW   r   r   r   r   r   r)     rX   zSELayer.is_zero_layerc                 C   s>   d}|| j | j d 7 }|j\}}}}||| | 7 }||fS )I
        count se flops, only compute the fc layers' calculation
        r   r   )r   r   rd   )r&   r   r\   brh   ri   rj   r   r   r   r0     s
   zSELayer.get_flops)r   )r   r2   r3   __doc__r	   r#   r   r+   r4   r,   r.   r5   r   r)   r0   r6   r   r   r'   r   r     s    	



r   c                       s.   e Zd Zd	 fdd	Zdd Zdd Z  ZS )
MHSA   r   c                    s   t t|   || _tj||dd| _tj||dd| _tj||dd| _|| _	|| _
tjtd||| d|gdd| _tjtd||| |dgdd| _tjdd| _d S )Nr   )r
   T)rc   r   )r"   r   r#   headsrD   rF   querykeyvaluewidthheight	Parameterre   Zrandnrel_hrel_wZSoftmaxsoftmax)r&   Zn_dimsr   r   r   r'   r   r   r#     s    zMHSA.__init__c              	   C   s   |  \}}}}| ||| j|| j d}| ||| j|| j d}| ||| j|| j d}t|dddd|}	| j	| j
 d| j|| j ddddd}
t|
|}
|	|
 }| |}t||dddd}|||||}|S )Nr   r   r   r   r   )r   r   viewr   r   r   re   matmulZpermuter   r   r   )r&   r   n_batchCr   r   qkvZcontent_contentZcontent_positionZenergyZ	attentionr   r   r   r   r+   #  s    
zMHSA.forwardc                 C   s   |  \}}}}d}|t| j|d 7 }||| | ||  7 }||| | 7 }||| | ||  7 }||| | ||  7 }||fS )r   r   r   )r   r   r   )r&   r   r   r   r   r   r\   r   r   r   r0   7  s   zMHSA.get_flops)r   r   r   )r   r2   r3   r#   r+   r0   r6   r   r   r'   r   r     s    r   c                       r7   )MBInvertedMHSALayerr9   r      Nc                    s   t t|   || _|| _|| _|| _|d u rt| j| j n|}| jdkr*d | _n"t	
tdt	j| j|dddddfdt	|fdt	jdd	fg| _t|||| _t	
tdt	j||dddddfdt	|fg| _d S )
Nr   r:   r   Fr;   r=   r>   Tr   )r"   r   r#   r   r   r@   rA   rB   rC   rD   rE   r   rF   rG   r   r   mhsarJ   )r&   r   r   r@   r   r   rA   rK   r'   r   r   r#   O  sF   
	
zMBInvertedMHSALayer.__init__c                 C   rM   r!   )rC   r   rJ   rN   r   r   r   r+   s  rO   zMBInvertedMHSALayer.forwardc                 C   r   )NzMSHA%d)r@   r-   r   r   r   r,   z  r   zMBInvertedMHSALayer.module_strc                 C   r   )N)r   r   r@   rA   )r   r   r   r@   rA   r-   r   r   r   r.   ~  r   zMBInvertedMHSALayer.configc                 C   rR   rS   )r   rT   r   r   r   r     rU   z%MBInvertedMHSALayer.build_from_configc                   C   rV   rW   r   r   r   r   r   r)     rX   z!MBInvertedMHSALayer.is_zero_layerc                 C   sh   d}| j r|t| j j|7 }|  |}|| j|d 7 }| |}|t| jj|7 }| |}||fS rY   )rC   r   r:   r   r0   rJ   r[   r   r   r   r0     s   


zMBInvertedMHSALayer.get_flops)r9   r   r   Nr]   r   r   r'   r   r   M  s     $



r   c                       s   e Zd Zg ddddf fdd	Zdd Zed	d
 Zedd Zedd Z	edd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Z  ZS )MBInvertedRepConvLayerrx   r8   r9   Nc                    sT  t t|   || _|| _|| _|| _|| _|| _|d u r%t	| j| j n|}t
tdt
j| j|dddddfdt
|fdt
 fg| _|| _t|| _t
 | _t| jD ])}| j| }	t|	}
| jt
tdt
j|||	||
|ddfdt
|fg qYd | _t
 | _t
tdt
j||dddddfdt
|fg| _d| _d S rz   )r"   r   r#   r   r   rep_conv_sizer   r@   rA   rB   rD   rE   r   rF   rG   rH   rC   r   r|   r~   rep_convrs   r   r   rep_conv_deployr>   rJ   deploy)r&   r   r   r   r   r@   rA   rK   r   r
   rL   r'   r   r   r#     sz   
	


	

zMBInvertedRepConvLayer.__init__c                 C   st   |  |}| js)g }| jD ]	}||| q|d }|dd  D ]}||7 }q!n| |}| |}| |}|S )Nr   r   )rC   r   r   r   r   r>   rJ   )r&   r   r   r   out_r   r   r   r+     s   





zMBInvertedRepConvLayer.forwardc                 C   r   )Nz%s_RepConv%d)r   r   r@   r-   r   r   r   r,     r   z!MBInvertedRepConvLayer.module_strc                 C   rP   )N)r   r   r   r   r   r@   rA   )rw   r   r   r   r   r   r@   rA   r-   r   r   r   r.     rQ   zMBInvertedRepConvLayer.configc                 C   rR   rS   r   rT   r   r   r   r     rU   z(MBInvertedRepConvLayer.build_from_configc                   C   rV   rW   r   r   r   r   r   r)     rX   z$MBInvertedRepConvLayer.is_zero_layerc              	   C   s   d| _ | jd jj}| jd jj}t| j}t|}tj	||||||dd| _
|  \}}|| j
j_|| j
j_|  D ]}|  q;| d d S )NTr   r?   r   )r   r   r:   r   r   maxr   r   rD   rF   r   get_equivalent_kernel_biasweightdatar<   
parametersZdetach___delattr__)r&   rK   r   r
   rL   kernelr<   parar   r   r   switch_to_deploy  s(   
	


z'MBInvertedRepConvLayer.switch_to_deployc                 C   s<  t | j}|dkrcd| jv r| | j| jd \}}nd }d}d| jv r5| | j| jd \}}nd }d}d| jv rM| | j| jd \}}nd}d}|| | | | || | fS d| jv rw| | j| jd \}}nd }d}d| jv r| | j| jd \}}nd }d}|| | || fS )Nry   r   r   r   )r   r   _fuse_bn_tensorr   index_pad_1x1_to_5x5_tensor_pad_3x3_to_5x5_tensor_pad_1x1_to_3x3_tensor)r&   Zmax_kernel_size	kernel1x1Zbias1x1	kernel3x3Zbias3x3Z	kernel5x5Zbias5x5r   r   r   r     s\   











z1MBInvertedRepConvLayer.get_equivalent_kernel_biasc                 C       |d u rdS t jj|g dS Nr   )r   r   r   r   re   rD   
functionalrL   r&   r   r   r   r   r   I     z-MBInvertedRepConvLayer._pad_1x1_to_3x3_tensorc                 C   r   )Nr   )r   r   r   r   r   r   r   r   r   r   O  r   z-MBInvertedRepConvLayer._pad_1x1_to_5x5_tensorc                 C   r   r   r   )r&   r   r   r   r   r   U  r   z-MBInvertedRepConvLayer._pad_3x3_to_5x5_tensorc                 C   s   |d u rdS t |tjr%|jj}|jj}|jj}|jj}|jj}|jj	}nOt |tj
s-J t| dsb| j| j }tj| j|ddftjd}	t| jD ]}
d|	|
|
| ddf< qJt|	|jj| _| j}|j}|j}|j}|j}|j	}||  }|| dddd}|| ||| |  fS )N)r   r   	id_tensorr   )Zdtyper   r   )r   rD   rE   r:   r   r=   running_meanrunning_varr<   epsrG   hasattrr   r   rl   rf   Zfloat32rs   re   Z
from_numpytorb   r   sqrtZreshape)r&   branchr   r   r   gammabetar   Z	input_dimZkernel_valueiZstdtr   r   r   r   [  s:   


z&MBInvertedRepConvLayer._fuse_bn_tensorc                 C   s   d}|t | jj|7 }| |}|t | jd j|7 }g }| jD ]	}||| q |d }|dd D ]}||7 }q4|t | jj|7 }| |}||fS )rZ   r   r   r   N)r   rC   r:   r   r   rJ   )r&   r   r\   r   r   r   r   r   r   r0   z  s   



z MBInvertedRepConvLayer.get_flops)r   r2   r3   r#   r+   r4   r,   r.   r5   r   r)   r   r   r   r   r   r   r0   r6   r   r   r'   r   r     s,    =



/r   )collectionsr   numpyrl   re   Ztorch.nnrD   Ztorch.nn.functionalr   r   r   r   r   Moduler    r   r   r   rv   rw   r   r   r   r   r   r   r   r   r   <module>   s&    3c"o^8@P