o
    پiH                     @   sF  d Z ddlZddlmZmZ ddlZddlmZ ddlm	Z	m
Z
 ddl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G dd dejZG dd	 d	ejZd7ddZd8ddZeeddeddeddeddeddeddeddeddeddeddeddedddZed7defdd Zed7d!d"Zed7defd#d$Zed7defd%d&Z ed7defd'd(Z!ed7defd)d*Z"ed7defd+d,Z#ed7defd-d.Z$ed7defd/d0Z%ed7defd1d2Z&ed7defd3d4Z'ed7defd5d6Z(dS )9af   Deep Layer Aggregation and DLA w/ Res2Net
DLA original adapted from Official Pytorch impl at: https://github.com/ucbdrive/dla
DLA Paper: `Deep Layer Aggregation` - https://arxiv.org/abs/1707.06484

Res2Net additions from: https://github.com/gasvn/Res2Net/
Res2Net Paper: `Res2Net: A New Multi-scale Backbone Architecture` - https://arxiv.org/abs/1904.01169
    N)ListOptionalIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)create_classifier   )build_model_with_cfg)register_modelgenerate_default_cfgsDLAc                       sF   e Zd ZdZd
 fdd	Zddeej deeej  fdd	Z	  Z
S )DlaBasicz	DLA Basicr   c              	      sr   t t|   tj||d||d|d| _t|| _tjdd| _	tj||dd|d|d| _
t|| _|| _d S )N   Fkernel_sizestridepaddingbiasdilationTinplacer   )superr   __init__nnConv2dconv1BatchNorm2dbn1ReLUreluconv2bn2r   )selfinplanesplanesr   r   _	__class__ C/home/ubuntu/.local/lib/python3.10/site-packages/timm/models/dla.pyr      s   
zDlaBasic.__init__Nshortcutchildrenc                 C   sT   |d u r|}|  |}| |}| |}| |}| |}||7 }| |}|S N)r   r   r   r    r!   r"   xr*   r+   outr(   r(   r)   forward&   s   





zDlaBasic.forwardr   r   NN)__name__
__module____qualname____doc__r   r   torchTensorr   r0   __classcell__r(   r(   r&   r)   r      s    ,r   c                       sJ   e Zd ZdZdZd fdd	Zddeej d	ee	ej  fd
dZ
  ZS )DlaBottleneckzDLA/DLA-X Bottleneck   r   @   c              
      s   t t|   || _tt||d  | }|| j }tj	||ddd| _
t|| _tj	||d||d||d| _t|| _tj	||ddd| _t|| _tjdd| _d S )	Nr<   r   Fr   r   r   )r   r   r   r   r   groupsTr   )r   r:   r   r   intmathfloor	expansionr   r   r   r   r   r    r!   conv3bn3r   r   )r"   r#   	outplanesr   r   cardinality
base_width
mid_planesr&   r(   r)   r   ;   s   

zDlaBottleneck.__init__Nr*   r+   c                 C   sr   |d u r|}|  |}| |}| |}| |}| |}| |}| |}| |}||7 }| |}|S r,   )r   r   r   r    r!   rC   rD   r-   r(   r(   r)   r0   K   s   








zDlaBottleneck.forward)r   r   r   r<   r2   r3   r4   r5   r6   rB   r   r   r7   r8   r   r0   r9   r(   r(   r&   r)   r:   7   s
    ,r:   c                       sJ   e Zd ZdZdZd fdd	Zdd	eej d
ee	ej  fddZ
  ZS )DlaBottle2neckzj Res2Net/Res2NeXT DLA Bottleneck
    Adapted from https://github.com/gasvn/Res2Net/blob/master/dla.py
    r;   r         c                    s.  t t|   |dk| _|| _tt||d  | }|| j }|| _	t
j||| ddd| _t
|| | _td|d }	g }
g }t|	D ]}|
t
j||d||||dd |t
| qGt
|
| _t
|| _| jryt
jd|ddnd | _t
j|| |ddd| _t
|| _t
jdd	| _d S )
Nr   r<   Fr=   r   )r   r   r   r   r>   r   )r   r   r   Tr   )r   rJ   r   is_firstscaler?   r@   rA   rB   widthr   r   r   r   r   maxrangeappend
ModuleListconvsbns	AvgPool2dpoolrC   rD   r   r   )r"   r#   rE   r   r   rN   rF   rG   rH   num_scale_convsrT   rU   r%   r&   r(   r)   r   f   s.   


zDlaBottle2neck.__init__Nr*   r+   c                 C   s  |d u r|}|  |}| |}| |}t|| jd}g }|d }tt| j| j	D ]*\}\}	}
|dks9| j
r>|| }n|||  }|	|}|
|}| |}|| q,| jdkrs| jd url|| |d  n||d  t|d}| |}| |}||7 }| |}|S )Nr   r   )r   r   r   r7   splitrO   	enumerateziprT   rU   rM   rR   rN   rW   catrC   rD   )r"   r.   r*   r+   r/   spxspospiconvbnr(   r(   r)   r0      s4   









zDlaBottle2neck.forward)r   r   rK   rL   rK   r2   rI   r(   r(   r&   r)   rJ   `   s
    ,rJ   c                       s0   e Zd Z fddZdeej fddZ  ZS )DlaRootc                    sR   t t|   tj||ddd|d d d| _t|| _tjdd| _	|| _
d S )Nr   Fr;   )r   r   r   Tr   )r   rd   r   r   r   rb   r   rc   r   r   r*   )r"   in_channelsout_channelsr   r*   r&   r(   r)   r      s   
zDlaRoot.__init__
x_childrenc                 C   s<   |  t|d}| |}| jr||d 7 }| |}|S )Nr   r   )rb   r7   r]   rc   r*   r   )r"   rg   r.   r(   r(   r)   r0      s   

zDlaRoot.forward)	r3   r4   r5   r   r   r7   r8   r0   r9   r(   r(   r&   r)   rd      s    rd   c                       sR   e Zd Z								d fdd	Zddeej d	eeej  fd
dZ  Z	S )DlaTreer   r<   Fr   c              	      sH  t t|   |
dkrd| }
|	r|
|7 }
|dkr tj||dnt | _t | _t|||d}|dkrj||||fi || _	|||dfi || _
||krattj||ddddt|| _t|
|||| _n/|t||d t|d ||||fd	di|| _	t|d |||fd	|
| i|| _
d | _|	| _|
| _|| _d S )
Nr   r;   r   r   )r   rF   rG   F)r   r   r   )root_kernel_sizeroot_shortcutroot_dim)r   rh   r   r   	MaxPool2dIdentity
downsampleprojectdicttree1tree2
Sequentialr   r   rd   rootupdate
level_rootrl   levels)r"   rx   blockre   rf   r   r   rF   rG   rw   rl   rj   rk   cargsr&   r(   r)   r      sV    
	
zDlaTree.__init__Nr*   r+   c                 C   s   |d u rg }|  |}| |}| jr|| | ||}| jd ur3| |}| ||g| }|S || | |d |}|S r,   )ro   rp   rw   rR   rr   ru   rs   )r"   r.   r*   r+   bottomx1x2r(   r(   r)   r0      s   





zDlaTree.forward)r   r   r   r<   Fr   r   Fr2   )
r3   r4   r5   r   r   r7   r8   r   r0   r9   r(   r(   r&   r)   rh      s    ,:rh   c                	       s   e Zd Zddddddeddf	 fd	d
	Zd 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   avgr   r<   Fg        c              
      s  t t|   || _|| _|| _|| _|dksJ ttj	||d dddddt
|d tjdd	| _| |d |d |d | _| j|d |d |d d
d| _t|||
d}t|d
 |	|d |d
 d
fddi|| _t|d |	|d
 |d d
fddi|| _t|d |	|d |d d
fddi|| _t|d |	|d |d d
fddi|| _t|d dddt|d d
ddt|d
 dddt|d dddt|d dddt|d dddg| _|d  | _| _t| j| j|d|d\| _| _| _|rtdnt | _|   D ]:}t!|tj	r0|j"d |j"d  |j# }|j$j%&dt'(d|  qt!|tj
rD|j$j%)d |j*j%+  qd S )Nr~   r      r   r   F)r   r   r   r   Tr   r;   ri   )rF   rG   rk   rw   rK      level0)num_chs	reductionmodulelevel1level2rL   level3   level4level5rY   )	pool_typeuse_conv	drop_rateg       @),r   r   r   channelsnum_classesrF   rG   r   rt   r   r   r   
base_layer_make_conv_levelr   r   rq   rh   r   r   r   r   feature_infonum_featureshead_hidden_sizer   global_pool	head_dropfcFlattenrn   flattenmodules
isinstancer   rf   weightdatanormal_r@   sqrtfill_r   zero_)r"   rx   r   output_strider   in_chansr   rF   rG   ry   shortcut_rootr   rz   mnr&   r(   r)   r     sV   
 ****	zDLA.__init__c                 C   s^   g }t |D ]#}|tj||d|dkr|nd|d|dt|tjddg |}qtj| S )Nr   r   r   Fr   Tr   )rQ   extendr   r   r   r   rt   )r"   r#   r$   rT   r   r   r   ra   r(   r(   r)   r   A  s   

zDLA._make_conv_levelc                 C   s   t d|rdng dd}|S )Nz^base_layer^level(\d+)))z^level(\d+)\.tree(\d+)N)z^level(\d+)\.root)r;   )r   )r   )stemblocks)rq   )r"   coarsematcherr(   r(   r)   group_matcherN  s
   	zDLA.group_matcherTc                 C   s   |rJ dd S )Nz$gradient checkpointing not supportedr(   )r"   enabler(   r(   r)   set_grad_checkpointing[  s   zDLA.set_grad_checkpointingreturnc                 C   s   | j S r,   )r   )r"   r(   r(   r)   get_classifier_  s   zDLA.get_classifierr   r   c                 C   sD   || _ t| j| j |dd\| _| _|rtd| _d S t | _d S )NT)r   r   r   )	r   r   r   r   r   r   r   rn   r   )r"   r   r   r(   r(   r)   reset_classifierc  s
   "zDLA.reset_classifierc                 C   sJ   |  |}| |}| |}| |}| |}| |}| |}|S r,   )r   r   r   r   r   r   r   r"   r.   r(   r(   r)   forward_featuresi  s   






zDLA.forward_features
pre_logitsc                 C   s6   |  |}| |}|r| |S | |}| |S r,   )r   r   r   r   )r"   r.   r   r(   r(   r)   forward_heads  s   




zDLA.forward_headc                 C   s   |  |}| |}|S r,   )r   r   r   r(   r(   r)   r0   {  s   

zDLA.forwardr1   F)T)r   )r3   r4   r5   rJ   r   r   r7   jitignorer   r   r   Moduler   r?   strr   r   boolr   r0   r9   r(   r(   r&   r)   r     s,    
<
Fc                 K   s    t t| |fdtddd|S )NF)r   r;   r   rK   r   )out_indices)pretrained_strictfeature_cfg)r	   r   rq   )variant
pretrainedkwargsr(   r(   r)   _create_dla  s   r    c                 K   s   | dddddt tddd
|S )	Nr   )r      r   )r   r   g      ?bilinearzbase_layer.0r   )
urlr   
input_size	pool_sizecrop_pctinterpolationmeanstd
first_conv
classifierr   )r   r   r(   r(   r)   _cfg  s   r   ztimm/)	hf_hub_id)z
dla34.in1kzdla46_c.in1kzdla46x_c.in1kzdla60x_c.in1kz
dla60.in1kzdla60x.in1kzdla102.in1kzdla102x.in1kzdla102x2.in1kzdla169.in1kzdla60_res2net.in1kzdla60_res2next.in1kr   c                 K   0   t ddtddd}td| fi t |fi |S )Nr   r   r   r;   r   r   r   r~            i   r      rx   r   ry   rF   rG   dla60_res2netrq   rJ   r   r   r   
model_argsr(   r(   r)   r     
   r   c                 K   r   )Nr   r   rL   rK   r   dla60_res2nextr   r   r(   r(   r)   r     r   r   c                 K   4   t g dg dtd}td| fi t |fi |S )Nr   r   r   r;   r;   r   )r   r~   r<   r   r   r   rx   r   ry   dla34)rq   r   r   r   r(   r(   r)   r        r   c                 K   r   )Nr   r   r~   r<   r<   r   r   r   dla46_crq   r:   r   r   r(   r(   r)   r     r   r   c                 K   8   t g dg dtddd}td| fi t |fi |S )Nr   r   r~   rK   r   dla46x_cr   r   r(   r(   r)   r     
   r   c                 K   r   )Nr   r   r~   rK   r   dla60x_cr   r   r(   r(   r)   r     r   r   c                 K   r   )Nr   r   r   dla60r   r   r(   r(   r)   r     s
   r   c                 K   r   )Nr   r   r~   rK   r   dla60xr   r   r(   r(   r)   r     r   r   c                 K   6   t g dg dtdd}td| fi t |fi |S )Nr   r   r   r   rK   r   r   Trx   r   ry   r   dla102r   r   r(   r(   r)   r     
   r   c                 K   :   t g dg dtdddd}td| fi t |fi |S )Nr   r   r~   rK   Trx   r   ry   rF   rG   r   dla102xr   r   r(   r(   r)   r     
   r   c                 K   r   )Nr   r   r<   rK   Tr   dla102x2r   r   r(   r(   r)   r     r   r   c                 K   r   )N)r   r   r;   r   r   r   r   Tr   dla169r   r   r(   r(   r)   r     r   r   r   )r   ))r6   r@   typingr   r   r7   torch.nnr   	timm.datar   r   timm.layersr   _builderr	   	_registryr
   r   __all__r   r   r:   rJ   rd   rh   r   r   r   default_cfgsr   r   r   r   r   r   r   r   r   r   r   r   r(   r(   r(   r)   <module>   sp    !)EL
}
