o
    ߥi*                     @   s@  d Z ddlZddlZddlmZ ddlZddlmZ ddlmZm	Z	m
Z
mZmZmZmZmZmZmZmZmZ G dd dejjZG dd deZd"d	d
ZG dd deZG dd deZG dd deZd#ddZdd ZG dd deZG dd deZG dd deZG dd deZG dd deZ G d d! d!eZ!dS )$z HandStatic
The implementation here is modified based on MobileFaceNet,
originally Apache 2.0 License and publicly available at https://github.com/xuexingyu24/MobileFaceNet_Tutorial_Pytorch
    N)AdaptiveAvgPool2dBatchNorm1dBatchNorm2dConv2dDropoutLinear	MaxPool2dModulePReLUReLU
SequentialSigmoidc                       &   e Zd Zd fdd	Zdd Z  ZS )StaticGestureNetTc                    sL   t    td}|| _tjtddt tdd| _	t
 | _d S )N         )super__init__MobileFaceNetfeature_extractortorchnnr   r   Softplusfc_layerr   sigmoid)selftrainmodel	__class__ ]/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/models/cv/hand_static/networks.pyr      s   
zStaticGestureNet.__init__c                 C   s"   |  |}| |}| |}|S N)r   r   r   )r   inputsoutr!   r!   r"   forward      


zStaticGestureNet.forward)T__name__
__module____qualname__r   r&   __classcell__r!   r!   r   r"   r      s    	r   c                   @   s   e Zd Zdd ZdS )Flattenc                 C   s   | |ddS )Nr   )viewsize)r   inputr!   r!   r"   r&   %   s   zFlatten.forwardN)r)   r*   r+   r&   r!   r!   r!   r"   r-   #   s    r-      c                 C   s    t | d|d}t | |}|S )N   T)r   normdiv)r1   axisr4   outputr!   r!   r"   l2_norm)   s   r8   c                       $   e Zd Z fddZdd Z  ZS )SEModulec                    s`   t t|   td| _t||| dddd| _tdd| _t|| |dddd| _	t
 | _d S )Nr2   r   F)kernel_sizepaddingbiasT)inplace)r   r:   r   r   avg_poolr   fc1r   relufc2r   r   )r   channels	reductionr   r!   r"   r   1   s$   
zSEModule.__init__c                 C   s>   |}|  |}| |}| |}| |}| |}|| S r#   )r?   r@   rA   rB   r   )r   xmodule_inputr!   r!   r"   r&   C   s   




zSEModule.forwardr(   r!   r!   r   r"   r:   /   s    r:   c                       r9   )BottleneckIRc                    s   t t|   ||krtd|| _ntt||d|ddt|| _tt|t||dddddt|t||d|dddt|| _	d S )Nr2   r2   r2   Fr=      rK   )
r   rG   r   r   shortcut_layerr   r   r   r
   	res_layerr   
in_channeldepthstrider   r!   r"   r   O   s   
zBottleneckIR.__init__c                 C      |  |}| |}|| S r#   rL   rM   r   rE   shortcutresr!   r!   r"   r&   ]      

zBottleneckIR.forwardr(   r!   r!   r   r"   rG   M       rG   c                       r9   )BottleneckIRSEc                    s   t t|   ||krtd|| _ntt||d|ddt|| _tt|t||dddddt|t||d|dddt|t	|d| _
d S )Nr2   rH   FrI   rJ      )r   rY   r   r   rL   r   r   r   r
   r:   rM   rN   r   r!   r"   r   e   s   
zBottleneckIRSE.__init__c                 C   rR   r#   rS   rT   r!   r!   r"   r&   s   rW   zBottleneckIRSE.forwardr(   r!   r!   r   r"   rY   c   rX   rY   r3   c                    s(   t |  |g fddt|d D  S )Nc                    s   g | ]}t   d qS r2   )
Bottleneck).0irP   r!   r"   
<listcomp>{   s    zget_block.<locals>.<listcomp>r2   )r\   range)rO   rP   	num_unitsrQ   r!   r_   r"   	get_blocky   s   rc   c                 C   s   | dkr t ddddt ddddt ddddt dd	ddg}|S | d
kr@t ddddt ddddt ddddt dd	ddg}|S | dkr^t ddddt ddddt ddddt dd	ddg}|S )N2   @   rK   )rO   rP   rb   r            r   d               $   )rc   )
num_layersblocksr!   r!   r"   
get_blocks~   s*   rq   c                       r   )Backboneirc           	   	      s   t t|   |dv sJ d|dv sJ dt|}|dkr"t}n|dkr(t}ttddd	d
d
ddtdt	d| _
ttdt|t tddtd| _g }|D ]}|D ]}|||j|j|j qVqRt| | _d S )N)rd   ri   rl   z#num_layers should be 50,100, or 152)rs   ir_sezmode should be ir or ir_sers   rt   rK   re   rJ   r2   FrI   r   i b  )r   rr   r   rq   rG   rY   r   r   r   r
   input_layerr   r-   r   r   output_layerappendrO   rP   rQ   body)	r   ro   
drop_ratiomoderp   unit_modulemodulesblock
bottleneckr   r!   r"   r      s8   

zBackbone.__init__c                 C   s&   |  |}| |}| |}t|S r#   )ru   rx   rv   r8   r   rE   r!   r!   r"   r&      s   


zBackbone.forward)rs   r(   r!   r!   r   r"   rr      s    rr   c                       .   e Zd Z				d fdd	Zdd Z  ZS )		ConvBlockrH   r   r   r2   c              	      s>   t t|   t||||||dd| _t|| _t|| _d S NF)out_channelsr;   groupsrQ   r<   r=   )	r   r   r   r   convr   bnr
   prelur   in_cout_ckernelrQ   r<   r   r   r!   r"   r      s   
zConvBlock.__init__c                 C   s"   |  |}| |}| |}|S r#   )r   r   r   r   r!   r!   r"   r&      r'   zConvBlock.forwardrH   rH   r   r2   r(   r!   r!   r   r"   r      s    r   c                       r   )	LinearBlockrH   r   r2   c              	      s4   t t|   t||||||dd| _t|| _d S r   )r   r   r   r   r   r   r   r   r   r!   r"   r      s   zLinearBlock.__init__c                 C   s   |  |}| |}|S r#   )r   r   r   r!   r!   r"   r&      s   

zLinearBlock.forwardr   r(   r!   r!   r   r"   r      s    r   c                       s0   e Zd Z					d
 fdd	Zdd	 Z  ZS )	DepthWiseFrJ   r3   r3   rH   r2   c                    sV   t t|   t||dddd| _t||||||d| _t||dddd| _|| _d S )NrH   r   )r   r   r<   rQ   )r   r   r<   rQ   )r   r<   rQ   )	r   r   r   r   r   conv_dwr   projectresidual)r   r   r   r   r   rQ   r<   r   r   r!   r"   r      s    


zDepthWise.__init__c                 C   sB   | j r|}| |}| |}| |}| j r|| }|S |}|S r#   )r   r   r   r   )r   rE   	short_cutr7   r!   r!   r"   r&     s   


zDepthWise.forward)FrJ   r   rH   r2   r(   r!   r!   r   r"   r      s    r   c                       s,   e Zd Z			d fdd	Zdd Z  ZS )ResidualrJ   rH   c           	         sJ   t t|   g }t|D ]}|t||d||||d qt| | _d S )NT)r   r   r<   rQ   r   )r   r   r   ra   rw   r   r   r   )	r   c	num_blockr   r   rQ   r<   r|   _r   r!   r"   r     s   	zResidual.__init__c                 C   s
   |  |S r#   )r   r   r!   r!   r"   r&   *  s   
zResidual.forward)rJ   rH   rH   r(   r!   r!   r   r"   r     s    r   c                       r9   )r   c                    s  t t|   tdddddd| _tddddddd| _tddddddd| _tdd	ddddd
| _	tddddddd| _
tddddddd
| _tddddddd| _tddddddd
| _tdddddd| _tddddddd| _t | _td|dd| _t|| _d S )NrK   re   rJ   r   rH   )r   rQ   r<   )r   rQ   r<   r   r   rf   )r   r   r   rQ   r<   rg      r   r3   r   )   r   )r   r   rQ   r<   FrI   )r   r   r   r   conv1conv2_dwr   conv_23r   conv_3conv_34conv_4conv_45conv_5
conv_6_sepr   	conv_6_dwr-   conv_6_flattenr   linearr   r   )r   embedding_sizer   r!   r"   r   0  sb   

zMobileFaceNet.__init__c                 C   s   |  |}| |}| |}| |}| |}| |}| |}| |}| |}| 	|}| 
|}| |}t|S r#   )r   r   r   r   r   r   r   r   r   r   r   r   r8   )r   rE   r%   r!   r!   r"   r&   Y  s   











zMobileFaceNet.forwardr(   r!   r!   r   r"   r   .  s    )r   r[   )r3   )"__doc__osr   torch.nnr   torchvisiontorchvision.modelsmodelsr   r   r   r   r   r   r   r	   r
   r   r   r   r   r-   r8   r:   rG   rY   rc   rq   rr   r   r   r   r   r   r!   r!   r!   r"   <module>   s*    8

!%