Ë
    éÓ^j¨c  ã                   ó  — d Z ddlZddlmZ ddlmZmZmZmZm	Z	 ddl
Z
ddlmc 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 dd	l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ejP                  «      «       Z) G d„ dejP                  «      Z* G d„ dejP                  «      Z+ G d„ dejP                  «      Z, G d„ dejP                  «      Z- G d„ dejP                  «      Z.d,d„Z/d„ Z0d-d„Z1d.d„Z2 e& e2dd d¬!«       e2dd d¬!«       e2dd"d#d¬$«       e2dd"d#d¬$«       e2dd"d#d¬$«       e2dd#d¬!«      d%œ«      Z3e%d-d&e.fd'„«       Z4e%d-d&e.fd(„«       Z5e%d-d&e.fd)„«       Z6e%d-d&e.fd*„«       Z7e%d-d&e.fd+„«       Z8y)/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)Úpartial)ÚListÚOptionalÚTupleÚTypeÚUnion)Únn©ÚIMAGENET_DEFAULT_MEANÚIMAGENET_DEFAULT_STD)ÚDropPathÚcalculate_drop_path_ratesÚLayerNorm2dÚMlpÚcreate_conv2dÚNormMlpClassifierHeadÚClassifierHeadÚtrunc_normal_tf_é   )Úbuild_model_with_cfg)Úfeature_take_indices)Úregister_notrace_module)Únamed_applyÚcheckpoint_seq)Úregister_modelÚgenerate_default_cfgsÚEdgeNeXtc                   óP   ‡ — e Zd Z	 	 	 	 	 ddededefˆ fd„Zdeeeef   fd„Zˆ xZS )ÚPositionalEncodingFourierÚ
hidden_dimÚdimÚtemperaturec                 óÈ   •— ||dœ}t         ‰| �  «        t        j                  |dz  |fddi|¤Ž| _        dt
        j                  z  | _        || _        || _	        || _
        y )N©ÚdeviceÚdtypeé   Úkernel_sizer   )ÚsuperÚ__init__r	   ÚConv2dÚtoken_projectionÚmathÚpiÚscaler"   r    r!   )Úselfr    r!   r"   r%   r&   ÚddÚ	__class__s          €ú_/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/models/edgenext.pyr*   z"PositionalEncodingFourier.__init__)   sa   ø€ ð ¨Ñ/ˆÜ‰ÑÔÜ "§	¡	¨*°q©.¸#Ñ SÈ1Ð SÐPRÑ SˆÔØœŸ™‘[ˆŒ
Ø&ˆÔØ$ˆŒØˆ�ó    Úshapec           
      ón  — | j                   j                  j                  }| j                   j                  j                  }t	        j
                  |«      j                  |t        j                  ¬«       }|j                  dt        j                  ¬«      }|j                  dt        j                  ¬«      }d}||d d …dd …d d …f   |z   z  | j                  z  }||d d …d d …dd …f   |z   z  | j                  z  }t	        j                  | j                  t        j                  |¬«      j                  t        j                  «      }| j                  dt	        j                  |dd¬	«      z  | j                  z  z  }|d d …d d …d d …d f   |z  }	|d d …d d …d d …d f   |z  }
t	        j                   |	d d …d d …d d …d
d d…f   j#                  «       |	d d …d d …d d …dd d…f   j%                  «       fd¬«      j'                  d«      }	t	        j                   |
d d …d d …d d …d
d d…f   j#                  «       |
d d …d d …d d …dd d…f   j%                  «       fd¬«      j'                  d«      }
t	        j(                  |
|	fd¬«      j+                  d
ddd«      }| j                  |j                  |«      «      }|S )Nr$   r   )r&   r'   ç�íµ ÷Æ°>éÿÿÿÿ)r&   r%   Úfloor)Úrounding_moder   é   ©r!   é   )r,   Úweightr%   r&   ÚtorchÚzerosÚtoÚboolÚcumsumÚfloat32r/   Úaranger    Úint64r"   ÚdivÚstackÚsinÚcosÚflattenÚcatÚpermute)r0   r5   r%   r&   Úinv_maskÚy_embedÚx_embedÚepsÚdim_tÚpos_xÚpos_yÚposs               r3   Úforwardz!PositionalEncodingFourier.forward9   s^  € Ø×&Ñ&×-Ñ-×4Ñ4ˆØ×%Ñ%×,Ñ,×2Ñ2ˆÜ—K‘K Ó&×)Ñ)°¼u¿z¹zÐ)ÓJÐJˆØ—/‘/ !¬5¯=©=�/Ó9ˆØ—/‘/ !¬5¯=©=�/Ó9ˆØˆØ˜W¢Q¨©ªQ YÑ/°#Ñ5Ñ6¸¿¹ÑCˆØ˜W¢Qª¨2©3 YÑ/°#Ñ5Ñ6¸¿¹ÑCˆä—‘˜TŸ_™_´E·K±KÈÔO×RÑRÔSX×S`ÑS`ÓaˆØ× Ñ  Q¬¯©°5¸!È7Ô)SÑ%SÐVZ×VeÑVeÑ%eÑfˆàšš1ša ˜Ñ&¨Ñ.ˆØšš1ša ˜Ñ&¨Ñ.ˆÜ—‘Ø’1’aš˜A˜D˜q˜D�=Ñ!×%Ñ%Ó'Ø’1’aš˜A˜D˜q˜D�=Ñ!×%Ñ%Ó'ð)Ø./ô1ç18±¸³ð 	ô —‘Ø’1’aš˜A˜D˜q˜D�=Ñ!×%Ñ%Ó'Ø’1’aš˜A˜D˜q˜D�=Ñ!×%Ñ%Ó'ð)Ø./ô1ç18±¸³ð 	ô �i‰i˜ ˜¨AÔ.×6Ñ6°q¸!¸QÀÓBˆØ×#Ñ# C§F¡F¨5£MÓ2ˆàˆ
r4   )é    i   g     ˆÃ@NN)	Ú__name__Ú
__module__Ú__qualname__ÚintÚfloatr*   r   rV   Ú__classcell__©r2   s   @r3   r   r   '   sL   ø„ ð !ØØ!'ØØñàðð ðð õ	ð ˜U 3¨¨S =Ñ1÷ r4   r   c                   óØ   ‡ — e Zd Zdddddd eej
                  d¬«      ej                  dddfd	ed
ee   dedede	de
de
deej                     deej                     de
fˆ fd„Zd„ Zˆ xZS )Ú	ConvBlockNé   r   Tr;   r7   ©rQ   ç        r!   Údim_outr(   ÚstrideÚ	conv_biasÚexpand_ratioÚls_init_valueÚ
norm_layerÚ	act_layerÚ	drop_pathc                 ó²  •— ||dœ}t         ‰| �  «        |xs |}|dkD  xs ||k7  | _        t        ||f||d|dœ|¤Ž| _         ||fi |¤Ž| _        t        |t        ||z  «      fd|	i|¤Ž| _        |dkD  r,t        j                  |t        j                  |fi |¤Žz  «      nd | _        |
dkD  rt        |
«      | _        y t        j                  «       | _        y )Nr$   r   T)r(   re   Ú	depthwiseÚbiasrj   r   rc   )r)   r*   Úshortcut_after_dwr   Úconv_dwÚnormr   r[   Úmlpr	   Ú	Parameterr?   ÚonesÚgammar   ÚIdentityrk   )r0   r!   rd   r(   re   rf   rg   rh   ri   rj   rk   r%   r&   r1   r2   s                 €r3   r*   zConvBlock.__init__U   sú   ø€ ð ¨Ñ/ˆÜ‰ÑÔØ’.˜SˆØ!'¨!¡Ò!=¨s°g©~ˆÔä$ØØð
ð $ØØØñ
ð ñ
ˆŒñ ˜wÑ-¨"Ñ-ˆŒ	ÜØÜ�˜wÑ&Ó'ñ
ð  ð
ð ñ	
ˆŒð Q^Ð`aÒPa”R—\‘\ -´%·*±*¸WÑ2KÈÑ2KÑ"KÔLÐgkˆŒ
Ø09¸B²œ )Ó,ˆ�ÄBÇKÁKÃMˆ�r4   c                 ó:  — |}| j                  |«      }| j                  r|}|j                  dddd«      }| j                  |«      }| j	                  |«      }| j
                  �| j
                  |z  }|j                  dddd«      }|| j                  |«      z   }|S )Nr   r'   r=   r   )rp   ro   rM   rq   rr   ru   rk   )r0   ÚxÚshortcuts      r3   rV   zConvBlock.forward|   s“   € ØˆØ�L‰L˜‹OˆØ×!Ò!ØˆHà�I‰I�a˜˜A˜qÓ!ˆØ�I‰I�a‹LˆØ�H‰H�Q‹KˆØ�:‰:Ð!Ø—
‘
˜Q‘ˆAØ�I‰I�a˜˜A˜qÓ!ˆà�t—~‘~ aÓ(Ñ(ˆØˆr4   )rX   rY   rZ   r   r	   Ú	LayerNormÚGELUr[   r   rB   r\   r   ÚModuler*   rV   r]   r^   s   @r3   r`   r`   T   sÁ   ø„ ð &*Ø ØØ"Ø"#Ø#'Ù*1°"·,±,ÀDÔ*IØ)+¯©Ø!ØØñ%Ràð%Rð ˜c‘]ð%Rð ð	%Rð
 ð%Rð ð%Rð  ð%Rð !ð%Rð ˜RŸY™Y™ð%Rð ˜BŸI™I‘ð%Rð õ%RöNr4   r`   c                   ó€   ‡ — e Zd Z	 	 	 	 	 	 d	dededededef
ˆ fd„Zd„ Zej                  j                  d„ «       Zˆ xZS )
ÚCrossCovarianceAttnr!   Ú	num_headsÚqkv_biasÚ	attn_dropÚ	proj_dropc                 ó|  •— ||dœ}t         ‰	| �  «        || _        t        j                  t        j                  |ddfi |¤Ž«      | _        t        j                  ||dz  fd|i|¤Ž| _	        t        j                  |«      | _        t        j                  ||fi |¤Ž| _        t        j                  |«      | _        y )Nr$   r   r=   rn   )r)   r*   r   r	   rs   r?   rt   r"   ÚLinearÚqkvÚDropoutr�   Úprojr‚   )
r0   r!   r   r€   r�   r‚   r%   r&   r1   r2   s
            €r3   r*   zCrossCovarianceAttn.__init__Ž   s›   ø€ ð ¨Ñ/ˆÜ‰ÑÔØ"ˆŒÜŸ<™<¬¯
©
°9¸aÀÑ(IÀbÑ(IÓJˆÔä—9‘9˜S #¨¡'Ñ?°Ð?¸BÑ?ˆŒÜŸ™ IÓ.ˆŒÜ—I‘I˜c 3Ñ-¨"Ñ-ˆŒ	ÜŸ™ IÓ.ˆ�r4   c                 óH  — |j                   \  }}}| j                  |«      j                  ||d| j                  d«      j	                  ddddd«      }|j                  d«      \  }}}t        j                  |d¬«      t        j                  |d¬«      j                  dd«      z  | j                  z  }	|	j                  d¬«      }	| j                  |	«      }	|	|z  }|j	                  dddd«      j                  |||«      }| j                  |«      }| j                  |«      }|S )	Nr=   r8   r'   r   r;   r   r<   éþÿÿÿ)r5   r…   Úreshaper   rM   ÚunbindÚFÚ	normalizeÚ	transposer"   Úsoftmaxr�   r‡   r‚   )
r0   rx   ÚBÚNÚCr…   ÚqÚkÚvÚattns
             r3   rV   zCrossCovarianceAttn.forward¢   s  € Ø—'‘'‰ˆˆ1ˆaØ�h‰h�q‹k×!Ñ! ! Q¨¨4¯>©>¸2Ó>×FÑFÀqÈ!ÈQÐPQÐSTÓUˆØ—*‘*˜Q“-‰ˆˆ1ˆaô —‘˜A 2Ô&¬¯©°Q¸BÔ)?×)IÑ)IÈ"ÈbÓ)QÑQÐUY×UeÑUeÑeˆØ�|‰| ˆ|Ó#ˆØ�~‰~˜dÓ#ˆØ�A‰Xˆà�I‰I�a˜˜A˜qÓ!×)Ñ)¨!¨Q°Ó2ˆØ�I‰I�a‹LˆØ�N‰N˜1ÓˆØˆr4   c                 ó   — dhS )Nr"   © ©r0   s    r3   Úno_weight_decayz#CrossCovarianceAttn.no_weight_decay²   s
   € àˆÐr4   )é   Frc   rc   NN)rX   rY   rZ   r[   rB   r\   r*   rV   r?   ÚjitÚignorerš   r]   r^   s   @r3   r~   r~   �   so   ø„ ð Ø"Ø!Ø!ØØñ/àð/ð ð/ð ð	/ð
 ð/ð õ/ò(ð  ‡Y�Y×Ññó ôr4   r~   c                   óä   ‡ — e Zd Zddddddd eej
                  d¬«      ej                  dddddfd	ed
ededede	de	de	dede
ej                     de
ej                     dededefˆ fd„Zd„ Zˆ xZS )ÚSplitTransposeBlockr   r›   r;   Tr7   rb   rc   Nr!   Ú
num_scalesr   rg   Úuse_pos_embrf   r€   rh   ri   rj   rk   r�   r‚   c           
      ó¾  •— ||dœ}t         ‰| �  «        t        t        t	        j
                  ||z  «      «      t        t	        j                  ||z  «      «      «      }|| _        t        d|dz
  «      | _        g }t        | j                  «      D ]"  }|j                  t        ||fdd|dœ|¤Ž«       Œ$ t        j                  |«      | _        d | _        |rt!        dd|i|¤Ž| _         |	|fi |¤Ž| _        |dkD  r,t        j$                  |t'        j(                  |fi |¤Žz  «      nd | _        t-        |f||||dœ|¤Ž| _         |	|fd	d
i|¤Ž| _        t3        |t        ||z  «      fd|
i|¤Ž| _        |dkD  r,t        j$                  |t'        j(                  |fi |¤Žz  «      nd | _        |dkD  rt9        |«      | _        y t        j:                  «       | _        y )Nr$   r   r=   T)r(   rm   rn   r!   r   )r   r€   r�   r‚   rQ   r7   rj   rc   r˜   )r)   r*   Úmaxr[   r-   Úceilr9   Úwidthr    ÚrangeÚappendr   r	   Ú
ModuleListÚconvsÚpos_embdr   Únorm_xcars   r?   rt   Ú	gamma_xcar~   Úxcarq   r   rr   ru   r   rv   rk   )r0   r!   r    r   rg   r¡   rf   r€   rh   ri   rj   rk   r�   r‚   r%   r&   r1   r¥   r©   Úir2   s                       €r3   r*   zSplitTransposeBlock.__init__¸   sÖ  ø€ ð$ ¨Ñ/ˆÜ‰ÑÔÜ”CœŸ	™	 #¨
Ñ"2Ó3Ó4´c¼$¿*¹*ÀSÈJÑEVÓ:WÓ6XÓYˆØˆŒ
Ü˜a ¨a¡Ó0ˆŒàˆÜ�t—‘Ó'ò 	kˆAØ�L‰Lœ u¨eÐiÀÈdÐYbÑiÐfhÑiÕjð	kä—]‘] 5Ó)ˆŒ
àˆŒÙÜ5ÑD¸#ÐDÀÑDˆDŒMÙ" 3Ñ-¨"Ñ-ˆŒØP]Ð`aÒPaœŸ™ m´e·j±jÀÑ6KÈÑ6KÑ&KÔLÐgkˆŒÜ&Øð
àØØØñ
ð ñ
ˆŒñ ˜sÑ3¨Ð3°Ñ3ˆŒ	ÜØÜ�˜sÑ"Ó#ñ
ð  ð
ð ñ	
ˆŒð MZÐ\]ÒL]”R—\‘\ -´%·*±*¸SÑ2GÀBÑ2GÑ"GÔHÐcgˆŒ
Ø09¸B²œ )Ó,ˆ�ÄBÇKÁKÃMˆ�r4   c           	      óÌ  — |}|j                  t        | j                  «      dz   d¬«      }g }|d   }t        | j                  «      D ]+  \  }}|dkD  r|||   z   } ||«      }|j	                  |«       Œ- |j	                  |d   «       t        j                  |d«      }|j                  \  }}	}
}|j                  ||	|
|z  «      j                  ddd«      }| j                  �H| j                  ||
|f«      j                  |d|j                  d   «      j                  ddd«      }||z   }|| j                  | j                  | j                  | j                  |«      «      z  «      z   }|j                  ||
||	«      }| j                  |«      }| j!                  |«      }| j"                  �| j"                  |z  }|j                  dddd«      }|| j                  |«      z   }|S )Nr   r<   r   r8   r'   r=   )ÚchunkÚlenr©   Ú	enumerater§   r?   rL   r5   rŠ   rM   rª   rk   r¬   r­   r«   rq   rr   ru   )r0   rx   ry   ÚspxÚspoÚspr®   Úconvr�   r’   ÚHÚWÚpos_encodings                r3   rV   zSplitTransposeBlock.forwardí   sÆ  € Øˆð �g‰g”c˜$Ÿ*™*“o¨Ñ)¨qˆgÓ1ˆØˆØ�‰VˆÜ  §¡Ó,ò 	‰GˆAˆtØ�1ŠuØ˜#˜a™&‘[�Ù�b“ˆBØ�J‰J�r�Nð		ð
 	�
‰
�3�r‘7ÔÜ�I‰I�c˜1Óˆð —W‘W‰
ˆˆ1ˆa�Ø�I‰I�a˜˜A ™EÓ"×*Ñ*¨1¨a°Ó3ˆØ�=‰=Ð$ØŸ=™=¨!¨Q°¨Ó3×;Ñ;¸A¸rÀ1Ç7Á7È1Á:ÓN×VÑVÐWXÐZ[Ð]^Ó_ˆLØ�LÑ ˆAØ�—‘˜tŸ~™~°·±¸¿¹ÀqÓ9IÓ0JÑJÓKÑKˆØ�I‰I�a˜˜A˜qÓ!ˆð �I‰I�a‹LˆØ�H‰H�Q‹KˆØ�:‰:Ð!Ø—
‘
˜Q‘ˆAØ�I‰I�a˜˜A˜qÓ!ˆà�t—~‘~ aÓ(Ñ(ˆØˆr4   )rX   rY   rZ   r   r	   rz   r{   r[   r\   rB   r   r|   r*   rV   r]   r^   s   @r3   rŸ   rŸ   ·   sç   ø„ ð  ØØ"#Ø $Ø"Ø!Ø#'Ù*1°"·,±,ÀDÔ*IØ)+¯©Ø!Ø!Ø!ØØñ!3Ràð3Rð ð3Rð ð	3Rð
  ð3Rð ð3Rð ð3Rð ð3Rð !ð3Rð ˜RŸY™Y™ð3Rð ˜BŸI™I‘ð3Rð ð3Rð ð3Rð õ3Röj!r4   rŸ   c            $       ó   ‡ — e Zd Zdddddddddddde eej                  d	¬
«      ej                  ddfdedededededededede	de
de
de	de	deee	      deej                     deej                     deej                     f"ˆ fd„Zd„ Zˆ xZS )ÚEdgeNeXtStager'   r   r;   ra   FTç      ð?Nr7   rb   Úin_chsÚout_chsre   ÚdepthÚnum_global_blocksr   Úscalesr(   rg   r¡   Údownsample_blockrf   rh   Údrop_path_ratesri   Únorm_layer_clrj   c                 ó  •— ||dœ}t         ‰| �  «        d| _        |s|dk(  rt        j                  «       | _        n=t        j                   ||fi |¤Žt        j                  ||fdd|dœ|¤Ž«      | _        |}g }t        |«      D ]f  }|||z
  k  r2|j                  t        d	|||r|dk(  r|nd|||	|||   ||dœ
|¤Ž«       n(|j                  t        d	||||	|
||||   ||dœ
|¤Ž«       |}Œh t        j                  |Ž | _        y )
Nr$   Fr   r'   ©r(   re   rn   r   )
r!   rd   re   rf   r(   rg   rh   rk   ri   rj   )
r!   r    r   rg   r¡   rf   rh   rk   ri   rj   r˜   )r)   r*   Úgrad_checkpointingr	   rv   Ú
downsampleÚ
Sequentialr+   r¦   r§   r`   rŸ   Úblocks)r0   r½   r¾   re   r¿   rÀ   r   rÁ   r(   rg   r¡   rÂ   rf   rh   rÃ   ri   rÄ   rj   r%   r&   r1   Ústage_blocksr®   r2   s                          €r3   r*   zEdgeNeXtStage.__init__  sV  ø€ ð, ¨Ñ/ˆÜ‰ÑÔØ"'ˆÔá˜v¨š{Ü Ÿk™k›mˆD�Oä Ÿm™mÙ˜6Ñ( RÑ(Ü—	‘	˜& 'ÐY°qÀÈÑYÐVXÑYóˆDŒOð ˆFàˆÜ�u“ò !	ˆAØ�5Ð,Ñ,Ò,Ø×#Ñ#Üð Ø"Ø 'Ù)9¸aÀ1ºf™vÈ!Ø"+Ø$/Ø%1Ø&3Ø"1°!Ñ"4Ø#0Ø"+ñð ñõð  ×#Ñ#Ü'ð Ø"Ø#)Ø"+Ø%1Ø$/Ø"+Ø&3Ø"1°!Ñ"4Ø#0Ø"+ñð ñôð ‰FðC!	ôD —m‘m \Ð2ˆ�r4   c                 óÎ   — | j                  |«      }| j                  r6t        j                  j	                  «       st        | j                  |«      }|S | j                  |«      }|S ©N)rÈ   rÇ   r?   rœ   Úis_scriptingr   rÊ   ©r0   rx   s     r3   rV   zEdgeNeXtStage.forwardZ  sS   € Ø�O‰O˜AÓˆØ×"Ò"¬5¯9©9×+AÑ+AÔ+CÜ˜tŸ{™{¨AÓ.ˆAð ˆð —‘˜A“ˆAØˆr4   )rX   rY   rZ   r   r   r	   rz   r{   r[   r\   rB   r   r   r   r|   r*   rV   r]   r^   s   @r3   r»   r»     s-  ø„ ð
 ØØ%&ØØØ Ø"#Ø %Ø%*Ø#Ø#&Ø59Ø*5Ù-4°R·\±\ÀtÔ-LØ)+¯©ØØñ)F3àðF3ð ðF3ð ð	F3ð
 ðF3ð  #ðF3ð ðF3ð ðF3ð ðF3ð  ðF3ð ðF3ð #ðF3ð ðF3ð !ðF3ð & d¨5¡kÑ2ðF3ð  ˜RŸY™Y™ð!F3ð"   §	¡	™?ð#F3ð$ ˜BŸI™I‘õ%F3öPr4   r»   c            )       óì  ‡ — 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ddfdedededeedf   deedf   deedf   deedf   deedf   deedf   deedf   de	de	d e	d!ed"ed#ed$ed%e
ej                     d&e	d'e	f(ˆ fd(„Zej                  j                  d<d)„«       Zej                  j                  d=d*„«       Zej                  j                  d+ej                  fd,„«       Zd>dedee   fd-„Z	 	 	 	 	 d?d.ej*                  d/eeeee   f      d0ed1ed2ed3ed+eeej*                     eej*                  eej*                     f   f   fd4„Z	 	 	 d@d/eeee   f   d5ed6efd7„Zd8„ Zd<d9efd:„Zd;„ Zˆ xZS )Ar   r=   éè  Úavg©é   é0   éX   é¨   ©r=   r=   é	   r=   )r   r   r   r   )r=   é   ra   rÙ   )r›   r›   r›   r›   )r'   r'   r=   r;   )FTFFr7   r¼   r;   FTÚpatchrc   NÚin_chansÚnum_classesÚglobal_poolÚdims.ÚdepthsÚglobal_block_countsÚkernel_sizesÚheadsÚ	d2_scalesr¡   rh   Úhead_init_scalerg   rÂ   rf   Ú	stem_typeÚhead_norm_firstrj   Údrop_path_rateÚ	drop_ratec           
      ó  •— t         ‰ | �  «        ||dœ}|| _        || _        || _        || _        t        t        d¬«      }t        t        j                  d¬«      }g | _
        |dv sJ ‚|dk(  rBt        j                  t        j                  ||d   fdd|dœ|¤Ž ||d   fi |¤Ž«      | _        nBt        j                  t        j                  ||d   fd	dd|d
œ|¤Ž ||d   fi |¤Ž«      | _        d}g }t        ||d¬«      }|d   }t        d«      D ]¤  }|dk(  s|dkD  rdnd}||z  }|j!                  t#        d&i d|“d||   “d|“d||   “d||   “d||   “d||   “d|	|   “d|“d||   “d|
|   “d|“d|“d|“d|“d|“d|“|¤Ž«       ||   }| xj                  t%        ||d |› �¬!«      gz  c_
        Œ¦ t        j                  |Ž | _        |d"   x| _        | _        |rB || j(                  fi |¤Ž| _        t/        | j(                  |f|| j
                  d#œ|¤Ž| _        nCt        j2                  «       | _        t5        | j(                  |f|| j
                  |d$œ|¤Ž| _        t7        t        t8        |¬%«      | «       y )'Nr$   r7   rb   )rÛ   ÚoverlaprÛ   r   r;   rÆ   rÙ   )r(   re   Úpaddingrn   T)Ú	stagewiser'   r   r½   r¾   re   r¿   rÀ   r   rÃ   rÁ   rg   r(   r¡   rh   rÂ   rf   ri   rÄ   rj   zstages.)Únum_chsÚ	reductionÚmoduler8   )Ú	pool_typeré   )rñ   ré   ri   )rå   r˜   )r)   r*   rÝ   rÜ   rÞ   ré   r   r   r	   rz   Úfeature_inforÉ   r+   Ústemr   r¦   r§   r»   ÚdictÚstagesÚnum_featuresÚhead_hidden_sizeÚnorm_prer   Úheadrv   r   r   Ú_init_weights)!r0   rÜ   rÝ   rÞ   rß   rà   rá   râ   rã   rä   r¡   rh   rå   rg   rÂ   rf   ræ   rç   rj   rè   ré   r%   r&   r1   ri   rÄ   Úcurr_striderõ   Údp_ratesr½   r®   re   r2   s!                                   €r3   r*   zEdgeNeXt.__init__d  s,  ø€ ô2 	‰ÑÔØ¨Ñ/ˆØ&ˆÔØ ˆŒØ&ˆÔØ"ˆŒÜœ[¨dÔ3ˆ
Ü¤§¡°$Ô7ˆØˆÔàÐ0Ñ0Ð0Ð0Ø˜ÒÜŸ™Ü—	‘	˜( D¨¡GÐ\¸À1È9Ñ\ÐXZÑ\Ù˜4 ™7Ñ) bÑ)óˆD�Iô
 Ÿ™Ü—	‘	˜( D¨¡GÐk¸À1ÈfÐ[dÑkÐhjÑkÙ˜4 ™7Ñ) bÑ)óˆDŒIð
 ˆØˆÜ,¨^¸VÈtÔTˆØ�a‘ˆÜ�q“ò 	eˆAØ%¨Ò*¨a°!ªe‘Q¸ˆFà˜6Ñ!ˆKØ�M‰Mœ-ò Ùðà˜Qšðñ ðð ˜Q’ið	ð
 #6°aÒ"8ðð   š(ðð !)¨¢ðð ! ’|ðñ *ðð )¨šOðð (¨šNðñ ,ðñ "2ðñ $ðñ &ðñ  ,ð!ñ" $Øñ%ô ð* ˜!‘WˆFØ×Ò¤$¨vÀÐW^Ð_`Ð^aÐUbÔ"cÐ!dÑdÖð5	eô8 —m‘m VÐ,ˆŒà48¸±HÐ<ˆÔ˜DÔ1ÙÙ& t×'8Ñ'8Ñ?¸BÑ?ˆDŒMÜ&Ø×!Ñ!Øðð &ØŸ.™.ñ	ð
 ñˆD�Iô ŸK™K›MˆDŒMÜ-Ø×!Ñ!Øðð &ØŸ.™.Ø%ñð ñˆDŒIô 	”GœM¸?ÔKÈTÕRr4   c                 ó2   — t        d|rd¬«      S 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ô   )r0   Úcoarses     r3   Úgroup_matcherzEdgeNeXt.group_matcherÌ  s'   € äØÙ(.Ð$ô
ð 	
ò5ô
ð 	
r4   c                 ó4   — | j                   D ]	  }||_        Œ y rÍ   )rõ   rÇ   )r0   ÚenableÚss      r3   Úset_grad_checkpointingzEdgeNeXt.set_grad_checkpointing×  s   € à—‘ò 	*ˆAØ#)ˆAÕ ñ	*r4   Úreturnc                 ó.   — | j                   j                  S rÍ   )rù   Úfcr™   s    r3   Úget_classifierzEdgeNeXt.get_classifierÜ  s   € à�y‰y�|‰|Ðr4   c                 óJ   — || _         | j                  j                  ||«       y rÍ   )rÝ   rù   Úreset)r0   rÝ   rÞ   s      r3   Úreset_classifierzEdgeNeXt.reset_classifierà  s   € Ø&ˆÔØ�	‰	�‰˜ [Õ1r4   rx   Úindicesrq   Ú
stop_earlyÚ
output_fmtÚintermediates_onlyc                 ó  — |dv sJ d«       ‚g }t        t        | j                  «      |«      \  }}	| j                  |«      }t        | j                  «      dz
  }
t        j
                  j                  «       s|s| j                  }n| j                  d|	dz    }t        |«      D ]>  \  }} ||«      }||v sŒ|r||
k(  r| j                  |«      }n|}|j                  |«       Œ@ |r|S |
k(  r| j                  |«      }||fS )aï   Forward features that returns intermediates.

        Args:
            x: Input image tensor
            indices: Take last n blocks if int, all if None, select matching indices if sequence
            norm: Apply norm layer to compatible intermediates
            stop_early: Stop iterating over blocks when last desired intermediate hit
            output_fmt: Shape of intermediate feature outputs
            intermediates_only: Only return intermediate features
        Returns:

        )ÚNCHWzOutput shape must be NCHW.r   N)
r   r±   rõ   ró   r?   rœ   rÎ   r²   rø   r§   )r0   rx   r  rq   r  r  r  ÚintermediatesÚtake_indicesÚ	max_indexÚlast_idxrõ   Úfeat_idxÚstageÚx_inters                  r3   Úforward_intermediateszEdgeNeXt.forward_intermediatesä  s  € ð* ˜YÑ&ÐDÐ(DÓDÐ&ØˆÜ"6´s¸4¿;¹;Ó7GÈÓ"QÑˆ�ið �I‰I�a‹LˆÜ�t—{‘{Ó# aÑ'ˆÜ�9‰9×!Ñ!Ô#©:Ø—[‘[‰Fà—[‘[  )¨a¡-Ð0ˆFä(¨Ó0ò 	.‰OˆH�eÙ�a“ˆAØ˜<Ò'Ù˜H¨Ò0Ø"Ÿm™m¨AÓ.‘Gà�GØ×$Ñ$ WÕ-ð	.ñ Ø Ð à�xÒØ—‘˜aÓ ˆAà�-ÐÐr4   Ú
prune_normÚ
prune_headc                 óÖ   — t        t        | j                  «      |«      \  }}| j                  d|dz    | _        |rt        j                  «       | _        |r| j                  dd«       |S )z@ Prune layers not required for specified intermediates.
        Nr   r   Ú )r   r±   rõ   r	   rv   rø   r
  )r0   r  r  r  r  r  s         r3   Úprune_intermediate_layersz"EdgeNeXt.prune_intermediate_layers  s]   € ô #7´s¸4¿;¹;Ó7GÈÓ"QÑˆ�iØ—k‘k . 9¨q¡=Ð1ˆŒÙÜŸK™K›MˆDŒMÙØ×!Ñ! ! RÔ(ØÐr4   c                 ól   — | j                  |«      }| j                  |«      }| j                  |«      }|S rÍ   )ró   rõ   rø   rÏ   s     r3   Úforward_featureszEdgeNeXt.forward_features&  s/   € Ø�I‰I�a‹LˆØ�K‰K˜‹NˆØ�M‰M˜!ÓˆØˆr4   Ú
pre_logitsc                 óN   — |r| j                  |d¬«      S | j                  |«      S )NT)r   )rù   )r0   rx   r   s      r3   Úforward_headzEdgeNeXt.forward_head,  s$   € Ù0:ˆt�y‰y˜ tˆyÓ,ÐLÀÇ	Á	È!ÃÐLr4   c                 óJ   — | j                  |«      }| j                  |«      }|S rÍ   )r  r"  rÏ   s     r3   rV   zEdgeNeXt.forward/  s'   € Ø×!Ñ! !Ó$ˆØ×Ñ˜aÓ ˆØˆr4   ©F)TrÍ   )NFFr  F)r   FT)rX   rY   rZ   r	   r{   r[   Ústrr   rB   r\   r   r|   r*   r?   rœ   r�   rÿ   r  r  r   r
  ÚTensorr   r   r  r  r  r"  rV   r]   r^   s   @r3   r   r   c  sê  ø„ ð Ø#Ø$Ø$5Ø&2Ø3?Ø,8Ø%1Ø)5Ø,GØ#'Ø%'Ø"#Ø%*Ø"Ø$Ø$)Ø)+¯©Ø$&Ø!ØØñ/fSàðfSð ðfSð ð	fSð
 ˜˜S˜‘/ðfSð ˜#˜s˜(‘OðfSð "' s¨C x¡ðfSð    S ™/ðfSð ˜˜c˜‘?ðfSð ˜S #˜X‘ðfSð ˜t S˜yÑ)ðfSð !ðfSð #ðfSð  ðfSð #ðfSð  ð!fSð" ð#fSð$ "ð%fSð& ˜BŸI™I‘ð'fSð( "ð)fSð* õ+fSðP ‡Y�Y×Ñò
ó ð
ð ‡Y�Y×Ñò*ó ð*ð ‡Y�Y×Ñð §	¡	ò ó ðñ2¨Cð 2¸hÀs¹mó 2ð 8<ØØ$Ø$Ø',ñ0 à�|‰|ð0 ð ˜e C¨¨c© NÑ3Ñ4ð0 ð ð	0 ð
 ð0 ð ð0 ð !%ð0 ð 
ˆt�E—L‘LÑ! 5¨¯©°t¸E¿L¹LÑ7IÐ)IÑ#JÐJÑ	Kó0 ðh ./Ø$Ø#ñ	à˜3  S¡	˜>Ñ*ðð ðð ó	ò ñM¨$ó Mör4   r¼   c                 ó.  — t        | t        j                  «      rNt        | j                  d¬«       | j
                  �*t        j                  j                  | j
                  «       y y t        | t        j                  «      r“t        | j                  d¬«       t        j                  j                  | j
                  «       |rPd|v rK| j                  j                  j                  |«       | j
                  j                  j                  |«       y y y y )Ng{®Gáz”?)Ústdúhead.)Ú
isinstancer	   r+   r   r>   rn   ÚinitÚzeros_r„   ÚdataÚmul_)rð   Únamerå   s      r3   rú   rú   5  s¶   € Ü�&œ"Ÿ)™)Ô$Ü˜Ÿ™¨CÕ0Ø�;‰;Ð"Ü�G‰G�N‰N˜6Ÿ;™;Õ'ð #ä	�FœBŸI™IÔ	&Ü˜Ÿ™¨CÕ0Ü
�‰�‰�v—{‘{Ô#Ù�G˜t‘OØ�M‰M×Ñ×#Ñ# OÔ4Ø�K‰K×Ñ×!Ñ! /Õ2ð $ˆ4ð 
'r4   c                 ó>  — d| v sd| v r| S d| v r| d   } nd| v r| d   } n	d| v r| d   } i }ddl }| j                  «       D ]Ü  \  }}|j                  dd	«      }|j                  d
d|«      }|j                  dd|«      }|j                  dd«      }|j                  dd«      }|j                  dd«      }|j	                  d«      r|j                  dd«      }|j
                  dk(  r2d|vr.|j                  «       |   j                  }|j                  |«      }|||<   ŒÞ |S )z Remap FB checkpoints -> timm zhead.norm.weightznorm_pre.weightÚ	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.\2Údwconvrp   Úpwconvzmlp.fcr)  zhead.fc.znorm.rq   z	head.normr'   rù   )	ÚreÚitemsÚreplaceÚsubÚ
startswithÚndimr3  r5   rŠ   )r3  r2  Úout_dictr6  r”   r•   Úmodel_shapes          r3   Úcheckpoint_filter_fnr>  B  sB  € à˜ZÑ'Ð+<À
Ñ+JØÐð �jÑ Ø Ñ,‰
Ø	�JÑ	Ø Ñ(‰
Ø	˜Ñ	#Ø Ñ-ˆ
à€HÛØ× Ñ Ó"ò ‰ˆˆ1Ø�I‰IÐ,¨gÓ6ˆØ�F‰FÐ.Ð0FÈÓJˆØ�F‰FÐ9Ð;UÐWXÓYˆØ�I‰I�h 	Ó*ˆØ�I‰I�h Ó)ˆØ�I‰I�g˜zÓ*ˆØ�<‰<˜Ô Ø—	‘	˜& +Ó.ˆAØ�6‰6�QŠ;˜6¨™?Ø×*Ñ*Ó,¨QÑ/×5Ñ5ˆKØ—	‘	˜+Ó&ˆAØˆ�Šðð €Or4   c                 óN   — t        t        | |ft        t        dd¬«      dœ|¤Ž}|S )N)r   r   r'   r=   T)Úout_indicesÚflatten_sequential)Úpretrained_filter_fnÚfeature_cfg)r   r   r>  rô   )ÚvariantÚ
pretrainedÚkwargsr2  s       r3   Ú_create_edgenextrG  a  s6   € Ü Ü�'˜:ðä1Ü \ÀdÔKñð ñ	€Eð
 €Lr4   c                 ó2   — | dddddt         t        dddd	œ|¥S )
NrÑ   )r=   é   rI  )r›   r›   gÍÌÌÌÌÌì?Úbicubiczstem.0zhead.fcÚmit)ÚurlrÝ   Ú
input_sizeÚ	pool_sizeÚcrop_pctÚinterpolationÚmeanr(  Ú
first_convÚ
classifierÚlicenser
   )rL  rF  s     r3   Ú_cfgrU  j  s3   € àØ¨=ÀvØ¨)Ü%Ô.BØ¨iØñð ðð r4   ztimm/)r=   é   rV  )Ú	hf_hub_idÚtest_input_sizeÚtest_crop_pctgffffffî?)r=   é@  rZ  )rW  rO  rX  rY  )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_in1kr  c           	      óL   — t        ddd¬«      }t        dd| it        |fi |¤Ž¤ŽS )N)r'   r'   é   r'   rÓ   ©r;   r;   r;   r;   ©rà   rß   rã   rE  )Úedgenext_xx_small©rô   rG  ©rE  rF  Ú
model_argss      r3   r_  r_  �  s1   € ô ˜\Ð0AÈÔV€JÜÑe¸JÐeÌ$ÈzÑJdÐ]cÑJdÑeÐer4   c           	      óL   — t        ddd¬«      }t        dd| it        |fi |¤Ž¤ŽS )NrØ   )rW   é@   éd   éÀ   r]  r^  rE  )Úedgenext_x_smallr`  ra  s      r3   rg  rg  ›  s1   € ô ˜\Ð0BÈ,ÔW€JÜÑd¸:ÐdÌÈjÑIcÐ\bÑIcÑdÐdr4   c           	      óJ   — t        dd¬«      }t        dd| it        |fi |¤Ž¤ŽS )NrØ   )rÕ   é`   é    i0  ©rà   rß   rE  )Úedgenext_smallr`  ra  s      r3   rl  rl  ¦  s/   € ô ˜\Ð0BÔC€JÜÑb¸ÐbÄtÈJÑGaÐZ`ÑGaÑbÐbr4   c           	      óR   — t        g d¢g d¢¬«      }t        dd| it        |fi |¤Ž¤ŽS )NrØ   )éP   rj  rV  iH  rk  rE  )Úedgenext_baser`  ra  s      r3   ro  ro  ±  s/   € ô š\Ò0CÔD€JÜÑa¸
ÐaÄdÈ:ÑF`ÐY_ÑF`ÑaÐar4   c           	      óP   — t        ddddd¬«      }t        dd| it        |fi |¤Ž¤ŽS )	NrØ   )rÕ   ri  rf  i€  TFrë   )rà   rß   rÂ   rf   ræ   rE  )Úedgenext_small_rwr`  ra  s      r3   rq  rq  ¼  s:   € äØÐ"4Ø¨¸)ôE€Jô Ñe¸JÐeÌ$ÈzÑJdÐ]cÑJdÑeÐer4   )Nr¼   r$  )r  )9Ú__doc__r-   Ú	functoolsr   Útypingr   r   r   r   r   r?   Útorch.nn.functionalr	   Ú
functionalrŒ   Ú	timm.datar   r   Útimm.layersr   r   r   r   r   r   r   r   Ú_builderr   Ú	_featuresr   Ú_features_fxr   Ú_manipulater   r   Ú	_registryr   r   Ú__all__r|   r   r`   r~   rŸ   r»   r   rú   r>  rG  rU  Údefault_cfgsr_  rg  rl  ro  rq  r˜   r4   r3   ú<module>r€     sô  ðñó Ý ß 5Õ 5ã ß Ð Ý ç A÷	÷ 	ó 	õ +Ý +Ý 1ß 4ß <àˆ,€ð ô) §	¡	ó )ó ð)ôX6�—	‘	ô 6ôr'˜"Ÿ)™)ô 'ôTW˜"Ÿ)™)ô WôtO�B—I‘Iô OôdOˆr�y‰yô Oód
3òó>ó	ñ %Ù"ØØ%°Sô:ñ "ØØ%°Sô:ñ  $ØØ }ÀCô ñ #ØØ }ÀCôñ $(ØØ }ÀCô$ñ "&ØØ%°Sô"ñ'&ó €ð4 ñf°Xò fó ðfð ñe°Hò eó ðeð ñc°(ò có ðcð ñb°ò bó ðbð ñf°Xò fó ñfr4   