a
    d"                     @   s&  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Zd$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dg d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 )&    N)
namedtuple)AdaptiveAvgPool2dBatchNorm1dBatchNorm2dConv2dDropoutLinear	MaxPool2dModulePReLUReLU
SequentialSigmoidc                   @   s   e Zd Zdd ZdS )Flattenc                 C   s   | |ddS )Nr   )viewsize)selfinput r   j/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/facexlib/recognition/arcface_arch.pyforward   s    zFlatten.forwardN)__name__
__module____qualname__r   r   r   r   r   r   	   s   r      c                 C   s    t | d|d}t | |}|S )N   T)torchnormdiv)r   Zaxisr   outputr   r   r   l2_norm   s    r!   c                       s$   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 )Nr   r   F)kernel_sizepaddingbiasT)Zinplace)superr"   __init__r   avg_poolr   fc1r   relufc2r   sigmoid)r   ZchannelsZ	reduction	__class__r   r   r'      s    
zSEModule.__init__c                 C   s>   |}|  |}| |}| |}| |}| |}|| S N)r(   r)   r*   r+   r,   )r   xZmodule_inputr   r   r   r      s    




zSEModule.forwardr   r   r   r'   r   __classcell__r   r   r-   r   r"      s   r"   c                       s$   e Zd Z fddZdd Z  ZS )bottleneck_IRc                    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 )Nr   r   r   Fr%      r7   )
r&   r3   r'   r	   shortcut_layerr   r   r   r   	res_layerr   
in_channeldepthstrider-   r   r   r'   +   s    zbottleneck_IR.__init__c                 C   s   |  |}| |}|| S r/   r8   r9   r   r0   Zshortcutresr   r   r   r   5   s    

zbottleneck_IR.forwardr1   r   r   r-   r   r3   )   s   
r3   c                       s$   e Zd Z fddZdd Z  ZS )bottleneck_IR_SEc                    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 )Nr   r4   Fr5   r6      )r&   rA   r'   r	   r8   r   r   r   r   r"   r9   r:   r-   r   r   r'   =   s     zbottleneck_IR_SE.__init__c                 C   s   |  |}| |}|| S r/   r>   r?   r   r   r   r   G   s    

zbottleneck_IR_SE.forwardr1   r   r   r-   r   rA   ;   s   
rA   c                   @   s   e Zd ZdZdS )
Bottleneckz(A named tuple describing a ResNet block.N)r   r   r   __doc__r   r   r   r   rC   M   s   rC   ZBlock)r;   r<   r=   r   c                    s(   t |  |g fddt|d D  S )Nc                    s   g | ]}t   d qS )r   )rC   ).0ir<   r   r   
<listcomp>R       zget_block.<locals>.<listcomp>r   )rC   range)r;   r<   	num_unitsr=   r   rG   r   	get_blockQ   s    rL   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}nz| d
kr|t ddddt ddddt ddddt dd	ddg}n<| dkrt ddddt ddddt ddddt dd	ddg}|S )N2   @   r7   )r;   r<   rK                  d               $   )rL   )
num_layersblocksr   r   r   
get_blocksU   s&    r\   c                       s&   e Zd Zd fdd	Zdd Z  ZS )Backboneirc           	   	      s   t t|   |dv sJ d|dv s.J dt|}|dkrDt}n|dkrPt}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 qqt| | _d S )N)rM   rT   rW   z#num_layers should be 50,100, or 152)r^   ir_sezmode should be ir or ir_ser^   r_   r7   rN   r6   r   Fr5   rS   i b  )r&   r]   r'   r\   r3   rA   r   r   r   r   input_layerr   r   r   r   output_layerappendr;   r<   r=   body)	r   rZ   Z
drop_ratiomoder[   Zunit_modulemodulesblockZ
bottleneckr-   r   r   r'   p   s"    &zBackbone.__init__c                 C   s&   |  |}| |}| |}t|S r/   )r`   rc   ra   r!   r   r0   r   r   r   r      s    


zBackbone.forward)r^   r1   r   r   r-   r   r]   n   s   r]   c                       s&   e Zd Zd fdd	Zdd Z  ZS )	
Conv_blockr4   r   r   r   c              	      s>   t t|   t||||||dd| _t|| _t|| _d S NF)Zout_channelsr#   groupsr=   r$   r%   )	r&   rh   r'   r   convr   bnr   prelur   in_cout_ckernelr=   r$   rk   r-   r   r   r'      s    
zConv_block.__init__c                 C   s"   |  |}| |}| |}|S r/   )rl   rm   rn   rg   r   r   r   r      s    


zConv_block.forward)r4   r4   ri   r   r1   r   r   r-   r   rh      s   rh   c                       s&   e Zd Zd fdd	Zdd Z  ZS )	Linear_blockr4   ri   r   c              	      s4   t t|   t||||||dd| _t|| _d S rj   )r&   rs   r'   r   rl   r   rm   ro   r-   r   r   r'      s
    zLinear_block.__init__c                 C   s   |  |}| |}|S r/   )rl   rm   rg   r   r   r   r      s    

zLinear_block.forward)r4   r4   ri   r   r1   r   r   r-   r   rs      s   rs   c                       s&   e Zd Zd
 fdd	Zdd	 Z  ZS )
Depth_WiseFr6   r   r   r4   r   c                    sV   t t|   t||dddd| _t||||||d| _t||dddd| _|| _d S )Nr4   ri   )rq   rr   r$   r=   )rk   rr   r$   r=   )rr   r$   r=   )	r&   rt   r'   rh   rl   conv_dwrs   projectresidual)r   rp   rq   rx   rr   r=   r$   rk   r-   r   r   r'      s
    zDepth_Wise.__init__c                 C   s@   | j r
|}| |}| |}| |}| j r8|| }n|}|S r/   )rx   rl   rv   rw   )r   r0   Z	short_cutr    r   r   r   r      s    



zDepth_Wise.forward)Fr6   ru   r4   r   r1   r   r   r-   r   rt      s   rt   c                       s&   e Zd Zd fdd	Zdd Z  ZS )Residualr6   r4   c           	         sJ   t t|   g }t|D ] }|t||d||||d qt| | _d S )NT)rx   rr   r$   r=   rk   )r&   ry   r'   rJ   rb   rt   r   model)	r   c	num_blockrk   rr   r=   r$   re   _r-   r   r   r'      s    zResidual.__init__c                 C   s
   |  |S r/   )rz   rg   r   r   r   r      s    zResidual.forward)r6   r4   r4   r1   r   r   r-   r   ry      s   ry   c                       s$   e Zd Z fddZdd Z  ZS )MobileFaceNetc                    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 )Nr7   rN   r6   ru   r4   )rr   r=   r$   )rr   r=   r$   rk   rO   rP   )r|   rk   rr   r=   r$   rQ      rS   r   ri   )   r   )rk   rr   r=   r$   Fr5   )r&   r~   r'   rh   conv1conv2_dwrt   conv_23ry   conv_3conv_34conv_4conv_45conv_5
conv_6_seprs   	conv_6_dwr   conv_6_flattenr   linearr   rm   )r   Zembedding_sizer-   r   r   r'      s    zMobileFaceNet.__init__c                 C   s   |  |}| |}| |}| |}| |}| |}| |}| |}| |}| 	|}| 
|}| |}| |}t|S r/   )r   r   r   r   r   r   r   r   r   r   r   r   rm   r!   )r   r0   outr   r   r   r      s    












zMobileFaceNet.forwardr1   r   r   r-   r   r~      s   r~   )r   )r   )r   collectionsr   Ztorch.nnr   r   r   r   r   r   r	   r
   r   r   r   r   r   r!   r"   r3   rA   rC   rL   r\   r]   rh   rs   rt   ry   r~   r   r   r   r   <module>   s    8

