a
    dS                     @   s  d Z ddlZddlmZ ddlmZ ddlmZ ddlZddl	m
  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mZ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 m!Z! dgZ"eG dd de
j#Z$G dd de
j#Z%G dd de
j#Z&G dd de
j#Z'G dd de
j#Z(G dd de
j#Z)d7ddZ*dd Z+d8d d!Z,d9d#d$Z-e!e-d%d&dd'e-d%d&dd'e-d%d(d)dd*e-d%d(d)dd*e-d%d(d)dd*e-d%d)dd'd+Z.e d:e)d,d-d.Z/e d;e)d,d/d0Z0e d<e)d,d1d2Z1e d=e)d,d3d4Z2e d>e)d,d5d6Z3dS )?a#   EdgeNeXt

Paper: `EdgeNeXt: Efficiently Amalgamated CNN-Transformer Architecture for Mobile Vision Applications`
 - https://arxiv.org/abs/2206.10589

Original code and weights from https://github.com/mmaaz60/EdgeNeXt

Modifications and additions for timm by / Copyright 2022, Ross Wightman
    N)OrderedDict)partial)Tuple)nnIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)trunc_normal_tf_DropPathLayerNorm2dMlpSelectAdaptivePool2dcreate_conv2duse_fused_attn   )build_model_with_cfg)register_notrace_module)named_applycheckpoint_seq)register_modelgenerate_default_cfgsEdgeNeXtc                       s6   e Zd Zd	 fdd	Zeeeef dddZ  ZS )
PositionalEncodingFourier       '  c                    sB   t    tj|d |dd| _dtj | _|| _|| _	|| _
d S )N   r   )kernel_size)super__init__r   Conv2dtoken_projectionmathpiscaletemperature
hidden_dimdim)selfr&   r'   r%   	__class__ ]/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/timm/models/edgenext.pyr       s    
z"PositionalEncodingFourier.__init__)shapec              	   C   s  | j jj}| j jj}t|j|tjd }|jd|d}|jd|d}d}||d d dd d d f |  | j	 }||d d d d dd f |  | j	 }tj
| j||d}| jdtj|ddd	 | j  }|d d d d d d d f | }	|d d d d d d d f | }
tj|	d d d d d d d
d df  |	d d d d d d dd df  fddd}	tj|
d d d d d d d
d df  |
d d d d d d dd df  fddd}
tj|
|	fddd
ddd}|  |}|S )N)devicedtyper   )r/   r   ư>)r/   r.   floor)Zrounding_moder      r'      )r!   weightr.   r/   torchzerostoboolZcumsumr$   Zaranger&   r%   divstacksincosflattencatpermute)r(   r-   r.   r/   Zinv_maskZy_embedZx_embedepsZdim_tZpos_xZpos_yposr+   r+   r,   forward(   s>    

((   $$$$
z!PositionalEncodingFourier.forward)r   r   r   )__name__
__module____qualname__r   r   intrD   __classcell__r+   r+   r)   r,   r      s   r   c                
       sD   e Zd Zddddddeejddejdf	 fd	d
	Zdd Z  Z	S )	ConvBlockN   r   Tr3   r0   rB           c                    s   t    |p|}|dkp ||k| _t||||d|d| _||| _t|t|| |	d| _|dkrxt	
|t| nd | _|
dkrt|
nt	 | _d S )Nr   T)r   stride	depthwisebias	act_layerr   rM   )r   r   shortcut_after_dwr   conv_dwnormr   rH   mlpr   	Parameterr7   onesgammar
   Identity	drop_path)r(   r'   dim_outr   rN   	conv_biasexpand_ratiols_init_value
norm_layerrR   r[   r)   r+   r,   r   D   s    

"zConvBlock.__init__c                 C   sr   |}|  |}| jr|}|dddd}| |}| |}| jd urP| j| }|dddd}|| | }|S )Nr   r   r5   r   )rT   rS   rA   rU   rV   rY   r[   )r(   xshortcutr+   r+   r,   rD   [   s    




zConvBlock.forward
rE   rF   rG   r   r   	LayerNormGELUr   rD   rI   r+   r+   r)   r,   rJ   C   s   rJ   c                       s6   e Zd Zd
 fdd	Zdd Zejjdd	 Z  Z	S )CrossCovarianceAttn   FrM   c                    sf   t    || _tt|dd| _tj||d |d| _	t
|| _t||| _t
|| _d S )Nr   r5   )rP   )r   r   	num_headsr   rW   r7   rX   r%   LinearqkvDropout	attn_dropproj	proj_drop)r(   r'   rh   qkv_biasrl   rn   r)   r+   r,   r   m   s    
zCrossCovarianceAttn.__init__c           
      C   s   |j \}}}| |||d| jdddddd}|d\}}}tj|ddtj|dddd | j	 }	|	j
dd}	| |	}	|	| }|dddd|||}| |}| |}|S )	Nr5   r1   r   r   r3   r   r4   )r-   rj   reshaperh   rA   ZunbindF	normalizeZ	transposer%   Zsoftmaxrl   rm   rn   )
r(   ra   BNCrj   qkvZattnr+   r+   r,   rD   ~   s    (*


zCrossCovarianceAttn.forwardc                 C   s   dhS )Nr%   r+   r(   r+   r+   r,   no_weight_decay   s    z#CrossCovarianceAttn.no_weight_decay)rg   FrM   rM   )
rE   rF   rG   r   rD   r7   jitignorer{   rI   r+   r+   r)   r,   rf   l   s       rf   c                       sJ   e Zd Zdddddddeejddejdddf fdd		Zd
d Z  Z	S )SplitTransposeBlockr   rg   r3   Tr0   rL   rM   c              
      s>  t    ttt|| tt|| }|| _td|d | _g }t	| jD ]}|
t||dd|d qTt|| _d | _|rt|d| _|	|| _|dkrt|t| nd | _t|||||d| _|	|dd	| _t|t|| |
d
| _|dkrt|t| nd | _|dkr0t|nt | _d S )Nr   r5   T)r   rO   rP   r4   r   )rh   ro   rl   rn   r0   rL   rQ   rM   )r   r   maxrH   r"   ceilr2   width
num_scalesrangeappendr   r   Z
ModuleListconvspos_embdr   norm_xcarW   r7   rX   	gamma_xcarf   xcarU   r   rV   rY   r
   rZ   r[   )r(   r'   r   rh   r^   use_pos_embr]   ro   r_   r`   rR   r[   rl   rn   r   r   ir)   r+   r,   r      s(    
&
"
$zSplitTransposeBlock.__init__c              	   C   s^  |}|j t| jd dd}g }|d }t| jD ].\}}|dkrN|||  }||}|| q2||d  t|d}|j\}}	}
}|||	|
| 	ddd}| j
d ur| 
||
|f|d|jd 	ddd}|| }|| | j| | |  }|||
||	}| |}| |}| jd ur<| j| }|	dddd}|| | }|S )Nr   r4   r   r1   r   r5   )chunklenr   	enumerater   r7   r@   r-   rq   rA   r   r[   r   r   r   rU   rV   rY   )r(   ra   rb   ZspxZspospr   convrt   rv   HWZpos_encodingr+   r+   r,   rD      s2    
* 


zSplitTransposeBlock.forwardrc   r+   r+   r)   r,   r~      s   'r~   c                       sP   e Zd Zddddddddddddeeejd	d
ejf fdd	Zdd Z	  Z
S )EdgeNeXtStager   r   r3   rK   FT      ?Nr0   rL   c                    s   t    d| _|s|dkr(t | _n&t||tj||dd|d| _|}g }t|D ]r}||| k r|	t
|||r|dkr|nd|||	||| ||d
 n&|	t||||	|
|||| ||d
 |}qZtj| | _d S )NFr   r   r   rN   rP   r   )
r'   r\   rN   r]   r   r^   r_   r[   r`   rR   )
r'   r   rh   r^   r   r]   r_   r[   r`   rR   )r   r   grad_checkpointingr   rZ   
downsample
Sequentialr    r   r   rJ   r~   blocks)r(   in_chsout_chsrN   depthnum_global_blocksrh   scalesr   r^   r   downsample_blockr]   r_   drop_path_ratesr`   norm_layer_clrR   Zstage_blocksr   r)   r+   r,   r      sT    
zEdgeNeXtStage.__init__c                 C   s6   |  |}| jr(tj s(t| j|}n
| |}|S N)r   r   r7   r|   Zis_scriptingr   r   r(   ra   r+   r+   r,   rD   #  s
    

zEdgeNeXtStage.forward)rE   rF   rG   r   r   r   rd   re   r   rD   rI   r+   r+   r)   r,   r      s"   Cr   c                       s   e Zd Zddddddddd	d
dddddddejddf f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   r5     avg   0   X      r5   r5   	   r5   )r   r   r   r   )r5      rK   r   )rg   rg   rg   rg   )r   r   r5   r3   )FTFFr0   r   r3   FTpatchrM   c                    sF  t    || _|| _|| _ttdd}ttjdd}g | _	|dv sHJ |dkr|t
tj||d dd|d||d | _n,t
tj||d ddd|d	||d | _d}g }d
d td|t||D }|d }tdD ]}|dks|dkrdnd}||9 }|t||| ||| || || || |	| ||| |
| ||||||d || }|  j	t||d| dg7  _	qtj
| | _|d | _|r|| jnt | _t
tdt|dfd|rt n|| jfd|rtdnt fdt| jfd|dkrt| j|nt fg| _ttt |d|  d S )Nr0   rL   )r   overlapr   r   r3   r   r   )r   rN   paddingrP   c                 S   s   g | ]}|  qS r+   )tolist).0ra   r+   r+   r,   
<listcomp>Z      z%EdgeNeXt.__init__.<locals>.<listcomp>r   r   )r   r   rN   r   r   rh   r   r   r^   r   r   r_   r   r]   r`   r   rR   zstages.)Znum_chsZ	reductionmoduler1   global_poolZ	pool_typerU   r?   dropfc)head_init_scale)!r   r   num_classesr   	drop_rater   r   r   rd   Zfeature_infor   r    stemr7   Zlinspacesumsplitr   r   r   dictstagesnum_featuresrZ   norm_prer   r   Flattenrk   ri   headr   _init_weights)r(   Zin_chansr   r   dimsdepthsZglobal_block_countsZkernel_sizesheadsZ	d2_scalesr   r_   r   r^   r   r]   	stem_typeZhead_norm_firstrR   Zdrop_path_rater   r`   r   Zcurr_strider   Zdp_ratesr   r   rN   r)   r+   r,   r   -  sp    


""
"
zEdgeNeXt.__init__c                 C   s   t d|rdng ddS )Nz^stemz^stages\.(\d+)))z^stages\.(\d+)\.downsample)r   )z^stages\.(\d+)\.blocks\.(\d+)N)z	^norm_pre)i )r   r   )r   )r(   Zcoarser+   r+   r,   group_matcher  s    zEdgeNeXt.group_matcherc                 C   s   | j D ]
}||_qd S r   )r   r   )r(   enablesr+   r+   r,   set_grad_checkpointing  s    
zEdgeNeXt.set_grad_checkpointingc                 C   s   | j jS r   )r   r   rz   r+   r+   r,   get_classifier  s    zEdgeNeXt.get_classifierr   Nc                 C   sV   |d ur0t |d| j_|r$tdnt | j_|dkrFt| j|nt | j_	d S )Nr   r   r   )
r   r   r   r   r   rZ   r?   ri   r   r   )r(   r   r   r+   r+   r,   reset_classifier  s    zEdgeNeXt.reset_classifierc                 C   s"   |  |}| |}| |}|S r   )r   r   r   r   r+   r+   r,   forward_features  s    


zEdgeNeXt.forward_features)
pre_logitsc                 C   sD   | j |}| j |}| j |}| j |}|r8|S | j |S r   )r   r   rU   r?   r   r   )r(   ra   r   r+   r+   r,   forward_head  s
    zEdgeNeXt.forward_headc                 C   s   |  |}| |}|S r   )r   r   r   r+   r+   r,   rD     s    

zEdgeNeXt.forward)F)T)r   N)F)rE   rF   rG   r   re   r   r7   r|   r}   r   r   r   r   r   r:   r   rD   rI   r+   r+   r)   r,   r   ,  s>   W


r   c                 C   s   t | tjr4t| jdd | jd urtj| j nPt | tjrt| jdd tj| j |rd|v r| jj	
| | jj	
| d S )Ng{Gz?)stdhead.)
isinstancer   r    r	   r6   rP   initZzeros_ri   dataZmul_)r   namer   r+   r+   r,   r     s    
r   c                 C   s   d| v sd| v r| S d| v r&| d } n"d| v r8| d } nd| v rH| d } i }ddl }|  D ]\}}|dd	}|d
d|}|dd|}|dd}|dd}|dd}|dr|dd}|jdkrd|vr| | j}||}|||< q\|S )z Remap FB checkpoints -> timm zhead.norm.weightznorm_pre.weightZ	model_emamodel
state_dictr   Nzdownsample_layers.0.zstem.zstages.([0-9]+).([0-9]+)zstages.\1.blocks.\2z#downsample_layers.([0-9]+).([0-9]+)zstages.\1.downsample.\2ZdwconvrT   Zpwconvzmlp.fcr   zhead.fc.znorm.rU   z	head.normr   r   )	reitemsreplacesub
startswithndimr   r-   rq   )r   r   Zout_dictr   rx   ry   Zmodel_shaper+   r+   r,   checkpoint_filter_fn  s0    




r   Fc                 K   s&   t t| |fttdddd|}|S )N)r   r   r   r5   T)Zout_indicesZflatten_sequential)Zpretrained_filter_fnZfeature_cfg)r   r   r   r   )variant
pretrainedkwargsr   r+   r+   r,   _create_edgenext  s    
r    c                 K   s   | dddddt tddd
|S )	Nr   )r5      r   )rg   rg   g?Zbicubiczstem.0zhead.fc)
urlr   Z
input_sizeZ	pool_sizecrop_pctinterpolationmeanr   Z
first_conv
classifierr   )r   r   r+   r+   r,   _cfg  s    r   ztimm/)r5      r   )	hf_hub_idtest_input_sizetest_crop_pctgffffff?)r5   @  r   )r   r   r   r   )zedgenext_xx_small.in1kzedgenext_x_small.in1kzedgenext_small.usi_in1kzedgenext_base.usi_in1kzedgenext_base.in21k_ft_in1kzedgenext_small_rw.sw_in1k)returnc                 K   s(   t f dddd|}tdd| i|S )N)r   r      r   r   r3   r3   r3   r3   r   r   r   edgenext_xx_smallr   )r   r   r   r   r   Zmodel_kwargsr+   r+   r,   r     s    r   c                 K   s(   t f dddd|}tdd| i|S )Nr   )r   @   d      r   r   edgenext_x_smallr   )r   r   r   r+   r+   r,   r     s    r   c                 K   s&   t f ddd|}tdd| i|S )Nr   )r   `      i0  r   r   edgenext_smallr   )r  r   r   r+   r+   r,   r  "  s    r  c                 K   s.   t f g dg dd|}tdd| i|S )Nr   )P   r   r   iH  r  edgenext_baser   )r  r   r   r+   r+   r,   r  -  s    r  c                 K   s,   t f dddddd|}td	d| i|S )
Nr   )r   r   r   i  TFr   )r   r   r   r]   r   edgenext_small_rwr   )r  r   r   r+   r+   r,   r  8  s    r  )Nr   )F)r   )F)F)F)F)F)4__doc__r"   collectionsr   	functoolsr   typingr   r7   Ztorch.nn.functionalr   Z
functionalrr   Z	timm.datar   r   Ztimm.layersr	   r
   r   r   r   r   r   Z_builderr   Z_features_fxr   Z_manipulater   r   	_registryr   r   __all__Moduler   rJ   rf   r~   r   r   r   r   r   r   Zdefault_cfgsr   r   r  r  r  r+   r+   r+   r,   <module>   s|   	$$)'LM 

	




