o
    Wbft                     @   s   d dl Z d dlm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i Zd
d Z	dddZ
dddZdddZg dddgg dddddfddZdS )    Nc                       &   e Zd Zd fdd	Zdd Z  ZS )Slice   c                       t t|   || _d S N)superr   __init__start_indexselfr	   	__class__ UC:\Users\Kristjan\AppData\Local\Programs\Python\MiDaS-master\midas\backbones\utils.pyr         
zSlice.__init__c                 C   s   |d d | j d f S r   )r	   r   xr   r   r   forward   s   zSlice.forwardr   __name__
__module____qualname__r   r   __classcell__r   r   r   r   r          r   c                       r   )
AddReadoutr   c                    r   r   )r   r   r   r	   r
   r   r   r   r      r   zAddReadout.__init__c                 C   s`   | j dkr|d d df |d d df  d }n|d d df }|d d | j d f |d S )N   r   r   )r	   	unsqueeze)r   r   readoutr   r   r   r      s   
& zAddReadout.forwardr   r   r   r   r   r   r      r   r   c                       r   )ProjectReadoutr   c                    s6   t t|   || _ttd| |t | _d S )Nr   )	r   r   r   r	   nn
SequentialLinearGELUproject)r   in_featuresr	   r   r   r   r      s   "zProjectReadout.__init__c                 C   sZ   |d d df  d|d d | jd f }t|d d | jd f |fd}| |S )Nr   r   )r   	expand_asr	   torchcatr$   )r   r   r   featuresr   r   r   r   #   s   ."
zProjectReadout.forwardr   r   r   r   r   r   r      s    r   c                       s$   e Zd Z fddZdd Z  ZS )	Transposec                    s   t t|   || _|| _d S r   )r   r+   r   dim0dim1)r   r,   r-   r   r   r   r   +   s   
zTranspose.__init__c                 C   s   | | j| j}|S r   )	transposer,   r-   r   r   r   r   r   0   s   zTranspose.forwardr   r   r   r   r   r+   *   s    r+   c                    s    fdd}|S )Nc                    s   |t  < d S r   )activations)modelinputoutputnamer   r   hook9   s   zget_activation.<locals>.hookr   )r4   r5   r   r3   r   get_activation8   s   r6   forward_featuresc                 C   s   t d| d | jd }| jd }| jd }| jd }t| dr&| |}t| dr0| |}t| d	r:| |}t| d
rD| |}||||fS )Nzpretrained.model.(x)1234act_postprocess1act_postprocess2act_postprocess3act_postprocess4)execr/   hasattrr=   r>   r?   r@   )
pretrainedr   function_namelayer_1layer_2layer_3layer_4r   r   r   forward_default?   s   











rI   c                 C   sv  |j \}}}}td| d | jd }| jd }| jd }	| jd }
| jdd |}| jdd |}| jdd |	}	| jdd |
}
tt	dt
|| jjd	  || jjd  g}|jd
krj||}|jd
krs||}|	jd
kr|||	}	|
jd
kr||
}
| jd
t| j |}| jd
t| j |}| jd
t| j |	}	| jd
t| j |
}
|||	|
fS )Nzglob = pretrained.model.r8   r9   r:   r;   r<   r   r   r      )shaperA   r/   r=   r>   r?   r@   r    r!   	Unflattenr(   Sizer0   
patch_sizendimlen)rC   r   rD   bchwrE   rF   rG   rH   	unflattenr   r   r   forward_adapted_unflattenS   sB   







rV   r   c                    sf   |dkrt  gt| }|S |dkrt gt| }|S |dkr. fdd|D }|S 	J d)Nignoreaddr$   c                    s   g | ]}t  qS r   )r   ).0Zout_featr	   vit_featuresr   r   
<listcomp>   s    
z$get_readout_oper.<locals>.<listcomp>FzSwrong operation for readout token, use_readout can be 'ignore', 'add', or 'project')r   rP   r   )r[   r*   use_readoutr	   readout_operr   rZ   r   get_readout_oper   s   
r_   )`           rb   )r            rc   rW   c           
      C   sD  t  }| |_|jj|d  td |jj|d  td |jj|d  td |jj|d  td t|_t||||}	t |	d t	ddt 
dt|d d	 |d d	 gt j||d dddd
t j|d |d ddddddd|_t |	d t	ddt 
dt|d d	 |d d	 gt j||d dddd
t j|d |d ddddddd|_t |	d t	ddt 
dt|d d	 |d d	 gt j||d dddd
|_t |	d t	ddt 
dt|d d	 |d d	 gt j||d dddd
t j|d |d dddd
|_||j_d	d	g|j_|S )Nr   r9   r   r:   r   r;   rJ   r<      )in_channelsout_channelskernel_sizestridepadding   T)rh   ri   rj   rk   rl   biasdilationgroups)r    Moduler0   blocksregister_forward_hookr6   r/   r_   r!   r+   rL   r(   rM   Conv2dConvTranspose2dr=   r>   r?   r@   r	   rN   )
r0   r*   sizehooksr[   r]   r	   start_index_readoutrC   r^   r   r   r   make_backbone_default   s   
$$$$ry   )r7   r   )r(   torch.nnr    rq   r   r   r   r+   r/   r6   rI   rV   r_   ry   r   r   r   r   <module>   s&    	


,