o
    oi                  	   @   s   d dl mZmZmZmZmZ d dlm  mZ	 d dl
mZ d dlmZmZ ddededed	ejfd
dZddededed	ejfddZG dd deZG dd dejZG dd dejZdS )    )AnyDictListTypeUnionN)nn)ModuleTensor   	in_planes
out_planesstridereturnc                 C      t j| |d|dddS )z 1x1 convolution without padding.r
   r   Fkernel_sizer   paddingbiasr   Conv2dr   r   r    r   \/home/ubuntu/.local/lib/python3.10/site-packages/kornia/feature/loftr/backbone/resnet_fpn.pyconv1x1      r   c                 C   r   )z3x3 convolution with padding.   r
   Fr   r   r   r   r   r   conv3x3   r   r   c                	       sB   e Zd Zddedededdf fddZd	edefd
dZ  ZS )
BasicBlockr
   r   planesr   r   Nc                    s~   t    t|||| _t||| _t|| _t|| _tj	dd| _
|dkr.d | _d S tt|||dt|| _d S )NTinplacer
   r   )super__init__r   conv1conv2r   BatchNorm2dbn1bn2ReLUrelu
downsample
Sequentialr   )selfr   r   r   	__class__r   r   r#   %   s   

"zBasicBlock.__init__xc                 C   sL   |}|  | | |}| | |}| jd ur| |}|  || S )N)r*   r'   r$   r(   r%   r+   )r-   r0   yr   r   r   forward2   s   

zBasicBlock.forwardr
   )__name__
__module____qualname__intr#   r	   r2   __classcell__r   r   r.   r   r   $   s     r   c                	       r   e Zd ZdZdeeef ddf fddZddee	e
 ef d	ed
edejfddZdedee fddZ  ZS )ResNetFPN_8_2zQResNet+FPN, output resolution are 1/8 and 1/2.

    Each block has 2 layers.
    configr   Nc              	      s  t    t}|d }|d }|| _tjd|ddddd| _t|| _tj	d	d
| _
| j||d dd| _| j||d dd| _| j||d dd| _t|d |d | _t|d |d | _tt|d |d t|d t t|d |d | _t|d |d | _tt|d |d t|d t t|d |d | _|  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 qd S Ninitial_dim
block_dimsr
         r   Fr   Tr   r   r!   fan_outr*   )modenonlinearity) r"   r#   r   r   r   r   r$   r&   r'   r)   r*   _make_layerlayer1layer2layer3r   layer3_outconvlayer2_outconvr,   r   	LeakyReLUlayer2_outconv2layer1_outconvlayer1_outconv2modules
isinstanceinitkaiming_normal_weight	GroupNorm	constant_r   r-   r;   blockr=   r>   mr.   r   r   r#   C   sD   
zResNetFPN_8_2.__init__r
   rV   dimr   c                 C   6   || j ||d}|||dd}||f}|| _ tj| S Nr!   r
   r   r   r,   r-   rV   rX   r   rE   rF   layersr   r   r   rD   n   
   
zResNetFPN_8_2._make_layerr0   c                 C   s   |  | | |}| |}| |}| |}| |}| |}tj	||j
dd  ddd}| || }| |}	tj	||	j
dd  ddd}
| |	|
 }	||	gS )Nr@   bilinearT)sizerB   align_corners)r*   r'   r$   rE   rF   rG   rH   rI   FinterpolateshaperK   rL   rM   )r-   r0   x0x1x2x3x3_outx2_out	x3_out_2xx1_out	x2_out_2xr   r   r   r2   v   s   





zResNetFPN_8_2.forwardr3   r4   r5   r6   __doc__r   strr   r#   r   r   r   r   r7   r   r,   rD   r	   r   r2   r8   r   r   r.   r   r:   =   s
    *+r:   c                	       r9   )ResNetFPN_16_4zRResNet+FPN, output resolution are 1/16 and 1/4.

    Each block has 2 layers.
    r;   r   Nc              	      s  t    t}|d }|d }|| _tjd|ddddd| _t|| _tj	d	d
| _
| j||d dd| _| j||d dd| _| j||d dd| _| j||d dd| _t|d |d | _t|d |d | _tt|d |d t|d t t|d |d | _t|d |d | _tt|d |d t|d t t|d |d | _|  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 qd S r<   )!r"   r#   r   r   r   r   r$   r&   r'   r)   r*   rD   rE   rF   rG   layer4r   layer4_outconvrH   r,   r   rJ   layer3_outconv2rI   rK   rN   rO   rP   rQ   rR   rS   rT   r   rU   r.   r   r   r#      sF   
zResNetFPN_16_4.__init__r
   rV   rX   r   c                 C   rY   rZ   r[   r\   r   r   r   rD      r^   zResNetFPN_16_4._make_layerr0   c                 C   s   |  | | |}| |}| |}| |}| |}| |}tj	|dddd}| 
|}	| |	| }	tj	|	dddd}
| |}| ||
 }||gS )Ng       @r_   T)scale_factorrB   ra   )r*   r'   r$   rE   rF   rG   rr   rs   rb   rc   rH   rt   rI   rK   )r-   r0   re   rf   rg   rh   x4x4_out	x4_out_2xri   rk   rj   r   r   r   r2      s   






zResNetFPN_16_4.forwardr3   rn   r   r   r.   r   rq      s
    *-rq   r3   )typingr   r   r   r   r   torch.nn.functionalr   
functionalrb   torchkornia.corer   r	   r7   r   r   r   r   r:   rq   r   r   r   r   <module>   s   N