a
    Ad                     @   s   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m	Z	 dZ
dae jeje
adZdadadd Zdd	 Zd
d Zdadd ZdS )    N)pathsshareddevicesmodelloadererrorsGFPGANzLhttps://github.com/TencentARC/GFPGAN/releases/download/v1.3.0/GFPGANv1.4.pthFc                  C   s   t d urt jtj t S td u r&d S tjtt	t
dd} t| dkr\| d dr\| d }n.t| dkr~t| tjjd}|}ntd d S ttjjdrtjtjj_t|dd	d
d tjd}|a |S )Nr   )
ext_filter   r   http)keyzUnable to load gfpgan model!deviceclean   )
model_pathupscalearchchannel_multiplierZbg_upsamplerr   )loaded_gfpgan_modelgfpgantor   device_gfpgangfpgan_constructorr   load_modelsr   	model_url	user_pathlen
startswithmaxospathgetctimeprinthasattrfacexlib	detection
retinafacer   )models
model_fileZlatest_filemodel r)   </var/www/html/stable-diffusion-webui/modules/gfpgan_model.pygfpgann   s$    
r+   c                 C   s,   | j | | jj| | jj| d S N)r   r   face_helperface_det
face_parse)r(   r   r)   r)   r*   send_model_to,   s    r0   c                 C   s   t  }|d u r| S t|tj | d d d d d d df }|j|dddd\}}}|d d d d d d df } |j  tjj	rt|tj
 | S )NFT)Zhas_alignedonly_center_faceZ
paste_back)r+   r0   r   r   enhancer-   	clean_allr   optsface_restoration_unloadcpu)np_imager(   Znp_image_bgrcropped_facesrestored_facesZgfpgan_output_bgrr)   r)   r*   gfpgan_fix_faces2   s    
r;   c                    s   zt jtdd ddlm} ddlm}m} tjj	tjj	 tjj	fdd} fdd	}fd
d}|tj_	|tj_	|tj_	| a
da|aG dd dtjj}tj|  W n  ty   tjddd Y n0 d S )NT)exist_okr   )GFPGANer)r$   parsingc                     s    f i t | tdS )N)	model_dirdictr   kwargs)load_file_from_url_origr)   r*   my_load_file_from_urlU   s    z*setup_model.<locals>.my_load_file_from_urlc                     s    f i t | td dS N)save_dirr?   r@   rB   )facex_load_file_from_url_origr)   r*   facex_load_file_from_urlX   s    z-setup_model.<locals>.facex_load_file_from_urlc                     s    f i t | td dS rF   r@   rB   )facex_load_file_from_url_orig2r)   r*   facex_load_file_from_url2[   s    z.setup_model.<locals>.facex_load_file_from_url2c                   @   s   e Zd Zdd Zdd ZdS )z'setup_model.<locals>.FaceRestorerGFPGANc                 S   s   dS )Nr   r)   )selfr)   r)   r*   namef   s    z,setup_model.<locals>.FaceRestorerGFPGAN.namec                 S   s   t |S r,   )r;   )rL   r8   r)   r)   r*   restorei   s    z/setup_model.<locals>.FaceRestorerGFPGAN.restoreN)__name__
__module____qualname__rM   rN   r)   r)   r)   r*   FaceRestorerGFPGANe   s   rR   zError setting up GFPGAN)exc_info)r   makedirsr   r   r=   r#   r$   r>   utilsload_file_from_urlr   have_gfpganr   modulesface_restorationFaceRestorationr   face_restorersappend	Exceptionr   report)dirnamer=   r$   r>   rE   rI   rK   rR   r)   )rH   rJ   rD   r*   setup_modelH   s(    r`   )r   r#   r   modules.face_restorationrX   r   r   r   r   r   r?   r   r   joinmodels_pathr   r   rW   r   r+   r0   r;   r   r`   r)   r)   r)   r*   <module>   s   