a
    
d&                     @   s   d dl Z d dlmZ d dlmZ d dl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 d dlmZmZ d dlmZ d dlmZ d d	lmZmZ G d
d dejZ G dd dejZ!dd Z"dS )    N)deepcopy)Path)nn)C3NMSSPP	AutoShape
BottleneckBottleneckCSPConcatConvDWConvFocusShuffleV2Block	StemBlock)	CrossConv	MixConv2d)check_anchor_order)make_divisible)	copy_attrfuse_conv_and_bnc                       s<   e Zd ZdZdZd fdd	Zdd Zedd
dZ  Z	S )DetectNFP    c                    s   t    | _|d d  _t| _t|d d  _tdg j  _	t
|  jdd} d|  d|  jddddd t fd	d
|D  _d S )N   
   r         anchorsanchor_gridc                 3   s$   | ]}t | j j d V  qdS )r   N)r   Conv2dnona.0xselfr   h/var/www/html/stable-diffusion-webui/repositories/CodeFormer/facelib/detection/yolov5face/models/yolo.py	<genexpr>,       z"Detect.__init__.<locals>.<genexpr>)super__init__ncr"   lennlr#   torchzerosgridtensorfloatviewregister_buffercloner   
ModuleListm)r(   r.   r   cha	__class__r'   r)   r-   !   s    

"zDetect.__init__c           	      C   s>  g }| j r4t| jD ]}| j| || ||< q|S t| jD ]}| j| || ||< || j\}}}}|| || j| j||ddddd	 ||< | j
s>| j| jdd || jdd kr| |||| j| j|< t|| d}|| dg df  |dg df< || ddd	f |ddd	f< |dddf d
 d | j| || j | j|  |dddf< |dddf d d | j|  |dddf< |dddf | j|  | j| || j| j|   |dddf< |dddf | j|  | j| || j| j|   |dddf< |dddf | j|  | j| || j| j|   |dddf< |dddf | j|  | j| || j| j|   |dddf< |ddd	f | j|  | j| || j| j|   |ddd	f< |||d| j q>| j
r.|S t|d|fS )Nr   r         r   .)r   r   r   r?   r@      r   rA   g       @g      ?   	         r   )exportranger0   r:   shaper6   r#   r"   permute
contiguoustrainingr3   
_make_gridtodevicer1   	full_likesigmoidstrider    appendcat)	r(   r&   zibs_nynxyr   r   r)   forward.   s:    0&$ D.88888zDetect.forward   c                 C   sB   t t |t | g\}}t ||fddd|| df S )Nr   r   )r1   meshgridarangestackr6   r5   )rY   rX   yvxvr   r   r)   rL   X   s    zDetect._make_grid)r   r   r   )r\   r\   )
__name__
__module____qualname__rQ   rF   r-   r[   staticmethodrL   __classcell__r   r   r=   r)   r      s   *r   c                       sZ   e Zd Zd fdd	Zdd Zdd	 Zdd
dZdd Zdd ZdddZ	dd Z
  ZS )Modelyolov5s.yamlr?   Nc                    s8  t    t|j| _t|jdd}t|| _W d    n1 sH0    Y  | jd| }| jd< |r|| jd kr|| jd< t	t
| j|gd\| _| _dd t| jd D | _| jd }t|tr4d	 t fd
d| td|  D |_| j|jddd  _t| |j| _|   d S )Nutf8)encodingr;   r.   r;   c                 S   s   g | ]}t |qS r   )str)r%   rU   r   r   r)   
<listcomp>l   r+   z"Model.__init__.<locals>.<listcomp>r      c                    s   g | ]} |j d   qS ))rH   r$   sr   r)   rm   r   r+   r   )r,   r-   r   name	yaml_fileopenyaml	safe_loadgetparse_modelr   modelsaverG   names
isinstancer   r1   r4   r[   r2   rQ   r   r6   r   _initialize_biases)r(   cfgr;   r.   fr:   r=   rp   r)   r-   `   s"    
*

,zModel.__init__c                 C   s
   |  |S N)forward_once)r(   r&   r   r   r)   r[   x   s    zModel.forwardc                    sl   g | j D ]\}|jdkrDt|jtr.|j n fdd|jD  |  |j| jv r` nd  q
 S )Nr   c                    s    g | ]}|d kr n| qS )r   r   )r%   jr&   rZ   r   r)   rm      r+   z&Model.forward_once.<locals>.<listcomp>)ry   r   r|   intrR   rU   rz   )r(   r&   r:   r   r   r)   r   {   s    

,zModel.forward_oncec              	   C   s   | j d }t|j|jD ]\}}|j|jd}|jd d df  t	dd| d  7  < |jd d dd f  |d u rt	d|j
d  nt	||  7  < tjj|dd	d
|_qd S )Nr   r@      i  r   r   g333333?gGz?T)requires_grad)ry   zipr:   rQ   biasr6   r#   datamathlogr.   r1   sumr   	Parameter)r(   cfr:   mirq   br   r   r)   r}      s    
,HzModel._initialize_biasesc                 C   sn   | j d }|jD ]X}|j |jdj}td|jj	d g|d d 
d |dd  
 R   qd S )Nr   z4%6g Conv2d.bias:%10.3g%10.3g%10.3g%10.3g%10.3g%10.3gr   r   )ry   r:   r   detachr6   r#   TprintweightrH   meantolist)r(   r:   r   r   r   r   r)   _print_biases   s    

zModel._print_biasesc                 C   sh   t d | j D ]P}t|trNt|drNt|j|j|_t	|d |j
|_qt|tju rd |_q| S )NzFusing layers... bn)r   ry   modulesr|   r   hasattrr   convr   delattrfuseforwardr[   typer   Upsamplerecompute_scale_factorr(   r:   r   r   r)   fuse   s    

z
Model.fuseTc                 C   s   t | jd t}|r^|s^td t }d|_| jd jd |_| jjt|j|d |   n |s~|r~td | jd d | _| S )Nr   zAdding NMS... r   )rr   modulezRemoving NMS... )	r|   ry   r   r   r   rU   
add_modulerl   eval)r(   modepresentr:   r   r   r)   nms   s    
z	Model.nmsc                 C   s$   t d t| }t|| ddd |S )NzAdding autoShape... )ru   r.   hypr{   rQ   r   )includeexclude)r   r   r   r   r   r   r)   	autoshape   s    zModel.autoshape)rh   r?   N)N)T)rb   rc   rd   r-   r[   r   r}   r   r   r   r   rf   r   r   r=   r)   rg   _   s   
	
rg   c                    s  | d | d | d | d f\}}}}t |tr>t|d d n|}||d  }g g d   }}	}
t| d	 | d
  D ]T\\}} t trtnt D ]4\}}zt |trt|n| |< W q   Y q0 q|dkrtt|| dn|}tt	t
ttttttttfv r||  d  }}
|
|krDt|
| dn|
}
||
g dd   ttfv r d| d}ntju r| g ntu rtfdd|D }
n^tu r fdd|D  t  d trtt d d gt|  d< n| }
|dkr<tj fddt|D  n  }tdd dd}tdd | D }|||f\|_ |_!|_"|_#|	$fddt |tr|gn|D  || |
 qvtj| t%|	fS )Nr   r.   Zdepth_multipleZwidth_multipler   r   r   r   backboneheadr   r   c                 3   s&   | ]} |d krd n|d  V  qdS )r   r   Nr   r$   rk   r   r)   r*      r+   zparse_model.<locals>.<genexpr>c                    s   g | ]} |d   qS )r   r   r$   rk   r   r)   rm      r+   zparse_model.<locals>.<listcomp>c                 3   s   | ]}  V  qd S r   r   )r%   rW   )argsr:   r   r)   r*      r+   ro   z	__main__. c                 s   s   | ]}|  V  qd S r   )numelr$   r   r   r)   r*      r+   c                 3   s   | ]}|d kr|  V  qdS )r   Nr   r$   )rU   r   r)   r*      r+   )&r|   listr/   	enumeraterl   r   maxroundr   r	   r   r   r   r   r   r
   r   r   r   r   insertr   BatchNorm2dr   r   r   rR   r   rG   
Sequentialreplace
parametersrU   r   r   npextendsorted)dr;   r   r.   gdgwr#   r"   layersrz   c2r   nr   r<   c1m_tr   r   )r   r;   rU   r:   r)   rx      s`    $&

$0*
rx   )#r   copyr   pathlibr   r1   ru   r   *facelib.detection.yolov5face.models.commonr   r   r   r   r	   r
   r   r   r   r   r   r   Z0facelib.detection.yolov5face.models.experimentalr   r   Z-facelib.detection.yolov5face.utils.autoanchorr   *facelib.detection.yolov5face.utils.generalr   Z.facelib.detection.yolov5face.utils.torch_utilsr   r   Moduler   rg   rx   r   r   r   r)   <module>   s   8BV