U
    ¯Ê¹jÞQ  ã                   @   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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+œƒZ0e"d:e+d,œd-d.„ƒZ1e"d;e+d,œd/d0„ƒZ2e"d<e+d,œd1d2„ƒZ3e"d=e+d,œd3d4„ƒZ4e"d>e+d,œd5d6„ƒZ5d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ÚNormMlpClassifierHeadÚClassifierHeadé   )Ú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__© úS/var/www/html/bwave/python/venv/lib/python3.8/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tj	d�}|jdtj	d�}d}||d d …dd …d d …f |  | j
 }||d d …d d …dd …f |  | j
 }tj| jtj|d� tj	¡}| 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   )r1   r   ç�íµ ÷Æ°>éÿÿÿÿ)r1   r0   Úfloor)Zrounding_moder   é   ©r)   é   )r#   Úweightr0   r1   ÚtorchZzerosÚtoÚboolZcumsumZfloat32r&   Zaranger(   Zint64r'   ÚdivÚstackÚsinÚcosÚflattenÚcatÚpermute)r*   r/   r0   r1   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   ÚintrE   Ú__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   Tr5   r2   ©rC   ç        c                    sœ   t ƒ  ¡  |p|}|dkp ||k| _t||||d|d�| _||ƒ| _t|t|| ƒ|	d�| _|dkrxt	 
|t |¡ ¡nd | _|
dkrŽt|
ƒnt	 ¡ | _d S )Nr   T)r   ÚstrideÚ	depthwiseÚbias©Ú	act_layerr   rN   )r    r!   Úshortcut_after_dwr   Úconv_dwÚnormr   rI   Úmlpr   Ú	Parameterr9   ÚonesÚgammar
   ÚIdentityÚ	drop_path)r*   r)   Údim_outr   rO   Ú	conv_biasÚexpand_ratioÚls_init_valueÚ
norm_layerrS   r\   r+   r-   r.   r!   D   s    
     ÿ
"zConvBlock.__init__c                 C   sr   |}|   |¡}| jr|}| dddd¡}|  |¡}|  |¡}| jd k	rP| j| }| dddd¡}||  |¡ }|S )Nr   r   r7   r   )rU   rT   rB   rV   rW   rZ   r\   )r*   ÚxÚshortcutr-   r-   r.   rE   [   s    




zConvBlock.forward©
rF   rG   rH   r   r   Ú	LayerNormÚGELUr!   rE   rJ   r-   r-   r+   r.   rK   C   s    örK   c                       s6   e Zd Zd
‡ fdd„	Zdd„ Zejjdd	„ ƒZ‡  Z	S )ÚCrossCovarianceAttné   FrN   c                    sf   t ƒ  ¡  || _t t |dd¡¡| _tj||d |d�| _	t 
|¡| _t ||¡| _t 
|¡| _d S )Nr   r7   )rQ   )r    r!   Ú	num_headsr   rX   r9   rY   r'   ÚLinearÚqkvZDropoutÚ	attn_dropÚprojÚ	proj_drop)r*   r)   ri   Ú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 )	Nr7   r3   r   r   r5   r   r6   éþÿÿÿ)r/   rk   Úreshaperi   rB   ZunbindÚFÚ	normalizeZ	transposer'   Zsoftmaxrl   rm   rn   )
r*   rb   ÚBÚNÚCrk   ÚqÚkÚvZattnr-   r-   r.   rE   ~   s    (*


zCrossCovarianceAttn.forwardc                 C   s   dhS )Nr'   r-   ©r*   r-   r-   r.   Úno_weight_decayŽ   s    z#CrossCovarianceAttn.no_weight_decay)rh   FrN   rN   )
rF   rG   rH   r!   rE   r9   ÚjitÚignorer{   rJ   r-   r-   r+   r.   rg   l   s       úrg   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   rh   r5   Tr2   rM   rN   c              
      s>  t ƒ  ¡  ttt || ¡ƒtt || ¡ƒƒ}|| _td|d ƒ| _g }t	| jƒD ]}| 
t||dd|d�¡ qTt |¡| _d | _|r”t|d�| _|	|ƒ| _|dkrºt |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   r7   T)r   rP   rQ   r6   r   )ri   ro   rl   rn   r2   rM   rR   rN   )r    r!   ÚmaxrI   r$   Úceilr4   ÚwidthÚ
num_scalesÚrangeÚappendr   r   Z
ModuleListÚconvsÚpos_embdr   Únorm_xcarX   r9   rY   Ú	gamma_xcarg   ÚxcarV   r   rW   rZ   r
   r[   r\   )r*   r)   r‚   ri   r_   Úuse_pos_embr^   ro   r`   ra   rS   r\   rl   rn   r�   r…   Úir+   r-   r.   r!   ”   s0    
&
"    ÿ$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 k	râ|  
||
|f¡ |d|jd ¡ 	ddd¡}|| }||  | j|  |  |¡¡ ¡ }| ||
||	¡}|  |¡}|  |¡}| jd k	�r<| j| }| 	dddd¡}||  |¡ }|S )Nr   r6   r   r3   r   r7   )ÚchunkÚlenr…   Ú	enumerater„   r9   rA   r/   rq   rB   r†   r\   rˆ   r‰   r‡   rV   rW   rZ   )r*   rb   rc   ZspxZspoÚspr‹   Úconvrt   rv   ÚHÚWZpos_encodingr-   r-   r.   rE   »   s2    
* 


zSplitTransposeBlock.forwardrd   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   r5   rL   FTç      ð?Nr2   rM   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   rO   rQ   r   )
r)   r]   rO   r^   r   r_   r`   r\   ra   rS   )
r)   r‚   ri   r_   rŠ   r^   r`   r\   ra   rS   )r    r!   Úgrad_checkpointingr   r[   Ú
downsampleÚ
Sequentialr"   rƒ   r„   rK   r~   Úblocks)r*   Úin_chsÚout_chsrO   ÚdepthÚnum_global_blocksri   Úscalesr   r_   rŠ   Údownsample_blockr^   r`   Údrop_path_ratesra   Únorm_layer_clrS   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–   r9   r|   Zis_scriptingr   r™   ©r*   rb   r-   r-   r.   rE   #  s
    

zEdgeNeXtStage.forward)rF   rG   rH   r   r   r   re   rf   r!   rE   rJ   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   r7   éè  Úavg©é   é0   éX   é¨   ©r7   r7   é	   r7   )r   r   r   r   )r7   é   rL   r¬   )rh   rh   rh   rh   )r   r   r7   r5   )FTFFr2   r”   r5   FTÚpatchrN   c                    sø  t ƒ  ¡  || _|| _|| _ttdd�}ttjdd�}g | _	|dksHt
‚|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rúdnd}||9 }| t||| ||| || || || |	| ||| |
| ||||||d�¡ || }|  j	t||d|› �d�g7  _	qâtj|Ž | _|d | _|�rÀ|| jƒ| _t| j||| jd�| _n"t ¡ | _t| j||| j|d�| _ttt|d�| ƒ d S )Nr2   rM   )r®   Úoverlapr®   r   r5   r•   r¬   )r   rO   ÚpaddingrQ   c                 S   s   g | ]}|  ¡ ‘qS r-   )Útolist)Ú.0rb   r-   r-   r.   Ú
<listcomp>Z  s     z%EdgeNeXt.__init__.<locals>.<listcomp>r   r   )rš   r›   rO   rœ   r�   ri   r    rž   r_   r   rŠ   r`   rŸ   r^   ra   r¡   rS   zstages.)Znum_chsZ	reductionÚmoduler3   )Ú	pool_typeÚ	drop_rate)rµ   r¶   ra   )Úhead_init_scale)r    r!   Únum_classesÚglobal_poolr¶   r   r   r   re   Zfeature_infoÚAssertionErrorr˜   r"   Ústemr9   ZlinspaceÚsumÚsplitrƒ   r„   r“   ÚdictÚstagesZnum_featuresÚnorm_prer   Úheadr[   r   r   Ú_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_firstrS   Zdrop_path_rater¶   ra   r¡   Zcurr_strider¿   Zdp_ratesrš   r‹   rO   r+   r-   r.   r!   -  s€    

þ
þ"ï"
ü

ûzEdgeNeXt.__init__c                 C   s   t d|rdndddg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Á   Úfcrz   r-   r-   r.   Úget_classifierž  s    zEdgeNeXt.get_classifierr   Nc                 C   s   | j  ||¡ d S r¢   )rÁ   Úreset)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   s   |r| j |dd�S |   |¡S )NTrÐ   )rÁ   )r*   rb   rÑ   r-   r-   r.   Úforward_head«  s    zEdgeNeXt.forward_headc                 C   s   |   |¡}|  |¡}|S r¢   )rÏ   rÒ   r£   r-   r-   r.   rE   ®  s    

zEdgeNeXt.forward)F)T)r   N)F)rF   rG   rH   r   rf   r!   r9   r|   r}   rÇ   rÊ   rÌ   rÎ   rÏ   r;   rÒ   rE   rJ   r-   r-   r+   r.   r   ,  s>   ëa


r”   c                 C   sˆ   t | tjƒr4t| jdd� | jd k	r„tj | j¡ nPt | tjƒr„t| jdd� tj | j¡ |r„d|kr„| jj	 
|¡ | jj	 
|¡ d S )Ng{®Gáz”?)Ústdúhead.)Ú
isinstancer   r"   r	   r8   rQ   ÚinitZzeros_rj   ÚdataZmul_)r´   Únamer·   r-   r-   r.   rÂ   ´  s    
rÂ   c                 C   sþ   d| ksd| kr| S d| kr&| d } n"d| kr8| d } nd| k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rðd|k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dwconvrU   Zpwconvzmlp.fcrÔ   zhead.fc.znorm.rV   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   r7   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¤   )r7   é   rç   )rh   rh   gÍÌÌÌÌÌì?Zbicubiczstem.0zhead.fc)
Úurlr¸   Z
input_sizeZ	pool_sizeÚcrop_pctÚinterpolationZmeanrÓ   Z
first_convÚ
classifierr   )rè   rä   r-   r-   r.   Ú_cfgé  s         ûúrì   ztimm/)r7   é   rí   )Ú	hf_hub_idÚtest_input_sizeÚtest_crop_pctgffffffî?)r7   é@  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 dddd�}tdd| it |f|Ž—ŽS )N)r   r   é   r   r¦   ©r5   r5   r5   r5   ©rÄ   rÃ   rÅ   Úedgenext_xx_smallrã   )rö   ©r¾   rå   ©rã   rä   Z
model_argsr-   r-   r.   rö     s    rö   c                 K   s(   t dddd�}tdd| it |f|Ž—ŽS )Nr«   )r   é@   éd   éÀ   rô   rõ   Úedgenext_x_smallrã   )rü   r÷   rø   r-   r-   r.   rü     s    rü   c                 K   s&   t ddd�}tdd| it |f|Ž—ŽS )Nr«   )r¨   é`   é    i0  ©rÄ   rÃ   Úedgenext_smallrã   )r   r÷   rø   r-   r-   r.   r   $  s    r   c                 K   s6   t ddddgddddgd�}td
d	| it |f|Ž—ŽS )Nr7   r¬   éP   rþ   rí   iH  rÿ   Úedgenext_baserã   )r  r÷   rø   r-   r-   r.   r  /  s    r  c                 K   s,   t dddddd�}td	d| it |f|Ž—ŽS )
Nr«   )r¨   rý   rû   i€  TFr¯   )rÄ   rÃ   rŸ   r^   rÆ   Úedgenext_small_rwrã   )r  r÷   rø   r-   r-   r.   r  :  s       þr  )Nr”   )F)ræ   )F)F)F)F)F)6Ú__doc__r$   Úcollectionsr   Ú	functoolsr   Útypingr   r9   Ztorch.nn.functionalr   Z
functionalrr   Z	timm.datar   r   Ztimm.layersr	   r
   r   r   r   r   r   r   r   Z_builderr   Z_features_fxr   Z_manipulater   r   Ú	_registryr   r   Ú__all__ÚModuler   rK   rg   r~   r“   r   rÂ   rá   rå   rì   Zdefault_cfgsrö   rü   r   r  r  r-   r-   r-   r.   Ú<module>   sŽ   	,$)'LM 	

	
 þ þ  þ  þ  þ þí



