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mZ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)Counter)path)distributed)tqdm)calculate_metric)get_root_loggerimwrite
tensor2img)get_dist_info)MODEL_REGISTRY   )VideoBaseModelc                       s@   e Zd Z fddZdd Z fddZdd Zd	d
 Z  ZS )VideoRecurrentModelc                    s*   t t| | | jr&|d d| _d S )NtrainZfix_flow)superr   __init__is_traingetfix_flow_iter)selfopt	__class__ m/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/basicsr/models/video_recurrent_model.pyr      s    zVideoRecurrentModel.__init__c           
      C   s   | j d }|dd}t }|d| d |dkrB| j }nbg }g }| j D ]&\}}d|v rp|| qT|| qT||d d d	||d d | d	g}|d d
}	| j	|	|fi |d | _
| j| j
 d S )Nr   flow_lr_mulr   z1Multiple the learning rate for flow network with .spynetZoptim_glr)paramsr   type)r   r   r   infonet_g
parametersnamed_parametersappendpopZget_optimizerZoptimizer_gZ
optimizers)
r   Z	train_optr   loggerZoptim_paramsZnormal_paramsZflow_paramsnameparamZ
optim_typer   r   r   setup_optimizers   s,    

z$VideoRecurrentModel.setup_optimizersc                    s   | j rxt }|dkrX|d| j  d | j D ]"\}}d|v sJd|v r2|d q2n || j krx|d | jd tt| 	| d S )	Nr   z+Fix flow network and feature extractor for z iters.r   ZedvrFzTrain all the parameters.T)
r   r   r!   r"   r$   Zrequires_grad_warningr   r   optimize_parameters)r   current_iterr'   r(   r)   r   r   r   r,   4   s    

z'VideoRecurrentModel.optimize_parametersc           !      C   s   |j }|jd }| jd d d u}|rt| ds~i | _t|jd }| D ]0\}	}
tj|
t	| jd d tj
dd| j|	< qL| | t \}}|r| j D ]\}}|  qt }t	|}|||  | }|dkrtt	|dd	}t||| |D ]}t||d
 }|| }|d }	|d d |d d | | |d d |d d |   |  }| `| `d|v r| `tj  | jr|d d
|d< d|v r|d d
|d< ||k rt|d d
D ]}|d d|d d d d d d f }t|g}||d< d|v rV|d d|d d d d d d f }t|g}||d< |r| jd rrt dn| jr|d !dd }|d !dd }| d| }t"#| jd d ||	| d| jd  d}n.t"#| jd d ||	|dd| jd  d}t$|| |rt%| jd d & D ].\}} t'|| }| j|	 ||f  |7  < q.q|dkrt|D ] }|(d
 |)d|	  qrq|dkr|*  |r| jd r| j D ]\}}t+,|d qt+-  |dkr| .||| d S )Nr(   valZmetricsmetric_resultsfoldercuda)ZdtypeZdevicer   )totalunitr   lqgtresultimgZimg2r   z.saving image is not supported during training.Zlq_path/_r   Zvisualizationz.pngZ08dzFolder: dist)/datasetr   hasattrr/   r   	data_infoitemstorchzeroslenfloat32Z_initialize_best_metric_resultsr
   Zzero_dictr   rangeminZ
unsqueeze_Z	feed_dataZsqueeze_testZget_current_visualsr4   outputr5   r1   Zempty_cachecenter_frame_onlyZ	unsqueezesizer	   NotImplementedErrorsplitospjoinr   	enumeratevaluesr   updateset_descriptioncloser<   reduceZbarrierZ_log_validation_metric_values)!r   Z
dataloaderr-   Z	tb_loggerZsave_imgr=   Zdataset_nameZwith_metricsZnum_frame_each_folderr0   Z	num_frameZrankZ
world_sizer;   ZtensorZmetric_dataZnum_foldersZnum_padZpbariidxZval_dataZvisualsr6   Z
result_imgr5   Zgt_imgZclip_Zseq_Zname_Zimg_pathZ
metric_idxZopt_r   r   r   dist_validationB   s    








"

"



"


z#VideoRecurrentModel.dist_validationc                 C   s<  | j d}| j  | jd dd}| jd dd| _|r^tj| j | j 	dgdd| _ t
  | | j | _W d    n1 s0    Y  |r| jd d d |d d d d d d f }| jd d |d d d d d d d f 	d}d||  | _| jr.| jd d |d d d d d d d f | _| j  d S )	Nr   r.   flip_seqFrJ   )Zdimg      ?   )r4   rK   r"   evalr   r   rJ   rA   catZflipZno_gradrI   r   )r   nrY   Zoutput_1Zoutput_2r   r   r   rH      s    

,(.*zVideoRecurrentModel.test)	__name__
__module____qualname__r   r*   r,   rX   rH   __classcell__r   r   r   r   r      s
   nr   )rA   collectionsr   osr   rN   r   r<   r   Zbasicsr.metricsr   Zbasicsr.utilsr   r   r	   Zbasicsr.utils.dist_utilr
   Zbasicsr.utils.registryr   Zvideo_base_modelr   registerr   r   r   r   r   <module>   s   