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 d dlZd dlm	Z	m
Z
mZmZ d dlmZ d dlmZ d dlmZ G dd dejjZd	d
 Zee dS )    N)tqdm)devicesmodelloaderscript_callbackserrors)SCUNet)load_file_from_url)optsc                       sP   e Zd Z fddZee dd Zej	j	dddZ
edd	d
Z  ZS )UpscalerScuNETc           	   	      s   d| _ d| _d| _d| _d| _|| _t   | jdgd}g }d}|D ]}|	d	r^| j}n
t
|}|| jks||| jkrd
}z tj||| d}|| W qH ty   tjd| dd Y qH0 qH|rtj| j| j| }|| || _d S )NZScuNETz
ScuNET GANzScuNET PSNRzMhttps://github.com/cszn/KAIR/releases/download/v1.0/scunet_color_real_gan.pthzNhttps://github.com/cszn/KAIR/releases/download/v1.0/scunet_color_real_psnr.pth.pth)
ext_filterThttpF   zError loading ScuNET model: )exc_info)name
model_nameZmodel_name2	model_urlZ
model_url2	user_pathsuper__init__find_models
startswithr   friendly_namemodulesupscalerUpscalerDataappend	Exceptionr   reportscalers)	selfdirnamemodel_pathsr   Z
add_model2filer   scaler_dataZscaler_data2	__class__ V/var/www/html/stable-diffusion-webui/extensions-builtin/ScuNET/scripts/scunet_model.pyr      s2    



zUpscalerScuNET.__init__c              	   C   s  | j dd  \}}tj}tj}|dkr.|| S td}|d dksLJ dd}|| }ttd|| ||| g }	ttd|| ||| g }
tj	dd|| || | j
|d}tj|tj
|d}tt|	t|
 d	d
}|	D ]}|
D ]}| d||| ||| f }||}t|}|d|| || | || || | f | |d|| || | || || | f | |d qqW d    n1 s0    Y  ||}|S )N   r   scunet   z-tile size should be a multiple of window_size      dtypedevicezScuNET tiles)totaldesc.)shaper	   SCUNET_tileSCUNET_tile_overlapr   get_device_forlistrangetorchzerosr/   
zeros_liker   len	ones_likeadd_updatediv_)imgmodelhwtileZtile_overlapr0   sfstrideZ
h_idx_listZ
w_idx_listEWpbarh_idxw_idxin_patchZ	out_patchZout_patch_maskoutputr'   r'   r(   tiled_inference-   s@    
 
((.
zUpscalerScuNET.tiled_inference)rA   c              
   C   s  t   z| |}W nB tyX } z*td| d| tjd |W  Y d }~S d }~0 0 t d}tj	}|j
|j }}t|}	|	d d d d d d df }	|	dd }	t|	 d|}
||ks||kr"tjd	d
t||t|||
j|
jd}|
|d d d d d |d |f< |}
| |
|d}|d d d |d	 d |d	 f }|  dd	 }~
~t   |d}|d d d d d d df }tj|d  tj!S )Nz"ScuNET: Unable to load model from z: )r#   r*   )r)   r   r,      r   r,   r-   r.   )r,   r)   r   )"r   torch_gc
load_modelr   printsysstderrr6   r	   r4   heightwidthnparray	transposer9   
from_numpyfloat	unsqueezetor:   maxr/   r0   rO   squeezecpuclamp_numpyPILImage	fromarrayastypeuint8)r    rA   Zselected_filerB   er0   rE   rC   rD   np_imgZ	torch_img_imgZtorch_outputZ	np_outputrN   r'   r'   r(   
do_upscaleV   s2    

& "
zUpscalerScuNET.do_upscale)pathc                 C   s   t d}|dr0t| j| j| j dd}n|}tdg ddd}|jt	
|d	d
 |  | D ]\}}d|_qj||}|S )Nr*   r   r   )	model_dir	file_namer-   )r   r   r   r   r   r   r   @   )Zin_ncconfigdimT)strictF)r   r6   r   r   r   model_download_pathr   r   load_state_dictr9   loadevalnamed_parametersrequires_gradr_   )r    rn   r0   filenamerB   _vr'   r'   r(   rS   w   s    


zUpscalerScuNET.load_model)__name__
__module____qualname__r   staticmethodr9   no_gradrO   re   rf   rm   strrS   __classcell__r'   r'   r%   r(   r
      s   '!r
   c                  C   st   dd l } ddlm} |jd|jdd| jddddd	d
d |jd|jdd| jddddd	d
d d S )Nr   )sharedr4      zTile size for SCUNET upscalers.i      )minimummaximumstep)	upscaling	Upscaling)sectionz0 = no tilingr5   r+   z"Tile overlap for SCUNET upscalers.rq   r,   zLow values = visible seam)gradior   r   r	   
add_option
OptionInfoSliderinfo)grr   r'   r'   r(   on_ui_settings   s    .r   )rU   	PIL.Imagere   rd   rY   r9   r   modules.upscalerr   r   r   r   r   Zscunet_model_archr   Zmodules.modelloaderr   Zmodules.sharedr	   r   Upscalerr
   r   r'   r'   r'   r(   <module>   s   x