a
    d%                     @   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J |d u s&J |d u s2J |d u s>J t||d  | }|pX|}|rt|dksj|
rt|}d}nd}|| _tj||ddd| _||| _|dd| _	|dkr|	rtj
d|dd	nd | _| jdkrt||d|||||||d

| _t | _t | _t | _nLtj||d||||dd| _||| _|d urJ| nt | _|dd| _|dkr|	st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__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__ \/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/timm/models/resnest.pyr      sH    
"





&zResNestBottleneck.__init__c                 C   s&   t | jdd d ur"tj| jj d S )Nweight)getattrr%   r   initZzeros_r0   )r(   r.   r.   r/   zero_init_lastW   s    z ResNestBottleneck.zero_init_lastc                 C   s   |}|  |}| |}| |}| jd ur6| |}| |}| |}| |}| |}| jd urr| |}| 	|}| 
|}| jd ur| |}||7 }| |}|S N)r   r   r   r   r   r    r!   r"   r#   r$   r%   r'   r&   )r(   xZshortcutoutr.   r.   r/   forward[   s&    















zResNestBottleneck.forward)__name__
__module____qualname____doc__Z	expansionr   ZReLUZBatchNorm2dr   r3   r7   __classcell__r.   r.   r,   r/   r      s,   ?r   Fc                 K   s   t t| |fi |S r4   )r   r   )variant
pretrainedkwargsr.   r.   r/   _create_resnestx   s    r@    c                 K   s   | dddddt tddd
|S )	Ni  )r      rB   )   rC   g      ?Zbilinearzconv1.0Zfc)
urlZnum_classes
input_size	pool_sizecrop_pctinterpolationmeanZstdZ
first_conv
classifierr   )rD   r?   r.   r.   r/   _cfg   s    rK   ztimm/)	hf_hub_id)r      rM   )   rN   )rL   rE   rF   )r   @  rO   )
   rP   gJ+?Zbicubic)rL   rE   rF   rG   rH   )r     rQ   )   rR   gV-?)rL   rH   )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g ddddddt dddd	d
}tdd| it |fi |S )z5 ResNeSt-14d model. Weights ported from GluonCV.
    )r   r   r   r   deep    Tr   r      Fr   r+   r   blockZlayersZ	stem_typeZ
stem_widthZavg_downr*   r)   Z
block_args
resnest14dr>   )rZ   dictr   r@   r>   r?   Zmodel_kwargsr.   r.   r/   rZ      s    
rZ   c                 K   sD   t tg ddddddt dddd	d
}tdd| it |fi |S )z5 ResNeSt-26d model. Weights ported from GluonCV.
    )rV   rV   rV   rV   rT   rU   Tr   r   rV   FrW   rX   
resnest26dr>   )r^   r[   r]   r.   r.   r/   r^      s    
r^   c                 K   sD   t tg ddddddt dddd	d
}tdd| it |fi |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      r   rT   rU   Tr   r   rV   FrW   rX   
resnest50dr>   )ra   r[   r]   r.   r.   r/   ra      s    
ra   c                 K   sD   t tg ddddddt ddddd	}tdd| it |fi |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      r   rT   r   Tr   rV   FrW   rX   resnest101er>   )rc   r[   r]   r.   r.   r/   rc      s    
rc   c                 K   sD   t tg ddddddt ddddd	}tdd| it |fi |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      $   r   rT   r   Tr   rV   FrW   rX   resnest200er>   )rf   r[   r]   r.   r.   r/   rf      s    
rf   c                 K   sD   t tg ddddddt ddddd	}tdd| it |fi |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   rN   rT   r   Tr   rV   FrW   rX   resnest269er>   )ri   r[   r]   r.   r.   r/   ri      s    
ri   c                 K   sD   t tg ddddddt ddddd	}tdd| it |fi |S )z]ResNeSt-50 4s2x40d from https://github.com/zhanghang1989/ResNeSt/blob/master/ablation.md
    r_   rT   rU   T(   rV   r   rW   rX   resnest50d_4s2x40dr>   )rk   r[   r]   r.   r.   r/   rk      s    
rk   c                 K   sD   t tg ddddddt ddddd	}tdd| it |fi |S )z]ResNeSt-50 1s4x24d from https://github.com/zhanghang1989/ResNeSt/blob/master/ablation.md
    r_   rT   rU   Trd   r   r   rW   rX   resnest50d_1s4x24dr>   )rl   r[   r]   r.   r.   r/   rl      s    
rl   N)F)rA   )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   r@   rK   Zdefault_cfgsrZ   r^   ra   rc   rf   ri   rk   rl   r.   r.   r.   r/   <module>   sd   f
	



