a
    dl,                     @   s   U d dl mZmZmZmZmZ d dlZd dlmZ i Z	ee
e
f ed< de	d< de	d< deeeejd	d
dZdeeeeeejdddZG dd dejZG dd dejZG dd dejZG dd dejZG dd dejZdS )    )CallableDictListOptionalTypeN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nnConv2d)r   r   r    r   ]/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/kornia/feature/defmo.pyconv1x1   s    r   )r   r   r   groupsdilationr   c              
   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                       sj   e Zd ZU dZeed< deeeeej eeeee	dejf  dd	 fdd	Z
ejejd
ddZ  ZS )
Bottleneck   	expansionr
   N@   .)	inplanesplanesr   
downsampler   
base_widthr   
norm_layerr   c	           
         s   t    |d u rtj}t||d  | }	t||	| _||	| _t|	|	|||| _	||	| _
t|	|| j | _||| j | _tjdd| _|| _|| _d S )Ng      P@TZ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__xr   c                 C   s~   |}|  |}| |}| |}| |}| |}| |}| |}| |}| jd urh| |}||7 }| |}|S N)r*   r+   r1   r,   r-   r.   r/   r"   )r2   r7   identityoutr   r   r   forwardE   s    










zBottleneck.forward)r
   Nr
   r   r
   N)__name__
__module____qualname__r   r)   __annotations__r   r   Moduler   r'   torchTensorr;   __classcell__r   r   r4   r   r   "   s&   
      r   c                       s   e Zd Zdee ee eeeeeee  ee	de
jf  dd	 fdd	Zdee eeeee
jd
ddZejejdddZejejd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rTt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rdtjj |	j!ddd n4t|	tjtj"fr<tj#|	j!d tj#|	j$d q<|r|  D ]$}	t|	t%rtj#|	j&j!d qd S )Nr   r
   )FFFr   zHreplace_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
   Zfan_outr1   )modeZnonlinearity)'r&   r'   r   r(   _norm_layerr    r   len
ValueErrorformatr   r#   r   r*   r+   r0   r1   Z	MaxPool2dmaxpool_make_layerlayer1layer2layer3layer4ZAdaptiveAvgPool2davgpoolZLinearr   fcmodules
isinstanceinitZkaiming_normal_ZweightZ	GroupNormZ	constant_r   r   r/   )
r2   rF   rG   rH   rI   r   rJ   rK   r$   mr4   r   r   r'   ]   sH    
zResNet.__init__)rF   r!   blocksr   rP   r   c                 C   s   | j }d }| j}|r&|  j|9  _d}|dks>| j||j krdtt| j||j ||||j }g }	|	|| j|||| j| j	|| ||j | _t
d|D ]&}
|	|| j|| j| j	| j|d qtj|	 S )Nr
   )r   r#   r   r$   )rS   r   r    r   r   
Sequentialr   appendr   r#   range)r2   rF   r!   rc   r   rP   r$   r"   Zprevious_dilationrG   _r   r   r   rX      s:    zResNet._make_layerr6   c                 C   st   |  |}| |}| |}| |}| |}| |}| |}| |}| |}t	
|d}| |}|S )Nr
   )r*   r+   r1   rW   rY   rZ   r[   r\   r]   rA   flattenr^   r2   r7   r   r   r   _forward_impl   s    









zResNet._forward_implc                 C   s
   |  |S r8   )rj   ri   r   r   r   r;      s    zResNet.forward)rE   Fr
   r   NN)r
   F)r<   r=   r>   r   r   r   r)   boolr   r   r   r@   r'   rd   rX   rA   rB   rj   r;   rC   r   r   r4   r   rD   \   s0         
8 #rD   c                       s0   e Zd Z fddZejejdddZ  ZS )EncoderDeFMOc                    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      rm   r   )rL   rL   )rM   rM   )r   r   FrN   r   )
r&   r'   rD   r   r   rd   listchildrenr   net)r2   modelZmodelc1Zmodelc2r4   r   r   r'      s    
zEncoderDeFMO.__init__
input_datar   c                 C   s
   |  |S r8   )rq   )r2   rt   r   r   r   r;      s    zEncoderDeFMO.forwardr<   r=   r>   r'   rA   rB   r;   rC   r   r   r4   r   rl      s   rl   c                       s0   e Zd Z fddZejejdddZ  ZS )RenderingDeFMOc                    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
   FrN   gh㈵>g?T)ZepsZmomentumZaffineZtrack_running_statsr%   rQ   rM   r      r   r   )r&   r'   Z	tsr_stepsr   rd   r   r(   r0   r   ZPixelShufflerq   rA   Zlinspacetimes)r2   rr   r4   r   r   r'      s(    


zRenderingDeFMO.__init__)latentr   c           	      C   s   | j |jd|jd d}g }t|jd D ]r}|dd t|jd D |f ddddd|jd |jd }t||fd}| 	|}|
| q4t|d }t|d d d d d df |d d d d d df< |S )	Nr   r
   c                 S   s   g | ]}|qS r   r   ).0r7   r   r   r   
<listcomp>       z*RenderingDeFMO.forward.<locals>.<listcomp>rM   r   r   )ry   toZdeviceZ	unsqueezerepeatshaperf   rA   catrq   re   stack
contiguousZsigmoid)	r2   rz   ry   ZrendersZkiZt_tensorZlatentiresultZrenders_stackedr   r   r   r;      s&    " 	
6zRenderingDeFMO.forwardru   r   r   r4   r   rv      s   rv   c                       s>   e Zd ZdZd
edd fddZejejd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
    FN)
pretrainedr   c                    sz   t    t | _t | _|rndd }tjjt	d |d}| jj
|dd tjjt	d |d}| jj
|dd |   d S )Nc                 S   s   | S r8   r   )Zstoragelocr   r   r   <lambda>"  r}   z DeFMO.__init__.<locals>.<lambda>r   )Zmap_locationT)strictr	   )r&   r'   rl   encoderrv   	renderingrA   ZhubZload_state_dict_from_urlr   Zload_state_dicteval)r2   r   Zstorage_fcnZpretrained_dictZpretrained_dict_renr4   r   r   r'     s    
zDeFMO.__init__rs   c                 C   s   |  |}| |}|S r8   )r   r   )r2   rt   rz   Zx_outr   r   r   r;   )  s    

zDeFMO.forward)F)
r<   r=   r>   __doc__rk   r'   rA   rB   r;   rC   r   r   r4   r   r     s   r   )r
   )r
   r
   r
   )typingr   r   r   r   r   rA   Ztorch.nnr   r   strr?   r)   r   r   r   r@   r   rD   rl   rv   r   r   r   r   r   <module>   s   :q,