a
    d                     @   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*edddZed+edddZed,edddZed-edddZed.edddZed/edd d!Zed0edd"d#Zed1edd$d%Zed2edd&d'ZdS )3z 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                    s^  t t|   || _|dkp"|d u| _td|d | _tt	||d  | }|| _
|| j }|	pf|}	tj||| ddd| _||| | _g }g }t| jD ]2}|tj||d||	|	|dd ||| qt|| _t|| _| jrtjd|dd| _nd | _tj|| |ddd| _||| _|d urB||nd | _|
dd	| _|| _d S )
Nr   g      P@F)kernel_sizebias   )r   stridepaddingdilationgroupsr   )r   r   r   T)Zinplace)superr
   __init__scaleis_firstmaxZ
num_scalesintmathfloorwidth	expansionnnZConv2dconv1bn1rangeappendZ
ModuleListconvsbnsZ	AvgPool2dpoolconv3bn3serelu
downsample)selfZinplanesZplanesr   r*   cardinality
base_widthr   r   Zfirst_dilationZ	act_layerZ
norm_layerZ
attn_layer_r   Z	outplanesr#   r$   i	__class__ \/var/www/html/stable-diffusion-webui/venv/lib/python3.9/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 )Nweight)getattrr'   r   initZzeros_r4   )r+   r2   r2   r3   zero_init_lastJ   s    zBottle2neck.zero_init_lastc           
      C   s@  |}|  |}| |}| |}t|| jd}g }|d }tt| j| j	D ]T\}\}}	|dksj| j
rt|| }n|||  }||}|	|}| |}|| qP| jdkr| jd ur|| |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*   )
r+   xZshortcutoutZspxZspospr/   convZbnr2   r2   r3   forwardN   s:    











zBottle2neck.forward)__name__
__module____qualname____doc__r   r   ZReLUr   r7   rB   __classcell__r2   r2   r0   r3   r
      s   2r
   Fc                 K   s   t t| |fi |S )N)r   r	   )variant
pretrainedkwargsr2   r2   r3   _create_res2netw   s    rK    c                 K   s   | dddddt tddd
|S )	Ni  )r      rM   )   rN   g      ?Zbilinearr   Zfc)
urlZnum_classesZ
input_sizeZ	pool_sizeZcrop_pctinterpolationmeanZstd
first_conv
classifierr   )rO   rJ   r2   r2   r3   _cfg{   s    rT   ztimm/)	hf_hub_idzconv1.0)rU   rR   )	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   s8   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layersr-   
block_argsres2net50_26w_4sdictr
   rK   rI   rJ   Z
model_argsr2   r2   r3   r^      s    r^   c                 K   s8   t tg ddt ddd}td| fi t |fi |S )z*Constructs a Res2Net-101 26w4s model.
    r   r      r   r   r   rY   rZ   res2net101_26w_4sr_   ra   r2   r2   r3   rd      s    rd   c                 K   s8   t tg ddt ddd}td| fi t |fi |S )z)Constructs a Res2Net-50 26w6s model.
    rW   r   rX   rY   rZ   res2net50_26w_6sr_   ra   r2   r2   r3   re      s    re   c                 K   s8   t tg ddt ddd}td| fi t |fi |S )z)Constructs a Res2Net-50 26w8s model.
    rW   r      rY   rZ   res2net50_26w_8sr_   ra   r2   r2   r3   rg      s    rg   c                 K   s8   t tg ddt ddd}td| fi t |fi |S )z)Constructs a Res2Net-50 48w2s model.
    rW   0      rY   rZ   res2net50_48w_2sr_   ra   r2   r2   r3   rj      s    rj   c                 K   s8   t tg ddt ddd}td| fi t |fi |S )z)Constructs a Res2Net-50 14w8s model.
    rW      rf   rY   rZ   res2net50_14w_8sr_   ra   r2   r2   r3   rl      s    rl   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
    rW   r   rf   rY   )r[   r\   r-   r,   r]   
res2next50r_   ra   r2   r2   r3   rm      s    rm   c              
   K   s>   t tg dddddt ddd}td	| fi t |fi |S )
Construct Res2Net-50
    rW   r   deepT    r   rY   r[   r\   r-   Z	stem_typeZavg_downZ
stem_widthr]   
res2net50dr_   ra   r2   r2   r3   rr      s
    rr   c              
   K   s>   t tg dddddt ddd}td	| fi t |fi |S )
rn   rb   r   ro   Trp   r   rY   rq   res2net101dr_   ra   r2   r2   r3   rs      s
    rs   )F)rL   )F)F)F)F)F)F)F)F)F)rF   r   r9   Ztorch.nnr   Z	timm.datar   r   Z_builderr   	_registryr   r   Zresnetr	   __all__Moduler
   rK   rT   Zdefault_cfgsr^   rd   re   rg   rj   rl   rm   rr   rs   r2   r2   r2   r3   <module>   sP   e



	