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mZ d dlm	Z	m
Z
mZmZ d dlmZmZ d dlmZ d dlmZ d dlmZmZ d	Ze
d
ZG dd deZdddZdd Zdd Zee dS )    N)Image)tqdm)modelloaderdevicesscript_callbacksshared)optsstate)SwinIR)Swin2SR)UpscalerUpscalerDatazqhttps://github.com/JingyunLiang/SwinIR/releases/download/v0.0/003_realSR_BSRGAN_DFOWMFC_s64w8_SwinIR-L_x4_GAN.pthZswinirc                       s.   e Zd Z fddZdd ZdddZ  ZS )	UpscalerSwinIRc                    s   d | _ d | _d| _t| _d| _|| _t   g }| j	ddgd}|D ]6}|
dr\| j}n
t|}t||| }|| qF|| _d S )Nr
   z	SwinIR 4xz.pt.pth)
ext_filterhttp)_cached_model_cached_model_confignameSWINIR_MODEL_URL	model_url
model_name	user_pathsuper__init__find_models
startswithr   friendly_namer   appendscalers)selfdirnamer   Zmodel_filesmodelr   
model_data	__class__ V/var/www/html/stable-diffusion-webui/extensions-builtin/SwinIR/scripts/swinir_model.pyr      s     


zUpscalerSwinIR.__init__c              
   C   s   t tdo2tjo2ttjdd dko2t dk}|tj	f}|rT| j
|krT| j}nd | _z| |}W nB ty } z*td| d| tjd |W  Y d }~S d }~0 0 |jttjd	}|rt|}|| _|| _
t||}t  |S )
NSWIN_torch_compile.r      WindowszFailed loading SwinIR model z: )filedtype)hasattrr   r(   inttorch__version__splitplatformsystem	SWIN_tiler   r   
load_model	Exceptionprintsysstderrtodevice_swinirr   r.   compileupscaletorch_gc)r    img
model_fileZuse_compilecurrent_configr"   er&   r&   r'   
do_upscale(   s,    



zUpscalerSwinIR.do_upscale   c                 C   s   | dr.tj|| j| jdd dd}n|}|drht|ddd	d
g ddg ddddd}d }n*t|ddd	d
g ddg ddddd}d}t	
|}|d ur|j|| dd n|j|dd |S )Nr    _r   )url	model_dir	file_namez.v2.pth   @      g      ?)   rO   rO   rO   rO   rO      r*   znearest+conv1conv)r?   in_chansimg_sizewindow_size	img_rangedepths	embed_dim	num_heads	mlp_ratio	upsamplerresi_connection)	rO   rO   rO   rO   rO   rO   rO   rO   rO      )	rN   rN   rN   rN   rN   rN   rN   rN   rN   3conv
params_emaT)strict)r   r   load_file_from_urlmodel_download_pathr   replaceendswithr   r
   r1   loadload_state_dict)r    pathscalefilenamer"   paramsZpretrained_modelr&   r&   r'   r7   ?   sR    


zUpscalerSwinIR.load_model)rF   )__name__
__module____qualname__r   rE   r7   __classcell__r&   r&   r$   r'   r      s   r   rN   rF   c              	   C   s"  |pt j}|pt j}t| } | d d d d d d df } t| ddd } t|  } | 	dj
ttjd} t  t f |  \}}}}|| d | | }	|| d | | }
t| t| dggdd d d d d ||	 d d f } t| t| dggdd d d d d d d ||
 f } t| |||||}|dd || d || f }|j   dd }|jdkrt|g d	d d d d f d
}|d  tj}t|dW  d    W  d    S 1 s0    Y  W d    n1 s0    Y  d S )Nr*   r      r-      rL   .)r*   rp   r   )rp   r*   r   g     o@RGB) r   r6   SWIN_tile_overlapnparraymoveaxisr1   
from_numpyfloat	unsqueezer<   r=   r   r.   no_gradautocastsizecatflip	inferencedatasqueezecpuclamp_numpyndim	transposeroundastypeuint8r   	fromarray)rA   r"   tiletile_overlaprT   rg   rH   Zh_oldZw_oldh_padw_padoutputr&   r&   r'   r?   o   s,    


::r?   c              	   C   s  |   \}}}}	t|||	}|| dks0J d|}
|| }ttd|| ||| g }ttd|	| ||	| g }tj||||
 |	|
 tjtd	| }tj
|tjtd}tt|t| dd}|D ]}tjstjr q|D ]}tjstjr q| d||| ||| f }||}t|}|d||
 || |
 ||
 || |
 f | |d||
 || |
 ||
 || |
 f | |d qqW d    n1 s0    Y  ||}|S )Nr   z-tile size should be a multiple of window_size)r.   devicezSwinIR tiles)totaldesc.rp   )r{   minlistranger1   zerosr   r.   r=   type_as
zeros_liker   lenr	   interruptedskipped	ones_likeadd_updatediv_)rA   r"   r   r   rT   rg   bchwsfstride
h_idx_list
w_idx_listEWpbarh_idxw_idxin_patch	out_patchout_patch_maskr   r&   r&   r'   r~      s@    &
((.
r~   c                  C   s   dd l } tjdtjdd| jdddddd	 tjd
tjdd| jdddddd	 ttj	dd dkrt
 dkrtjdtjdd| jddidd	d d S )Nr   r6      zTile size for all SwinIR.   i   )minimummaximumstep)	upscaling	Upscaling)sectionrr   rN   z>Tile overlap, in pixels for SwinIR. Low values = visible seam.0   rp   r)   r*   r+   r(   Fz'Use torch.compile to accelerate SwinIR.interactiveTzTakes longer on first run)gradior   r   
add_option
OptionInfoSliderr0   r1   r2   r3   r4   r5   Checkboxinfo)grr&   r&   r'   on_ui_settings   s
    (($r   )NNrN   rF   )r:   r4   r   rs   r1   PILr   r   modulesr   r   r   r   Zmodules.sharedr   r	   Zswinir_model_archr
   Zswinir_model_arch_v2r   modules.upscalerr   r   r   get_device_forr=   r   r?   r~   r   r&   r&   r&   r'   <module>   s*   
^    
"&	