a
    Ad.#                     @   s   d dl Z d dlZd dlZd dlmZ d dlmZ d dl	m
Z
mZmZ d dlmZ d dlmZmZ dd Zdd	d
Zdd ZG dd deZdd Zdd ZdS )    N)Image)modelloaderimagesdevices)opts)UpscalerUpscalerDatac                 C   s  d| v ri }t | }| d |d< | d |d< | D ]X}d|v r6|dd}d|v rd|dd	}nd
|v rx|d
d}| | ||< || q6| d |d< | d |d< | d |d< | d |d< | d |d< | d |d< | d |d< | d |d< | d |d< | d |d< |} | S ) Nconv_first.weightmodel.0.weightconv_first.biasmodel.0.biasZRDBzRRDB_trunk.model.1.sub..weight	.0.weight.bias.0.biasztrunk_conv.weightzmodel.1.sub.23.weightztrunk_conv.biaszmodel.1.sub.23.biaszupconv1.weightmodel.3.weightzupconv1.biasmodel.3.biaszupconv2.weightmodel.6.weightzupconv2.biasmodel.6.biaszHRconv.weightzmodel.8.weightzHRconv.biaszmodel.8.biasconv_last.weightzmodel.10.weightconv_last.biaszmodel.10.biaslistcopyreplaceremove)
state_dictcrt_netitemskori_k r"   </var/www/html/stable-diffusion-webui/modules/esrgan_model.py
mod2normal   s4    
r$      c                 C   s  d| v rd| v rd}i }t | }| d |d< | d |d< | D ]d}d|v rD|dd	}|d
d}d|v r~|dd}nd|v r|dd}| | ||< || qD| d |d	| d< | d |d	| d< | d |d< | d |d< | d |d< | d |d< d| v r(d}| d |d< | d |d< | d |d d!|  d< | d" |d d!|  d< | d# |d d$|  d< | d% |d d$|  d< |} | S )&Nr	   body.0.rdb1.conv1.weightr   r
   r   r   Zrdbzbody.r   z.rdbz.RDBr   r   r   r   zconv_body.weightzconv_body.biaszconv_up1.weightr   zconv_up1.biasr   zconv_up2.weightr   zconv_up2.biasr   zconv_up3.weight   zmodel.9.weightzconv_up3.biaszmodel.9.biaszconv_hr.weightzmodel.   zconv_hr.biasr   
   r   r   )r   nbZre8xr   r   r    r!   r"   r"   r#   resrgan2normal.   s@    
r+   c                 C   s   d}d}d}d}t | D ]}|d}t|}|dkrP|d dkrPt|d }nV|dkrt|d	 }	|	|kr|d d
kr|d dkr|d	7 }|	|kr|	}| | jd }
|sd|v rd}q| d jd }| d jd	 }|
}
d| }||
||||fS )Nr      F.      subr'      modelweightconv1x1Tr
   )r   splitlenintshape)r   Zscale2xZscaleminZ	n_uplayerplusblockpartsZn_partsr*   part_numout_ncnfin_ncscaler"   r"   r#   infer_paramsY   s6    


rA   c                       s2   e Zd Z fddZdd ZedddZ  ZS )UpscalerESRGANc                    s   d| _ d| _d| _g | _|| _t   | jddgd}g }t|dkrdt	| j| j| d}|
| |D ]:}|d	r~| j}n
t|}t	||| d}| j
| qhd S )
NESRGANz>https://github.com/cszn/KAIR/releases/download/v1.0/ESRGAN.pthZ	ESRGAN_4xz.pt.pth)
ext_filterr      http)name	model_url
model_namescalers	user_pathsuper__init__find_modelsr6   r   append
startswithr   friendly_name)selfdirnamemodel_pathsrK   scaler_datafilerH   	__class__r"   r#   rN   z   s"    



zUpscalerESRGAN.__init__c              
   C   sl   z|  |}W nB tyP } z*td| d| tjd |W  Y d }~S d }~0 0 |tj t||}|S )NzUnable to load ESRGAN model z: )rW   )	
load_model	Exceptionprintsysstderrtor   device_esrganesrgan_upscale)rS   imgselected_modelr2   er"   r"   r#   
do_upscale   s    
zUpscalerESRGAN.do_upscale)pathc                 C   s6  | dr(tj| j| j| j dd}n|}tj|tj	j
dkrBdnd d}d|v r\|d }nLd|v r|d }d	|v rxd
nd}tjddd|ddd}|| |  |S d|v rd|v rd|v rdnd}t||}n"d|v rt|}nd|vrtdt|\}}}	}}
}tj|||	|||
d}|| |  |S )NrG   rD   )url	model_dir	file_namempscpu)map_location
params_emaparamszrealesr-animevideov3       r'   @   rF   prelu)	num_in_ch
num_out_chnum_featnum_convupscaleact_typer&   r	   ZRealESRGAN_x4plus_anime_6Br,   r%   r
   z*The file is not a recognized ESRGAN model.)r?   r=   r>   r*   rw   r9   )rQ   r   load_file_from_urlrI   model_download_pathrJ   torchloadr   r`   typearchSRVGGNetCompactload_state_dictevalr+   r$   r[   rA   RRDBNet)rS   rf   filenamer   rv   r2   r*   r?   r=   r>   r9   mscaler"   r"   r#   rZ      s:    





zUpscalerESRGAN.load_model)__name__
__module____qualname__rN   re   strrZ   __classcell__r"   r"   rX   r#   rB   y   s   
rB   c                 C   s   t |}|d d d d d d df }t t |dd }t| }|dt	j
}t  | |}W d    n1 s0    Y  |   dd }dt |dd }|t j}|d d d d d d df }t|dS )	N)r/   r   r1      r   r1   g     o@r/   RGB)nparrayascontiguousarray	transposer{   
from_numpyfloat	unsqueezer_   r   r`   no_gradsqueezerk   clamp_numpymoveaxisastypeuint8r   	fromarray)r2   rb   outputr"   r"   r#   upscale_without_tiling   s    

&r   c              	   C   s   t jdkrt| |S t|t jt jt j}g }d}|jD ]h\}}}g }|D ]<}	|	\}
}}t| |}|j|j }||
| || |g qJ||| || |g q8t	||j
| |j| |j| |j| |j| }t|}|S )Nr   r1   )r   ESRGAN_tiler   r   
split_gridESRGAN_tile_overlaptileswidthrP   Gridtile_wtile_himage_wimage_hoverlapcombine_grid)r2   rb   gridZnewtilesscale_factoryhrownewrowtiledataxwtiler   Znewgridr"   r"   r#   ra      s     



2
ra   )r%   )r]   r   r   r{   PILr   Zmodules.esrgan_model_archZesrgan_model_archr~   modulesr   r   r   Zmodules.sharedr   modules.upscalerr   r   r$   r+   rA   rB   r   ra   r"   r"   r"   r#   <module>   s   !
+ H