a
    
d                     @   s   d dl Z d dlmZ d dlm  mZ d!ddZdd Zd"ddZd#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$ddZd%ddZd&dd ZdS )'    N   c              
   C   s0   t t j| |d|dddt |t j|ddS )N   r   FbiasTnegative_slopeinplacenn
SequentialConv2dBatchNorm2d	LeakyReLUinpoupstrideleaky r   k/var/www/html/stable-diffusion-webui/repositories/CodeFormer/facelib/detection/retinaface/retinaface_net.pyconv_bn   s    r   c              
   C   s$   t t j| |d|dddt |S )Nr   r   Fr   )r
   r   r   r   )r   r   r   r   r   r   conv_bn_no_relu   s    r   c              
   C   s0   t t j| |d|dddt |t j|ddS )Nr   r   F)paddingr   Tr   r	   r   r   r   r   
conv_bn1X1   s    r   皙?c                 C   sZ   t t j| | d|d| ddt | t j|ddt j| |dddddt |t j|ddS )	Nr   r   F)groupsr   Tr   r   r   r	   r   r   r   r   conv_dw   s    r   c                       s$   e Zd Z fddZdd Z  ZS )SSHc                    s   t t|   |d dksJ d}|dkr.d}t||d dd| _t||d d|d| _t|d |d dd| _t|d |d d|d| _t|d |d dd| _	d S )	N   r   @   r      r   )r   r   r   )
superr   __init__r   conv3X3r   	conv5X5_1	conv5X5_2	conv7X7_2	conv7x7_3)self
in_channelout_channelr   	__class__r   r   r#   &   s    zSSH.__init__c                 C   sT   |  |}| |}| |}| |}| |}tj|||gdd}t|}|S )Nr   )dim)	r$   r%   r&   r'   r(   torchcatFrelu)r)   inputr$   r%   Zconv5X5r'   Zconv7X7outr   r   r   forward4   s    





zSSH.forward__name__
__module____qualname__r#   r5   __classcell__r   r   r,   r   r   $   s   r   c                       s$   e Zd Z fddZdd Z  ZS )FPNc                    s   t t|   d}|dkrd}t|d |d|d| _t|d |d|d| _t|d |d|d| _t|||d| _t|||d| _	d S )Nr   r   r   r   r!   r    r   )
r"   r;   r#   r   output1output2output3r   merge1merge2)r)   in_channels_listout_channelsr   r,   r   r   r#   D   s    zFPN.__init__c                 C   s   |  |d }| |d }| |d }tj||d|dgdd}|| }| |}tj||d|dgdd}|| }| |}|||g}|S )Nr   r   r    r   nearest)sizemode)r=   r>   r?   r1   interpolaterE   rA   r@   )r)   r3   r=   r>   r?   Zup3up2r4   r   r   r   r5   P   s     
 

zFPN.forwardr6   r   r   r,   r   r;   B   s   r;   c                       s$   e Zd Z fddZdd Z  ZS )MobileNetV1c                    s   t t|   ttdddddtdddtdddtdddtdd	dtd	d	d| _ttd	d
dtd
d
dtd
d
dtd
d
dtd
d
dtd
d
d| _ttd
ddtddd| _	t
d| _tdd| _d S )Nr      r    r   r<      r       r         r   r   i  )r"   rI   r#   r
   r   r   r   stage1stage2stage3AdaptiveAvgPool2davgLinearfc)r)   r,   r   r   r#   f   s.    












zMobileNetV1.__init__c                 C   sB   |  |}| |}| |}| |}|dd}| |}|S )NrN   )rP   rQ   rR   rT   viewrV   )r)   xr   r   r   r5      s    




zMobileNetV1.forwardr6   r   r   r,   r   rI   d   s   rI   c                       s&   e Zd Zd fdd	Zdd Z  ZS )	ClassHead   r   c                    s4   t t|   || _tj|| jd dddd| _d S )Nr    rO   r   r   kernel_sizer   r   )r"   rZ   r#   num_anchorsr
   r   conv1x1r)   
inchannelsr^   r,   r   r   r#      s    zClassHead.__init__c                 C   s2   |  |}|dddd }||jd ddS )Nr   r    r   r   rW   r_   permute
contiguousrX   shaper)   rY   r4   r   r   r   r5      s    
zClassHead.forward)r[   r   r6   r   r   r,   r   rZ      s   rZ   c                       s&   e Zd Zd fdd	Zdd Z  ZS )BboxHeadr[   r   c                    s,   t t|   tj||d dddd| _d S )Nr   rO   r   r   r\   )r"   rg   r#   r
   r   r_   r`   r,   r   r   r#      s    zBboxHead.__init__c                 C   s2   |  |}|dddd }||jd ddS )Nr   r    r   r   rW   r   rb   rf   r   r   r   r5      s    
zBboxHead.forward)r[   r   r6   r   r   r,   r   rg      s   rg   c                       s&   e Zd Zd fdd	Zdd Z  ZS )LandmarkHeadr[   r   c                    s,   t t|   tj||d dddd| _d S )N
   rO   r   r   r\   )r"   rh   r#   r
   r   r_   r`   r,   r   r   r#      s    zLandmarkHead.__init__c                 C   s2   |  |}|dddd }||jd ddS )Nr   r    r   r   rW   ri   rb   rf   r   r   r   r5      s    
zLandmarkHead.forward)r[   r   r6   r   r   r,   r   rh      s   rh   r   r   r    c                 C   s*   t  }t| D ]}|t|| q|S N)r
   
ModuleListrangeappendrZ   )fpn_numra   
anchor_numZ	classheadir   r   r   make_class_head   s    rq   c                 C   s*   t  }t| D ]}|t|| q|S rj   )r
   rk   rl   rm   rg   )rn   ra   ro   Zbboxheadrp   r   r   r   make_bbox_head   s    rr   c                 C   s*   t  }t| D ]}|t|| q|S rj   )r
   rk   rl   rm   rh   )rn   ra   ro   Zlandmarkheadrp   r   r   r   make_landmark_head   s    rs   )r   r   )r   )r   )r   r   r    )r   r   r    )r   r   r    )r/   torch.nnr
   torch.nn.functional
functionalr1   r   r   r   r   Moduler   r;   rI   rZ   rg   rh   rq   rr   rs   r   r   r   r   <module>   s   


"&

