U
    ¯Ê¹j  ã                   @   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 k	| _td|d ƒ| _tt 	||d  ¡ƒ| }|| _
|| j }|	pf|}	tj||| ddd�| _||| ƒ| _g }g }t| jƒD ]2}| tj||d||	|	|dd�¡ | ||ƒ¡ q t |¡| _t |¡| _| j�rtjd|dd�| _nd | _tj|| |ddd�| _||ƒ| _|d k	�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__© úR/var/www/html/bwave/python/venv/lib/python3.8/site-packages/timm/models/res2net.pyr      sD    
      þ
zBottle2neck.__init__c                 C   s&   t | jdd ƒd k	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 k	rÐ| |  |d ¡¡ n| |d ¡ t |d¡}|  |¡}|  |¡}| jd k	�r|  |¡}| jd k	�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|Ž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   Úfc)
ÚurlZnum_classesZ
input_sizeZ	pool_sizeZcrop_pctÚinterpolationZmeanZstdÚ
first_convÚ
classifierr   )rP   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   s4   t tddddgdt dd�d�}td| ft |f|ŽŽS )z)Constructs a Res2Net-50 26w4s model.
    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   s4   t tddddgdt dd�d�}td| ft |f|ŽŽS )z*Constructs a Res2Net-101 26w4s model.
    r   r   é   r   rX   rY   Úres2net101_26w_4sr^   r`   r2   r2   r3   rb   œ   s     
  ÿrb   c                 K   s4   t tddddgdt dd�d�}td| ft |f|ŽŽS )z)Constructs a Res2Net-50 26w6s model.
    r   r   rW   r   rX   rY   Úres2net50_26w_6sr^   r`   r2   r2   r3   rc   ¥   s     
  ÿrc   c                 K   s4   t tddddgdt dd�d�}td| ft |f|ŽŽS )	z)Constructs a Res2Net-50 26w8s model.
    r   r   rW   r   é   rX   rY   Úres2net50_26w_8sr^   r`   r2   r2   r3   re   ®   s     
  ÿre   c                 K   s4   t tddddgdt dd�d�}td| ft |f|ŽŽS )	z)Constructs a Res2Net-50 48w2s model.
    r   r   rW   é0   é   rX   rY   Úres2net50_48w_2sr^   r`   r2   r2   r3   rh   ·   s     
  ÿrh   c                 K   s4   t tddddgdt dd�d�}td| ft |f|ŽŽS )	z)Constructs a Res2Net-50 14w8s model.
    r   r   rW   é   rd   rX   rY   Úres2net50_14w_8sr^   r`   r2   r2   r3   rj   À   s     
  ÿrj   c                 K   s6   t tddddgddt dd�d�}td| ft |f|ŽŽS )zConstruct Res2NeXt-50 4s
    r   r   rW   rd   rX   )rZ   r[   r-   r,   r\   Ú
res2next50r^   r`   r2   r2   r3   rk   É   s     
   ÿrk   c              
   K   s:   t tddddgddddt dd�d	�}td
| ft |f|ŽŽS )úConstruct Res2Net-50
    r   r   rW   r   ÚdeepTé    rX   ©rZ   r[   r-   Z	stem_typeZavg_downZ
stem_widthr\   Ú
res2net50dr^   r`   r2   r2   r3   rp   Ò   s     
    þrp   c              
   K   s:   t tddddgddddt dd�d	�}td
| ft |f|ŽŽS )rl   r   r   ra   r   rm   Trn   rX   ro   Úres2net101dr^   r`   r2   r2   r3   rq   Ü   s     
    þrq   )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]   rb   rc   re   rh   rj   rk   rp   rq   r2   r2   r2   r3   Ú<module>   sP   e



÷	