o
    oiY                     @   sx   d dl mZmZmZ d dlZd dlmZ d dlmZmZ ddl	m
Z
 G dd deZG d	d
 d
eZG dd deZdS )    )AnyOptionalTupleN)nn)ModuleTensor   )vgg19_bnc                       sB   e Zd Zdejfdedejddf fddZdefd	d
Z	  Z
S )VGG19Famp	amp_dtypereturnNc                    s2   t    tt jd d | _|| _|| _d S )N(   )	super__init__r   
ModuleListr	   featureslayersr   r   )selfr   r   	__class__ Q/home/ubuntu/.local/lib/python3.10/site-packages/kornia/feature/dedode/encoder.pyr      s   

zVGG19.__init__xc                 K   s   t jd| j| jd/ g }g }| jD ]}t|tjr)|| ||j	dd   ||}q||fW  d    S 1 s<w   Y  d S )Ncuda)enableddtype)
torchautocastr   r   r   
isinstancer   	MaxPool2dappendshape)r   r   kwargsfeatssizeslayerr   r   r   forward$   s   


$zVGG19.forward)__name__
__module____qualname__r   float16boolr   r   r   r(   __classcell__r   r   r   r   r
      s    $r
   c                       sH   e Zd Zdejdfdedejdee f fddZ	de
fd	d
Z  ZS )FrozenDINOv2TNr   r   dinov2_weightsc                    s   t    |d u rtjjddd}ddlm} tdddd	d
d}|di | }|	| || _
|| _| j
r=|| j}|g| _d S )NzNhttps://dl.fbaipublicfiles.com/dinov2/dinov2_vitl14/dinov2_vitl14_pretrain.pthcpu)map_locationr   )	vit_largei     g      ?mlpr   )img_size
patch_sizeinit_values	ffn_layerblock_chunksr   )r   r   r   hubload_state_dict_from_urltransformerr3   dictevalload_state_dictr   r   todinov2_vitl14)r   r   r   r0   r3   
vit_kwargsrB   r   r   r   r   1   s(   

zFrozenDINOv2.__init__r   c                 C   s   |j \}}}}| jd j|jkr | jd |j| j| jd< t ' | jd || j}|d ddd	|d|d |d }W d    n1 sNw   Y  |
 g|d |d fgfS )Nr   x_norm_patchtokens   r   i   r4   )r#   rB   devicerA   r   r   inference_modeforward_featurespermutereshapeclone)r   r   B_CHWdinov2_features_16features_16r   r   r   r(   H   s    
(zFrozenDINOv2.forward)r)   r*   r+   r   r,   r-   r   r   r   r   r   r(   r.   r   r   r   r   r/   0   s    *r/   c                       s@   e Zd Zd fdd	Zdedeeeeef f fddZ  ZS )	
VGG_DINOv2Nc                    sF   |d u s|d u rt dt   tdi || _tdi || _d S )NzInput kwargs pleaser   )
ValueErrorr   r   r
   vggr/   frozen_dinov2)r   
vgg_kwargsdinov2_kwargsr   r   r   r   S   s
   
zVGG_DINOv2.__init__r   r   c                 C   s,   |  |\}}| |\}}|| || fS )N)rT   rU   )r   r   	feats_vgg	sizes_vggfeat_dinov2size_dinov2r   r   r   r(   Z   s   zVGG_DINOv2.forward)NN)	r)   r*   r+   r   r   r   intr(   r.   r   r   r   r   rR   R   s    *rR   )typingr   r   r   r   r   kornia.corer   r   rT   r	   r
   r/   rR   r   r   r   r   <module>   s   "