o
    ߥiV                     @   s~   d dl Z d dlZd dlZd dlZd dlmZ ddlmZm	Z	m
Z
mZ ddlmZmZmZ G dd dejZG dd deZdS )	    N   )IdentityLayerMBInvertedConvLayerMobileInvertedResidualBlock	ZeroLayer)	MixedEdgebuild_candidate_opsconv_func_by_namec                       sL   e Zd Z fddZdd Zdd Zedd Zd	d
 Ze	dd Z
  ZS )NasRecBackbonec                    s.   t t|   || _t|| _g d| _d S )N)            )superr
   __init__
first_convnn
ModuleListblocks
output_idx)selfr   r   	__class__ h/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/models/cv/ocr_detection/modules/proxyless.pyr      s   zNasRecBackbone.__init__c                 C   sr   |  |}d}g }| jD ]}||}|d tt| jd  dkr&|| |d7 }q|d |d |d |d fS )Nr   r            )r   r   intlenappend)r   xidxoutblockr   r   r   forward   s   



zNasRecBackbone.forwardc                 C   s<   |   D ]}t|tjst|tjr|j|jd  S qd S )Nmomentumepsmodules
isinstancer   BatchNorm2dBatchNorm1dr'   r(   )r   mr   r   r   get_bn_param    s   
zNasRecBackbone.get_bn_paramc                 C   s    t j|  ddd | jD dS )Nconv_in3_out32_k3_s2_p1c                 S   s   g | ]}|j qS r   )config).0r$   r   r   r   
<listcomp>/   s    z)NasRecBackbone.config.<locals>.<listcomp>)namebnr   r   )r
   __name__r/   r   )r   r   r   r   r1   )   s
   zNasRecBackbone.configc                 C   s6   |   D ]}t|tjst|tjr||_||_qd S )Nr)   )r   r'   r(   r.   r   r   r   set_bn_param2   s   zNasRecBackbone.set_bn_paramc              
   C   s   | d }t d|}t|d}t|d}t|d}t|d}t|d}ttj|||||dd	t|tjd
d}g }	| d D ]
}
|		t
|
 qJt||	}d| v rj|jdi | d  |S |jddd |S )Nr   z*conv_in(\d+)_out(\d+)_k(\d+)_s(\d+)_p(\d+)r   r   r   r   r   F)biasTinplacer   r5   皙?MbP?r&   r   )rematchr   groupr   
SequentialConv2dr,   ReLUr    r   build_from_configr
   r7   )r1   first_conv_config	match_obj
in_channelout_channelkernel_sizestridepaddingr   r   block_confignetr   r   r   rC   9   s@   

z NasRecBackbone.build_from_config)r6   
__module____qualname__r   r%   r/   propertyr1   r7   staticmethodrC   __classcell__r   r   r   r   r
      s    	
r
   c                       s&   e Zd ZdZ		d fdd	Z  ZS )CompactDetBackbonez%
    proxyless nas backbone, 5M.
    Nr;   r<   c              
      s  |d u r|d }t t jd|dddddt |t jdd	}g d
}g d}g d}g d}	g d}
|rBt|t|	d ksAJ n
t|t|	ksLJ g }t||	|
D ]`\}}}t|D ]5}|dkrf|}nd}t|}t	|||  |||}|dkr||krt
 }nd }t||}|| |}q]|d urt|}t	|||  |||}t
 }t||}|| qT|| _tt| || |  D ])}t|t jrt jj|jddd qt|t jrt j|jd t j|jd qd S )Nr   r   )r   r   r   r   F)rH   rI   rJ   r8   Tr9   )5x5_MBConv25x5_MBConv43x3_MBConv23x3_MBConv413_MixConv213_MixConv435_MixConv235_MixConv4135_MixConv2135_MixConv413_LinMixConv35_LinMixConv135_LinMixConv13_RepConv213_RepConv435_RepConv235_RepConv4135_RepConv2135_RepConv4Zero)SE_2SE_4SE_8rg   )   r   r   r   r   r      rl      rm   rl   r   rl   rm   rl   rm   rm   r   r   rm   rm   rm   rl   r   )r   r   r   r   )r   r   rn   rn   rn   r   )r   r   fan_outrelu)modenonlinearity)r   r@   rA   r,   rB   r   sumzipranger	   r   r   r    rG   r   rR   r   r*   r+   initkaiming_normal_weight	constant_r8   )r   width_stagesinput_channelbn_paramkwargsr   conv_candidatesse_candidatesconv_op_idsn_cell_stagesstride_stagesr   widthn_cellsirI   block_iconv_opshortcutinverted_residual_blockse_opr.   r   r   r   r   _   s   




zCompactDetBackbone.__init__)NrS   )r6   rM   rN   __doc__r   rQ   r   r   r   r   rR   Z   s
    rR   )r=   sysnumpynptorchtorch.nnr   layersr   r   r   r   mix_opsr   r   r	   Moduler
   rR   r   r   r   r   <module>   s    M