a
    
dl(                     @   s   d dl Z d dlZd dlZd dlZd dlZdddZ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dZdddZdS )     N    c                 C   s   t | t|}|S N)make_divisibleint)img_sizesnew_size r	   j/var/www/html/stable-diffusion-webui/repositories/CodeFormer/facelib/detection/yolov5face/utils/general.pycheck_img_size	   s    r   c                 C   s   t | | | S r   )mathceil)xdivisorr	   r	   r
   r      s    r   c                 C   s   t | tjr|  nt| }| d d df | d d df  d |d d df< | d d df | d d df  d |d d df< | d d df | d d df  |d d df< | d d df | d d df  |d d df< |S Nr            
isinstancetorchTensorclonenpcopyr   yr	   r	   r
   	xyxy2xywh   s    00,,r   c                 C   s   t | tjr|  nt| }| d d df | d d df d  |d d df< | d d df | d d df d  |d d df< | d d df | d d df d  |d d df< | d d df | d d df d  |d d df< |S r   r   r   r	   r	   r
   	xywh2xyxy    s    0000r   c                 C   s   |d u r\t | d |d  | d |d  }| d |d |  d | d |d |  d f}n|d d }|d }|d d ddgf  |d 8  < |d d ddgf  |d 8  < |d d d df  |  < t|| |S )Nr   r   r   r      )minclip_coordsZ
img1_shapecoordsZ
img0_shapeZ	ratio_padgainpadr	   r	   r
   scale_coords*   s    "2  
r&   c                 C   st   | d d df  d|d  | d d df  d|d  | d d df  d|d  | d d df  d|d  d S )Nr   r   r   r   )clamp_)boxes	img_shaper	   r	   r
   r!   :   s    r!   c                 C   s   dd }|| j }||j }t| dddddf |ddddf t| dddddf |ddddf  dd}||dddf | |  S )a]  
    Return intersection-over-union (Jaccard index) of boxes.
    Both sets of boxes are expected to be in (x1, y1, x2, y2) format.
    Arguments:
        box1 (Tensor[N, 4])
        box2 (Tensor[M, 4])
    Returns:
        iou (Tensor[N, M]): the NxM matrix containing the pairwise
            IoU values for every element in boxes1 and boxes2
    c                 S   s    | d | d  | d | d   S )Nr   r   r   r   r	   )boxr	   r	   r
   box_areaO   s    zbox_iou.<locals>.box_areaNr   r   )Tr   r    maxclampprod)box1Zbox2r+   area1area2interr	   r	   r
   box_iouB   s
    

hr4         ??Fr	   c              	   C   s  | j d d }| d |k}d}d}	d}
|dk}d}t }tjd	| jd
g| j d  }t| D ]0\}}|||  }|rt|| r|| }tjt||d f|jd
}|ddddf |ddddf< d|dddf< d|tt||dddf  d f< t	||fd}|j d s&q^|ddddf  |ddddf 9  < t
|ddddf }|r|ddddf |kjddj\}}t	|| |||d df |ddddf |dddf  fd}nX|ddddf jddd\}}t	|||ddddf | fd|d|k }|durn||ddddf tj||jd
kd }|j d }|sq^|ddddf |rdn| }|ddddf | |dddf  }}tj|||}|rnd|  k rdk rnn npt|| ||k}||d  }t||ddddf  |jddd ||ddf< |
rn||ddk }|| ||< t | |	kr^ qq^|S )zPerforms Non-Maximum Suppression (NMS) on inference results
    Returns:
         detections with shape: nx6 (x1, y1, x2, y2, conf, cls)
    r      .r            $@Tr   F)r      devicer   N   r         ?as_tuplekeepdim   r;        p@)shapetimer   zerosr=   	enumeratelenrangelongcatr   nonzeror,   floatr-   viewtensoranytorchvisionopsnmsr4   mmsum)
prediction
conf_thres	iou_thresclassesagnosticlabelsncxcmax_wh
time_limit	redundantmulti_labelmergetoutputxir   labelvr*   ijconfncr(   scoresiouweightsr	   r	   r
   non_max_suppression_faceY   sZ    $(,&H"6
.
"*":rs   c                 C   s  | j d d }| d |k}d}d}	d}
|dk}d}t }tjd	| jd
g| j d  }t| D ]8\}}|||  }|rt|| r|| }tjt||d f|jd
}|ddddf |ddddf< d|dddf< d|tt||dddf  d f< t	||fd}|j d s&q^|ddddf  |ddddf 9  < t
|ddddf }|r|ddddf |kjddj\}}t	|| |||d df |dddf  fd}nF|ddddf jddd\}}t	||| fd|d|k }|durJ||ddddf tj||jd
kd }|j d }|s\q^||dddf jdd }|ddddf |rdn| }|ddddf | |dddf  }}tj|||}|rfd|  k rdk rfn npt|| ||k}||d  }t||ddddf  |jddd ||ddf< |
rf||ddk }|| ||< t | |	kr^td|	 d  qq^|S )zPerforms Non-Maximum Suppression (NMS) on inference results

    Returns:
         detections with shape: nx6 (x1, y1, x2, y2, conf, cls)
    r   r>   r8   r9   r:   Tr   F)r   rE   r<   r   Nr   r?   r@   rB   rD   rE   )
descendingrF   zWARNING: NMS time limit z
s exceeded)rG   rH   r   rI   r=   rJ   rK   rL   rM   rN   r   rO   r,   rP   r-   rQ   rR   rS   argsortrT   rU   rV   r4   rW   rX   print)rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   r   Zlabel_idrj   r*   rk   rl   rm   rn   ro   r(   rp   rq   rr   r	   r	   r
   non_max_suppression   s^    $(,&6"$
.
"*":rw   c                 C   s  |d u r\t | d |d  | d |d  }| d |d |  d | d |d |  d f}n|d d }|d }|d d g df  |d 8  < |d d g df  |d 8  < |d d d df  |  < |d d df d|d  |d d df d|d  |d d df d|d  |d d df d|d  |d d df d|d  |d d d	f d|d  |d d d
f d|d  |d d df d|d  |d d df d|d  |d d df d|d  |S )Nr   r   r   )r   r   r   rE      )r   r   r>      	   
   r   r   r>   rE   ry   rx   rz   )r    r'   r"   r	   r	   r
   scale_coords_landmarks   s&    "2  r|   )r   )N)r5   r6   NFr	   )r5   r6   NFr	   )N)r   rH   numpyr   r   rT   r   r   r   r   r&   r!   r4   rs   rw   r|   r	   r	   r	   r
   <module>   s   




O
Q