a
    þd.  ã                   @   sœ   d dl Zd dlZd dl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 dlmZ d dlmZ d dlmZ d d	lmZ e ¡ G d
d„ de
ƒƒZdS )é    N)Úrandom_add_gaussian_noise_ptÚrandom_add_poisson_noise_pt)Úpaired_random_crop)Ú
SRGANModel)ÚDiffJPEGÚUSMSharp)Úfilter2D)ÚMODEL_REGISTRY)ÚOrderedDict)Ú
functionalc                       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__© úk/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/realesrgan/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   r/   é   Zresize_ranger0   )Ú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_ranger7   r5   r6   Z
jpeg_range)ZqualityZsecond_blur_probZresize_prob2Zresize_range2Úscale)r   r3   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_typer8   r3   r4   Zjpeg_pr:   r   r   r   Ú	feed_dataB   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   rK   ¹   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	¡| _
d}tƒ }|| j dkrP|| jkrP| jrÆ|  | j
|¡}||7 }||d< | jr|  | j
|¡\}	}
|	d urø||	7 }|	|d< |
d ur||
7 }|
|d< |  | j
¡}| j|d	dd
}||7 }||d< | ¡  | j ¡  | j ¡ D ]}d	|_qZ| j ¡  |  |¡}| j|d	d	d
}||d< t | ¡ ¡|d< | ¡  |  | j
 ¡  ¡ ¡}| j|dd	d
}||d< t | ¡ ¡|d< | ¡  | j ¡  | jdkr| j| jd |  |¡| _d S )NZ	l1_gt_usmFZpercep_gt_usmZ
gan_gt_usmr   Úl_g_pixÚ
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   Úoutputr
   Znet_d_itersZnet_d_init_itersZcri_pixZcri_perceptualZcri_ganZbackwardÚstepZoptimizer_dr   ÚmeanÚdetachr"   Z	ema_decayZ	model_emaZreduce_loss_dictZlog_dict)r   rL   Zl1_gtZ	percep_gtZgan_gtÚpZ	l_g_totalZ	loss_dictrM   rN   rO   Zfake_g_predrP   Zreal_d_predrQ   Zfake_d_predrR   r   r   r   Úoptimize_parameters¿   sf    






z#RealESRGANModel.optimize_parameters)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   Zno_gradr)   rJ   rK   rY   Ú__classcell__r   r   r   r   r      s   
$
vr   )Únumpyr@   r>   r   Zbasicsr.data.degradationsr   r   Zbasicsr.data.transformsr   Zbasicsr.models.srgan_modelr   Zbasicsr.utilsr   r   Zbasicsr.utils.img_process_utilr   Zbasicsr.utils.registryr	   Úcollectionsr
   Ztorch.nnr   rC   Úregisterr   r   r   r   r   Ú<module>   s   