o
    پi*M                     @   s<	  d Z ddlmZmZ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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d0d1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	d0d1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d0d"	eeddd
ddddedd#d#dd	ddd.ed/dd#d2d3	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d0d4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&d5d6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d7ed8d9d1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d7ed8d9d4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d7ed:d9d1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dAedddBd.edCd	dDdEdFeeddd
ddddedd#dd	ddd7edGd9dHedd$dd	ddd.eddIdHedddd	ddde dHfdddddJeeddd
ddddedd#dd	ddd.eddIdHedd$dd	ddd.eddIdHedddd	ddde dHfdddddJdKZddMedNee dOedPefdQdRZddSedPeeef fdTdUZeedVdWddXdYdZed[dWddXdYd\d]eddXdYd^ed_dWddXdYdZedXdYdXd`edadWdXdYdXdbedcdWdXdYdXd\ddededWdXdYdXd\ddedfdWdXdYdXd\ddedgdWdhdXdYd\diedjdWdhdXdYdkedldWddXdYd\d]edmdWdndndodpdqdpd\dr	edsdWddXdYdZedtdWddXdYdZduZeddOedPefdvdwZeddOedPefdxdyZeddOedPefdzd{ZeddOedPefd|d}ZeddOedPefd~dZeddOedPefddZeddOedPefddZ eddOedPefddZ!eddOedPefddZ"eddOedPefddZ#eddOedPefddZ$eddOedPefddZ%eddOedPefddZ&eddOedPefddZ'eddOedPefddZ(d:S )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.
    )AnyDictOptional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   @   tieredmaxpoolT
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    silui   se)	r   r    r!   r"   	act_layernum_features
attn_layerr$   r%         )r   r    r!   r"   r+   r#   r$   r%      eca)dim_head)	r   r    r!   r"   r#   r+   r-   r$   r%   g      ?   
   7x7halo   )
block_size	halo_size)r   r    r!   r"   r$   r%   )r8   r9   	num_heads)	r   r'   r   r   r   r   r   r$   r%   )r   r    r!   r"   r+   r$   r%   )r8   r9   r2   )r   r    r!   r"   r+   r-   r$   r%   lambda	   )rN0   `         i       )rd_ratio)	bottle_in
linear_out   gQ?)r8   r9   qk_ratio)r   r    r"   
downsampler,   r+   r-   attn_kwargsblock_kwargsr$   r%      )r   r   r   r   r   r   r$   r%   )r9   )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halo2botnet50tsFvariantcfg_variant
pretrainedreturnc                 K   s0   t t| |f|st|  nt| tddd|S )a<  Create a Bring-Your-Own-Attention network model.

    Args:
        variant: Model variant name.
        cfg_variant: Config variant name if different from model variant.
        pretrained: Load pretrained weights.
        **kwargs: Additional model arguments.

    Returns:
        Instantiated ByobNet model.
    T)flatten_sequential)	model_cfgfeature_cfg)r	   r   
model_cfgsdict)r[   r\   r]   kwargs re   G/home/ubuntu/.local/lib/python3.10/site-packages/timm/models/byoanet.py_create_byoanet	  s   rg   urlc                 K   s"   | dddddt tddddd	|S )
zGenerate default model configuration.

    Args:
        url: URL for pretrained weights.
        **kwargs: Override default configuration values.

    Returns:
        Model configuration dictionary.
    i  r&      rj   rF   rF   gffffff?bicubiczstem.conv1.convzhead.fcF)rh   num_classes
input_size	pool_sizecrop_pctinterpolationmeanstd
first_conv
classifierr#   min_input_sizer   )rh   rd   re   re   rf   _cfg  s   rw   zshttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-attn-weights/botnet26t_c1_256-167a0e9f.pthztimm/)r&   r   r   )r7   r7   )rh   	hf_hub_idr#   rn   ro   zxhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-attn-weights/sebotnet33ts_a1h2_256-957e3c3e.pthgGz?)rh   rx   r#   rn   ro   rp   )r#   rn   ro   zxhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-attn-weights/eca_botnext26ts_c_256-95a898f6.pth)rn   ro   rv   zuhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-attn-weights/halonet26t_a1h_256-3083328c.pth)rh   rx   rn   ro   rv   zthttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-attn-weights/sehalonet33ts_256-87e053f9.pth)rh   rx   rn   ro   rv   rp   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&   r3   r3   )rh   rx   rv   rn   ro   rp   z|https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-attn-weights/lambda_resnet50ts_a1h_256-b87370f7.pth)rh   rx   rv   rn   ro   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)      ?ry   ry   z	stem.convri   rk   )	rh   rx   rr   rs   rt   rn   ro   rv   rp   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_in1kc                 K      | dd tdd| i|S )z4 Bottleneck Transformer w/ ResNet26-T backbone.
    img_sizer   botnet26t_256rL   r]   N)r|   rL   
setdefaultrg   r]   rd   re   re   rf   r|   r     r|   c                 K      t dd| i|S )zY Bottleneck Transformer w/ a ResNet33-t backbone, SE attn for non Halo blocks, SiLU,
    sebotnet33ts_256rM   r]   N)r   rM   rg   r   re   re   rf   r   z     r   c                 K   rz   )z> Bottleneck Transformer w/ ResNet50-T backbone, silu act.
    r{   r   botnet50ts_256rN   r]   N)r   rN   r}   r   re   re   rf   r     r   r   c                 K   rz   )z> Bottleneck Transformer w/ ResNet26-T backbone, silu act.
    r{   r   eca_botnext26ts_256rO   r]   N)r   rO   r}   r   re   re   rf   r     r   r   c                 K      t dd| i|S )za HaloNet-H1. Halo attention in all stages as per the paper.
    NOTE: This runs very slowly!
    rP   r]   N)rP   r   r   re   re   rf   rP     s   rP   c                 K   r   )zJ HaloNet w/ a ResNet26-t backbone. Halo attention in final two stages
    rQ   r]   N)rQ   r   r   re   re   rf   rQ     r   rQ   c                 K   r   )zc HaloNet w/ a ResNet33-t backbone, SE attn for non Halo blocks, SiLU, 1-2 Halo in stage 2,3,4.
    rR   r]   N)rR   r   r   re   re   rf   rR     r   rR   c                 K   r   )zT HaloNet w/ a ResNet50-t backbone, silu act. Halo attention in final two stages
    rS   r]   N)rS   r   r   re   re   rf   rS     r   rS   c                 K   r   )zT HaloNet w/ a ResNet26-t backbone, silu act. Halo attention in final two stages
    rT   r]   N)rT   r   r   re   re   rf   rT     r   rT   c                 K   r   )zG Lambda-ResNet-26-T. Lambda layers w/ conv pos in last two stages.
    rU   r]   N)rU   r   r   re   re   rf   rU     r   rU   c                 K   r   )zR Lambda-ResNet-50-TS. SiLU act. Lambda layers w/ conv pos in last two stages.
    rV   r]   N)rV   r   r   re   re   rf   rV     r   rV   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.
    r{   r   rW   r]   N)rW   r}   r   re   re   rf   rW     r   rW   c                 K   r   )z Halo + RegNetZ
    rX   r]   N)rX   r   r   re   re   rf   rX     r   rX   c                 K   r   )z3 Combo Attention (Lambda + Halo + Bot) Network
    lamhalobotnet50ts_256rY   r]   N)r   rY   r   r   re   re   rf   r     r   r   c                 K   r   )z1 Combo Attention (Halo + Halo + Bot) Network
    halo2botnet50ts_256rZ   r]   N)r   rZ   r   r   re   re   rf   r     r   r   )NF)r(   )F))__doc__typingr   r   r   	timm.datar   r   _builderr	   	_registryr
   r   byobnetr   r   r   r   __all__rc   rb   strboolrg   rw   default_cfgsr|   r   r   r   rP   rQ   rR   rS   rT   rU   rV   rW   rX   r   r   re   re   re   rf   <module>   s   








   q
A