
    kh*M                         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       edd	dd	dd       edd	dd	dd       edd	dd	dd      fddddd e              e edd	d
ddd       edd	gddd	dd       edd	gddd	dd       edd	dd	dd      fddddd d!d e       "	       e eddd
ddd       edd#d#dd	dd       edd$dd	dd       edddd	dd      fdddddd e       %       e edd	d
dd&d       edd	dd	d&d       edd	dd	d&d       edd	dd	d&d      fdddddd'd ed&(      )	       e edddddd*       eddd+d	dd*       edd,d
d	dd*       edddd	dd*      fdd-dd. ed/d0      1       e edd	d
ddd       edd	dd	dd       edd	dd	dd       edd	dd	dd      fdddd. ed/d	0      1       e edd	d
ddd       edd	gddd	dd       edd	gddd	dd       edd	dd	dd      fddddd d!d. ed/d0      "	       e eddd
ddd       edd#d#dd	ddd. ed/dd#2      3	       edd$dd	dd       edddd	dd      fddddd. ed/d0      4       e edd	d
dd&d       edd	dd	d&d       edd	dd	d&d       edd	dd	d&d      fddddd'd. ed/d	d&5      6       e edd	d
ddd       edd	dd	dd       edd	dd	dd       edd	dd	dd      fdddd7 ed89      1       e eddd
ddd       edd#d#dd	dd       edd$dd	dd       edddd	dd      fddddd7 ed89      4       e edd	d
ddd       edd	dd	dd       edd	dd	dd       edd	dd	dd      fdddd7 ed:9      1       e edd	d;d	d&d       edd$d<d	d&d       eddd=d>d	d&d       edd	d?d	d&d      fd@ddddd! edA       eddB      d. edCd	dDE      F       e eddd
ddd       edd#dd	ddd7 edG9      H       edd$dd	ddd. edI      H       edddd	ddd e       H      fddddJ       e eddd
ddd       edd#dd	ddd. edI      H       edd$dd	ddd. edI      H       edddd	ddd e       H      fddddJ      K      ZddLedMee   dNedOefdPZddQedOeeef   fdRZ e edSdTddUdVW       edXdTddUdVdYZ       eddUdV[       ed\dTddUdVW       edUdVdU]       ed^dTdUdVdU_       ed`dTdUdVdUdYa       edbdTdUdVdUdYa       edcdTdUdVdUdYa       edddTdedUdVdYf       edgdTdedUdVh       edidTddUdVdYZ       edjdTdkdkdldmdndmdYo	       edpdTddUdVW       edqdTddUdVW      dr      ZeddNedOefds       ZeddNedOefdt       ZeddNedOefdu       ZeddNedOefdv       ZeddNedOefdw       ZeddNedOefdx       ZeddNedOefdy       Z eddNedOefdz       Z!eddNedOefd{       Z"eddNedOefd|       Z#eddNedOefd}       Z$eddNedOefd~       Z%eddNedOefd       Z&eddNedOefd       Z'eddNedOefd       Z(y:)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&   )r9   r:   	num_heads)	r   r(   r   r   r   r   r   r%   r&   )r    r!   r"   r#   r,   r%   r&   )r9   r:   r3   )r    r!   r"   r#   r,   r.   r%   r&   lambda	   )rN0   `         i       )rd_ratio)	bottle_in
linear_out   gQ?)r9   r:   qk_ratio)r    r!   r#   
downsampler-   r,   r.   attn_kwargs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halo2botnet50tsvariantcfg_variant
pretrainedreturnc                 d    t        t        | |f|s	t        |    nt        |   t        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^   kwargss       O/var/www/teggl/fontify/venv/lib/python3.12/site-packages/timm/models/byoanet.py_create_byoanetrh   	  s@      *-8*W%j>UD1 	     urlc                 4    | 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'      rm   rG   rG   gffffff?bicubiczstem.conv1.convzhead.fcF)rj   num_classes
input_size	pool_sizecrop_pctinterpolationmeanstd
first_conv
classifierr$   min_input_sizer   )rj   rf   s     rg   _cfgrz     s7     4}SY9%.B'y!]  ri   zshttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-attn-weights/botnet26t_c1_256-167a0e9f.pthztimm/)r'   r   r   )r8   r8   )rj   	hf_hub_idr$   rq   rr   zxhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-attn-weights/sebotnet33ts_a1h2_256-957e3c3e.pthgGz?)rj   r{   r$   rq   rr   rs   )r$   rq   rr   zxhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-attn-weights/eca_botnext26ts_c_256-95a898f6.pth)rq   rr   ry   zuhttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-attn-weights/halonet26t_a1h_256-3083328c.pth)rj   r{   rq   rr   ry   zthttps://github.com/rwightman/pytorch-image-models/releases/download/v0.1-attn-weights/sehalonet33ts_256-87e053f9.pth)rj   r{   rq   rr   ry   rs   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'   r4   r4   )rj   r{   ry   rq   rr   rs   z|https://github.com/rwightman/pytorch-image-models/releases/download/v0.1-attn-weights/lambda_resnet50ts_a1h_256-b87370f7.pth)rj   r{   ry   rq   rr   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.convrl   rn   )	rj   r{   ru   rv   rw   rq   rr   ry   rs   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                 @    |j                  dd       t        dd| i|S )z4 Bottleneck Transformer w/ ResNet26-T backbone.
    img_sizer   r^   )botnet26t_256rM   
setdefaultrh   r^   rf   s     rg   r   r   r  s(     j#&YJYRXYYri   c                     t        dd| i|S )zY Bottleneck Transformer w/ a ResNet33-t backbone, SE attn for non Halo blocks, SiLU,
    r^   )sebotnet33ts_256rN   rh   r   s     rg   r   r   z  s     _*_X^__ri   c                 @    |j                  dd       t        dd| i|S )z> Bottleneck Transformer w/ ResNet50-T backbone, silu act.
    r~   r   r^   )botnet50ts_256rO   r   r   s     rg   r   r     s(     j#&[j[TZ[[ri   c                 @    |j                  dd       t        dd| i|S )z> Bottleneck Transformer w/ ResNet26-T backbone, silu act.
    r~   r   r^   )eca_botnext26ts_256rP   r   r   s     rg   r   r     s)     j#&ePZe^deeri   c                     t        dd| i|S )za HaloNet-H1. Halo attention in all stages as per the paper.
    NOTE: This runs very slowly!
    r^   )rQ   r   r   s     rg   rQ   rQ     s    
 IJI&IIri   c                     t        dd| i|S )zJ HaloNet w/ a ResNet26-t backbone. Halo attention in final two stages
    r^   )rR   r   r   s     rg   rR   rR     s     IJI&IIri   c                     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^   )rS   r   r   s     rg   rS   rS          LzLVLLri   c                     t        dd| i|S )zT HaloNet w/ a ResNet50-t backbone, silu act. Halo attention in final two stages
    r^   )rT   r   r   s     rg   rT   rT     s     JZJ6JJri   c                     t        dd| i|S )zT HaloNet w/ a ResNet26-t backbone, silu act. Halo attention in final two stages
    r^   )rU   r   r   s     rg   rU   rU          O*OOOri   c                     t        dd| i|S )zG Lambda-ResNet-26-T. Lambda layers w/ conv pos in last two stages.
    r^   )rV   r   r   s     rg   rV   rV     r   ri   c                     t        dd| i|S )zR Lambda-ResNet-50-TS. SiLU act. Lambda layers w/ conv pos in last two stages.
    r^   )rW   r   r   s     rg   rW   rW     s     P:PPPri   c                 @    |j                  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   r^   )rX   r   r   s     rg   rX   rX     s'     j#&U
UfUUri   c                     t        dd| i|S )z Halo + RegNetZ
    r^   )rY   r   r   s     rg   rY   rY     r   ri   c                     t        dd| i|S )z3 Combo Attention (Lambda + Halo + Bot) Network
    r^   )lamhalobotnet50ts_256rZ   r   r   s     rg   r   r     s     iT^ibhiiri   c                     t        dd| i|S )z1 Combo Attention (Halo + Halo + Bot) Network
    r^   )halo2botnet50ts_256r[   r   r   s     rg   r   r     s     ePZe^deeri   )NF)r)   )F))__doc__typingr   r   r   	timm.datar   r   _builderr
   	_registryr   r   byobnetr   r   r   r   __all__re   rd   strboolrh   rz   default_cfgsr   r   r   r   rQ   rR   rS   rT   rU   rV   rW   rX   rY   r   r    ri   rg   <module>r      s   ' & A * < I I
 XcQ1FXcQ1F$;qDARSX\][AqTJ	
 $ XcQ1F$;A3!sVW\]bfg$;A3!tWX]^cghqDA!F	
 $  XcQ1F$;1STUZ[`de$;qDARSX\]$;qDARSX\]	
 $  XcQ2$GXcQ2$G$;qDARTY]^[ArdK	
 $r*" [AqQ3G[AaCH[B#qSI[AaCH	
 a8 XcQ1FXcQ1F$;qDARSX\][AqTJ	
 a8 XcQ1F$;A3!sVW\]bfg$;A3!tWX]^cghqDA!F	
 a8  XcQ1F-Q!saARV &VWcd9eg $;qDARSX\]$;qDARSX\]
 a8  !XcQ2$GXcQ2$G$;qDARTY]^[ArdK	
 a"E  !XcQ1FXcQ1F$;qDARSX\][AqTJ	
   "XcQ1F$;1STUZ[`de$;qDARSX\]$;qDARSX\]	
   'XcQ1FXcQ1F$;qDARSX\][AqTJ	
   XbA"CXbA"C$;1cUV[]bcdqC1B	
 $'DT:a$G!( "XcQ1F-cQ1 (4":G -daA$ &9JL -daA$ ,tvG
 !$  XcQ1F-cQ1 &9JL -daA$ &9JL -daA$ ,tvG
 !wm
`S x} QU ls (c T#s(^ ( %! B-6K "& G-6TX"Z !%-6!K#' G-6$K
 !MV\ij D F=R # C F=[_a ! F F=[_a !% H F=[_!a
 !% H$&[_!a #' K$&#R '+ J-6TX'Z
 # G/=F[hsw	y '+ L-6'K %) J-6%Ku>& >B Zd Z Z Z ` `G ` ` \t \' \ \ fD fw f f J4 Jg J J J4 Jg J J Md M M M KD Kw K K P PG P P P PG P P Q$ QW Q Q Vt V' V V Md M M M jd j j j fD fw f fri   