o
    Wbf                  	   @   s   d dl Z d dlmZ d dlZd dlZd dlZd dlm  mZ ddl	m
Z
mZmZmZmZmZ dd Zdd Zdd	 Zg d
ddgg dddddfddZdddZdddZg dddgg ddddgddddf	ddZ	dddZdS )     N   )activationsforward_adapted_unflattenget_activationget_readout_opermake_backbone_default	Transposec                 C   s   t | |dS )Nforward_flex)r   )
pretrainedx r   SC:\Users\Kristjan\AppData\Local\Programs\Python\MiDaS-master\midas\backbones\vit.pyforward_vit   s   r   c                 C   s   |d d d | j f |d| j d f }}ttt|}|d||ddddd}tj|||fdd}|ddddd|| d}t	j
||gdd}|S )	Nr   r         bilinear)sizemodedim)start_indexintmathsqrtlenreshapepermuteFinterpolatetorchcat)selfposembZgs_hZgs_wZ
posemb_tokposemb_gridgs_oldr   r   r   _resize_pos_embed   s   r&   c                 C   s4  |j \}}}}| | j|| jd  || jd  }|j d }t| jdr5| j|}t|tt	fr5|d }| j
|ddd}t| dd d ure| j|dd}| j|dd}	tj||	|fdd}n| jrl|| }| j|dd}tj||fdd}| js|| }| |}| jD ]}
|
|}q| |}|S )Nr   r   backboner   r   
dist_tokenr   )shaper&   	pos_embed
patch_sizehasattrpatch_embedr'   
isinstancelisttupleprojflatten	transposegetattr	cls_tokenexpandr(   r    r!   no_embed_classpos_dropblocksnorm)r"   r   bchwr*   B
cls_tokensr(   blkr   r   r   r	   !   s:   




r	   `           rE   r            rF   ignorec           	   	   C   s>   t | |||||||}tt|j|j_tt|j|j_|S )N)r   types
MethodTyper	   modelr&   )	rN   featuresr   hooksvit_featuresuse_readoutr   start_index_readoutr
   r   r   r   _make_vit_b16_backboneK   s   
rT   c                 C   s8   t jd| d}|d krg dn|}t|g d|d|dS )Nvit_large_patch16_384r
   )rH   rJ         )         r[   r[   )rO   rP   rQ   rR   timmcreate_modelrT   r
   rR   rP   rN   r   r   r   _make_pretrained_vitl16_384b   s   r`   c                 C   s6   t jd| d}|d krg dn|}t|g d||dS )Nvit_base_patch16_384rV   rG   rB   )rO   rP   rR   r\   r_   r   r   r   _make_pretrained_vitb16_384o   s
   rb   rY   rZ   rF   rF   r   r   rI   rJ      r   Fc
                 C   s  t  }
| |
_|rdn|}t|D ]}|
jjjj| tt	|d  qt|dD ]}|
jj
||  tt	|d  q*t|
_t||||	}t|D ]}t t  t  t  }td|d  d qLt|dD ]s}||k rt j|| || dd|  dd|  ddddd}n||krt j|d	 |d	 d	ddd
}nd }|| tddt dt|d d |d d gt j||| dddd
g}|d ur|| t j| }td|d  d qk|	|
j_||
j_tt|
j|
j_tt|
j|
j_|
S )Nr   r      zpretrained.act_postprocessz=valuer   T)in_channelsout_channelskernel_sizestridepaddingbiasdilationgroupsr   )rg   rh   ri   rj   rk   re   )nnModulerN   ranger-   r'   stagesregister_forward_hookr   strr9   r   r   
SequentialIdentityexecConvTranspose2dConv2dr   	Unflattenr    Sizeappendr   r+   rL   rM   r	   r&   )rN   rO   r   rP   rQ   r+   Znumber_stagesuse_vit_onlyrR   r   r
   Zused_number_stagessreadout_opervaluefinal_layerlayersr   r   r   _make_vit_b_rn50_backbonex   sr   $


$

r   c                 C   s>   t jd| d}|d krg dn|}t|g dddg|||dS )Nvit_base_resnet50_384rV   rd   rc   rE   )rO   r   rP   r}   rR   )r]   r^   r   )r
   rR   rP   r}   rN   r   r   r   _make_pretrained_vitb_rn50_384   s   r   )rK   N)rK   NF)r    torch.nnro   r]   rL   r   Ztorch.nn.functional
functionalr   utilsr   r   r   r   r   r   r   r&   r	   rT   r`   rb   r   r   r   r   r   r   <module>   s@     ,



Y