o
    پi                     @   s  d Z ddl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mZ ddlmZ g ZG dd	 d	ejZd(ddZd)d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dedddd	Zed(defddZed(defddZed(defddZed(defddZed(defddZed(defd d!Zed(defd"d#Zed(defd$d%Zed(defd&d'ZdS )*z Res2Net and Res2NeXt
Adapted from Official Pytorch impl at: https://github.com/gasvn/Res2Net/
Paper: `Res2Net: A New Multi-scale Backbone Architecture` - https://arxiv.org/abs/1904.01169
    NIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD   )build_model_with_cfg)register_modelgenerate_default_cfgs)ResNetc                
       sL   e Zd ZdZdZdddddddejddf
 fdd	Zdd	 Zd
d Z	  Z
S )Bottle2neckzj Res2Net/Res2NeXT Bottleneck
    Adapted from https://github.com/gasvn/Res2Net/blob/master/res2net.py
       r   N   c                    sZ  t t|   || _|dkp|d u| _td|d | _tt	||d  | }|| _
|| j }|	p3|}	tj||| ddd| _||| | _g }g }t| jD ]}|tj||d||	|	|dd ||| qPt|| _t|| _| jrtjd|dd| _nd | _tj|| |ddd| _||| _|d ur||nd | _|
dd	| _|| _d S )
Nr   g      P@F)kernel_sizebias   )r   stridepaddingdilationgroupsr   )r   r   r   T)inplace)superr
   __init__scaleis_firstmax
num_scalesintmathfloorwidth	expansionnnConv2dconv1bn1rangeappend
ModuleListconvsbns	AvgPool2dpoolconv3bn3serelu
downsample)selfinplanesplanesr   r/   cardinality
base_widthr   r   first_dilation	act_layer
norm_layer
attn_layer_r   	outplanesr'   r(   i	__class__ G/home/ubuntu/.local/lib/python3.10/site-packages/timm/models/res2net.pyr      s8   



zBottle2neck.__init__c                 C   s*   t | jdd d urtj| jj d S d S )Nweight)getattrr,   r    initzeros_r@   )r0   r>   r>   r?   zero_init_lastJ   s   zBottle2neck.zero_init_lastc           
      C   s<  |}|  |}| |}| |}t|| jd}g }|d }tt| j| j	D ]*\}\}}	|dks5| j
r:|| }n|||  }||}|	|}| |}|| q(| jdkro| jd urh|| |d  n||d  t|d}| |}| |}| jd ur| |}| jd ur| |}||7 }| |}|S )Nr   r   )r"   r#   r.   torchsplitr   	enumeratezipr'   r(   r   r%   r   r*   catr+   r,   r-   r/   )
r0   xshortcutoutspxspospr;   convbnr>   r>   r?   forwardN   s:   













zBottle2neck.forward)__name__
__module____qualname____doc__r   r    ReLUr   rD   rS   __classcell__r>   r>   r<   r?   r
      s     2r
   Fc                 K   s   t t| |fi |S )N)r   r	   )variant
pretrainedkwargsr>   r>   r?   _create_res2netw   s   r]    c                 K   s   | dddddt tddd
|S )	Ni  )r      r_   )   r`   g      ?bilinearr"   fc)
urlnum_classes
input_size	pool_sizecrop_pctinterpolationmeanstd
first_conv
classifierr   )rc   r\   r>   r>   r?   _cfg{   s   rm   ztimm/)	hf_hub_idzconv1.0)rn   rk   )	zres2net50_26w_4s.in1kzres2net50_48w_2s.in1kzres2net50_14w_8s.in1kzres2net50_26w_6s.in1kzres2net50_26w_8s.in1kzres2net101_26w_4s.in1kzres2next50.in1kzres2net50d.in1kzres2net101d.in1kreturnc                 K   8   t tg ddt ddd}td| fi t |fi |S )z)Constructs a Res2Net-50 26w4s model.
    r   r      r   r   r   r   blocklayersr4   
block_argsres2net50_26w_4sdictr
   r]   r[   r\   
model_argsr>   r>   r?   rx         rx   c                 K   rp   )z*Constructs a Res2Net-101 26w4s model.
    r   r      r   r   r   rs   rt   res2net101_26w_4sry   r{   r>   r>   r?   r      r}   r   c                 K   rp   )z)Constructs a Res2Net-50 26w6s model.
    rq   r   rr   rs   rt   res2net50_26w_6sry   r{   r>   r>   r?   r      r}   r   c                 K   rp   )z)Constructs a Res2Net-50 26w8s model.
    rq   r      rs   rt   res2net50_26w_8sry   r{   r>   r>   r?   r      r}   r   c                 K   rp   )z)Constructs a Res2Net-50 48w2s model.
    rq   0      rs   rt   res2net50_48w_2sry   r{   r>   r>   r?   r      r}   r   c                 K   rp   )z)Constructs a Res2Net-50 14w8s model.
    rq      r   rs   rt   res2net50_14w_8sry   r{   r>   r>   r?   r      r}   r   c                 K   s:   t tg dddt ddd}td| fi t |fi |S )zConstruct Res2NeXt-50 4s
    rq   r   r   rs   )ru   rv   r4   r3   rw   
res2next50ry   r{   r>   r>   r?   r      s   r   c              
   K   >   t tg dddddt ddd}td	| fi t |fi |S )
Construct Res2Net-50
    rq   r   deepT    r   rs   ru   rv   r4   	stem_typeavg_down
stem_widthrw   
res2net50dry   r{   r>   r>   r?   r      
   r   c              
   K   r   )
r   r~   r   r   Tr   r   rs   r   res2net101dry   r{   r>   r>   r?   r      r   r   )F)r^   )rW   r   rF   torch.nnr    	timm.datar   r   _builderr   	_registryr   r   resnetr	   __all__Moduler
   r]   rm   default_cfgsrx   r   r   r   r   r   r   r   r   r>   r>   r>   r?   <module>   sR    
e


	