
    f                         d dl Z d dlmZ d dlZd dlmZ d dlmZ d dlZd dl	m
Z
 d dlmZ d dlT d dlmc mZ d dlT  e j        e j                                        rdnd          Z G d d	          ZdS )
    N)AdamW)warp)DistributedDataParallel)*cudacpuc                   H    e Zd ZddZd Zd Zd ZddZddZddZ	ddZ
dS )Modelc                 T   t                      | _        |                                  t          | j                                        dd          | _        t                      | _        d| _        t                      | _
        |dk    rt          | j        |g|          | _        d S d S )Ngư>g-C6?)lrweight_decayg      @r   )
device_idsoutput_device)IFNetflownetdevicer   
parametersoptimGEPEepeversionSOBELsobelDDP)self
local_ranks     9/Users/hzwer/Github/Practical-RIFE/train_log/RIFE_HDv3.py__init__zModel.__init__   s    wwDL3355$TRRR55WW
t|T^___DLLL     c                 8    | j                                          d S N)r   trainr   s    r   r#   zModel.train   s    r    c                 8    | j                                          d S r"   )r   evalr$   s    r   r&   z
Model.eval   s    r    c                 D    | j                             t                     d S r"   )r   tor   r$   s    r   r   zModel.device!   s    r    r   c           	         fd}dk    rt           j                                        rK| j                             |t          j        d                    |                              d           d S | j                             |t          j        d                    |          d                    d           d S d S )Nc                 P    dk    rd |                                  D             S | S )Nr   c                 J    i | ] \  }}d |v 	|                     d d          |!S )zmodule. )replace).0kvs      r   
<dictcomp>z5Model.load_model.<locals>.convert.<locals>.<dictcomp>'   s=       1 A~~ IIi,,a%~~r    )items)paramranks    r   convertz!Model.load_model.<locals>.convert%   s<    rzz  %    r    r   {}/flownet.pklFr   )map_location)torchr   is_availabler   load_state_dictloadformat)r   pathr4   r5   s     ` r   
load_modelzModel.load_model$   s    	 	 	 	 	 199z&&(( },,WWUZ@P@W@WX\@]@]5^5^-_-_afggggg,,WWUZ@P@W@WX\@]@]mr5s5s5s-t-tv{|||||	 9r    c                     |dk    rAt          j        | j                                        d                    |                     d S d S )Nr   r6   )r8   saver   
state_dictr<   )r   r=   r4   s      r   
save_modelzModel.save_model4   sG    199Jt|..001A1H1H1N1NOOOOO 9r          ?      ?c                     t          j        ||fd          }d|z  d|z  d|z  d|z  d|z  g}|                     |||          \  }}}	|	d         S )N               r   )r8   catr   )
r   img0img1timestepscaleimgs
scale_listflowmaskmergeds
             r   	inferencezModel.inference8   sa    y$q))h%5!E'1U7C
!\\$*EEdFbzr    rF   TNc                    | j         j        D ]}||d<   |d d d df         }|d d dd f         }	|r|                                  n|                                  g d}
|                     t          j        ||fd          |
|          \  }}}|d         |z
                                                                  }| 	                    |d         |d         dz                                            }|rW| j         
                                 |t          z   |dz  z   }|                                 | j                                          n|d	         }|d         ||d         d d d d	f         |t          |d
fS )Nr      )rG   rH   rI   rJ   rF   rF   )rO   trainingr   r   g?rJ   )rS   rR   loss_l1	loss_consloss_smooth)r   param_groupsr#   r&   r   r8   rK   absmeanr   	zero_gradrZ   backwardstep)r   rP   gtlearning_ratemulrX   flow_gtparam_grouprL   rM   rO   rR   rS   rT   rY   r[   loss_Gflow_teachers                     r   updatezModel.update>   s   ;3 	. 	.K -KAAArrE{AAAqrrE{ 	JJLLLLIIKKK   !\\%)T2J*B*B%Zb\ccdF":?''))..00jjb48A:66;;== 	#K!!###y(;+<<FOOK7LbzHQQQUO"&   	r    )r   )r   )rC   rD   )r   rF   TN)__name__
__module____qualname__r   r#   r&   r   r>   rB   rU   ri    r    r   r
   r
      s        	` 	` 	` 	`         } } } } P P P P        r    r
   )r8   torch.nnnnnumpynptorch.optimr   optim	itertoolsmodel.warplayerr   torch.nn.parallelr   r   train_log.IFNet_HDv3torch.nn.functional
functionalF
model.lossr   r   r9   r
   rm   r    r   <module>r|      s                                          < < < < < < " " " "             	
 7 7 9 9Dffu	E	EJ J J J J J J J J Jr    