
    Ύj!                        d dl Z 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
 G d dej                  Z G d dej                  Z G d d	ej                  Z G d
 dej                  Z G d de j        j                  Zedk    r e j        dddd                                                              e
          Z e j        ej                            d dd                                                                        e
          Z e            Z e eee          j                   dS dS )    Ncudacpuc                   $     e Zd Z fdZd Z xZS )EPEc                 V    t          t          |                                            d S N)superr   __init__self	__class__s    b/home/vela/workspace/domain/tn-silver/web/tn-site/.runtime/video-rife/Practical-RIFE/model/loss.pyr
   zEPE.__init__   s%    c4!!#####    c                 x    ||                                 z
  dz  }|                    dd          dz   dz  }||z  S )N      Tgư>g      ?)detachsum)r   flowgt	loss_maskloss_maps        r   forwardzEPE.forward   sA    299;;&1,LLD))D0S89$%r   __name__
__module____qualname__r
   r   __classcell__r   s   @r   r   r   
   sG        $ $ $ $ $& & & & & & &r   r   c                   <     e Zd Z fdZd Zd Zd Zd Zd Z xZ	S )Ternaryc                    t          t          |                                            d}||z  }t          j        |                              ||d|f          | _        t          j        | j        d          | _        t          j	        | j                  
                                                    t                    | _        d S )N   r   )   r   r   r   )r	   r!   r
   npeyereshapew	transposetorchtensorfloattodevice)r   
patch_sizeout_channelsr   s      r   r
   zTernary.__init__   s    gt%%'''
!J.%%--Q57 7dfl33df%%++--0088r   c                     t          j        || j        dd           }||z
  }|t          j        d|dz  z             z  }|S )Nr$   )paddingbiasgQ?r   )Fconv2dr(   r*   sqrt)r   imgpatchestransftransf_norms        r   	transformzTernary.transform   sH    (3===3uz$*:;;;r   c                     |d d ddd d d d f         |d d ddd d d d f         |d d ddd d d d f         }}}d|z  d|z  z   d|z  z   }|S )Nr   r   r   r$   gŏ1w-!?gbX9?gv/? )r   rgbrgbgrays         r   rgb2grayzTernary.rgb2gray$   s    aaa1aaal#SAaCAAA%6AAAqsAAAqqqL8Ia1zFQJ&!3r   c                 N    ||z
  dz  }t          j        |d|z   z  dd          }|S )Nr   皙?r   T)r*   mean)r   t1t2dist	dist_norms        r   hammingzTernary.hamming)   s1    RA~JtsTz2At<<	r   c                     |                                 \  }}}}t          j        |d|d|z  z
  |d|z  z
                                |          }t	          j        ||gdz            }|S )Nr   r      )sizer*   onestype_asr4   pad)	r   tr2   n_hr(   innermasks	            r   
valid_maskzTernary.valid_mask.   sf    VVXX
1a
1aQ[!a'k/BBJJ1MMuUWIM**r   c                     |                      |                     |                    }|                      |                     |                    }|                     ||          |                     |d          z  S )Nr   )r;   rC   rK   rX   )r   img0img1s      r   r   zTernary.forward4   sc    ~~dmmD1122~~dmmD1122||D$''$//$*B*BBBr   )
r   r   r   r
   r;   rC   rK   rX   r   r   r   s   @r   r!   r!      s        9 9 9 9 9    
  
  C C C C C C Cr   r!   c                   $     e Zd Z fdZd Z xZS )SOBELc                 ,   t          t          |                                            t          j        g dg dg dg                                          | _        | j                                        j        | _	        | j        
                    d          
                    d                              t                    | _        | j	        
                    d          
                    d                              t                    | _	        d S )N)r   r   )r   r   r   )r	   r]   r
   r*   r+   r,   kernelXcloneTkernelY	unsqueezer-   r.   r   s    r   r
   zSOBEL.__init__;   s    eT##%%%|JJJJJJ%
   577	 	
 |))++-|--a00::1==@@HH|--a00::1==@@HHr   c           	      D   |j         d         |j         d         |j         d         |j         d         f\  }}}}t          j        |                    ||z  d||          |                    ||z  d||          gd          }t	          j        || j        d          }t	          j        || j        d          }	|d ||z           |||z  d          }}
|	d ||z           |	||z  d          }}t          j        |
|z
            t          j        ||z
            }}||z   }|S )Nr   r   r   r$   )r2   )	shaper*   catr'   r4   r5   ra   rd   abs)r   predr   NCHW	img_stacksobel_stack_xsobel_stack_ypred_Xgt_Xpred_Ygt_YL1XL1Ylosss                    r   r   zSOBEL.forwardF   s"   Z]DJqM4:a=$*Q-O
1aI\\!A#q!Q''AaCAq)A)ABAG G	DL!DDDDL!DDD$TacT*M!A#$$,?$TacT*M!A#$$,?9VD[))59VD[+A+ASCr   r   r   s   @r   r]   r]   :   sL        	I 	I 	I 	I 	I      r   r]   c                         e Zd Zd fd	Z xZS )	MeanShiftr   Tc                    t          |          }t          t          |                               ||d           t	          j        |          }t	          j        |                              ||dd          | j        _	        |ry| j        j	        
                    |                    |ddd                     d|z  t	          j        |          z  | j        _	        | j        j	        
                    |           nV| j        j	                            |                    |ddd                     |t	          j        |          z  | j        _	        d| _        d S )Nr   )kernel_sizer_   F)lenr	   rz   r
   r*   Tensorr&   viewweightdatadiv_r3   mul_requires_grad)r   	data_meandata_std
data_rangenormcstdr   s          r   r
   zMeanShift.__init__T   s$   	NNi''1!'<<<l8$$ 9Q<<,,Q1a88 	BK!!#((1aA"6"6777*_u|I/F/FFDININ$$$$K!!#((1aA"6"6777'%,y*A*AADIN"r   )r   T)r   r   r   r
   r   r   s   @r   rz   rz   S   s=        # # # # # # # # # #r   rz   c                   (     e Zd Zd fd	ZddZ xZS )VGGPerceptualLossr   c                 2   t          t          |                                            g }d}t          j        |          j        | _        t          g dg dd                                          | _	        | 
                                D ]	}d|_        
d S )NT)
pretrained)g
ףp=
?gv/?gCl?)gZd;O?gy&1?g?)r   F)r	   r   r
   modelsvgg19featuresvgg_pretrained_featuresrz   r   	normalize
parametersr   )r   rankblocksr   paramr   s        r   r
   zVGGPerceptualLoss.__init__c   s    &&//111
'-|z'J'J'J'S$"#8#8#8:O:O:OVZ[[[``bb__&& 	( 	(E"'E	( 	(r   Nc                    |                      |          }|                      |          }g d}g d}d}d}t          |d                   D ]} | j        |         |          } | j        |         |          }|dz   |v rO|||         ||                                z
                                                                  z  dz  z  }|dz  }|S )N)r   r#            )g؉؉?g?gL?gm۶m?g@r   r_   r   rE   )r   ranger   r   ri   rF   )r   XYindicesweightskrx   is           r   r   zVGGPerceptualLoss.forwardl   s    NN1NN1$$$>>>wr{## 	 	A/,Q/22A/,Q/22A!
a!((**n%9%9%;%;%@%@%B%BBSHHQr   )r   r   r   r   s   @r   r   r   b   sQ        ( ( ( ( ( (       r   r   __main__r$      r   )r$   r$   r   r   ) r*   numpyr%   torch.nnnntorch.nn.functional
functionalr4   torchvision.modelsr   r.   r   is_availableModuler   r!   r]   Conv2drz   r   r   zerosr,   r-   rZ   r+   randomnormalr[   ternary_lossprintrg   r=   r   r   <module>r      s#                       # # # # # #	
 7 7 9 9Dffu	E	E& & & & &") & & &#C #C #C #C #Cbi #C #C #CL    BI   2# # # # #	 # # #       2 z5;q!S#&&,,..11&99D5<	((	1    ! !!&F 	799L	E,,tT
"
"
())))) r   