a
    d)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ddLdMZddNdO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dedpdqdrZededpdsdtZededpdudvZededpdwdxZededpdydzZededpd{d|Zededpd}d~ZededpddZededpddZededpddZededpddZededpddZededpddZ ededpddZ!ededpdd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	   )rN0   `         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   \/var/www/html/stable-diffusion-webui/venv/lib/python3.9/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Gz?)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