a
    d'                  	   @   s  d dl Z d dlZd dlZd#ddZdd Zd$d	d
Zdd Zedkrd dl	Z	d dl
mZ d dlmZ d dlmZ dZe	e	jed  ZedddZe eZejd d \ZZeed ed Zedkre jeeee eee fe jdZ e!  e"e dZ#W d   n1 s 0    Y  edkr<e#e9 Z#ee#eed  Z#eee#gde d e$dd e%dddD Z&eee&dddddd \Z'Z(e )de d!e' eee'e(Z e )de d"e  dS )%    NTc                 C   s   | \}}}}|| }|| }|rft |dd|  | | d|  }	t |dd|  | | d|  }
n| }	}
t||	|  }t||
|  }t||	|  }t||
|  }||||fS )N      )maxint)ZbboxZincrease_areaZpreserve_aspectlefttoprightZbotwidthheightZwidth_increaseZheight_increase r   b/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/facexlib/utils/face_utils.pycompute_increased_bbox   s    "$r   c                 C   sD   t | d d}t | d d}t| d |}t| d |}||||fS )Nr   r   r      )r   min)bboxeshwr   r   r   Zbottomr   r   r   get_valid_bboxes   s
    r   Fr   r   c           *      C   s  d}t |ttfr||f}|du r*|d }t|}|jd dkrr|dkrr|d }	|d }
|d |d  d }n|jd dkr|d	kr|d
d }|dd
 }tj|dd}	tj|dd}
|d }n|jd dkr |dd }|dd }tj|dd}	tj|dd}
|d |d  d }nX|jd dkrx|dd }|dd }tj|dd}	tj|dd}
|d |d  d }|	|
 d }|
|	 }|| }|t|ddg  }|tj|  }d}|t	tj| d | tj| d | 9 }t|ddg }||d 9 }||d 9 }||d  }t
|| | || | || | || | g}tj| d
 }t|}tt|| d }|dkr| jdd
 \}}ttt|| ttt|| f}tj| |tjd} || }|| }| jdd
 \}}t	tt|d d}ttt|dddf ttt|dddf ttt	|dddf ttt	|dddf f}t	|d | dt	|d | dt|d
 | |t|d | |f}|d
 |d  |k s|d |d  |k r.| |d |d |d |d
 ddf } ||dd
 8 }| jdd
 \}}ttt|dddf ttt|dddf ttt	|dddf ttt	|dddf f}t	|d  | dt	|d  | dt	|d
 | | dt	|d | | df}|rt	||d krt|tt|d }t| |d |d f|d |d
 fdfd} | jdd
 \}}tjd|d|ddf \}}}tdtt||d  t|d | |d
   dtt||d  t|d | |d   } t|d }!|!d
 dkr$|!d7 }!tj| d|!|!fd}"| d } | |"|  t| d! d d"d 7 } | tj| d#d|  t| d"d 7 } t| dd$} ||dd
 7 }|d |d  }#t||# | }$}%tddgd|$g|%|$g|%dgg}&tj||&tjd%d }'tj| |'|%|$ftjd&d'}(||k rBtj|(|t||# ftj d}(|rt||# | }$}%tddgd|$g|%|$g|%dgg}&tj|tddgd|g|%|$g|%dggtjd%d }'t!|'})nd})|(|)fS )(a  Align and crop face with landmarks.

    The output_size and transform_size are based on width. The height is
    adjusted based on shrink_ratio_h/shring_ration_w.

    Modified from:
    https://github.com/NVlabs/ffhq-dataset/blob/master/download_ffhq.py

    Args:
        img (Numpy array): Input image.
        landmarks (Numpy array): 5 or 68 or 98 landmarks.
        output_size (int): Output face size.
        transform_size (ing): Transform size. Usually the four time of
            output_size.
        enable_padding (float): Default: True.
        shrink_ratio (float | tuple[float] | list[float]): Shring the whole
            face for height and width (crop larger area). Default: (1, 1).

    Returns:
        (Numpy array): Cropped face.
    Zretinaface_5N   r      r   r         ?Zdlib_5r   )ZaxisD   $   *   0   6   b   <   L   R   g       @g?g?interpolationg333333?)r   r   Zreflectg      ?g{Gz?)Zksizefloat32g      @g        )r   r      )method)         )Z
borderModeZborderValue)"
isinstancefloatr   nparrayshapemeanZflipudhypotr   stackcopyfloorZrintcv2resizeZ
INTER_AREAr   ceilmaximumpadZogridZminimumr$   Z	boxFilterZastypeZclipZmedianZestimateAffinePartial2DZLMEDS
warpAffineZBORDER_CONSTANTINTER_LINEARZinvertAffineTransform)*img	landmarksoutput_sizetransform_sizeenable_paddingreturn_inverse_affineshrink_ratioZlm_typeZlmZeye_leftZ	eye_rightZ	mouth_avgZlm_eye_leftZlm_eye_rightZeye_avgZ
eye_to_eyeZeye_to_mouthxZ
rect_scaleycZquadqsizeZquad_orishrinkr   r   ZrsizeZborderZcropr8   _maskZblurZblur_imgZh_ratioZdst_hZdst_wtemplateZaffine_matrixcropped_faceinverse_affiner   r   r   align_crop_face_landmarks   s    

*2

,TD,*TP,"
"$"
"&rL   c                 C   s   | j dd \}}|j dd \}}t||||f}tj||dftjd}t||||f}	t|	tdtj}
|
| }t|
d }t	|d d }|d }t|
t||ftj}|d }t
||d |d fd}|| d| |   } | S )	Nr   r   r   )Zdtype)r   r   r      r   )r.   r4   r9   r,   Zonesr$   ZerodeZuint8sumr   ZGaussianBlur)r;   facerK   r   r   Zface_hZface_wZinv_restoredrH   Zinv_maskZinv_mask_erosionZinv_restored_remove_borderZtotal_face_areaZw_edgeZerosion_radiusZinv_mask_centerZ	blur_sizeZinv_soft_maskr   r   r   paste_face_back   s    rP   __main__)init_detection_model)get_largest_face)visualize_detectionz+/home/wxt/datasets/ffhq/ffhq_wild/00009.pngZretinaface_resnet50)Zhalfr   i   r   r"   g
ףp=
?ztmp/z_det.pngc                 C   s    g | ]}t | t |d   gqS )r   )r   ).0ir   r   r   
<listcomp>       rW   r      i   )r=   r>   r?   r@   rA   z_cropeed_face.pngz	_back.png)T)NTFr   )*r4   numpyr,   Ztorchr   r   rL   rP   __name__osZfacexlib.detectionrR   Z&facexlib.utils.face_restoration_helperrS   Zfacexlib.visualizationrT   Zimg_pathsplitextpathbasenameZimg_nameZdet_netZimreadZimg_orir.   r   r   r   Zscaler5   r   r:   r;   Zno_gradZdetect_facesr   r-   ranger<   rJ   rK   Zimwriter   r   r   r   <module>   sV   
    
  

&
,

	