o
    Wbf1                     @   s&  d dl Z d dlmZ ddlmZmZmZmZ ddlm	Z	 ddl
mZmZmZ ddlmZ ddlmZmZ ddlmZmZmZmZ dd	d
dd	dg dfddZd#ddZd$ddZdd Zdd Z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 )%    N   )_make_pretrained_beitl16_512_make_pretrained_beitl16_384_make_pretrained_beitb16_384forward_beit)forward_swin)_make_pretrained_swin2l24_384_make_pretrained_swin2b24_384_make_pretrained_swin2t16_256)_make_pretrained_swinl12_384)_make_pretrained_levit_384forward_levit)_make_pretrained_vitb_rn50_384_make_pretrained_vitl16_384_make_pretrained_vitb16_384forward_vitFTignore)`            c
                 C   s  | dkrt |||d}
tg d|||d}|
|fS | dkr2t|||d}
tg d|||d}|
|fS | dkrKt|||d}
tg d|||d}|
|fS | dkrct||d	}
tg d
|||d}|
|fS | dkr{t||d	}
tg d|||d}|
|fS | dkrt||d	}
tg d|||d}|
|fS | dkrt||d	}
tg d
|||d}|
|fS | dkrddlm	} ||d	}
t|	|||d}|
|fS | dkrt
||d	}
tg d|||d}|
|fS | dkrt|||d}
tg d|||d}|
|fS | dkrt||||d}
tg d|||d}|
|fS | dkr,t|||d}
tg d|||d}|
|fS | dkrCt|}
tg d|||d}|
|fS | dkr\t||d}
tg d|||d}|
|fS td|  d J ) Nbeitl16_512)hooksuse_readout)r   r   r   r   )groupsexpandbeitl16_384beitb16_384)r           swin2l24_384)r   )r   r   r    i   swin2b24_384)   r   r   r   swin2t16_256swinl12_384next_vit_large_6mr   )"_make_pretrained_next_vit_large_6m	levit_384)r   r   r    
vitl16_384vitb_rn50_384)r   use_vit_onlyr   )r   r   r    r    
vitb16_384Zresnext101_wsl)r   r   r   i   efficientnet_lite3)
exportable)    0      r   z
Backbone 'z' not implemented)r   _make_scratchr   r   r   r	   r
   r   backbones.next_vitr'   r   r   r   r   _make_pretrained_resnext101_wsl#_make_pretrained_efficientnet_lite3print)backbonefeaturesuse_pretrainedr   r   r.   r   r+   r   in_features
pretrainedscratchr'    r=   LC:\Users\Kristjan\AppData\Local\Programs\Python\MiDaS-master\midas\blocks.py_make_encoder    s   \UNG@92
,%



r?   c           	   	   C   s   t  }|}|}|}t| dkr|}|r(|}|d }|d }t| dkr(|d }t j| d |dddd|d|_t j| d |dddd|d|_t j| d |dddd|d|_t| dkrjt j| d |dddd|d|_|S )	N         r      r   Fkernel_sizestridepaddingbiasr   )nnModulelenConv2d	layer1_rn	layer2_rn	layer3_rn	layer4_rn)	in_shape	out_shaper   r   r<   Z
out_shape1Z
out_shape2Z
out_shape3Z
out_shape4r=   r=   r>   r2      s4   r2   c                 C   s   t jjdd| |d}t|S )Nz"rwightman/gen-efficientnet-pytorchZtf_efficientnet_lite3)r;   r.   )torchhubload_make_efficientnet_backbone)r9   r.   Zefficientnetr=   r=   r>   r5      s   r5   c                 C   sv   t  }t j| j| j| jg| jdd R  |_t j| jdd  |_t j| jdd  |_	t j| jdd  |_
|S )Nr   rA   rC      	   )rI   rJ   
SequentialZ	conv_stembn1Zact1blockslayer1layer2layer3layer4)Zeffnetr;   r=   r=   r>   rV      s   
rV   c                 C   sB   t  }t | j| j| j| j| j|_| j|_| j	|_	| j
|_
|S )N)rI   rJ   rY   conv1rZ   reluZmaxpoolr\   r]   r^   r_   )resnetr;   r=   r=   r>   _make_resnet_backbone   s   rc   c                 C   s   t jdd}t|S )Nzfacebookresearch/WSL-ImagesZresnext101_32x8d_wsl)rS   rT   rU   rc   )r9   rb   r=   r=   r>   r4      s   r4   c                       s*   e Zd ZdZd fdd	Zdd Z  ZS )InterpolatezInterpolation module.
    Fc                    s.   t t|   tjj| _|| _|| _|| _	dS )zrInit.

        Args:
            scale_factor (float): scaling
            mode (str): interpolation mode
        N)
superrd   __init__rI   
functionalinterpolateinterpscale_factormodealign_corners)selfrj   rk   rl   	__class__r=   r>   rf      s
   

zInterpolate.__init__c                 C   s   | j || j| j| jd}|S )z{Forward pass.

        Args:
            x (tensor): input

        Returns:
            tensor: interpolated data
        rj   rk   rl   )ri   rj   rk   rl   )rm   xr=   r=   r>   forward   s   
zInterpolate.forwardF__name__
__module____qualname____doc__rf   rr   __classcell__r=   r=   rn   r>   rd      s    rd   c                       (   e Zd ZdZ fddZdd Z  ZS )ResidualConvUnit!Residual convolution module.
    c                    sL   t    tj||ddddd| _tj||ddddd| _tjdd| _dS )LInit.

        Args:
            features (int): number of features
        rC   r   T)rE   rF   rG   rH   )inplaceN)re   rf   rI   rL   r`   conv2ReLUra   rm   r8   rn   r=   r>   rf      s   
zResidualConvUnit.__init__c                 C   s0   |  |}| |}|  |}| |}|| S )pForward pass.

        Args:
            x (tensor): input

        Returns:
            tensor: output
        )ra   r`   r   rm   rq   outr=   r=   r>   rr   	  s
   
	


zResidualConvUnit.forwardrt   r=   r=   rn   r>   r{      s    r{   c                       rz   )FeatureFusionBlockFeature fusion block.
    c                    s&   t t|   t|| _t|| _dS )r}   N)re   r   rf   r{   resConfUnit1resConfUnit2r   rn   r=   r>   rf     s   
zFeatureFusionBlock.__init__c                 G   sH   |d }t |dkr|| |d 7 }| |}tjj|dddd}|S )CForward pass.

        Returns:
            tensor: output
        r   rA   r   bilinearTrp   )rK   r   r   rI   rg   rh   )rm   xsoutputr=   r=   r>   rr   )  s   
zFeatureFusionBlock.forwardrt   r=   r=   rn   r>   r     s    r   c                       rz   )ResidualConvUnit_customr|   c              	      s   t    || _d| _tj||dddd| jd| _tj||dddd| jd| _| jdkr8t|| _	t|| _
|| _tj | _dS )r}   r   rC   TrD   N)re   rf   bnr   rI   rL   r`   r   BatchNorm2drZ   bn2
activation	quantizedFloatFunctionalskip_add)rm   r8   r   r   rn   r=   r>   rf   C  s   

z ResidualConvUnit_custom.__init__c                 C   sr   |  |}| |}| jdkr| |}|  |}| |}| jdkr(| |}| jdkr2| |}| j	||S )r   Tr   )
r   r`   r   rZ   r   r   r   Z
conv_merger   addr   r=   r=   r>   rr   _  s   










zResidualConvUnit_custom.forwardrt   r=   r=   rn   r>   r   ?  s    r   c                       s0   e Zd ZdZd
 fdd	Zdddd	Z  ZS )FeatureFusionBlock_customr   FTNc           	   	      s   t t|   || _|| _d| _|| _|}| jdkr|d }tj||dddddd| _	t
|||| _t
|||| _tj | _|| _dS )r}   r   TrA   r   rD   N)re   r   rf   deconvrl   r   r   rI   rL   out_convr   r   r   r   r   r   size)	rm   r8   r   r   r   r   rl   r   out_featuresrn   r=   r>   rf     s   

z"FeatureFusionBlock_custom.__init__)r   c                G   s   |d }t |dkr| |d }| j||}| |}|du r+| jdu r+ddi}n|du r5d| ji}nd|i}tjj|fi |d| j	d}| 
|}|S )	r   r   rA   r   Nrj   r   r   )rk   rl   )rK   r   r   r   r   r   rI   rg   rh   rl   r   )rm   r   r   r   resmodifierr=   r=   r>   rr     s&   



z!FeatureFusionBlock_custom.forward)FFFTNrt   r=   r=   rn   r>   r   {  s    r   )r   Frs   )$rS   torch.nnrI   Zbackbones.beitr   r   r   r   Zbackbones.swin_commonr   Zbackbones.swin2r   r	   r
   Zbackbones.swinr   backbones.levitr   r   Zbackbones.vitr   r   r   r   r?   r2   r5   rV   rc   r4   rJ   rd   r{   r   r   r   r=   r=   r=   r>   <module>   s*    


e
!
#'%<