o
    Wbfl                     @   s~   d dl Z d dlZd dlmZ d dlZddlmZmZm	Z	 dd Z
g dddgfdd	ZG d
d dejZdd ZdddZdS )    N   )activationsget_activation	Transposec                 C   sR   | j | | jd }| jd }| jd }| |}| |}| |}|||fS )N123)modelforward_featuresr   act_postprocess1act_postprocess2act_postprocess3)
pretrainedxlayer_1layer_2layer_3 r   UC:\Users\Kristjan\AppData\Local\Programs\Python\MiDaS-master\midas\backbones\levit.pyforward_levit	   s   






r               c                 C   s  t  }| |_|jj|d  td |jj|d  td |jj|d  td t|_tj|t	d}t 
tddt dt| |_t 
tddt dtt|d t	 |_t 
tddt dtt|d t	 |_|S )	Nr   r   r   r      r   )dtype   )nnModuler	   blocksregister_forward_hookr   r   nparrayint
Sequentialr   	UnflattentorchSizetolistr   ceilastyper   r   )r	   hooks
patch_gridr   patch_grid_sizer   r   r   _make_levit_backbone   s(   $$r/   c                       s6   e Zd ZdZ		d fdd	Ze dd Z  ZS )	ConvTransposeNormz
    Modification of
        https://github.com/rwightman/pytorch-image-models/blob/master/timm/models/levit.py: ConvNorm
    such that ConvTranspose2d is used instead of Conv2d.
    r   r   c	           	         sT   t    | dtj|||||||dd | dt| tj| jj	| d S )NcF)biasbn)
super__init__
add_moduler   ConvTranspose2dBatchNorm2dinit	constant_r3   weight)	selfin_chsout_chskernel_sizestridepaddilationgroupsbn_weight_init	__class__r   r   r5   >   s   
zConvTransposeNorm.__init__c              	   C   s   | j  \}}|j|j|j d  }|j|d d d d d f  }|j|j|j |j|j d   }tj|	d|	d|j
dd  | jj| jj| jj| jjd}|jj| |jj| |S )Ng      ?r   r   r   )r@   paddingrB   rC   )_modulesvaluesr;   running_varepsr2   running_meanr   r7   sizeshaper1   r@   rG   rB   rC   datacopy_)r<   r1   r3   wbmr   r   r   fuseH   s   ""zConvTransposeNorm.fuse)r   r   r   r   r   r   )	__name__
__module____qualname____doc__r5   r'   no_gradrT   __classcell__r   r   rE   r   r0   7   s    
r0   c              
   C   s0   t t| |ddd| t||d ddd| S )z
    Modification of
        https://github.com/rwightman/pytorch-image-models/blob/master/timm/models/levit.py: stem_b16
    such that ConvTranspose2d is used instead of Conv2d and stem is also reduced to the half.
    r   r   r   )r   r%   r0   )r=   r>   
activationr   r   r   stem_b4_transposeV   s   r\   c                 C   s.   t jd| d}|d krg dn|}t||dS )N	levit_384)r   r   )r,   )timmcreate_modelr/   )r   r,   r	   r   r   r   _make_pretrained_levit_384c   s   r`   )N)r^   r'   torch.nnr   numpyr"   utilsr   r   r   r   r/   r%   r0   r\   r`   r   r   r   r   <module>   s    
 