o
    پiJ5                     @   s  d Z ddlmZ ddlmZ ddlmZ ddlZddlm	Z	 ddl
m	  mZ ddlmZmZmZmZ ddlmZmZmZmZmZ dd	lmZ dd
lmZmZ dg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"d0ddZ#d1ddZ$ee$eede$dde$deedddde$dde$dde$dde$dde$ddd Z%ed0d!e"fd"d#Z&ed0d!e"fd$d%Z'ed0d!e"fd&d'Z(ed0d!e"fd(d)Z)ed0d!e"fd*d+Z*ed0d!e"fd,d-Z+ed0d!e"fd.d/Z,dS )2a^   PyTorch implementation of DualPathNetworks
Based on original MXNet implementation https://github.com/cypw/DPNs with
many ideas from another PyTorch implementation https://github.com/oyam/pytorch-DPNs.

This implementation is compatible with the pretrained weights from cypw's MXNet implementation.

Hacked together by / Copyright 2020 Ross Wightman
    )OrderedDict)partial)TupleN)IMAGENET_DPN_MEANIMAGENET_DPN_STDIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)BatchNormAct2dConvNormActcreate_conv2dcreate_classifierget_norm_act_layer   )build_model_with_cfg)register_modelgenerate_default_cfgsDPNc                       sH   e Zd Zef fdd	Zejjdd Zejjdd Zdd Z  Z	S )CatBnActc                    s    t t|   ||dd| _d S )NMbP?eps)superr   __init__bn)selfin_chs
norm_layer	__class__ C/home/ubuntu/.local/lib/python3.10/site-packages/timm/models/dpn.pyr      s   zCatBnAct.__init__c                 C      d S Nr   r   xr   r   r    forward      zCatBnAct.forwardc                 C   r!   r"   r   r#   r   r   r    r%   #   r&   c                 C   s"   t |trtj|dd}| |S )Nr   dim)
isinstancetupletorchcatr   r#   r   r   r    r%   (   s   

)
__name__
__module____qualname__r	   r   r+   jit_overload_methodr%   __classcell__r   r   r   r    r      s    

r   c                       s*   e Zd Zdef fdd	Zdd Z  ZS )BnActConv2dr   c                    s4   t t|   ||dd| _t|||||d| _d S )Nr   r   )stridegroups)r   r3   r   r   r   conv)r   r   out_chskernel_sizer4   r5   r   r   r   r    r   /   s   zBnActConv2d.__init__c                 C   s   |  | |S r"   )r6   r   r#   r   r   r    r%   4   s   zBnActConv2d.forward)r-   r.   r/   r	   r   r%   r2   r   r   r   r    r3   .   s    r3   c                       s\   e Zd Z		d
 fdd	Zejjdd Zejjdd Zdeej	ej	f fd	dZ  Z
S )DualPathBlocknormalFc	           	         s8  t t|   || _|| _|| _|dkrd| _d| _n|dkr&d| _d| _n|dks,J d| _d| _d | _d | _	| jr[| jdkrNt
||d|  ddd| _	nt
||d|  ddd| _t
||ddd| _t
||d	| j|d
| _|rt|d| _t||dd| _t||dd| _d S t
||| ddd| _d | _d | _d S )Nprojr   Tdown   r:   F)r   r7   r8   r4      )r   r7   r8   r4   r5   )r   )r8   )r   r9   r   	num_1x1_cincb
key_stridehas_proj	c1x1_w_s1	c1x1_w_s2r3   c1x1_ac3x3_br   c1x1_cr   c1x1_c1c1x1_c2)	r   r   	num_1x1_a	num_3x3_br?   r@   r5   
block_typerA   r   r   r    r   9   sD   


zDualPathBlock.__init__c                 C   r!   r"   r   r#   r   r   r    r%   j   r&   zDualPathBlock.forwardc                 C   r!   r"   r   r#   r   r   r    r%   o   r&   returnc           
      C   sL  t |trtj|dd}n|}| jd u r"| jd u r"|d }|d }n2| jd ur-| |}n| |}|d d d | jd d d d f }|d d | jd d d d d f }| |}| |}| 	|}| j
d urs| 
|}| |}n"|d d d | jd d d d f }|d d | jd d d d d f }|| }tj||gdd}	||	fS )Nr   r'   r   )r)   r*   r+   r,   rD   rE   r?   rF   rG   rH   rI   rJ   )
r   r$   x_inx_s1x_s2x_sout1out2residdenser   r   r    r%   t   s,   



""




"")r:   F)r-   r.   r/   r   r+   r0   r1   r%   r   Tensorr2   r   r   r   r    r9   8   s    	1

"r9   c                       s   e Zd Z													
			d# fdd	Zejjd$ddZejjd%ddZejjde	j
fddZd&dedefddZdd Zd$defdd Zd!d" Z  ZS )'r   r>         r>                `   r]     r>   avgF@           batchnorm2drelueluc              
      s  t t|   || _|| _|| _|dksJ tt||ddd}tt||dddd}|	r/dnd}t }t	||
|	r;d	nd
d|d|d< t
jd	ddd|d< t|
dddg| _d| }|d }|| d|  }t|
|||||d||d< |d	|  }td|d d D ]}t||||||d||dt| < ||7 }q|  jt|dd|d  dg7  _d| }|d }|| d|  }t||||||d||d< |d	|  }td|d d D ]}t||||||d||dt| < ||7 }q|  jt|dd|d  dg7  _d| }|d }|| d|  }t||||||d||d < |d	|  }td|d d D ]}t||||||d||d!t| < ||7 }q.|  jt|d"d#|d  dg7  _d$| }|d	 }|| d|  }t||||||d||d%< |d	|  }td|d	 d D ]}t||||||d||d&t| < ||7 }q|  jt|dd'|d	  dg7  _t||d(|d)< | | _| _t
|| _t| j| j|d*d+\| _| _|rt
d| _d S t
 | _d S ),Nr]   )	act_layerr   r   F)r   inplacer   rY   r>      r=   )r8   r4   r   conv1_1)r8   r4   padding
conv1_poolzfeatures.conv1_1)num_chs	reductionmodulerc   r   r;   conv2_1r:   conv2_zfeatures.conv2_r_   r<   conv3_1conv3_   zfeatures.conv3_   conv4_1conv4_r\   zfeatures.conv4_i   conv5_1conv5_zfeatures.conv5_)r   conv5_bn_acT	pool_typeuse_conv)r   r   r   num_classes	drop_raterA   r   r   r   r
   nn	MaxPool2ddictfeature_infor9   rangestrr   num_featureshead_hidden_size
Sequentialfeaturesr   global_pool
classifierFlattenIdentityflatten)r   k_secinc_seck_rr5   r   in_chansoutput_strider   smallnum_init_featuresrA   r   r   rh   fc_act_layerfc_norm_layer	bw_factorblocksbwr@   rr   ir   r   r    r      sr   
"
$"
$"$"$$zDPN.__init__c                 C   s    t d|rdndd fdgd}|S )Nz^features\.conv1z^features\.conv(\d+)z^features\.conv(\d+)_(\d+))z^features\.conv5_bn_ac)i )stemr   )r   )r   coarsematcherr   r   r    group_matcher   s   zDPN.group_matcherTc                 C   s   |rJ dd S )Nz$gradient checkpointing not supportedr   )r   enabler   r   r    set_grad_checkpointing   s   zDPN.set_grad_checkpointingrN   c                 C   s   | j S r"   )r   )r   r   r   r    get_classifier   s   zDPN.get_classifierr   r   c                 C   sD   || _ t| j| j |dd\| _| _|rtd| _d S t | _d S )NTr|   r   )	r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r    reset_classifier  s
   "zDPN.reset_classifierc                 C   s
   |  |S r"   )r   r#   r   r   r    forward_features	  s   
zDPN.forward_features
pre_logitsc                 C   sJ   |  |}| jdkrtj|| j| jd}|r| |S | |}| |S )Nrd   )ptraining)r   r   Fdropoutr   r   r   )r   r$   r   r   r   r    forward_head  s   




zDPN.forward_headc                 C   s   |  |}| |}|S r"   )r   r   r#   r   r   r    r%     s   

zDPN.forward)rX   r[   r`   r]   ra   r>   r]   rb   Frc   Frd   re   rf   rg   F)T)rb   )r-   r.   r/   r   r+   r0   ignorer   r   r   Moduler   intr   r   r   boolr   r%   r2   r   r   r   r    r      s6    Y
	Fc                 K   s    t t| |fdtdddi|S )Nfeature_cfgT)feature_concatflatten_sequential)r   r   r   )variant
pretrainedkwargsr   r   r    _create_dpn  s   
r    c                 K   s   | dddddt tddd
|S )	Nra   )r>      r   )rj   rj   g      ?bicubiczfeatures.conv1_1.convr   )
urlr   
input_size	pool_sizecrop_pctinterpolationmeanstd
first_convr   )r   r   )r   r   r   r   r    _cfg%  s   r   )r   r   ztimm/)	hf_hub_idgffffff?)r>      r   g      ?)r   r   r   r   test_input_sizetest_crop_pct)zdpn48b.untrainedzdpn68.mx_in1kzdpn68b.ra_in1kzdpn68b.mx_in1kzdpn92.mx_in1kzdpn98.mx_in1kzdpn131.mx_in1kzdpn107.mx_in1krN   c              
   K   s6   t ddddddddd}tdd
| it |fi |S )NT
   r_   r]   )r>   rY      r>   r\   r]   r]   rc   silu)r   r   r   r5   rA   r   r   rh   dpn48br   )r   r   r   r   r   
model_argsr   r   r    r   >  s
   r   c                 K   s2   t ddddddd}td
d	| it |fi |S )NTr   r_   r]   r>   rY      r>   r   )r   r   r   r5   r   r   dpn68r   )r   r   r   r   r   r    r   F  s
   r   c              	   K   s4   t dddddddd}td
d	| it |fi |S )NTr   r_   r]   r   r   )r   r   r   r5   rA   r   r   dpn68br   )r   r   r   r   r   r    r   N  s
   r   c                 K   0   t dddddd}td	d| it |fi |S )
Nrc   r`   r]   rX   r[   r   r   r5   r   r   dpn92r   )r   r   r   r   r   r    r   V  
   r   c                 K   r   )
Nr`      (   )r>   r   rZ   r>   r\   r]   r]   r_   r   dpn98r   )r   r   r   r   r   r    r   ^  r   r   c                 K   r   )
Nr_   r   r   )rY   ru      r>   r   r   dpn131r   )r   r   r   r   r   r    r   f  r   r   c                 K   r   )
Nr_      2   )rY   ru   rZ   r>   )rZ   rc   rc   r_   r   dpn107r   )r   r   r   r   r   r    r   n  r   r   r   )r   )-__doc__collectionsr   	functoolsr   typingr   r+   torch.nnr   torch.nn.functional
functionalr   	timm.datar   r   r   r   timm.layersr	   r
   r   r   r   _builderr   	_registryr   r   __all__r   r   r3   r9   r   r   r   default_cfgsr   r   r   r   r   r   r   r   r   r   r    <module>   s^    
^ 




