o
    *j*                     @   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   ZSoftplusfc_layerr   sigmoid)selftrainmodel	__class__ j/var/www/html/Deteccion_Ine/venv/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   Z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)r/   Zaxisr2   outputr    r    r!   l2_norm)   s   r5   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 )Nr0   r   F)kernel_sizepaddingbiasT)Zinplace)r   r7   r   r   avg_poolr   fc1r   relufc2r   r   )r   ZchannelsZ	reductionr   r    r!   r   1   s$   
zSEModule.__init__c                 C   s>   |}|  |}| |}| |}| |}| |}|| S r"   )r;   r<   r=   r>   r   )r   xZmodule_inputr    r    r!   r$   C   s   




zSEModule.forwardr&   r    r    r   r!   r7   /   s    r7   c                       r6   )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 )Nr0   r0   r0   Fr:      rD   )
r   r@   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"   rE   rF   r   r?   Zshortcutresr    r    r!   r$   ]      

zBottleneckIR.forwardr&   r    r    r   r!   r@   M       r@   c                       r6   )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 )Nr0   rA   FrB   rC      )r   rQ   r   r   rE   r   r   r   r
   r7   rF   rG   r   r    r!   r   e   s   
zBottleneckIRSE.__init__c                 C   rK   r"   rL   rM   r    r    r!   r$   s   rO   zBottleneckIRSE.forwardr&   r    r    r   r!   rQ   c   rP   rQ   r1   c                    s(   t |  |g fddt|d D  S )Nc                    s   g | ]}t   d qS r0   )
Bottleneck).0irI   r    r!   
<listcomp>{   s    zget_block.<locals>.<listcomp>r0   )rT   range)rH   rI   	num_unitsrJ   r    rW   r!   	get_blocky   s   r[   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   @   rD   )rH   rI   rZ   r            r   d               $   )r[   )
num_layersblocksr    r    r!   
get_blocks~   s*   ri   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)r\   ra   rd   z#num_layers should be 50,100, or 152)rk   ir_sezmode should be ir or ir_serk   rl   rD   r]   rC   r0   FrB   r   i b  )r   rj   r   ri   r@   rQ   r   r   r   r
   input_layerr   r+   r   r   output_layerappendrH   rI   rJ   body)	r   rg   Z
drop_ratiomoderh   Zunit_modulemodulesblockZ
bottleneckr   r    r!   r      s8   

zBackbone.__init__c                 C   s&   |  |}| |}| |}t|S r"   )rm   rp   rn   r5   r   r?   r    r    r!   r$      s   


zBackbone.forward)rk   r&   r    r    r   r!   rj      s    rj   c                       .   e Zd Z				d fdd	Zdd Z  ZS )		ConvBlockrA   r   r   r0   c              	      s>   t t|   t||||||dd| _t|| _t|| _d S NF)Zout_channelsr8   groupsrJ   r9   r:   )	r   rv   r   r   convr   bnr
   prelur   in_cout_ckernelrJ   r9   ry   r   r    r!   r      s   
zConvBlock.__init__c                 C   s"   |  |}| |}| |}|S r"   )rz   r{   r|   rt   r    r    r!   r$      r%   zConvBlock.forwardrA   rA   rw   r0   r&   r    r    r   r!   rv      s    rv   c                       ru   )	LinearBlockrA   rw   r0   c              	      s4   t t|   t||||||dd| _t|| _d S rx   )r   r   r   r   rz   r   r{   r}   r   r    r!   r      s   zLinearBlock.__init__c                 C   s   |  |}| |}|S r"   )rz   r{   rt   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 )	DepthWiseFrC   r1   r1   rA   r0   c                    sV   t t|   t||dddd| _t||||||d| _t||dddd| _|| _d S )NrA   rw   )r   r   r9   rJ   )ry   r   r9   rJ   )r   r9   rJ   )	r   r   r   rv   rz   conv_dwr   projectresidual)r   r~   r   r   r   rJ   r9   ry   r   r    r!   r      s    


zDepthWise.__init__c                 C   sB   | j r|}| |}| |}| |}| j r|| }|S |}|S r"   )r   rz   r   r   )r   r?   Z	short_cutr4   r    r    r!   r$     s   


zDepthWise.forward)FrC   r   rA   r0   r&   r    r    r   r!   r      s    r   c                       s,   e Zd Z			d fdd	Zdd Z  ZS )ResidualrC   rA   c           	         sJ   t t|   g }t|D ]}|t||d||||d qt| | _d S )NT)r   r   r9   rJ   ry   )r   r   r   rY   ro   r   r   r   )	r   c	num_blockry   r   rJ   r9   rr   _r   r    r!   r     s   	zResidual.__init__c                 C   s
   |  |S r"   )r   rt   r    r    r!   r$   *  s   
zResidual.forward)rC   rA   rA   r&   r    r    r   r!   r     s    r   c                       r6   )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 )NrD   r]   rC   r   rA   )r   rJ   r9   )r   rJ   r9   ry   r   r^   )r   ry   r   rJ   r9   r_      r   r1   rw   )   r   )ry   r   rJ   r9   FrB   )r   r   r   rv   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   Z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   r5   )r   r?   r#   r    r    r!   r$   Y  s   











zMobileFaceNet.forwardr&   r    r    r   r!   r   .  s    )r   rS   )r1   )"__doc__osr   Ztorch.nnr   ZtorchvisionZtorchvision.modelsmodelsr   r   r   r   r   r   r   r	   r
   r   r   r   r   r+   r5   r7   r@   rQ   r[   ri   rj   rv   r   r   r   r   r    r    r    r!   <module>   s*    8

!%