a
    d]2                     @   s  d Z ddlmZ ddlmZ ddlZddlmZ ddlm	Z	m
Z
mZmZmZmZmZ ddlmZ ddlmZ dd	lmZmZmZ d
gZG dd dejZG dd dejZG dd
 d
ejZdd Zd.ddZd/ddZeeddedddeddeddeddeddddeddddeddddeddedddd
Z ed0ed d!d"Z!ed1ed d#d$Z"ed2ed d%d&Z#ed3ed d'd(Z$ee%d)d*d+d,d- dS )4z
TResNet: High Performance GPU-Dedicated Architecture
https://arxiv.org/pdf/2003.13630.pdf

Original model: https://github.com/mrT23/TResNet

    )OrderedDict)partialN)SpaceToDepth
BlurPool2dClassifierHeadSEModuleConvNormActAaConvNormActDropPath   )build_model_with_cfg)checkpoint_seq)register_modelgenerate_default_cfgsregister_model_deprecationsTResNetc                       s*   e Zd ZdZd	 fdd	Zdd Z  ZS )

BasicBlockr   NT        c           
         s   t t|   || _|| _ttjdd}|dkrFt||dd|d| _	nt
||dd||d| _	t||dddd d	| _tjd
d| _t|| j d d}	|rt|| j |	dnd | _|dkrt|nt | _d S )NMbP?Znegative_sloper      kernel_sizestride	act_layer   r   r   r   aa_layerFr   r   Z	apply_actr   TZinplace   @   Zrd_channelsr   )superr   __init__
downsampler   r   nn	LeakyReLUr	   conv1r   conv2ReLUactmax	expansionr   ser
   Identity	drop_path)
selfinplanesplanesr   r%   use_ser   drop_path_rater   Zrd_chs	__class__ \/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/timm/models/tresnet.pyr$      s    
zBasicBlock.__init__c                 C   s^   | j d ur|  |}n|}| |}| |}| jd urB| |}| || }| |}|S N)r%   r(   r)   r.   r0   r+   r1   xZshortcutoutr8   r8   r9   forward6   s    





zBasicBlock.forward)r   NTNr   __name__
__module____qualname__r-   r$   r>   __classcell__r8   r8   r6   r9   r      s        r   c                       s*   e Zd ZdZd
 fdd	Zdd	 Z  ZS )
Bottleneckr    r   NTr   c	           
         s   t t|   || _|| _|p*ttjdd}t||dd|d| _	|dkr^t||dd|d| _
nt||dd||d| _
t|| j d d	}	|rt||	d
nd | _t||| j dddd d| _|dkrt|nt | _tjdd| _d S )Nr   r   r   r   r   r   r      r!   r"   Fr   r   Tr   )r#   rD   r$   r%   r   r   r&   r'   r	   r(   r)   r   r,   r-   r   r.   conv3r
   r/   r0   r*   r+   )
r1   r2   r3   r   r%   r4   r   r   r5   Zreduction_chsr6   r8   r9   r$   G   s*    


zBottleneck.__init__c                 C   sh   | j d ur|  |}n|}| |}| |}| jd urB| |}| |}| || }| |}|S r:   )r%   r(   r)   r.   rF   r0   r+   r;   r8   r8   r9   r>   i   s    






zBottleneck.forward)r   NTNNr   r?   r8   r8   r6   r9   rD   D   s         "rD   c                       s   e Zd Zd fdd	ZdddZejjdddZejjd ddZ	ejjdd Z
d!ddZdd Zd"edddZdd Z  ZS )#r   r           ?Ffastr   c	              
      s  || _ || _d| _tt|   t}	tj}
t	d| | _
t	d| | _|rj| j
d d | _
| jd d | _dd td|t||D }t|d | jdd	|
d
}| j|rtnt| j|d dd|	|d d}| j|rtnt| jd |d dd|	|d d}| jt| jd |d dd|	|d d}| jt| jd |d	 dd|	|d	 d}ttdt fd|fd|fd|fd|fd|fg| _t| jdddt| j|rtjnd dddt| jd |rtjnd dddt| jd tj dddt| jd tj dddg| _| jd tj | _t| j|||d| _|  D ]F}t|tj rVtj!j"|j#ddd t|tj$r0|j#j%&dd  q0|  D ]B}t|trtj!'|j(j)j# t|trtj!'|j*j)j# qd S )!NFr!   rE   c                 S   s   g | ]}|  qS r8   )tolist).0r<   r8   r8   r9   
<listcomp>       z$TResNet.__init__.<locals>.<listcomp>r      r   r   )r   r   r   T)r   r4   r   r5   r   r    s2dr(   layer1layer2layer3layer4 )Znum_chsZ	reductionmodulezbody.layer1zbody.layer2zbody.layer3    zbody.layer4)	pool_type	drop_rateZfan_outZ
leaky_relu)modeZnonlinearityg{Gz?)+num_classesrX   grad_checkpointingr#   r   r$   r   r&   r'   intr2   r3   torchZlinspacesumsplitr	   _make_layerrD   r   
Sequentialr   r   bodydictr-   Zfeature_infoZnum_featuresr   headmodules
isinstanceZConv2dinitZkaiming_normal_ZweightZLineardataZnormal_Zzeros_r)   ZbnrF   )r1   layersZin_chansrZ   width_factorv2global_poolrX   r5   r   r   Zdprr(   rP   rQ   rR   rS   mr6   r8   r9   r$   y   sn    "



"	zTResNet.__init__r   TNc                 C   s   d }|dks| j ||j krlg }	|dkr@|	tjddddd |	t| j ||j dddd dg7 }	tj|	 }g }	t|D ]X}
|	|| j ||
dkr|nd|
dkr|nd ||t|t	r||
 n|d ||j | _ qxtj|	 S )	Nr   r   TF)r   r   Z	ceil_modeZcount_include_padr   r   )r   r%   r4   r   r5   )
r2   r-   appendr&   Z	AvgPool2dr	   ra   rangerf   list)r1   blockr3   blocksr   r4   r   r5   r%   ri   ir8   r8   r9   r`      s,    

	zTResNet._make_layerc                 C   s   t d|rdndd}|S )Nz^body\.conv1z^body\.layer(\d+)z^body\.layer(\d+)\.(\d+))stemrr   )rc   )r1   ZcoarseZmatcherr8   r8   r9   group_matcher   s    zTResNet.group_matcherc                 C   s
   || _ d S r:   )r[   )r1   enabler8   r8   r9   set_grad_checkpointing   s    zTResNet.set_grad_checkpointingc                 C   s   | j jS r:   )rd   Zfc)r1   r8   r8   r9   get_classifier   s    zTResNet.get_classifierc                 C   s   | j j||d d S )N)rW   )rd   reset)r1   rZ   rl   r8   r8   r9   reset_classifier   s    zTResNet.reset_classifierc                 C   s^   | j rPtj sP| j|}| j|}t| jj| jj	| jj
| jjg|dd}n
| |}|S )NT)flatten)r[   r]   jitZis_scriptingrb   rO   r(   r   rP   rQ   rR   rS   r1   r<   r8   r8   r9   forward_features   s    
zTResNet.forward_features)
pre_logitsc                 C   s   |r|S |  |S r:   )rd   )r1   r<   r   r8   r8   r9   forward_head   s    zTResNet.forward_headc                 C   s   |  |}| |}|S r:   )r~   r   r}   r8   r8   r9   r>      s    

zTResNet.forward)r   rG   rH   FrI   r   r   )r   TNr   )F)T)N)F)r@   rA   rB   r$   r`   r]   r|   ignoreru   rw   rx   rz   r~   boolr   r>   rC   r8   r8   r6   r9   r   x   s&          M


c                 C   s   d| v r| S dd l }| d| } | d| } i }|  D ]\}}|ddd |}|dd	d |}|d
dd |}|ddd |}|ddd |}|ddd |}|dr| d}|||< q8|S )Nzbody.conv1.conv.weightr   model
state_dictzconv(\d+)\.0.0c                 S   s   dt | d dS Nconvr   .convr\   groupr<   r8   r8   r9   <lambda>  rM   z&checkpoint_filter_fn.<locals>.<lambda>zconv(\d+)\.0.1c                 S   s   dt | d dS Nr   r   .bnr   r   r8   r8   r9   r     rM   zconv(\d+)\.0c                 S   s   dt | d dS r   r   r   r8   r8   r9   r     rM   zconv(\d+)\.1c                 S   s   dt | d dS r   r   r   r8   r8   r9   r     rM   zdownsample\.(\d+)\.0c                 S   s   dt | d dS )Ndownsample.r   r   r   r   r8   r8   r9   r     rM   zdownsample\.(\d+)\.1c                 S   s   dt | d dS )Nr   r   r   r   r   r8   r8   r9   r     rM   z	bn.weightgh㈵>)regetitemssubendswithabsadd)r   r   r   Zout_dictkvr8   r8   r9   checkpoint_filter_fn  s"    

r   Fc                 K   s"   t t| |fttdddd|S )N)r   r   r   r    T)Zout_indicesZflatten_sequential)Zpretrained_filter_fnZfeature_cfg)r   r   r   rc   )variant
pretrainedkwargsr8   r8   r9   _create_tresnet  s    
r   rT   c                 K   s   | ddddddddd	d

|S )NrG   )r      r   )   r   g      ?Zbilinear)r   r   r   )rH   rH   rH   zbody.conv1.convzhead.fc)
urlrZ   
input_size	pool_sizeZcrop_pctinterpolationmeanZstdZ
first_conv
classifierr8   )r   r   r8   r8   r9   _cfg'  s    r   ztimm/)	hf_hub_idi+  )r   rZ   )r     r   )   r   )r   r   r   )
ztresnet_m.miil_in21k_ft_in1ktresnet_m.miil_in21kztresnet_m.miil_in1kztresnet_l.miil_in1kztresnet_xl.miil_in1ktresnet_m.miil_in1k_448tresnet_l.miil_in1k_448tresnet_xl.miil_in1k_448ztresnet_v2_l.miil_in21k_ft_in1kztresnet_v2_l.miil_in21k)returnc                 K   s(   t f dg di|}tdd| i|S )Nri   )r   r       r   	tresnet_mr   )r   rc   r   r   r   Zmodel_kwargsr8   r8   r9   r   F  s    r   c                 K   s*   t f g ddd|}tdd| i|S )N)r          r   g333333?ri   rj   	tresnet_lr   )r   r   r   r8   r8   r9   r   L  s    r   c                 K   s*   t f g ddd|}tdd| i|S )N)r    r      r   g?r   
tresnet_xlr   )r   r   r   r8   r8   r9   r   R  s    r   c                 K   s,   t f g dddd|}tdd| i|S )N)r   r       r   rH   T)ri   rj   rk   tresnet_v2_lr   )r   r   r   r8   r8   r9   r   X  s    r   r   r   r   r   )Ztresnet_m_miil_in21kZtresnet_m_448Ztresnet_l_448Ztresnet_xl_448)F)rT   )F)F)F)F)&__doc__collectionsr   	functoolsr   r]   Ztorch.nnr&   Ztimm.layersr   r   r   r   r   r	   r
   Z_builderr   Z_manipulater   	_registryr   r   r   __all__Moduler   rD   r   r   r   r   Zdefault_cfgsr   r   r   r   r@   r8   r8   r8   r9   <module>   sf   $-4 




