a
    g$                     @   s   d dl Z d dlmZ ddlmZmZmZmZ d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_vitb_rn50_384_make_pretrained_vitl16_384_make_pretrained_vitb16_384forward_vitFTignorec	                 C   s   | dkr,t |||d}	tg d|||d}
n| dkrZt||||d}	tg d|||d}
n| dkrt|||d}	tg d	|||d}
nh| d
krt|}	tg d|||d}
nB| dkrt||d}	tg d|||d}
ntd|  d dsJ |	|
fS )N
vitl16_384)hooksuse_readout)         r   )groupsexpandvitb_rn50_384)r	   use_vit_onlyr
   )r   r      r   
vitb16_384)`        r   Zresnext101_wsl)r   r   r   i   efficientnet_lite3)
exportable)    0      r   z
Backbone 'z' not implementedF)r   _make_scratchr   r   _make_pretrained_resnext101_wsl#_make_pretrained_efficientnet_lite3print)backbonefeaturesuse_pretrainedr   r   r   r	   r   r
   
pretrainedscratch r%   LC:\Games\Steam\steamapps\common\wallpaper_engine\dlc\pymidas\midas\blocks.py_make_encoder   sB    r'   c           	   	   C   s   t  }|}|}|}|}|dkr<|}|d }|d }|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 j| d |dddd|d	|_|S )
NT         r      r   Fkernel_sizestridepaddingbiasr   )nnModule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&   r   1   s.    r   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)r"   r   Zefficientnetr%   r%   r&   r   N   s    r   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   r(   r+      	   )r1   r2   
SequentialZ	conv_stembn1Zact1blockslayer1layer2layer3layer4)Zeffnetr#   r%   r%   r&   r=   X   s    
r=   c                 C   sB   t  }t | j| j| j| j| j|_| j|_| j	|_	| j
|_
|S )N)r1   r2   r@   conv1rA   relumaxpoolrC   rD   rE   rF   )resnetr#   r%   r%   r&   _make_resnet_backbonee   s    rK   c                 C   s   t jdd}t|S )Nzfacebookresearch/WSL-ImagesZresnext101_32x8d_wsl)r:   r;   r<   rK   )r"   rJ   r%   r%   r&   r   r   s    r   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)
superrL   __init__r1   
functionalinterpolateinterpscale_factormodealign_corners)selfrR   rS   rT   	__class__r%   r&   rN   |   s
    
zInterpolate.__init__c                 C   s   | j || j| j| jd}|S )z{Forward pass.

        Args:
            x (tensor): input

        Returns:
            tensor: interpolated data
        rR   rS   rT   )rQ   rR   rS   rT   )rU   xr%   r%   r&   forward   s    
zInterpolate.forward)F__name__
__module____qualname____doc__rN   rZ   __classcell__r%   r%   rV   r&   rL   x   s   rL   c                       s(   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
        r+   r   T)r-   r.   r/   r0   )inplaceN)rM   rN   r1   r3   rG   conv2ReLUrH   rU   r!   rV   r%   r&   rN      s    
zResidualConvUnit.__init__c                 C   s0   |  |}| |}|  |}| |}|| S )pForward pass.

        Args:
            x (tensor): input

        Returns:
            tensor: output
        )rH   rG   re   rU   rY   outr%   r%   r&   rZ      s
    	



zResidualConvUnit.forwardr[   r%   r%   rV   r&   ra      s   ra   c                       s(   e Zd ZdZ fddZdd Z  ZS )FeatureFusionBlockFeature fusion block.
    c                    s&   t t|   t|| _t|| _dS )rc   N)rM   rk   rN   ra   resConfUnit1resConfUnit2rg   rV   r%   r&   rN      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   r(   r   bilinearTrX   )lenrm   rn   r1   rO   rP   )rU   xsoutputr%   r%   r&   rZ      s    
zFeatureFusionBlock.forwardr[   r%   r%   rV   r&   rk      s   rk   c                       s(   e Zd ZdZ fddZdd Z  ZS )ResidualConvUnit_customrb   c              	      s   t    || _d| _tj||dddd| jd| _tj||dddd| jd| _| jdkrpt|| _	t|| _
|| _tj | _dS )rc   r   r+   Tr,   N)rM   rN   bnr   r1   r3   rG   re   BatchNorm2drA   bn2
activation	quantizedFloatFunctionalskip_add)rU   r!   rx   ru   rV   r%   r&   rN      s    

z ResidualConvUnit_custom.__init__c                 C   sr   |  |}| |}| jdkr(| |}|  |}| |}| jdkrP| |}| jdkrd| |}| j	||S )rh   Tr   )
rx   rG   ru   rA   re   rw   r   Z
conv_merger{   addri   r%   r%   r&   rZ     s    










zResidualConvUnit_custom.forwardr[   r%   r%   rV   r&   rt      s   rt   c                       s*   e Zd ZdZd fdd	Zdd Z  ZS )	FeatureFusionBlock_customrl   FTc              	      s   t t|   || _|| _d| _|| _|}| jdkr<|d }tj||dddddd| _	t
|||| _t
|||| _tj | _dS )rc   r   Tr(   r   r,   N)rM   r}   rN   deconvrT   r   r   r1   r3   out_convrt   rm   rn   ry   rz   r{   )rU   r!   rx   r~   ru   r   rT   out_featuresrV   r%   r&   rN   '  s    
z"FeatureFusionBlock_custom.__init__c                 G   s^   |d }t |dkr0| |d }| j||}| |}tjj|dd| jd}| 	|}|S )ro   r   r(   r   rp   rX   )
rq   rm   r{   r|   rn   r1   rO   rP   rT   r   )rU   rr   rs   resr%   r%   r&   rZ   @  s    


z!FeatureFusionBlock_custom.forward)FFFTr[   r%   r%   rV   r&   r}   #  s   r}   )r   FTNFr   )r   F)F)r:   torch.nnr1   Zvitr   r   r   r   r'   r   r   r=   rK   r   r2   rL   ra   rk   rt   r}   r%   r%   r%   r&   <module>   s   
&


#'%<