a
    þd^$  ã                   @   s˜   d dl Z d dlmZ d dlmZ d dlmZ d dlm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 e ¡ G dd„ deƒƒZdS )é    N)ÚOrderedDict)Úpath)Útqdm)Úbuild_network)Ú
build_loss)Úcalculate_metric)Úget_root_loggerÚimwriteÚ
tensor2img)ÚMODEL_REGISTRYé   )Ú	BaseModelc                       sp   e Zd ZdZ‡ fdd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Z‡  ZS )ÚSRModelz0Base SR model for single image super-resolution.c                    s–   t t| ƒ |¡ t|d ƒ| _|  | j¡| _|  | j¡ | jd  dd ¡}|d ur„| jd  dd¡}|  	| j|| jd  dd¡|¡ | j
r’|  ¡  d S )NÚ	network_gr   Úpretrain_network_gZparam_key_gÚparamsÚstrict_load_gT)Úsuperr   Ú__init__r   Únet_gZmodel_to_deviceZprint_networkÚoptÚgetÚload_networkÚis_trainÚinit_training_settings)Úselfr   Ú	load_pathÚ	param_key©Ú	__class__© ú`/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/basicsr/models/sr_model.pyr      s     zSRModel.__init__c                 C   s0  | j  ¡  | jd }| dd¡| _| jdkr¬tƒ }| d| j› ¡ t| jd ƒ | j	¡| _
| jd  dd ¡}|d ur˜|  | j
|| jd  dd	¡d
¡ n
|  d¡ | j
 ¡  | d¡rÎt|d ƒ | j	¡| _nd | _| d¡röt|d ƒ | j	¡| _nd | _| jd u r| jd u rtdƒ‚|  ¡  |  ¡  d S )NÚtrainÚ	ema_decayr   z+Use Exponential Moving Average with decay: r   r   r   r   TÚ
params_emaZ	pixel_optZperceptual_optz*Both pixel and perceptual losses are None.)r   r"   r   r   r#   r   Úinfor   ÚtoÚdeviceÚ	net_g_emar   Ú	model_emaÚevalr   Úcri_pixÚcri_perceptualÚ
ValueErrorÚsetup_optimizersZsetup_schedulers)r   Ú	train_optÚloggerr   r    r    r!   r   #   s,    


"



zSRModel.init_training_settingsc                 C   s†   | j d }g }| j ¡ D ]2\}}|jr2| |¡ qtƒ }| d|› d¡ q|d  d¡}| j||fi |d ¤Ž| _	| j
 | j	¡ d S )Nr"   zParams z will not be optimized.Zoptim_gÚtype)r   r   Znamed_parametersZrequires_gradÚappendr   ÚwarningÚpopZget_optimizerÚoptimizer_gZ
optimizers)r   r/   Zoptim_paramsÚkÚvr0   Z
optim_typer    r    r!   r.   I   s    
zSRModel.setup_optimizersc                 C   s0   |d   | j¡| _d|v r,|d   | j¡| _d S )NÚlqÚgt)r&   r'   r8   r9   )r   Údatar    r    r!   Ú	feed_dataW   s    zSRModel.feed_datac                 C   sÌ   | j  ¡  |  | j¡| _d}tƒ }| jrH|  | j| j¡}||7 }||d< | jr’|  | j| j¡\}}|d urz||7 }||d< |d ur’||7 }||d< | 	¡  | j  
¡  |  |¡| _| jdkrÈ| j| jd d S )Nr   Úl_pixÚl_percepÚl_style)Zdecay)r5   Z	zero_gradr   r8   Úoutputr   r+   r9   r,   ZbackwardÚstepZreduce_loss_dictZlog_dictr#   r)   )r   Úcurrent_iterZl_totalZ	loss_dictr<   r=   r>   r    r    r!   Úoptimize_parameters\   s*    


zSRModel.optimize_parametersc                 C   sš   t | dƒrL| j ¡  t ¡  |  | j¡| _W d   ƒ q–1 s@0    Y  nJ| j ¡  t ¡  |  | j¡| _W d   ƒ n1 s‚0    Y  | j ¡  d S )Nr(   )	Úhasattrr(   r*   ÚtorchZno_gradr8   r?   r   r"   )r   r    r    r!   Útesty   s    


.

,zSRModel.testc                 C   s"   | j d dkr|  ||||¡ d S )NZrankr   )r   Únondist_validation)r   Ú
dataloaderrA   Ú	tb_loggerÚsave_imgr    r    r!   Údist_validation„   s    zSRModel.dist_validationc              	   C   s˜  |j jd }| jd  d¡d u}| jd  dd¡}|rht| dƒs^dd„ | jd d  ¡ D ƒ| _|  |¡ |r~d	d„ | jD ƒ| _tƒ }|r˜tt	|ƒd
d}	t
|ƒD ]\}
}t t |d d ¡¡d }|  |¡ |  ¡  |  ¡ }t|d gƒ}||d< d|v rt|d gƒ}||d< | `| `| `tj ¡  |rØ| jd rdt | jd d ||› d|› d¡}nj| jd d r¤t | jd d ||› d| jd d › d¡}n*t | jd d ||› d| jd › d¡}t||ƒ |r| jd d  ¡ D ]"\}}| j|  t||ƒ7  < qð|r |	 d¡ |	 d|› ¡ q |rB|	 ¡  |r”| j ¡ D ]2}| j|  |
d   < |  ||| j| |¡ qR|   |||¡ d S )NÚnameÚvalZmetricsÚpbarFÚmetric_resultsc                 S   s   i | ]
}|d “qS ©r   r    ©Ú.0Úmetricr    r    r!   Ú
<dictcomp>   ó    z.SRModel.nondist_validation.<locals>.<dictcomp>c                 S   s   i | ]
}|d “qS rO   r    rP   r    r    r!   rS   ”   rT   Úimage)ÚtotalÚunitZlq_pathr   ÚresultÚimgr9   Zimg2r   r   ZvisualizationÚ_z.pngÚsuffixr   zTest )!Zdatasetr   r   rC   ÚkeysrN   Z_initialize_best_metric_resultsÚdictr   ÚlenÚ	enumerateÚospÚsplitextÚbasenamer;   rE   Úget_current_visualsr
   r9   r8   r?   rD   ZcudaZempty_cacheÚjoinr	   Úitemsr   ÚupdateÚset_descriptionÚcloseZ_update_best_metric_resultÚ_log_validation_metric_values)r   rG   rA   rH   rI   Údataset_nameZwith_metricsZuse_pbarZmetric_datarM   ÚidxZval_dataZimg_nameZvisualsZsr_imgZgt_imgZsave_img_pathrK   Zopt_rR   r    r    r!   rF   ˆ   sh    




ÿÿÿ

zSRModel.nondist_validationc                 C   sÂ   d|› d}| j  ¡ D ]d\}}|d|› d|d›7 }t| dƒrr|d| j| | d d›d	| j| | d
 › d7 }|d7 }qtƒ }| |¡ |r¾| j  ¡ D ]"\}}| d|› d|› ||¡ qšd S )NzValidation Ú
z	 # z: z.4fÚbest_metric_resultsz	Best: rL   z @ Úiterz iterzmetrics/ú/)rN   re   rC   rm   r   r%   Z
add_scalar)r   rA   rj   rH   Zlog_strrR   Úvaluer0   r    r    r!   ri   Ë   s    
ÿ


z%SRModel._log_validation_metric_valuesc                 C   sJ   t ƒ }| j ¡  ¡ |d< | j ¡  ¡ |d< t| dƒrF| j ¡  ¡ |d< |S )Nr8   rX   r9   )r   r8   ÚdetachÚcpur?   rC   r9   )r   Zout_dictr    r    r!   rc   Ú   s    
zSRModel.get_current_visualsc                 C   sJ   t | dƒr*| j| j| jgd|ddgd n|  | jd|¡ |  ||¡ d S )Nr(   r   r   r$   )r   )rC   Zsave_networkr   r(   Zsave_training_state)r   ÚepochrA   r    r    r!   Úsaveâ   s    
 zSRModel.save)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r.   r;   rB   rE   rJ   rF   ri   rc   rt   Ú__classcell__r    r    r   r!   r      s   &Cr   )rD   Úcollectionsr   Úosr   r`   r   Zbasicsr.archsr   Zbasicsr.lossesr   Zbasicsr.metricsr   Zbasicsr.utilsr   r	   r
   Zbasicsr.utils.registryr   Z
base_modelr   Úregisterr   r    r    r    r!   Ú<module>   s   