o
    ߥi+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p1p2 r   e/home/ubuntu/.local/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xout_hout_w	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)layer_config
name2layer
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   resconv_x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   r5   <   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,   r6   r   r   r   r7   B   s   z"MobileInvertedResidualBlock.configc                 C   s"   t | d }t | d }t||S )Nr+   r,   )r&   r'   )r7   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,   r4   )r-   r   flops1_flops2r   r   r   r9   T   s
   z%MobileInvertedResidualBlock.get_flops)r   
__module____qualname__r*   r4   propertyr5   r7   staticmethodr"   r9   __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   rG   )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   rK   rL   feature_dimpadr.   r   r   r*   _   sl   


	

zMBInvertedConvLayer.__init__c                 C   (   | j r|  |}| |}| |}|S r(   )rN   rT   rU   r-   r   r   r   r   r4      
   


zMBInvertedConvLayer.forwardc                 C   s   d| j | j | jf S )Nz%dx%d_MBConv%d)r
   rK   r6   r   r   r   r5      s   
zMBInvertedConvLayer.module_strc                 C   "   t j| j| j| j| j| j| jdS )N)r   r   r   r
   r   rK   rL   )r   r   r   r   r
   r   rK   rL   r6   r   r   r   r7         zMBInvertedConvLayer.configc                 C      t di | S Nr   )r   r7   r   r   r   r"         z%MBInvertedConvLayer.build_from_configc                   C      dS NFr   r   r   r   r   r0         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   )rN   r   rE   rT   rU   r-   r   total_flopsr   r   r   r9      s   


zMBInvertedConvLayer.get_flops)r   rC   rD   Nr   r=   r>   r*   r4   r?   r5   r7   r@   r"   r0   r9   rA   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*   r6   r.   r   r   r*      s   zIdentityLayer.__init__c                 C   s   |S r(   r   rY   r   r   r   r4      s   zIdentityLayer.forwardc                 C   ra   )NIdentityr   r6   r   r   r   r5      rc   zIdentityLayer.module_strc                 C   s
   dt jiS r   )r    r   r6   r   r   r   r7      s   zIdentityLayer.configc                 C   r]   r^   )r    r_   r   r   r   r"      r`   zIdentityLayer.build_from_configc                   C   ra   rb   r   r   r   r   r   r0      rc   zIdentityLayer.is_zero_layerc                 C      d|  |fS r8   r4   rY   r   r   r   r9         zIdentityLayer.get_flopsrh   r   r   r.   r   r       s    



r    c                       ri   )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   rn   torchzeros)r-   r   nchwrn   paddingr   r   r   r4      s   zZeroLayer.forwardc                 C   ra   )NZeror   r6   r   r   r   r5      rc   zZeroLayer.module_strc                 C   s   t j| jdS )N)r   r   )r   r   r   r6   r   r   r   r7      r`   zZeroLayer.configc                 C   r]   r^   )r   r_   r   r   r   r"      r`   zZeroLayer.build_from_configc                   C   ra   )NTr   r   r   r   r   r0      rc   zZeroLayer.is_zero_layerc                 C   rk   r8   rl   rY   r   r   r   r9      rm   zZeroLayer.get_flopsrh   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).0r;   
num_groupstotal_channelsr   r   
<listcomp>  s    zsplit_layer.<locals>.<listcomp>r   )rangesum)r~   r}   splitr   r|   r   split_layer   s
   r   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      rC   rD   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 	NrE   r   r   FrF   rH   rI   rJ   )r)   r   r*   r   r   mix_conv_sizer   rK   rL   rM   rO   rP   r   rQ   rR   rS   rN   r   n_chunksr   split_in_channels
ModuleListmix_convr   r   appendrU   )r-   r   r   r   r   rK   rL   rV   idxr
   rW   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   )r{   r   sr   r   r   r   H  s    z2MBInvertedMixConvLayer.forward.<locals>.<listcomp>)rN   rq   r   r   catzipr   rU   )r-   r   r   r   r   r   r4   E  s   

zMBInvertedMixConvLayer.forwardc                 C      dt | j| jf S )Nz%s_MixConv%d)strr   rK   r6   r   r   r   r5   N     z!MBInvertedMixConvLayer.module_strc                 C   r[   )N)r   r   r   r   r   rK   rL   )r   r   r   r   r   r   rK   rL   r6   r   r   r   r7   R  r\   zMBInvertedMixConvLayer.configc                 C   r]   r^   r   r_   r   r   r   r"   ^  r`   z(MBInvertedMixConvLayer.build_from_configc                   C   ra   rb   r   r   r   r   r   r0   b  rc   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 re   r   r   r   )r   rN   rE   rq   r   r   r   r   r   r   rU   )r-   r   rg   r   outr   r   r   r   r   r9   f  s   

z MBInvertedMixConvLayer.get_flopsrh   r   r   r.   r   r     s     ;	



r   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 )LinearMixConvLayerr   rC   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 )NrE   FrJ   rH   rI   Tinplacer   r   rF   )r)   r   r*   r   r   r   r   rL   r   r   rO   r   r   r   r   r   rP   r   rQ   rR   ReLU6rU   )	r-   r   r   r   r   rL   r   r
   rW   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   )r{   r   r   r   r   r     s    z.LinearMixConvLayer.forward.<locals>.<listcomp>r   r   )rq   r   r   rU   rY   r   r   r   r4     s   
zLinearMixConvLayer.forwardc                 C   s   dt | j S )Nz%s_LinearMixConv)r   r   r6   r   r   r   r5     r`   zLinearMixConvLayer.module_strc                 C   s   t j| j| j| j| j| jdS )N)r   r   r   r   r   rL   )r   r   r   r   r   r   rL   r6   r   r   r   r7     s   zLinearMixConvLayer.configc                 C   r]   r^   )r   r_   r   r   r   r"     r`   z$LinearMixConvLayer.build_from_configc                   C   ra   rb   r   r   r   r   r   r0     rc   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   rE   rq   r   rU   )r-   r   rg   r   r   r   r   r   r9     s   

zLinearMixConvLayer.get_flopsrh   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_channelsrO   rQ   fc1ReLUrelufc2)r-   r   r   r.   r   r   r*     s   
zSELayer.__init__c                 C   s4   t |d}| |}| |}| |}t|S )Nr   )Fadaptive_avg_pool2dr   r   r   rq   sigmoidr-   inputscaler   r   r   _scale  s
   



zSELayer._scalec                 C   s   |  |}|| S r(   )r   r   r   r   r   r4     s   
zSELayer.forwardc                 C   
   d| j  S )NzSE_%d)r   r6   r   r   r   r5        
zSELayer.module_strc                 C      t j| j| j| jdS )N)r   r   r   r   )r   r   r   r   r   r6   r   r   r   r7     
   zSELayer.configc                 C   r]   r^   )r   r_   r   r   r   r"     r`   zSELayer.build_from_configc                   C   ra   rb   r   r   r   r   r   r0     rc   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   rp   )r-   r   rg   brt   ru   rv   r   r   r   r9     s
   zSELayer.get_flops)r   )r   r=   r>   __doc__r	   r*   r   r4   r?   r5   r7   r@   r"   r0   r9   rA   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)ro   r   )r)   r   r*   headsrO   rQ   querykeyvaluewidthheight	Parameterrq   randnrel_hrel_wSoftmaxsoftmax)r-   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   rq   matmulpermuter   r   r   )r-   r   n_batchCr   r   qkvcontent_contentcontent_positionenergy	attentionr   r   r   r   r4   #  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   rg   r   r   r   r9   7  s   zMHSA.get_flops)r   r   r   )r   r=   r>   r*   r4   r9   rA   r   r   r.   r   r     s    r   c                       rB   )MBInvertedMHSALayerrD   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   rE   r   FrF   rH   rI   Tr   )r)   r   r*   r   r   rK   rL   rM   rN   rO   rP   r   rQ   rR   r   r   mhsarU   )r-   r   r   rK   r   r   rL   rV   r.   r   r   r*   O  sF   
	
zMBInvertedMHSALayer.__init__c                 C   rX   r(   )rN   r   rU   rY   r   r   r   r4   s  rZ   zMBInvertedMHSALayer.forwardc                 C   r   )NzMSHA%d)rK   r6   r   r   r   r5   z  r   zMBInvertedMHSALayer.module_strc                 C   r   )N)r   r   rK   rL   )r   r   r   rK   rL   r6   r   r   r   r7   ~  r   zMBInvertedMHSALayer.configc                 C   r]   r^   )r   r_   r   r   r   r"     r`   z%MBInvertedMHSALayer.build_from_configc                   C   ra   rb   r   r   r   r   r   r0     rc   z!MBInvertedMHSALayer.is_zero_layerc                 C   sh   d}| j r|t| j j|7 }|  |}|| j|d 7 }| |}|t| jj|7 }| |}||fS rd   )rN   r   rE   r   r9   rU   rf   r   r   r   r9     s   


zMBInvertedMHSALayer.get_flops)rD   r   r   Nrh   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 )MBInvertedRepConvLayerr   rC   rD   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 r   )r)   r   r*   r   r   rep_conv_sizer   rK   rL   rM   rO   rP   r   rQ   rR   rS   rN   r   r   r   rep_convr   r   r   rep_conv_deployrI   rU   deploy)r-   r   r   r   r   rK   rL   rV   r   r
   rW   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   )rN   r   r   r   r   rI   rU   )r-   r   r   r   out_r   r   r   r4     s   





zMBInvertedRepConvLayer.forwardc                 C   r   )Nz%s_RepConv%d)r   r   rK   r6   r   r   r   r5     r   z!MBInvertedRepConvLayer.module_strc                 C   r[   )N)r   r   r   r   r   rK   rL   )r   r   r   r   r   r   rK   rL   r6   r   r   r   r7     r\   zMBInvertedRepConvLayer.configc                 C   r]   r^   r   r_   r   r   r   r"     r`   z(MBInvertedRepConvLayer.build_from_configc                   C   ra   rb   r   r   r   r   r   r0     rc   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   rJ   r   )r   r   rE   r   r   maxr   r   rO   rQ   r   get_equivalent_kernel_biasweightdatarG   
parametersdetach___delattr__)r-   rV   r   r
   rW   kernelrG   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 )Nr   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-   max_kernel_size	kernel1x1bias1x1	kernel3x3bias3x3	kernel5x5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   rq   rO   
functionalrW   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   )dtyper   r   )r   rO   rP   rE   r   rH   running_meanrunning_varrG   epsrR   hasattrr   r   ry   rr   float32r   rq   
from_numpytorn   r   sqrtreshape)r-   branchr   r   r   gammabetar   	input_dimkernel_valuei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 )re   r   r   r   N)r   rN   rE   r   r   rU   )r-   r   rg   r   r   r   r   r   r   r9   z  s   



z MBInvertedRepConvLayer.get_flops)r   r=   r>   r*   r4   r?   r5   r7   r@   r"   r0   r   r   r   r   r   r   r9   rA   r   r   r.   r   r     s,    =



/r   )collectionsr   numpyry   rq   torch.nnrO   torch.nn.functionalr   r   r   r   r&   Moduler'   r   r    r   r   r   r   r   r   r   r   r   r   r   r   <module>   s&    3c"o^8@P