a
    Adh                     @   sr   d dl Z d dlZd dlZd dlZd dlZd dlmZmZmZm	Z	 d dl
mZ dZe jeeZdZdadd ZdS )    N)shareddevicesmodelloadererrors)models_pathZ
CodeformerzLhttps://github.com/sczhou/CodeFormer/releases/download/v0.1.0/codeformer.pthc                    s   t jtdd tjjdd }|d u r*d S z~ddlm ddlm	} ddl
mm ddlm  dd	lm |G  fd
ddtjj}|| atjt W n  ty   tjddd Y n0 d S )NT)exist_ok
CodeFormerr   )	normalize)r   )
img2tensor
tensor2img)FaceRestoreHelper)
retinafacec                       sF   e Zd Zdd Zdd Z fddZdd Zdfd
d	Zd	S )z+setup_model.<locals>.FaceRestorerCodeFormerc                 S   s   dS )Nr    )selfr   r   @/var/www/html/stable-diffusion-webui/modules/codeformer_model.pyname&   s    z0setup_model.<locals>.FaceRestorerCodeFormer.namec                 S   s   d | _ d | _|| _d S N)netface_helpercmd_dir)r   dirnamer   r   r   __init__)   s    z4setup_model.<locals>.FaceRestorerCodeFormer.__init__c              	      s   | j d ur.| jd ur.| j tj | j | jfS tjtt| j	ddgd}t
|dkr\|d }ntd dS ddd	d
g ddtj}t|d }|| |  tdrtj_ ddddddtjd}|| _ || _||fS )Nzcodeformer-v0.1.0.pthz.pth)download_name
ext_filterr   z Unable to load codeformer model.)NNi   i      	   )3264Z128256)Zdim_embdZcodebook_sizen_headn_layersZconnect_listZ
params_emadevice   )r"   r"   Zretinaface_resnet50pngT)Z	face_sizeZ
crop_ratioZ	det_modelZsave_extZ	use_parser!   )r   r   tor   device_codeformerr   load_models
model_path	model_urlr   lenprinttorchloadload_state_dictevalhasattrr!   )r   Zmodel_paths	ckpt_pathr   
checkpointr   )r   	net_classr   r   r   create_models.   s$    


z9setup_model.<locals>.FaceRestorerCodeFormer.create_modelsc                 S   s,   | j | | jj| | jj| d S r   )r   r$   r   Zface_detZ
face_parse)r   r!   r   r   r   send_model_toG   s    z9setup_model.<locals>.FaceRestorerCodeFormer.send_model_toNc           	   	      s  |d d d d d d df }|j dd }|   | jd u sF| jd u rJ|S | tj | j  | j| | jj	dddd | j
  | jjD ]} |d d	d	d
}|ddd	d |dtj}zjt B | j||d ur|ntjjd	dd }|d	dd}W d    n1 s0    Y  ~t  W n0 tyb   tjdd	d |d	dd}Y n0 |d}| j| q| jd  | j }|d d d d d d df }||j dd krtj|d|d |j d  |d |j d  tjd}| j  tjjr| tj |S )Nr      Fi     )Zonly_center_faceresizeZeye_dist_thresholdg     o@T)Zbgr2rgbfloat32)      ?r:   r:   )inplace)wZadain)r5   r"   )Zrgb2bgrmin_maxzFailed inference for CodeFormerexc_infouint8)r   r   r"   )fxfyinterpolation) shaper3   r   r   r4   r   r%   Z	clean_all
read_imageZget_face_landmarks_5Zalign_warp_faceZcropped_faces	unsqueezer$   r+   no_gradr   optscode_former_weighttorch_gc	Exceptionr   reportastypeZadd_restored_faceZget_inverse_affineZpaste_faces_to_input_imagecv2r8   INTER_LINEARface_restoration_unloadcpu)	r   np_imager<   Zoriginal_resolutionZcropped_faceZcropped_face_toutputZrestored_faceZrestored_img)r
   r	   r   r   r   restoreL   sD    


$.

2

z3setup_model.<locals>.FaceRestorerCodeFormer.restore)N)__name__
__module____qualname__r   r   r3   r4   rT   r   r   r
   r2   r	   r   r   r   r   FaceRestorerCodeFormer%   s
   rY   zError setting up CodeFormerr>   )osmakedirsr'   modulespathsgetZ!torchvision.transforms.functionalr	   Z"modules.codeformer.codeformer_archr   Zbasicsr.utilsr
   r   Z%facelib.utils.face_restoration_helperr   Zfacelib.detection.retinafacer   face_restorationFaceRestoration
codeformerr   face_restorersappendrK   r   rL   )r   pathr   rY   r   rX   r   setup_model   s     "Yre   )rZ   rN   r+   modules.face_restorationr\   Zmodules.sharedr   r   r   r   Zmodules.pathsr   	model_dirrd   joinr'   r(   ra   re   r   r   r   r   <module>   s   