a
    
d)-                     @   s<  d dl Z d dlZd dlZd dlmZ d dlmZ d dlmZm	Z	m
Z
mZ d%ddZ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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$ZdS )'    N)nn	letterbox)make_divisiblenon_max_suppressionscale_coords	xyxy2xywhc                 C   s,   |d u r(t | tr| d ndd | D }|S )N   c                 S   s   g | ]}|d  qS )r	    .0xr
   r
   j/var/www/html/stable-diffusion-webui/repositories/CodeFormer/facelib/detection/yolov5face/models/common.py
<listcomp>       zautopad.<locals>.<listcomp>)
isinstanceint)kpr
   r
   r   autopad   s     r   c                 C   sV   | j  \}}}}tj||dd}| |||||} t| dd } | |d||S )Ntrunc)rounding_mode   r	   )datasizetorchdivview	transpose
contiguous)r   groups	batchsizenum_channelsheightwidthchannels_per_groupr
   r
   r   channel_shuffle   s
    r'   r   Tc              	   C   s   t | |||t| ||dS )N)gact)Convmathgcd)c1c2r   sr)   r
   r
   r   DWConv%   s    r0   c                       s.   e Zd Zd
 fdd	Zdd Zdd	 Z  ZS )r*   r   NTc              	      sd   t    tj||||t|||dd| _t|| _|du rFt nt	|tj
rV|nt | _d S )NF)r!   biasT)super__init__r   Conv2dr   convBatchNorm2dbnSiLUr   ModuleIdentityr)   selfr-   r.   r   r/   r   r(   r)   	__class__r
   r   r3   ,   s    
 zConv.__init__c                 C   s   |  | | |S N)r)   r7   r5   r<   r   r
   r
   r   forward2   s    zConv.forwardc                 C   s   |  | |S r?   )r)   r5   r@   r
   r
   r   fuseforward5   s    zConv.fuseforward)r   r   Nr   T)__name__
__module____qualname__r3   rA   rB   __classcell__r
   r
   r=   r   r*   *   s   r*   c                       s&   e Zd Zd
 fdd	Zdd	 Z  ZS )	StemBlock   r	   Nr   Tc                    sx   t    t|||||||| _t||d ddd| _t|d |ddd| _tjdddd| _t|d |ddd| _	d S )Nr	   r   r   rH   T)kernel_sizestride	ceil_mode)
r2   r3   r*   stem_1stem_2astem_2br   	MaxPool2dstem_2pstem_3r;   r=   r
   r   r3   :   s    
zStemBlock.__init__c                 C   s>   |  |}| |}| |}| |}| t||fdS )Nr   )rL   rM   rN   rP   rQ   r   cat)r<   r   Z
stem_1_outZstem_2a_outZstem_2b_outZstem_2p_outr
   r
   r   rA   B   s
    



zStemBlock.forward)rH   r	   Nr   TrC   rD   rE   r3   rA   rF   r
   r
   r=   r   rG   9   s   rG   c                       s&   e Zd Zd fdd	Zdd Z  ZS )	
BottleneckTr         ?c                    sL   t    t|| }t||dd| _t||dd|d| _|oD||k| _d S )Nr   rH   r(   )r2   r3   r   r*   cv1cv2add)r<   r-   r.   shortcutr(   ec_r=   r
   r   r3   L   s
    
zBottleneck.__init__c                 C   s*   | j r|| | | S | | |S r?   )rY   rX   rW   r@   r
   r
   r   rA   S   s    zBottleneck.forward)Tr   rU   rS   r
   r
   r=   r   rT   J   s   rT   c                       s&   e Zd Zd fdd	Zdd Z  ZS )	BottleneckCSPr   TrU   c                    s   t    t||  t| dd| _tj| dddd| _tj  dddd| _td  |dd| _	t
d  | _tjddd| _tj fdd	t|D  | _d S )
Nr   F)r1   r	   g?T)inplacec                 3   s    | ]}t   d dV  qdS       ?)r[   NrT   r   _r\   r(   rZ   r
   r   	<genexpr>b   r   z)BottleneckCSP.__init__.<locals>.<genexpr>)r2   r3   r   r*   rW   r   r4   rX   cv3cv4r6   r7   	LeakyReLUr)   
Sequentialrangemr<   r-   r.   nrZ   r(   r[   r=   rd   r   r3   Y   s    
zBottleneckCSP.__init__c              
   C   sD   |  | | |}| |}| | | tj||fddS Nr   dim)	rf   rk   rW   rX   rg   r)   r7   r   rR   )r<   r   y1y2r
   r
   r   rA   d   s    
zBottleneckCSP.forward)r   Tr   rU   rS   r
   r
   r=   r   r]   W   s   r]   c                       s&   e Zd Zd fdd	Zdd Z  ZS )	C3r   TrU   c                    sn   t    t||  t| dd| _t| dd| _td  |d| _tj fddt	|D  | _
d S )Nr   r	   c                 3   s    | ]}t   d dV  qdS r_   ra   rb   rd   r
   r   re   r   r   zC3.__init__.<locals>.<genexpr>)r2   r3   r   r*   rW   rX   rf   r   ri   rj   rk   rl   r=   rd   r   r3   l   s    
zC3.__init__c                 C   s*   |  tj| | || |fddS rn   )rf   r   rR   rk   rW   rX   r@   r
   r
   r   rA   t   s    z
C3.forward)r   Tr   rU   rS   r
   r
   r=   r   rs   j   s   rs   c                       s2   e Zd Z fddZed
ddZdd	 Z  ZS )ShuffleV2Blockc                    s  t    d|  krdks(n td|| _|d }| jdkrt| j||d| jddt|tj||dddddt|t	 | _
n
t | _
ttj| jdkr|n||dddddt|t	 | j||d| jddt|tj||dddddt|t	 | _d S )	Nr   rH   zillegal stride valuer	   rI   rJ   paddingr   F)rI   rJ   rv   r1   )r2   r3   
ValueErrorrJ   r   ri   depthwise_convr6   r4   r8   branch1branch2)r<   inpouprJ   branch_featuresr=   r
   r   r3   y   s>    


zShuffleV2Block.__init__r   r   Fc              	   C   s   t j| |||||| dS )N)r1   r!   )r   r4   )iorI   rJ   rv   r1   r
   r
   r   rx      s    zShuffleV2Block.depthwise_convc                 C   sb   | j dkr6|jddd\}}tj|| |fdd}ntj| || |fdd}t|d}|S )Nr   r	   ro   )rJ   chunkr   rR   rz   ry   r'   )r<   r   x1x2outr
   r
   r   rA      s    

zShuffleV2Block.forward)r   r   F)rC   rD   rE   r3   staticmethodrx   rA   rF   r
   r
   r=   r   rt   x   s   &rt   c                       s&   e Zd Zd fdd	Zdd Z  ZS )SPP   	      c                    sX   t    |d }t||dd| _t|t|d  |dd| _tdd |D | _d S )Nr	   r   c                 S   s    g | ]}t j|d |d dqS )r   r	   ru   )r   rO   r   r
   r
   r   r      r   z SPP.__init__.<locals>.<listcomp>)	r2   r3   r*   rW   lenrX   r   
ModuleListrk   )r<   r-   r.   r   r\   r=   r
   r   r3      s
    
zSPP.__init__c                    s2   |    | t g fdd| jD  dS )Nc                    s   g | ]}| qS r
   r
   )r   rk   r   r
   r   r      r   zSPP.forward.<locals>.<listcomp>r   )rW   rX   r   rR   rk   r@   r
   r   r   rA      s    
zSPP.forward)r   rS   r
   r
   r=   r   r      s   r   c                       s&   e Zd Zd fdd	Zdd Z  ZS )	Focusr   NTc                    s(   t    t|d ||||||| _d S )N   )r2   r3   r*   r5   r;   r=   r
   r   r3      s    
zFocus.__init__c                 C   sr   |  t|dd d dd d df |ddd dd d df |dd d ddd df |ddd ddd df gdS )N.r	   r   )r5   r   rR   r@   r
   r
   r   rA      s    zFocus.forward)r   r   Nr   TrS   r
   r
   r=   r   r      s   r   c                       s&   e Zd Zd fdd	Zdd Z  ZS )Concatr   c                    s   t    || _d S r?   )r2   r3   d)r<   	dimensionr=   r
   r   r3      s    
zConcat.__init__c                 C   s   t || jS r?   )r   rR   r   r@   r
   r
   r   rA      s    zConcat.forward)r   rS   r
   r
   r=   r   r      s   r   c                   @   s    e Zd ZdZdZdZdd ZdS )NMS      ??Nc                 C   s   t |d | j| j| jdS )Nr   Z
conf_thresZ	iou_thresclasses)r   confiour   r@   r
   r
   r   rA      s    zNMS.forward)rC   rD   rE   r   r   r   rA   r
   r
   r
   r   r      s   r   c                       s>   e Zd ZdZdZdZdZ fddZdd Zdd
dZ	  Z
S )	AutoShape  r   r   Nc                    s   t    | | _d S r?   )r2   r3   evalmodel)r<   r   r=   r
   r   r3      s    
zAutoShape.__init__c                 C   s   t d | S )Nz'autoShape already enabled, skipping... )printr<   r
   r
   r   	autoshape   s    zAutoShape.autoshapeFc                    s2  t j }t|tjr6||j|||S t|t	rLt
||fnd|gf\}}g g  }t|D ]\}}	t|	}	|	jd dk r|	d}	|	jdkr|	d d d d d df nt|	d d d d d f d}	|	jd d }
||
 |t|
   fdd|
D  |	||< qlfd	dtddD fd
d|D }|dkrft|dn
|d d  }t|d}t||j|d }t " |||d }W d    n1 s0    Y  t|jjjd}t|D ]*}t|| d d d df ||  qt||jS )Nr   r   r   )r   r	   r   rH   r	   c                    s   g | ]}|  qS r
   r
   )r   yrV   r
   r   r      r   z%AutoShape.forward.<locals>.<listcomp>c                    s    g | ]}t |t j qS r
   )r   r   rJ   maxr   r   r
   r   r     r   c                    s   g | ]}t | d dd qS )F)	new_shapeautor   r   )r   im)shape1r
   r   r     r   )r   rH   r   r	   g     o@r   r   ) nextr   
parametersr   r   Tensortodevicetype_aslistr   	enumeratenparrayshaper   ndimtileappendr   stackascontiguousarray
from_numpyno_gradr   r   r   r   rj   r   
Detectionsnames)r<   imgsr   augmentprofiler   rm   shape0r~   r   r/   r   r   r
   )r(   r<   r   r   rA      s4    $


B

 "
2(zAutoShape.forward)r   FF)rC   rD   rE   img_sizer   r   r   r3   r   rA   rF   r
   r
   r=   r   r      s   r   c                       s.   e Zd Zd fdd	Zdd Zdd Z  ZS )	r   Nc                    s   t    |d j  fdd|D }|| _|| _|| _|| _dd |D | _dd t| j|D | _	dd t| j|D | _
t| j| _d S )Nr   c                    s4   g | ], t jg  fd ddD dddqS )c                 3   s   | ]} j | V  qd S r?   )r   r   r~   r   r
   r   re     r   z1Detections.__init__.<locals>.<listcomp>.<genexpr>)r   r   r   r   r`   )r   )r   tensor)r   r   r   r   r     r   z'Detections.__init__.<locals>.<listcomp>c                 S   s   g | ]}t |qS r
   )r   r   r
   r
   r   r     r   c                 S   s   g | ]\}}|| qS r
   r
   r   r   r(   r
   r
   r   r     r   c                 S   s   g | ]\}}|| qS r
   r
   r   r
   r
   r   r     r   )r2   r3   r   r   predr   xyxyxywhzipxyxynxywhnr   rm   )r<   r   r   r   gnr=   r   r   r3     s    

zDetections.__init__c                 C   s   | j S r?   )rm   r   r
   r
   r   __len__"  s    zDetections.__len__c                    sF    fddt  jD }|D ]$}dD ]}t||t||d  q$q|S )Nc                    s*   g | ]"}t  j| g j| g jqS r
   )r   r   r   r   r   r   r
   r   r   '  r   z%Detections.tolist.<locals>.<listcomp>)r   r   r   r   r   r   r   )rj   rm   setattrgetattr)r<   r   r   r   r
   r   r   tolist%  s
    zDetections.tolist)N)rC   rD   rE   r3   r   r   rF   r
   r
   r=   r   r     s   r   )N)r   r   T)r+   numpyr   r   r   Z+facelib.detection.yolov5face.utils.datasetsr   Z*facelib.detection.yolov5face.utils.generalr   r   r   r   r   r'   r0   r9   r*   rG   rT   r]   rs   rt   r   r   r   r   r   r   r
   r
   r
   r   <module>   s(   

5


: