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 d dlmZ d dlmZ d dlmZ d dlmZmZ d d	lmZ d d
lmZ ejddG dd„ deƒƒZdS )é    N)ÚOrderedDict)Ú
functional)Úrandom_add_gaussian_noise_ptÚrandom_add_poisson_noise_pt)Úpaired_random_crop)Úget_refined_artifact_map)Ú
SRGANModel)ÚDiffJPEGÚUSMSharp)Úfilter2D)ÚMODEL_REGISTRYZbasicsr)Úsuffixc                       sT   e Zd ZdZ‡ fdd„Ze ¡ dd„ ƒZe ¡ dd„ ƒZ‡ fdd	„Z	d
d„ Z
‡  ZS )ÚRealESRGANModelzèRealESRGAN Model for Real-ESRGAN: Training Real-World Blind Super-Resolution with Pure Synthetic Data.

    It mainly performs:
    1. randomly synthesize LQ images in GPU tensors
    2. optimize the networks with GAN training.
    c                    s>   t t| ƒ |¡ tdd ¡ | _tƒ  ¡ | _| dd¡| _	d S )NF)ZdifferentiableÚ
queue_sizeé´   )
Úsuperr   Ú__init__r	   ÚcudaÚjpegerr
   Úusm_sharpenerÚgetr   )ÚselfÚopt©Ú	__class__© úh/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/basicsr/models/realesrgan_model.pyr      s    zRealESRGANModel.__init__c           	      C   sÔ  | j  ¡ \}}}}t| dƒsˆ| j| dks@J d| j› d|› ƒ‚t | j|||¡ ¡ | _| j ¡ \}}}}t | j|||¡ ¡ | _	d| _
| j
| jkrdt | j¡}| j| | _| j	| | _	| jd|…dd…dd…dd…f  ¡ }| j	d|…dd…dd…dd…f  ¡ }| j  ¡ | jd|…dd…dd…dd…f< | j ¡ | j	d|…dd…dd…dd…f< || _ || _nl| j  ¡ | j| j
| j
| …dd…dd…dd…f< | j ¡ | j	| j
| j
| …dd…dd…dd…f< | j
| | _
dS )ac  It is the training pair pool for increasing the diversity in a batch.

        Batch processing limits the diversity of synthetic degradations in a batch. For example, samples in a
        batch could not have different resize scaling factors. Therefore, we employ this training pair pool
        to increase the degradation diversity in a batch.
        Úqueue_lrr   zqueue size z# should be divisible by batch size N)ÚlqÚsizeÚhasattrr   ÚtorchÚzerosr   r   ÚgtZqueue_gtZ	queue_ptrZrandpermÚclone)	r   ÚbÚcÚhÚwÚ_ÚidxZ
lq_dequeueZ
gt_dequeuer   r   r   Ú_dequeue_and_enqueue   s(    	
$&&((00z$RealESRGANModel._dequeue_and_enqueuec                 C   sx  | j r8| j dd¡r8|d  | j¡| _|  | j¡| _|d  | j¡| _|d  | j¡| _	|d  | j¡| _
| j ¡ dd… \}}t| j| jƒ}t g d	¢| jd
 ¡d }|dkrÎtj d| jd d ¡}n&|dkrðtj | jd d d¡}nd}t g d¢¡}tj|||d}| jd }tj ¡ | jd k rLt|| jd dd|d}nt|| jd |ddd}| | d¡¡j| jd Ž }	t |dd¡}| j||	d}tj ¡ | jd k r¾t|| j	ƒ}t g d	¢| jd ¡d }|dkrütj d| jd d ¡}n(|dkr tj | jd d d¡}nd}t g d¢¡}tj|t|| jd  | ƒt|| jd  | ƒf|d}| jd  }tj ¡ | jd! k r¤t|| jd" dd|d}nt|| jd# |ddd}tj ¡ d$k rHt g d¢¡}tj||| jd  || jd  f|d}t|| j
ƒ}| | d¡¡j| jd% Ž }	t |dd¡}| j||	d}nz| | d¡¡j| jd% Ž }	t |dd¡}| j||	d}t g d¢¡}tj||| jd  || jd  f|d}t|| j
ƒ}t |d&  ¡ dd'¡d& | _| jd( }
t| j| jg| j|
| jd ƒ\\| _| _| _|  ¡  |  | j¡| _| j  ¡ | _n<|d)  | j¡| _d|v rt|d  | j¡| _|  | j¡| _d*S )+z^Accept data from dataloader, and then add two-order degradations to obtain LQ images.
        Zhigh_order_degradationTr#   Úkernel1Úkernel2Úsinc_kernelé   é   )ÚupÚdownZkeepZresize_probr   r1   é   Zresize_ranger2   )ÚareaZbilinearZbicubic)Zscale_factorÚmodeÚgray_noise_probZgaussian_noise_probZnoise_rangeF)Zsigma_rangeÚclipÚroundsÚ	gray_probZpoisson_scale_range)Zscale_ranger9   r7   r8   Z
jpeg_range)ZqualityZsecond_blur_probZresize_prob2Zresize_range2Úscale)r   r5   Zgray_noise_prob2Zgaussian_noise_prob2Znoise_range2Zpoisson_scale_range2g      à?Zjpeg_range2g     ào@éÿ   Úgt_sizer   N)!Úis_trainr   r   ÚtoZdevicer#   r   Úgt_usmr,   r-   r.   r   r   ÚrandomÚchoicesÚnpÚuniformÚchoiceÚFZinterpolater   r   Z	new_zerosZuniform_r!   Úclampr   ÚintÚroundr   r   r+   Ú
contiguous)r   ÚdataZori_hZori_wÚoutZupdown_typer:   r5   r6   Zjpeg_pr<   r   r   r   Ú	feed_dataD   s     
ÿû

.ÿ
ÿû((
ÿ
zRealESRGANModel.feed_datac                    s&   d| _ tt| ƒ ||||¡ d| _ d S )NFT)r=   r   r   Únondist_validation)r   Z
dataloaderÚcurrent_iterZ	tb_loggerZsave_imgr   r   r   rM   »   s    z"RealESRGANModel.nondist_validationc                 C   sŠ  | j }| j }| j }| jd du r&| j}| jd du r:| j}| jd du rN| j}| j ¡ D ]
}d|_qX| j ¡  |  | j	¡| _
| jr|  | j	¡| _d}tƒ }|| j dkr²|| jkr²| jrÚ|  | j
|¡}||7 }||d< | jr&t| j| j
| jdƒ}	|  t |	| j
¡t |	| j¡¡}
||
7 }|
|d< | jrt|  | j
|¡\}}|d urZ||7 }||d	< |d urt||7 }||d
< |  | j
¡}| j|ddd}||7 }||d< | ¡  | j ¡  | j ¡ D ]}d|_q¼| j ¡  |  |¡}| j|ddd}||d< t | ¡ ¡|d< | ¡  |  | j
 ¡  ¡ ¡}| j|ddd}||d< t | ¡ ¡|d< | ¡  | j ¡  | jdkrz| j| jd |  |¡| _ d S )NZ	l1_gt_usmFZpercep_gt_usmZ
gan_gt_usmr   Úl_g_pixé   Úl_g_ldlÚ
l_g_percepÚ	l_g_styleT)Zis_discÚl_g_ganÚl_d_realZ
out_d_realÚl_d_fakeZ
out_d_fake)Zdecay)!r?   r   r#   Znet_dÚ
parametersZrequires_gradZoptimizer_gZ	zero_gradZnet_gr   ÚoutputZcri_ldlZ	net_g_emaZ
output_emar   Znet_d_itersZnet_d_init_itersZcri_pixr   r!   ÚmulZcri_perceptualZcri_ganZbackwardÚstepZoptimizer_dÚmeanÚdetachr$   Z	ema_decayZ	model_emaZreduce_loss_dictZlog_dict)r   rN   Zl1_gtZ	percep_gtZgan_gtÚpZ	l_g_totalZ	loss_dictrO   Zpixel_weightrQ   rR   rS   Zfake_g_predrT   Zreal_d_predrU   Zfake_d_predrV   r   r   r   Úoptimize_parametersÁ   st    
 






z#RealESRGANModel.optimize_parameters)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r!   Zno_gradr+   rL   rM   r^   Ú__classcell__r   r   r   r   r      s   
$
vr   )ÚnumpyrB   r@   r!   Úcollectionsr   Ztorch.nnr   rE   Zbasicsr.data.degradationsr   r   Zbasicsr.data.transformsr   Zbasicsr.losses.loss_utilr   Zbasicsr.models.srgan_modelr   Zbasicsr.utilsr	   r
   Zbasicsr.utils.img_process_utilr   Zbasicsr.utils.registryr   Úregisterr   r   r   r   r   Ú<module>   s   
