U
    ¯Ê¹j£%  ã                   @   s€  d 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dlmZ G d	d
„ d
ejƒZd2dd„Zd3dd„Zeedd�edd�edd�edddd�edddddd�edddddd�eddd�eddd�dœƒZed4ed œd!d"„ƒZed5ed œd#d$„ƒZed6ed œd%d&„ƒZed7ed œd'd(„ƒZed8ed œd)d*„ƒZed9ed œd+d,„ƒZed:ed œd-d.„ƒZed;ed œd/d0„ƒZd1S )<a   ResNeSt Models

Paper: `ResNeSt: Split-Attention Networks` - https://arxiv.org/abs/2004.08955

Adapted from original PyTorch impl w/ weights at https://github.com/zhanghang1989/ResNeSt by Hang Zhang

Modified for torchscript compat, and consistency with timm by Ross Wightman
é    )Únn©ÚIMAGENET_DEFAULT_MEANÚIMAGENET_DEFAULT_STD)Ú	SplitAttné   )Úbuild_model_with_cfg)Úregister_modelÚgenerate_default_cfgs)ÚResNetc                       s\   e Zd ZdZdZdddddddddddejejddddf‡ fdd„	Zd	d
„ Z	dd„ Z
‡  ZS )ÚResNestBottleneckzResNet Bottleneck
    é   r   Né@   Fc                    sÂ  t t| ƒ ¡  |dkst‚|d ks&t‚|d ks2t‚|d ks>t‚t||d  ƒ| }|pX|}|rt|dksj|
rt|}d}nd}|| _tj||ddd�| _||ƒ| _	|dd�| _
|dkrÄ|	rÄtjd|dd	�nd | _| jdk�rt||d|||||||d
�
| _t ¡ | _t ¡ | _t ¡ | _nLtj||d||||dd�| _||ƒ| _|d k	�rJ|ƒ nt ¡ | _|dd�| _|dk�r€|	�s€tjd|dd	�nd | _tj||d ddd�| _||d ƒ| _|dd�| _|| _d S )Nr   g      P@r   F)Úkernel_sizeÚbiasT)Zinplaceé   )Úpadding)r   Ústrider   ÚdilationÚgroupsÚradixÚ
norm_layerZ
drop_layer)r   r   r   r   r   r   r   )Úsuperr   Ú__init__ÚAssertionErrorÚintr   r   ZConv2dÚconv1Úbn1Úact1Z	AvgPool2dÚ	avd_firstr   Úconv2ZIdentityÚbn2Ú
drop_blockÚact2Úavd_lastÚconv3Úbn3Úact3Ú
downsample)ÚselfZinplanesZplanesr   r(   r   ÚcardinalityÚ
base_widthÚavdr   Zis_firstZreduce_firstr   Zfirst_dilationZ	act_layerr   Z
attn_layerZaa_layerr"   Z	drop_pathZgroup_widthZ
avd_stride©Ú	__class__© úR/var/www/html/bwave/python/venv/lib/python3.8/site-packages/timm/models/resnest.pyr      sd    
"        þ

      þ
&zResNestBottleneck.__init__c                 C   s&   t | jdd ƒd k	r"tj | jj¡ d S )NÚweight)Úgetattrr&   r   ÚinitZzeros_r1   )r)   r/   r/   r0   Úzero_init_lastW   s    z ResNestBottleneck.zero_init_lastc                 C   s°   |}|   |¡}|  |¡}|  |¡}| jd k	r6|  |¡}|  |¡}|  |¡}|  |¡}|  |¡}| jd k	rr|  |¡}|  	|¡}|  
|¡}| jd k	rš|  |¡}||7 }|  |¡}|S ©N)r   r   r   r   r    r!   r"   r#   r$   r%   r&   r(   r'   )r)   ÚxZshortcutÚoutr/   r/   r0   Úforward[   s&    















zResNestBottleneck.forward)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Z	expansionr   ZReLUZBatchNorm2dr   r4   r8   Ú__classcell__r/   r/   r-   r0   r      s,   ì?r   Fc                 K   s   t t| |f|ŽS r5   )r   r   )ÚvariantÚ
pretrainedÚkwargsr/   r/   r0   Ú_create_resnestx   s    ýürA   Ú c                 K   s   | dddddt tdddœ
|–S )	Niè  )r   éà   rC   )é   rD   g      ì?Zbilinearzconv1.0Úfc)
ÚurlZnum_classesÚ
input_sizeÚ	pool_sizeÚcrop_pctÚinterpolationZmeanZstdZ
first_convÚ
classifierr   )rF   r@   r/   r/   r0   Ú_cfg�   s         ûúrL   ztimm/)Ú	hf_hub_id)r   é   rN   )é   rO   )rM   rG   rH   )r   é@  rP   )é
   rQ   gJ+‡í?Zbicubic)rM   rG   rH   rI   rJ   )r   é   rR   )é   rS   gV-²í?)rM   rJ   )zresnest14d.gluon_in1kzresnest26d.gluon_in1kzresnest50d.in1kzresnest101e.in1kzresnest200e.in1kzresnest269e.in1kzresnest50d_4s2x40d.in1kzresnest50d_1s4x24d.in1k)Úreturnc                 K   sD   t tddddgdddddt dddd�d	�}tdd| it |f|Ž—ŽS )z5 ResNeSt-14d model. Weights ported from GluonCV.
    r   Údeepé    Tr   é   F©r   r,   r   ©ÚblockZlayersZ	stem_typeZ
stem_widthZavg_downr+   r*   Z
block_argsÚ
resnest14dr?   )r[   ©Údictr   rA   ©r?   r@   Zmodel_kwargsr/   r/   r0   r[   ¢   s     
    ýr[   c                 K   sD   t tddddgdddddt dddd�d	�}tdd| it |f|Ž—ŽS )z5 ResNeSt-26d model. Weights ported from GluonCV.
    rW   rU   rV   Tr   r   FrX   rY   Ú
resnest26dr?   )r_   r\   r^   r/   r/   r0   r_   ­   s     
    ýr_   c                 K   sD   t tddddgdddddt d	dd
d�d�}tdd| it |f|Ž—ŽS )zÈ ResNeSt-50d model. Matches paper ResNeSt-50 model, https://arxiv.org/abs/2004.08955
    Since this codebase supports all possible variations, 'd' for deep stem, stem_width 32, avg in downsample.
    r   r   é   rU   rV   Tr   r   rW   FrX   rY   Ú
resnest50dr?   )ra   r\   r^   r/   r/   r0   ra   ¸   s     
    ýra   c                 K   sD   t tddddgdddddt ddd	d
�d�}tdd| it |f|Ž—ŽS )zË ResNeSt-101e model. Matches paper ResNeSt-101 model, https://arxiv.org/abs/2004.08955
     Since this codebase supports all possible variations, 'e' for deep stem, stem_width 64, avg in downsample.
    r   r   é   rU   r   Tr   rW   FrX   rY   Úresnest101er?   )rc   r\   r^   r/   r/   r0   rc   Ä   s     
    ýrc   c                 K   sD   t tddddgdddddt ddd	d
�d�}tdd| it |f|Ž—ŽS )zÊ ResNeSt-200e model. Matches paper ResNeSt-200 model, https://arxiv.org/abs/2004.08955
    Since this codebase supports all possible variations, 'e' for deep stem, stem_width 64, avg in downsample.
    r   é   é$   rU   r   Tr   rW   FrX   rY   Úresnest200er?   )rf   r\   r^   r/   r/   r0   rf   Ð   s     
    ýrf   c                 K   sD   t tddddgdddddt d	dd
d�d�}tdd| it |f|Ž—ŽS )zÊ ResNeSt-269e model. Matches paper ResNeSt-269 model, https://arxiv.org/abs/2004.08955
    Since this codebase supports all possible variations, 'e' for deep stem, stem_width 64, avg in downsample.
    r   é   é0   rO   rU   r   Tr   rW   FrX   rY   Úresnest269er?   )ri   r\   r^   r/   r/   r0   ri   Ü   s     
    ýri   c                 K   sD   t tddddgdddddt dddd	�d
�}tdd| it |f|Ž—ŽS )z]ResNeSt-50 4s2x40d from https://github.com/zhanghang1989/ResNeSt/blob/master/ablation.md
    r   r   r`   rU   rV   Té(   rW   rX   rY   Úresnest50d_4s2x40dr?   )rk   r\   r^   r/   r/   r0   rk   è   s     
    ýrk   c                 K   sD   t tddddgdddddt dddd	�d
�}tdd| it |f|Ž—ŽS )z]ResNeSt-50 1s4x24d from https://github.com/zhanghang1989/ResNeSt/blob/master/ablation.md
    r   r   r`   rU   rV   Trd   r   rX   rY   Úresnest50d_1s4x24dr?   )rl   r\   r^   r/   r/   r0   rl   ó   s     
    ýrl   N)F)rB   )F)F)F)F)F)F)F)F)r<   Ztorchr   Z	timm.datar   r   Ztimm.layersr   Z_builderr   Ú	_registryr	   r
   Zresnetr   ÚModuler   rA   rL   Zdefault_cfgsr[   r_   ra   rc   rf   ri   rk   rl   r/   r/   r/   r0   Ú<module>   sr   f
	
 þ   þ   þþþð


