o
    oi/.                     @   s  U d dl mZmZmZmZmZ d dlZd dlmZ d dlm	Z	m
Z
mZmZ i Zeeef ed< ded< ded	< ddedededejfddZd dedededededejfddZG dd de	ZG dd de	ZG dd de	ZG dd de	ZG dd de	ZdS )!    )CallableDictListOptionalTypeN)nn)ModuleTensorconcatenatestackurlszMhttp://ptak.felk.cvut.cz/personal/rozumden/defmo_saved_models/encoder_best.ptdefmo_encoderzOhttp://ptak.felk.cvut.cz/personal/rozumden/defmo_saved_models/rendering_best.ptdefmo_rendering   	in_planes
out_planesstridereturnc                 C   s   t j| |d|ddS )z1x1 convolution.r   F)kernel_sizer   biasr   Conv2d)r   r   r    r   H/home/ubuntu/.local/lib/python3.10/site-packages/kornia/feature/defmo.pyconv1x1"   s   r   groupsdilationc              
   C   s   t j| |d|||d|dS )z3x3 convolution with padding.   F)r   r   paddingr   r   r   r   )r   r   r   r   r   r   r   r   conv3x3'   s   r   c                       s   e Zd ZU dZeed< 						ddededed	ee d
edededeedef  ddf fddZ	de
de
fddZ  ZS )
Bottleneck   	expansionr   N@   inplanesplanesr   
downsampler   
base_widthr   
norm_layer.r   c	           
         s   t    |d u rtj}t||d  | }	t||	| _||	| _t|	|	|||| _	||	| _
t|	|| j | _||| j | _tjdd| _|| _|| _d S )Ng      P@Tinplace)super__init__r   BatchNorm2dintr   conv1bn1r   conv2bn2r"   conv3bn3ReLUrelur&   r   )
selfr$   r%   r   r&   r   r'   r   r(   width	__class__r   r   r,   >   s   



zBottleneck.__init__xc                 C   s~   |}|  |}| |}| |}| |}| |}| |}| |}| |}| jd ur4| |}||7 }| |}|S N)r/   r0   r6   r1   r2   r3   r4   r&   )r7   r;   identityoutr   r   r   forwardX   s   










zBottleneck.forward)r   Nr   r#   r   N)__name__
__module____qualname__r"   r.   __annotations__r   r   r   r,   r	   r?   __classcell__r   r   r9   r   r    5   s8   
 	
r    c                       s   e Zd Z						ddee dee ded	ed
ededeee  dee	de
f  ddf fddZ	ddee dededededejfddZdedefddZdedefddZ  ZS )ResNet  Fr   r#   Nblocklayersnum_classeszero_init_residualr   width_per_groupreplace_stride_with_dilationr(   .r   c	           
         s  t    |d u rtj}|| _d| _d| _|d u rg d}t|dkr*td| || _	|| _
tjd| jddddd	| _|| j| _tjd
d| _tjdddd| _| |d|d | _| j|d|d d|d d| _| j|d|d d|d d| _| j|d|d d|d d| _td| _td|j || _|  D ],}	t|	tjrtjj|	j ddd qt|	tjtj!frtj"|	j d tj"|	j#d q|r|  D ]}	t|	t$rt|	j%j t&rtj"|	j%j d qd S d S )Nr#   r   )FFFr   zFreplace_stride_with_dilation should be None or a 3-element tuple, got       Fr   r   r   r   Tr)   )r   r   r   r      )r   dilate   i   )r   r   fan_outr6   )modenonlinearity)'r+   r,   r   r-   _norm_layerr$   r   len
ValueErrorr   r'   r   r/   r0   r5   r6   	MaxPool2dmaxpool_make_layerlayer1layer2layer3layer4AdaptiveAvgPool2davgpoolLinearr"   fcmodules
isinstanceinitkaiming_normal_weight	GroupNorm	constant_r   r    r4   r	   )
r7   rG   rH   rI   rJ   r   rK   rL   r(   mr9   r   r   r,   p   sL   
zResNet.__init__r%   blocksr   rQ   c                 C   s   | j }d }| j}|r|  j|9  _d}|dks| j||j kr2tt| j||j ||||j }g }	|	|| j|||| j| j	|| ||j | _t
d|D ]}
|	|| j|| j| j	| j|d qPtj|	 S )Nr   )r   r'   r   r(   )rV   r   r$   r"   r   
Sequentialr   appendr   r'   range)r7   rG   r%   rl   r   rQ   r(   r&   previous_dilationrH   _r   r   r   r[      s:   
zResNet._make_layerr;   c                 C   st   |  |}| |}| |}| |}| |}| |}| |}| |}| |}t	
|d}| |}|S )Nr   )r/   r0   r6   rZ   r\   r]   r^   r_   ra   torchflattenrc   r7   r;   r   r   r   _forward_impl   s   









zResNet._forward_implc                 C   
   |  |S r<   )ru   rt   r   r   r   r?         
zResNet.forward)rF   Fr   r#   NN)r   F)r@   rA   rB   r   r    r   r.   boolr   r   r   r,   r   rm   r[   r	   ru   r?   rD   r   r   r9   r   rE   o   sT    
	
7
#rE   c                       0   e Zd Zd fddZdedefddZ  ZS )	EncoderDeFMOr   Nc                    sx   t    ttg d}tjt| d d  }tjt| dd  }tjddddd	d
d|d< t||| _	d S )N)r   r!      r   r   r!      r{   r#   )rM   rM   )rN   rN   )r   r   FrO   r   )
r+   r,   rE   r    r   rm   listchildrenr   net)r7   modelmodelc1modelc2r9   r   r   r,      s   
zEncoderDeFMO.__init__
input_datac                 C   rv   r<   )r   )r7   r   r   r   r   r?      rw   zEncoderDeFMO.forwardr   Nr@   rA   rB   r,   r	   r?   rD   r   r   r9   r   rz      s    rz   c                       ry   )	RenderingDeFMOr   Nc                    s   t    d| _ttjdddddddtjddd	d
d
dtjd
dtddt	dtddt	dtddt	dtjdddddddt	dtjdddddd
dtjd
dtjdddddd
d}|| _
tdd| j| _d S )N   i  i   r   r   FrO   gh㈵>g?T)epsmomentumaffinetrack_running_statsr)   rR   rN   r#      r!   r   )r+   r,   	tsr_stepsr   rm   r   r-   r5   r    PixelShuffler   rr   linspacetimes)r7   r   r9   r   r   r,      s(   


zRenderingDeFMO.__init__latentc           	      C   s   | j |jd|jd d}g }t|jd D ]5}|tt|jd |f ddddd|jd |jd }t||fd}| 	|}|
| qt|d }t|d d d d d df |d d d d d df< |S )Nr   r   rN   r   r!   )r   todevice	unsqueezerepeatshapero   r}   r
   r   rn   r   
contiguousrr   sigmoid)	r7   r   r   renderskit_tensorlatentiresultrenders_stackedr   r   r   r?     s   "
6zRenderingDeFMO.forwardr   r   r   r   r9   r   r      s    r   c                       s>   e Zd ZdZddeddf fddZdedefd	d
Z  ZS )DeFMOa  Module that disentangle a fast-moving object from the background and performs deblurring.

    This is based on the original code from paper "DeFMO: Deblurring and Shape Recovery
        of Fast Moving Objects". See :cite:`DeFMO2021` for more details.

    Args:
        pretrained: Download and set pretrained weights to the model. Default: false.

    Returns:
        Temporal super-resolution without background.
    Shape:
        - Input: (B, 6, H, W)
        - Output: (B, S, 4, H, W)

    Examples:
        >>> import kornia
        >>> input = torch.rand(2, 6, 240, 320)
        >>> defmo = kornia.feature.DeFMO()
        >>> tsr_nobgr = defmo(input) # 2x24x4x240x320

    F
pretrainedr   Nc                    s~   t    t | _t | _|r9tjjt	d t
dd}| jj|dd tjjt	d t
dd}| jj|dd |   d S )Nr   cpu)map_locationT)strictr   )r+   r,   rz   encoderr   	renderingrr   hubload_state_dict_from_urlr   r   load_state_dicteval)r7   r   pretrained_dictpretrained_dict_renr9   r   r   r,   -  s   
zDeFMO.__init__r   c                 C   s   |  |}| |}|S r<   )r   r   )r7   r   r   x_outr   r   r   r?   >  s   

zDeFMO.forward)F)	r@   rA   rB   __doc__rx   r,   r	   r?   rD   r   r   r9   r   r     s    r   )r   )r   r   r   )typingr   r   r   r   r   rr   r   kornia.corer   r	   r
   r   r   strrC   r.   r   r   r   r    rE   rz   r   r   r   r   r   r   <module>   s   &:p*