
    f!                     6   d dl Z d dlmZ d dlmc mZ d dlmZ  e j        e j	        
                                rdnd          ZddZddZ G d	 d
ej                  Z G d dej                  Z G d dej                  Z G d dej                  ZdS )    N)warpcudacpu      c                     t          j        t          j        | |||||d          t          j        dd                    S )NTkernel_sizestridepaddingdilationbias皙?)nn
SequentialConv2d	LeakyReLU	in_planes
out_planesr
   r   r   r   s         :/Users/hzwer/Github/Practical-RIFE/train_log/IFNet_HDv3.pyconvr   	   sK    =
	)Z[!H4	A 	A 	A
S$      c                     t          j        t          j        | |||||d          t          j        |          t          j        dd                    S )NFr	   r   T)r   r   r   BatchNorm2dr   r   s         r   conv_bnr      sX    =
	)Z[!H5	B 	B 	B
z""
S$	  r   c                   &     e Zd Z fdZddZ xZS )Headc                 r   t          t          |                                            t          j        ddddd          | _        t          j        ddddd          | _        t          j        ddddd          | _        t          j        ddddd          | _	        t          j
        dd          | _        d S )Nr         r      r   T)superr   __init__r   r   cnn0cnn1cnn2ConvTranspose2dcnn3r   reluself	__class__s    r   r$   zHead.__init__   s    dD""$$$IaQ1--	Ib"aA..	Ib"aA..	&r1aA66	Ld++			r   Fc                 <   |                      |          }|                     |          }|                     |          }|                     |          }|                     |          }|                     |          }|                     |          }|r||||gS |S N)r%   r*   r&   r'   r)   )r,   xfeatx0x1x2x3s          r   forwardzHead.forward!   s    YYq\\IIbMMYYq\\IIbMMYYq\\IIbMMYYq\\ 	$B##	r   )F__name__
__module____qualname__r$   r6   __classcell__r-   s   @r   r   r      sL        , , , , ,
 
 
 
 
 
 
 
r   r   c                   &     e Zd Zd fd	Zd Z xZS )ResConvr   c           	      ,   t          t          |                                            t          j        ||dd||d          | _        t          j        t          j        d|ddf          d          | _	        t          j
        dd          | _        d S )Nr   r   )r   groupsT)requires_gradr   )r#   r>   r$   r   r   r   	Parametertorchonesbetar   r*   )r,   cr   r-   s      r   r$   zResConv.__init__.   s    gt%%'''IaAq(Xa   	LQ1aL!9!9NNN	Ld++			r   c                 h    |                      |                     |          | j        z  |z             S r/   )r*   r   rE   )r,   r0   s     r   r6   zResConv.forward5   s*    yy1	1A5666r   )r   r7   r<   s   @r   r>   r>   -   sL        , , , , , ,7 7 7 7 7 7 7r   r>   c                   (     e Zd Zd fd	ZddZ xZS )IFBlock@   c                 n   t          t          |                                            t          j        t          ||dz  ddd          t          |dz  |ddd                    | _        t          j        t          |          t          |          t          |          t          |          t          |          t          |          t          |          t          |                    | _        t          j        t          j	        |dddd          t          j
        d                    | _        d S )Nr!   r   r   4   r"   )r#   rI   r$   r   r   r   conv0r>   	convblockr(   PixelShufflelastconv)r,   r   rF   r-   s      r   r$   zIFBlock.__init__9   s    gt%%''']AqD!Q**Aq!Q"" 
 AJJAJJAJJAJJAJJAJJAJJAJJ	
 	
 q$1a00OA
 
r   Nr   c                    t          j        |d|z  dd          }|8t          j        |d|z  dd          dz  |z  }t          j        ||fd          }|                     |          }|                     |          }|                     |          }t          j        ||dd          }|d d d df         |z  }|d d ddf         }|d d dd f         }|||fS )Ng      ?bilinearF)scale_factormodealign_cornersr   r"      )FinterpolaterC   catrM   rN   rP   )r,   r0   flowscaler1   tmpmasks          r   r6   zIFBlock.forwardN   s    M!2:JV[\\\=R%Zj`efffikknssD	1d)Q''Azz!}}~~d##mmD!!mCe*TYZZZ111bqb5zE!111ac6{111abb5zT4r   )rJ   )Nr   r7   r<   s   @r   rI   rI   8   sQ        
 
 
 
 
 
*               r   rI   c                   4     e Zd Z fdZdg ddddfdZ xZS )IFNetc                 X   t          t          |                                            t          dd          | _        t          dd          | _        t          dd          | _        t          dd          | _        t          dd          | _        t                      | _
        d S )	N      )rF         `   rJ       )r#   r_   r$   rI   block0block1block2block3block4r   encoder+   s    r   r$   zIFNet.__init__]   s    eT##%%%cS)))g---g,,,g,,,g,,,ff	 	r   g      ?)   r"   r!   r   FTc                    |dk    r,|j         d         dz  }|d d d |f         }|d d |d f         }	t          j        |          s*|d d d df                                         dz  dz   |z  }n.|                    dd|j         d         |j         d                   }|                     |d d d df                   }
|                     |	d d d df                   }g }g }g }|}|	}d }d }d}| j        | j        | j        | j	        | j
        g}t          d          D ]}|` ||         t          j        |d d d df         |	d d d df         |
||fd          d ||                   \  }}}|rt          d           nt          |
|d d d df                   }t          ||d d dd	f                   } ||         t          j        |d d d df         |d d d df         |||||fd          |||                   \  }}}|rt          d           n|}||z   }|                    |           |                    |           t          ||d d d df                   }t          |	|d d dd	f                   }|                    ||f           t          j        |          }||z  |d|z
  z  z   |d	<   |st          d
           	 ||d	         |fS )NFr   r!   r   r   rV   )r[   z2warning: ensemble is not supported since RIFEv4.21r"   zcontextnet is removed)shaperC   	is_tensorclonerepeatrl   rg   rh   ri   rj   rk   rangerY   printr   appendsigmoid)r,   r0   timestep
scale_listtrainingfastmodeensemblechannelimg0img1f0f1	flow_listmerged	mask_listwarped_img0warped_img1rZ   r]   	loss_consblockir1   wf0wf1fdm0s                              r   r6   zIFNet.forwardw   s   ugajAoGQQQ[>DQQQ[>Dx(( 	K!!!RaR%((1,q0H<HHq!TZ]DJqMJJH[[aaa!e%%[[aaa!e%%			dk4;T[Qq 	6 	6A|#+58EItAAArrE{DBQBKQSUWYa6bde,f,fhlt~  @A  uB  $C  $C  $C dD PNOOO2tAAArrE{++2tAAAqsF|,,'uQx	;qqq"1"u3E{STSTSTVXWXVXSXGY[^`cemosuy2z|}(~(~  AE  MW  XY  MZ   [   [   [B NOOOODbyT"""T"""tT!!!RaR%[11KtT!!!QqS&\22KMM;45555}T"" 4'+T*BBq	 	)*** )A,..r   r7   r<   s   @r   r_   r_   \   s_            4 #&,,,Y]hm 2/ 2/ 2/ 2/ 2/ 2/ 2/ 2/r   r_   )r   r   r   r   )rC   torch.nnr   torch.nn.functional
functionalrW   model.warplayerr   devicer   is_availabler   r   Moduler   r>   rI   r_    r   r   <module>r      sd                               

 7 7 9 9Dffu	E	E          29   *	7 	7 	7 	7 	7bi 	7 	7 	7"  "  "  "  " bi "  "  " HM/ M/ M/ M/ M/BI M/ M/ M/ M/ M/r   