U
    ¯Ê¹j)J  ã                   @   sÄ  d 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
mZmZmZ g Zeee
ddd	ddd
d�e
dddddd
d�edddddd
d�e
dddddd
d�fdddddeƒ d�ee
ddd	ddd
d�eddgddddd
d�eddgddddd
d�e
ddddddd�fdddddd deƒ d!�	ee
ddd	ddd
d�edd"d"dddd
d�edd#dddd
d�edddddd
d�fddddddeƒ d$�ee
ddd	dd%d
d�e
ddddd%d
d�eddddd%d
d�e
ddddd%d
d�fdddddd&ded%d'�d(�	ee
dddddd)d�e
ddd*ddd)d�e
dd+d	ddd)d�e
dddddd)d�fdd,dd-ed.dd/�d0�ee
ddd	ddd
d�e
dddddd
d�edddddd
d�e
dddddd
d�fdddd-ed.dd/�d0�ee
ddd	ddd
d�eddgddddd
d�eddgddddd
d�e
ddddddd�fdddddd d-ed.dd/�d!�	ee
ddd	ddd
d�edd"d"dddd
d-ed.dd"d1�d2�	edd#dddd
d�edddddd
d�fddddd-ed.dd/�d3�ee
ddd	dd%d
d�e
ddddd%d
d�eddddd%d
d�e
ddddd%d
d�fddddd&d-ed.dd%d4�d5�ee
ddd	ddd
d�e
dddddd
d�edddddd
d�e
dddddd
d�fdddd6ed7d8�d0�ee
ddd	ddd
d�edd"d"dddd
d�edd#dddd
d�edddddd
d�fddddd6ed7d8�d3�ee
ddd	ddd
d�e
dddddd
d�edddddd
d�e
dddddd
d�fdddd6ed9d8�d0�ee
ddd:dd%dd�e
dd#d;dd%dd�eddd<d=dd%dd�e
ddd>dd%dd�fd?ddddd ed
d@�edddA�d-edBddCdD�dE�ee
ddd	ddd
d�edd"dddd
d6edFd8�dG�edd#dddd
d-eddH�dG�edddddd
deƒ dG�fdddddI�ee
ddd	ddd
d�edd"dddd
d-eddH�dG�edd#dddd
d-eddH�dG�edddddd
deƒ dG�fdddddI�dJ�Zd�dLdM„Zd�dNdO„ZeedPdQddRdSdT�edUdQddRdSdVdW�eddRdSdX�edYdQddRdSdT�edRdSdRdZ�ed[dQdRdSdRd\�ed]dQdRdSdRdVd^�ed_dQdRdSdRdVd^�ed`dQdRdSdRdVd^�edadQdbdRdSdVdc�edddQdbdRdSde�edfdQddRdSdVdW�edgdQdhdhdidjdkdjdVdl�	edmdQddRdSdT�edndQddRdSdT�doœƒZed‘edpœdqdr„ƒZed’edpœdsdt„ƒZed“edpœdudv„ƒZed”edpœdwdx„ƒZed•edpœdydz„ƒZed–edpœd{d|„ƒZed—edpœd}d~„ƒZed˜edpœdd€„ƒZed™edpœd�d‚„ƒZedšedpœdƒd„„ƒZed›edpœd…d†„ƒZedœedpœd‡dˆ„ƒZed�edpœd‰dŠ„ƒZ edžedpœd‹dŒ„ƒZ!edŸedpœd�dŽ„ƒZ"d9S ) a”   Bring-Your-Own-Attention Network

A flexible network w/ dataclass based config for stacking NN blocks including
self-attention (or similar) layers.

Currently used to implement experimental variants of:
  * Bottleneck Transformers
  * Lambda ResNets
  * HaloNets

Consider all of the models definitions here as experimental WIP and likely to change.

Hacked together by / copyright Ross Wightman, 2021.
é    ©ÚIMAGENET_DEFAULT_MEANÚIMAGENET_DEFAULT_STDé   )Úbuild_model_with_cfg)Úregister_modelÚgenerate_default_cfgs)ÚByoBlockCfgÚByoModelCfgÚByobNetÚinterleave_blocksÚbottleé   é   g      Ð?)ÚtypeÚdÚcÚsÚgsÚbri   )r   Ú	self_attni   )Útypesr   r   r   r   r   r   i   é@   ZtieredZmaxpoolTZ
bottleneck)ÚblocksÚstem_chsÚ	stem_typeÚ	stem_poolÚfixed_input_sizeÚself_attn_layerÚself_attn_kwargsé   )r   Úeveryr   r   r   r   r   i   gZd;ßOÕ?)r   r   r   r   r   Ú Zsilui   Úse)	r   r   r   r   Ú	act_layerÚnum_featuresÚ
attn_layerr   r   é   é   )r   r   r   r   r$   r   r   r   é   Zeca)Údim_head)	r   r   r   r   r   r$   r&   r   r   g      ð?é€   é
   Z7x7Zhaloé   )Ú
block_sizeÚ	halo_size)r   r   r   r   r   r   )r.   r/   Z	num_heads)	r   r!   r   r   r   r   r   r   r   )r   r   r   r   r$   r   r   )r.   r/   r*   )r   r   r   r   r$   r&   r   r   Úlambdaé	   )ÚrNé0   é`   é   éÀ   i   é    )Zrd_ratio)Z	bottle_inZ
linear_outé   g…ëQ¸Õ?)r.   r/   Zqk_ratio)r   r   r   Z
downsampler%   r$   r&   Zattn_kwargsZblock_kwargsr   r   é   )r   r   r   r   r   r   r   r   )r/   )r   r   r   r   r$   )Ú	botnet26tÚsebotnet33tsÚ
botnet50tsÚeca_botnext26tsÚ
halonet_h1Ú
halonet26tÚsehalonet33tsÚhalonet50tsÚeca_halonext26tsÚlambda_resnet26tÚlambda_resnet50tsÚlambda_resnet26rpt_256Úhaloregnetz_bÚlamhalobotnet50tsÚhalo2botnet50tsFc                 K   s0   t t| |f|st|  nt| tdd�dœ|—ŽS )NT)Zflatten_sequential)Z	model_cfgZfeature_cfg)r   r   Ú
model_cfgsÚdict)ÚvariantZcfg_variantÚ
pretrainedÚkwargs© rN   úR/var/www/html/bwave/python/venv/lib/python3.8/site-packages/timm/models/byoanet.pyÚ_create_byoanet  s      ÿýürP   c                 K   s"   | dddddt tddddd	œ|–S )
Niè  ©r    éà   rR   ©r8   r8   gffffffî?Zbicubiczstem.conv1.convzhead.fcF)ÚurlZnum_classesÚ
input_sizeÚ	pool_sizeÚcrop_pctÚinterpolationÚmeanÚstdÚ
first_convÚ
classifierr   Úmin_input_sizer   )rT   rM   rN   rN   rO   Ú_cfg  s           ûúr^   zshttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-attn-weights/botnet26t_c1_256-167a0e9f.pthztimm/)r    r   r   )r-   r-   )rT   Ú	hf_hub_idr   rU   rV   zxhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-attn-weights/sebotnet33ts_a1h2_256-957e3c3e.pthg®Gázî?)rT   r_   r   rU   rV   rW   )r   rU   rV   zxhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-attn-weights/eca_botnext26ts_c_256-95a898f6.pth)rU   rV   r]   zuhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-attn-weights/halonet26t_a1h_256-3083328c.pth)rT   r_   rU   rV   r]   zthttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-attn-weights/sehalonet33ts_256-87e053f9.pth)rT   r_   rU   rV   r]   rW   zwhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-attn-weights/halonet50ts_a1h2_256-f3a3daee.pthzyhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-attn-weights/eca_halonext26ts_c_256-06906299.pthzyhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-attn-weights/lambda_resnet26t_c_256-e5a5c857.pth)r    r+   r+   )rT   r_   r]   rU   rV   rW   z|https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-attn-weights/lambda_resnet50ts_a1h_256-b87370f7.pth)rT   r_   r]   rU   rV   z{https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-attn-weights/lambda_resnet26rpt_c_256-ab00292d.pthzxhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-attn-weights/haloregnetz_c_raa_256-c8ad7616.pth)ç      à?r`   r`   z	stem.convrQ   rS   )	rT   r_   rY   rZ   r[   rU   rV   r]   rW   z}https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-attn-weights/lamhalobotnet50ts_a1h2_256-fe3d9445.pthz{https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-attn-weights/halo2botnet50ts_a1h2_256-fd9c11a3.pth)zbotnet26t_256.c1_in1kzsebotnet33ts_256.a1h_in1kzbotnet50ts_256.untrainedzeca_botnext26ts_256.c1_in1kzhalonet_h1.untrainedzhalonet26t.a1h_in1kzsehalonet33ts.ra2_in1kzhalonet50ts.a1h_in1kzeca_halonext26ts.c1_in1kzlambda_resnet26t.c1_in1kzlambda_resnet50ts.a1h_in1kzlambda_resnet26rpt_256.c1_in1kzhaloregnetz_b.ra3_in1kzlamhalobotnet50ts_256.a1h_in1kzhalo2botnet50ts_256.a1h_in1k)Úreturnc                 K   s   |  dd¡ tdd| i|—ŽS )z4 Bottleneck Transformer w/ ResNet26-T backbone.
    Úimg_sizer   Úbotnet26t_256r:   rL   )rc   r:   ©Ú
setdefaultrP   ©rL   rM   rN   rN   rO   rc   \  s    rc   c                 K   s   t dd| i|—ŽS )zY Bottleneck Transformer w/ a ResNet33-t backbone, SE attn for non Halo blocks, SiLU,
    Úsebotnet33ts_256r;   rL   )rg   r;   ©rP   rf   rN   rN   rO   rg   d  s    rg   c                 K   s   |  dd¡ tdd| i|—ŽS )z> Bottleneck Transformer w/ ResNet50-T backbone, silu act.
    rb   r   Úbotnet50ts_256r<   rL   )ri   r<   rd   rf   rN   rN   rO   ri   k  s    ri   c                 K   s   |  dd¡ tdd| i|—ŽS )z> Bottleneck Transformer w/ ResNet26-T backbone, silu act.
    rb   r   Úeca_botnext26ts_256r=   rL   )rj   r=   rd   rf   rN   rN   rO   rj   s  s    rj   c                 K   s   t dd| i|—ŽS )za HaloNet-H1. Halo attention in all stages as per the paper.
    NOTE: This runs very slowly!
    r>   rL   )r>   rh   rf   rN   rN   rO   r>   {  s    r>   c                 K   s   t dd| i|—ŽS )zJ HaloNet w/ a ResNet26-t backbone. Halo attention in final two stages
    r?   rL   )r?   rh   rf   rN   rN   rO   r?   ƒ  s    r?   c                 K   s   t dd| i|—ŽS )zc HaloNet w/ a ResNet33-t backbone, SE attn for non Halo blocks, SiLU, 1-2 Halo in stage 2,3,4.
    r@   rL   )r@   rh   rf   rN   rN   rO   r@   Š  s    r@   c                 K   s   t dd| i|—ŽS )zT HaloNet w/ a ResNet50-t backbone, silu act. Halo attention in final two stages
    rA   rL   )rA   rh   rf   rN   rN   rO   rA   ‘  s    rA   c                 K   s   t dd| i|—ŽS )zT HaloNet w/ a ResNet26-t backbone, silu act. Halo attention in final two stages
    rB   rL   )rB   rh   rf   rN   rN   rO   rB   ˜  s    rB   c                 K   s   t dd| i|—ŽS )zG Lambda-ResNet-26-T. Lambda layers w/ conv pos in last two stages.
    rC   rL   )rC   rh   rf   rN   rN   rO   rC   Ÿ  s    rC   c                 K   s   t dd| i|—ŽS )zR Lambda-ResNet-50-TS. SiLU act. Lambda layers w/ conv pos in last two stages.
    rD   rL   )rD   rh   rf   rN   rN   rO   rD   ¦  s    rD   c                 K   s   |  dd¡ tdd| i|—ŽS )zN Lambda-ResNet-26-R-T. Lambda layers w/ rel pos embed in last two stages.
    rb   r   rE   rL   )rE   rd   rf   rN   rN   rO   rE   ­  s    rE   c                 K   s   t dd| i|—ŽS )z Halo + RegNetZ
    rF   rL   )rF   rh   rf   rN   rN   rO   rF   µ  s    rF   c                 K   s   t dd| i|—ŽS )z3 Combo Attention (Lambda + Halo + Bot) Network
    Úlamhalobotnet50ts_256rG   rL   )rk   rG   rh   rf   rN   rN   rO   rk   ¼  s    rk   c                 K   s   t dd| i|—ŽS )z1 Combo Attention (Halo + Halo + Bot) Network
    Úhalo2botnet50ts_256rH   rL   )rl   rH   rh   rf   rN   rN   rO   rl   Ã  s    rl   )NF)r"   )F)F)F)F)F)F)F)F)F)F)F)F)F)F)F)#Ú__doc__Z	timm.datar   r   Z_builderr   Ú	_registryr   r   Zbyobnetr	   r
   r   r   Ú__all__rJ   rI   rP   r^   Zdefault_cfgsrc   rg   ri   rj   r>   r?   r@   rA   rB   rC   rD   rE   rF   rk   rl   rN   rN   rN   rO   Ú<module>   s:  üôüòüóüòü
ôü
õü
ò       þú
òüóüõüôüõü
ð      þ      þ      þøð      þ      þ      þøð€ ¥ q
	
  ý   ý  ÿ  ý  ý   ý   ý   ý   ý  ý   ý     ü  ý  ýÆA