Ë
    éÓ^jYl  ã                   ó`  — d Z ddlmZmZmZmZmZmZ ddlZddl	m
Z
 ddlm
c mZ ddlmZmZ ddl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 dgZ G d„ de
j@                  «      Z! G d„ de
j@                  «      Z" G d„ de
j@                  «      Z# G d„ de
j@                  «      Z$ G d„ de
j@                  «      Z% G d„ de
j@                  «      Z& G d„ de
j@                  «      Z' G d„ de
j@                  «      Z( G d„ de
j@                  «      Z) G d„ de
j@                  «      Z* e+dg d ¢g d!¢g d"¢g d#¢g d$¢d%œdg d&¢g d'¢g d(¢g d)¢g d*¢d%œdg d+¢g d,¢g d-¢g d.¢g d/¢d%œd0d1d1gg d2¢g d3¢g d4¢g d5¢d%œd0d6d7gg d8¢g d9¢g d:¢g d;¢d%œd0d6d7gg d<¢g d=¢g d>¢g d?¢d%œd0d6d7gg d@¢g dA¢g dB¢g dC¢d%œd0d7dDgg dE¢g dF¢g dG¢g dH¢d%œd0d7dIgg dJ¢g dK¢g dL¢g dM¢d%œd0dDdNgg dO¢g dP¢g dQ¢g dR¢d%œ¬S«
      Z,dwdT„Z-dxdU„Z. ei dV e.dWdX¬Y«      “dZ e.dWdX¬Y«      “d[ e.dWdX¬Y«      “d\ e.dWdX¬Y«      “d] e.dWdX¬Y«      “d^ e.dX¬_«      “d` e.dX¬_«      “da e.dX¬_«      “db e.dX¬_«      “dc e.dX¬_«      “dd e.dX¬_«      “de e.dX¬_«      “df e.dX¬_«      “dg e.dX¬_«      “dh e.dX¬_«      “di e.dX¬_«      “dj e.dX¬_«      “ e.dX¬_«       e.dX¬_«      dkœ¥«      Z/edwdle*fdm„«       Z0edwdle*fdn„«       Z1edwdle*fdo„«       Z2edwdle*fdp„«       Z3edwdle*fdq„«       Z4edwdle*fdr„«       Z5edwdle*fds„«       Z6edwdle*fdt„«       Z7edwdle*fdu„«       Z8edwdle*fdv„«       Z9y)yaù   PP-HGNet (V1 & V2)

Reference:
https://github.com/PaddlePaddle/PaddleClas/blob/develop/docs/zh_CN/models/ImageNet1k/PP-HGNetV2.md
The Paddle Implement of PP-HGNet (https://github.com/PaddlePaddle/PaddleClas/blob/release/2.5.1/docs/en/models/PP-HGNet_en.md)
PP-HGNet: https://github.com/PaddlePaddle/PaddleClas/blob/release/2.5.1/ppcls/arch/backbone/legendary_models/pp_hgnet.py
PP-HGNetv2: https://github.com/PaddlePaddle/PaddleClas/blob/release/2.5.1/ppcls/arch/backbone/legendary_models/pp_hgnet_v2.py
é    )ÚDictÚListÚOptionalÚTupleÚTypeÚUnionN©ÚIMAGENET_DEFAULT_MEANÚIMAGENET_DEFAULT_STD)ÚSelectAdaptivePool2dÚDropPathÚcalculate_drop_path_ratesÚcreate_conv2dé   )Úbuild_model_with_cfg)Úfeature_take_indices)Úregister_modelÚgenerate_default_cfgs)Úcheckpoint_seqÚHighPerfGpuNetc                   ó8   ‡ — e Zd Z	 	 	 	 ddedefˆ fd„Zd„ Zˆ xZS )ÚLearnableAffineBlockÚscale_valueÚ
bias_valuec                 óð   •— ||dœ}t         ‰| �  «        t        j                  t	        j
                  |gfi |¤Žd¬«      | _        t        j                  t	        j
                  |gfi |¤Žd¬«      | _        y )N©ÚdeviceÚdtypeT)Úrequires_grad)ÚsuperÚ__init__ÚnnÚ	ParameterÚtorchÚtensorÚscaleÚbias)Úselfr   r   r   r   ÚddÚ	__class__s         €ú\/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/models/hgnet.pyr!   zLearnableAffineBlock.__init__   s`   ø€ ð ¨Ñ/ˆÜ‰ÑÔÜ—\‘\¤%§,¡,°¨}Ñ"CÀÑ"CÐSWÔXˆŒ
Ü—L‘L¤§¡¨z¨lÑ!A¸bÑ!AÐQUÔVˆ�	ó    c                 ó:   — | j                   |z  | j                  z   S ©N)r&   r'   ©r(   Úxs     r+   ÚforwardzLearnableAffineBlock.forward&   s   € Ø�z‰z˜A‰~ §	¡	Ñ)Ð)r,   )ç      ð?ç        NN)Ú__name__Ú
__module__Ú__qualname__Úfloatr!   r1   Ú__classcell__©r*   s   @r+   r   r      s0   ø„ ð "%Ø #ØØñ
Wàð
Wð õ
Wö*r,   r   c                   óV   ‡ — e Zd Z	 	 	 	 	 	 	 ddedededededededefˆ fd	„Zd
„ Zˆ xZS )Ú	ConvBNActÚin_chsÚout_chsÚkernel_sizeÚstrideÚgroupsÚpaddingÚuse_actÚuse_labc                 ó®  •— |	|
dœ}t         ‰| �  «        || _        || _        t	        |||f|||dœ|¤Ž| _        t        j                  |fi |¤Ž| _        | j                  rt        j                  «       | _
        nt        j                  «       | _
        | j                  r| j                  rt        di |¤Ž| _        y t        j                  «       | _        y )Nr   )r?   rA   r@   © )r    r!   rB   rC   r   Úconvr"   ÚBatchNorm2dÚbnÚReLUÚactÚIdentityr   Úlab)r(   r<   r=   r>   r?   r@   rA   rB   rC   r   r   r)   r*   s               €r+   r!   zConvBNAct.__init__+   s¸   ø€ ð ¨Ñ/ˆÜ‰ÑÔØˆŒØˆŒÜ!ØØØð
ð ØØñ
ð ñ
ˆŒ	ô —.‘. Ñ/¨BÑ/ˆŒØ�<Š<Ü—w‘w“yˆD�Hä—{‘{“}ˆDŒHØ�<Š<˜DŸLšLÜ+Ñ1¨bÑ1ˆD�Hä—{‘{“}ˆD�Hr,   c                 óŽ   — | j                  |«      }| j                  |«      }| j                  |«      }| j                  |«      }|S r.   )rF   rH   rJ   rL   r/   s     r+   r1   zConvBNAct.forwardO   s;   € Ø�I‰I�a‹LˆØ�G‰G�A‹JˆØ�H‰H�Q‹KˆØ�H‰H�Q‹KˆØˆr,   )r   r   Ú TFNN)	r4   r5   r6   ÚintÚstrÚboolr!   r1   r8   r9   s   @r+   r;   r;   *   ss   ø„ ð ØØØ Ø!ØØñ"%àð"%ð ð"%ð ð	"%ð
 ð"%ð ð"%ð ð"%ð ð"%ð õ"%öHr,   r;   c                   óD   ‡ — e Zd Z	 	 	 	 ddededededef
ˆ fd„Zd„ Zˆ xZS )	ÚLightConvBNActr<   r=   r>   r@   rC   c                 ó†   •— ||dœ}t         ‰	| �  «        t        ||fdd|dœ|¤Ž| _        t        ||f||d|dœ|¤Ž| _        y )Nr   r   F)r>   rB   rC   T)r>   r@   rB   rC   )r    r!   r;   Úconv1Úconv2)
r(   r<   r=   r>   r@   rC   r   r   r)   r*   s
            €r+   r!   zLightConvBNAct.__init__X   sw   ø€ ð ¨Ñ/ˆÜ‰ÑÔÜØØð
ð ØØñ
ð ñ
ˆŒ
ô ØØð
ð $ØØØñ
ð ñ
ˆ�
r,   c                 óJ   — | j                  |«      }| j                  |«      }|S r.   )rU   rV   r/   s     r+   r1   zLightConvBNAct.forwardv   s!   € Ø�J‰J�q‹MˆØ�J‰J�q‹MˆØˆr,   )r   FNN©r4   r5   r6   rO   rQ   r!   r1   r8   r9   s   @r+   rS   rS   W   sK   ø„ ð Ø!ØØñ
àð
ð ð
ð ð	
ð
 ð
ð õ
ö<r,   rS   c                   ó,   ‡ — e Zd Zddefˆ fd„Zd„ Zˆ xZS )Ú	EseModuleÚchsc                 óž   •— ||dœ}t         ‰| �  «        t        j                  ||fddddœ|¤Ž| _        t        j
                  «       | _        y )Nr   r   r   ©r>   r?   rA   )r    r!   r"   ÚConv2drF   ÚSigmoidÚsigmoid)r(   r[   r   r   r)   r*   s        €r+   r!   zEseModule.__init__}   sW   ø€ Ø¨Ñ/ˆÜ‰ÑÔÜ—I‘IØØð
ð ØØñ
ð ñ
ˆŒ	ô —z‘z“|ˆ�r,   c                 óœ   — |}|j                  dd¬«      }| j                  |«      }| j                  |«      }t        j                  ||«      S )N)é   é   T)Úkeepdim)ÚmeanrF   r`   r$   Úmul)r(   r0   Úidentitys      r+   r1   zEseModule.forwardŠ   sD   € ØˆØ�F‰F�6 4ˆFÓ(ˆØ�I‰I�a‹LˆØ�L‰L˜‹OˆÜ�y‰y˜ 1Ó%Ð%r,   ©NN)r4   r5   r6   rO   r!   r1   r8   r9   s   @r+   rZ   rZ   |   s   ø„ ñ$˜Cõ $ö&r,   rZ   c                   ó2   ‡ — e Zd Zddee   fˆ fd„Zd„ Zˆ xZS )ÚStemV1Ústem_chsc                 ó   •— ||dœ}t         ‰| �  «        t        j                  t	        t        |«      dz
  «      D �cg c]"  }t        ||   ||dz      fd|dk(  rdnddœ|¤Ž‘Œ$ c}Ž | _        t        j                  ddd¬«      | _	        y c c}w )Nr   r   rc   r   rb   )r>   r?   r]   )
r    r!   r"   Ú
SequentialÚrangeÚlenr;   ÚstemÚ	MaxPool2dÚpool)r(   rk   r   r   r)   Úir*   s         €r+   r!   zStemV1.__init__”   s¤   ø€ Ø¨Ñ/ˆÜ‰ÑÔÜ—M‘Mô  %Ü�H“ Ñ!ó #ö$
ð ô Ø˜‘Ø˜˜Q™‘ðð Ø šF‘q¨ñ	ð
 óò$
ð ˆŒ	ô —L‘L¨Q°qÀ!ÔDˆ�	ùò$
s   ½'Bc                 óJ   — | j                  |«      }| j                  |«      }|S r.   )rp   rr   r/   s     r+   r1   zStemV1.forward¢   s!   € Ø�I‰I�a‹LˆØ�I‰I�a‹LˆØˆr,   rh   )r4   r5   r6   r   rO   r!   r1   r8   r9   s   @r+   rj   rj   ’   s   ø„ ñE  c¡õ Eör,   rj   c            	       ó>   ‡ — e Zd Z	 	 	 ddedededefˆ fd„Zd„ Zˆ xZS )ÚStemV2r<   Úmid_chsr=   rC   c                 óT  •— ||dœ}t         ‰| �  «        t        ||fdd|dœ|¤Ž| _        t        ||dz  fdd|dœ|¤Ž| _        t        |dz  |fdd|dœ|¤Ž| _        t        |dz  |fdd|dœ|¤Ž| _        t        ||fdd|dœ|¤Ž| _        t        j                  ddd¬«      | _
        y )Nr   rc   rb   ©r>   r?   rC   r   T)r>   r?   Ú	ceil_mode)r    r!   r;   Ústem1Ústem2aÚstem2bÚstem3Ústem4r"   rq   rr   )	r(   r<   rw   r=   rC   r   r   r)   r*   s	           €r+   r!   zStemV2.__init__ª   s   ø€ ð ¨Ñ/ˆÜ‰ÑÔÜØØð
ð ØØñ
ð ñ
ˆŒ
ô  ØØ�q‰Lð
ð ØØñ
ð ñ
ˆŒô  Ø�q‰LØð
ð ØØñ
ð ñ
ˆŒô Ø�a‰KØð
ð ØØñ
ð ñ
ˆŒ
ô ØØð
ð ØØñ
ð ñ
ˆŒ
ô —L‘L¨Q°qÀDÔIˆ�	r,   c                 ó\  — | j                  |«      }t        j                  |d«      }| j                  |«      }t        j                  |d«      }| j	                  |«      }| j                  |«      }t        j                  ||gd¬«      }| j                  |«      }| j                  |«      }|S )N)r   r   r   r   r   ©Údim)
r{   ÚFÚpadr|   r}   rr   r$   Úcatr~   r   )r(   r0   Úx2Úx1s       r+   r1   zStemV2.forwardß   s‰   € Ø�J‰J�q‹MˆÜ�E‰E�!�\Ó"ˆØ�[‰[˜‹^ˆÜ�U‰U�2�|Ó$ˆØ�[‰[˜‹_ˆØ�Y‰Y�q‹\ˆÜ�I‰I�r˜2�h AÔ&ˆØ�J‰J�q‹MˆØ�J‰J�q‹MˆØˆr,   )FNNrX   r9   s   @r+   rv   rv   ¨   sD   ø„ ð "ØØñ3Jàð3Jð ð3Jð ð	3Jð
 õ3Jöj
r,   rv   c                   óp   ‡ — e Zd Z	 	 	 	 	 	 	 	 ddedededededededed	ed
eee   ef   fˆ fd„Z	d„ Z
ˆ xZS )ÚHighPerfGpuBlockr<   rw   r=   Ú	layer_numr>   ÚresidualÚlight_blockrC   ÚaggÚ	drop_pathc           
      ó¾  •— ||dœ}t         ‰| �  «        || _        t        j                  «       | _        t        |«      D ]f  }|r1| j
                  j                  t        |dk(  r|n||f||dœ|¤Ž«       Œ6| j
                  j                  t        |dk(  r|n||f|d|dœ|¤Ž«       Œh |||z  z   }|	dk(  rDt        ||dz  fdd|dœ|¤Ž}t        |dz  |fdd|dœ|¤Ž}t        j                  ||«      | _        n8t        ||fdd|dœ|¤Ž}t        |fi |¤Ž}t        j                  ||«      | _        |
rt        |
«      | _        y t        j                  «       | _        y )Nr   r   )r>   rC   r   ry   Úserb   )r    r!   r‹   r"   Ú
ModuleListÚlayersrn   ÚappendrS   r;   rm   ÚaggregationrZ   r   rK   rŽ   )r(   r<   rw   r=   rŠ   r>   r‹   rŒ   rC   r�   rŽ   r   r   r)   rs   Ú	total_chsÚaggregation_squeeze_convÚaggregation_excitation_convÚaggregation_convÚattr*   s                       €r+   r!   zHighPerfGpuBlock.__init__í   sÊ  ø€ ð ¨Ñ/ˆÜ‰ÑÔØ ˆŒä—m‘m“oˆŒÜ�yÓ!ò 	ˆAÙØ—‘×"Ñ"Ü"Ø"# q¢&™¨gØðð %0Ø 'ñ	ð
 ñõð —‘×"Ñ"ÜØ"# q¢&™¨gØðð %0Ø Ø 'ñð ñõ	ð	ð0 ˜Y¨Ñ0Ñ0ˆ	Ø�$Š;Ü'0ØØ˜1‘ð(ð ØØñ(ð ñ(Ð$ô +4Ø˜1‘Øð+ð ØØñ+ð ñ+Ð'ô  "Ÿ}™}Ø(Ø+ó ˆDÕô
  )ØØð ð ØØñ ð ñ Ðô ˜GÑ* rÑ*ˆCÜ!Ÿ}™}Ø Øó ˆDÔñ
 1:œ )Ó,ˆ�¼r¿{¹{»}ˆ�r,   c                 óô   — |}|g}| j                   D ]  } ||«      }|j                  |«       Œ t        j                  |d¬«      }| j	                  |«      }| j
                  r| j                  |«      |z   }|S )Nr   r�   )r’   r“   r$   r…   r”   r‹   rŽ   )r(   r0   rg   ÚoutputÚlayers        r+   r1   zHighPerfGpuBlock.forward@  sw   € ØˆØ�ˆØ—[‘[ò 	ˆEÙ�a“ˆAØ�M‰M˜!Õð	ô �I‰I�f !Ô$ˆØ×Ñ˜QÓˆØ�=Š=Ø—‘˜qÓ! HÑ,ˆAØˆr,   )rc   FFFÚeser3   NN©r4   r5   r6   rO   rQ   rP   r   r   r7   r!   r1   r8   r9   s   @r+   r‰   r‰   ì   s®   ø„ ð  !Ø"Ø %Ø!ØØ35ØØñQMàðQMð ðQMð ð	QMð
 ðQMð ðQMð ðQMð ðQMð ðQMð ðQMð ˜T %™[¨%Ð/Ñ0õQMöf
r,   r‰   c                   óz   ‡ — e Zd Z	 	 	 	 	 	 	 	 	 d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   ef   fˆ fd„Z	d„ Z
ˆ xZS )ÚHighPerfGpuStager<   rw   r=   Ú	block_numrŠ   Ú
downsampler?   rŒ   r>   rC   r�   rŽ   c                 óž  •— ||dœ}t         ‰| �  «        || _        |rt        ||fd||d|
dœ|¤Ž| _        nt	        j
                  «       | _        g }t        |«      D ]P  }|j                  t        |dk(  r|n||||f|dk(  rdnd|	||
|t        |t        t        f«      r||   n|dœ|¤Ž«       ŒR t	        j                  |Ž | _        d| _        y )Nr   rc   F)r>   r?   r@   rB   rC   r   T)r‹   r>   rŒ   rC   r�   rŽ   )r    r!   r¢   r;   r"   rK   rn   r“   r‰   Ú
isinstanceÚlistÚtuplerm   ÚblocksÚgrad_checkpointing)r(   r<   rw   r=   r¡   rŠ   r¢   r?   rŒ   r>   rC   r�   rŽ   r   r   r)   Úblocks_listrs   r*   s                     €r+   r!   zHighPerfGpuStage.__init__N  s  ø€ ð" ¨Ñ/ˆÜ‰ÑÔØ$ˆŒÙÜ'ØØð	ð ØØØØñ	ð ñ	ˆD�Oô !Ÿk™k›mˆDŒOàˆÜ�yÓ!ò 	ˆAØ×ÑÜ Ø 1šf‘F¨'ØØØð	ð
 '(¨1¢f™U°$Ø +Ø +Ø#ØÜ.8¸ÄTÌ5ÀMÔ.R˜i¨šlÐXañð ñõð	ô  —m‘m [Ð1ˆŒØ!&ˆÕr,   c                 óÎ   — | j                  |«      }| j                  r6t        j                  j	                  «       st        | j                  |«      }|S | j                  |«      }|S r.   )r¢   r¨   r$   ÚjitÚis_scriptingr   r§   r/   s     r+   r1   zHighPerfGpuStage.forward„  sS   € Ø�O‰O˜AÓˆØ×"Ò"¬5¯9©9×+AÑ+AÔ+CÜ˜tŸ{™{¨AÓ.ˆAð ˆð —‘˜A“ˆAØˆr,   )	Trb   Frc   Fr�   r3   NNrž   r9   s   @r+   r    r    M  s¯   ø„ ð  $ØØ %Ø Ø!ØØ35ØØñ4'àð4'ð ð4'ð ð	4'ð
 ð4'ð ð4'ð ð4'ð ð4'ð ð4'ð ð4'ð ð4'ð ð4'ð ˜T %™[¨%Ð/Ñ0õ4'ölr,   r    c                   ór   ‡ — e Zd Z	 	 	 	 	 	 ddededededee   defˆ fd„Zddedee   fd„Z	dd	efd
„Z
ˆ xZS )ÚClassifierHeadÚin_featuresÚnum_classesÚ	pool_typeÚ	drop_rateÚhidden_sizerC   c	                 óÊ  •— ||dœ}	t         ‰| �  «        || _        |�|s|dk(  sJ d«       ‚t        |¬«      | _        |�}|| _        t        j                  ||fdddddœ|	¤Ž}
t        j                  «       }|r(t        di |	¤Ž}t        j                  |
||«      | _
        n5t        j                  |
|«      | _
        nt        j                  «       | _
        t        j                  |«      | _        |rt        j                  d«      nt        j                  «       | _        |dkD  r't        j                   | j                  |fi |	¤Ž| _        y t        j                  «       | _        y )	Nr   r   ú6Classifier head must be removed if pooling is disabled©r±   r   F)r>   r?   rA   r'   rE   )r    r!   Únum_featuresr   Úglobal_poolr"   r^   rI   r   rm   Ú	last_convrK   ÚDropoutÚdropoutÚFlattenÚflattenÚLinearÚfc)r(   r¯   r°   r±   r²   r³   rC   r   r   r)   r¹   rJ   rL   r*   s                €r+   r!   zClassifierHead.__init__Ž  s8  ø€ ð ¨Ñ/ˆÜ‰ÑÔØ'ˆÔØÐ ÙØ" aÒ'ÐaÐ)aÓaÐ'ä/¸)ÔDˆÔØÐ"Ø +ˆDÔÜŸ	™	ØØðð ØØØñð ñˆIô —'‘'“)ˆCÙÜ*Ñ0¨RÑ0�Ü!#§¡¨y¸#¸sÓ!C�•ä!#§¡¨y¸#Ó!>�•äŸ[™[›]ˆDŒNä—z‘z )Ó,ˆŒÙ(1”r—z‘z !”}´r·{±{³}ˆŒØEPÐSTÂ_”"—)‘)˜D×-Ñ-¨{ÑA¸bÑAˆ�ÔZ\×ZeÑZeÓZgˆ�r,   c                 ó:  — ||dœ}|�O|s|dk(  sJ d«       ‚t        |¬«      | _        |rt        j                  d«      nt        j                  «       | _        |dkD  r't        j                  | j                  |fi |¤Ž| _        y t        j                  «       | _        y )Nr   r   rµ   r¶   r   )	r   r¸   r"   r¼   rK   r½   r¾   r·   r¿   )r(   r°   r±   r   r   r)   s         r+   ÚresetzClassifierHead.reset¹  sƒ   € Ø¨Ñ/ˆØÐ ÙØ" aÒ'ÐaÐ)aÓaÐ'Ü3¸iÔHˆDÔÙ,5œ2Ÿ:™: aœ=¼2¿;¹;»=ˆDŒLàEPÐSTÂ_”"—)‘)˜D×-Ñ-¨{ÑA¸bÑAˆ�ÔZ\×ZeÑZeÓZgˆ�r,   Ú
pre_logitsc                 ó¸   — | j                  |«      }| j                  |«      }| j                  |«      }| j                  |«      }|r|S | j	                  |«      }|S r.   )r¸   r¹   r»   r½   r¿   ©r(   r0   rÂ   s      r+   r1   zClassifierHead.forwardÃ  sT   € Ø×Ñ˜QÓˆØ�N‰N˜1ÓˆØ�L‰L˜‹OˆØ�L‰L˜‹OˆÙØˆHØ�G‰G�A‹JˆØˆr,   )Úavgr3   é   FNN©NNN©F)r4   r5   r6   rO   rP   r7   r   rQ   r!   rÁ   r1   r8   r9   s   @r+   r®   r®   �  sˆ   ø„ ð
 #Ø!Ø)-Ø!ØØñ)hàð)hð ð)hð ð	)hð
 ð)hð " #™ð)hð õ)hñVh ð h°¸#±ó hñ T÷ r,   r®   c                   ó4  ‡ — e Zd Z	 	 	 	 	 	 	 	 	 ddededededee   de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      dededededeee
j&                     ee
j&                  ee
j&                     f   f   fd„Z	 	 	 d"deeee   f   dedefd„Zd„ Zddefd„Zd„ Zˆ xZS )#r   ÚcfgÚin_chansr°   r¸   Úhead_hidden_sizer²   Údrop_path_raterC   c                 ó:  •— t         ‰!| �  «        |	|
dœ}|d   }|d   }|d   |d   |d   |d   g}|| _        || _        || _        || _        |dv sJ ‚|d	k(  rt        d||d
   |d   |dœ|¤Ž| _        nt        |g|z   fi |¤Ž| _        d}g }g | _	        |D �cg c]  }|d   ‘Œ	 }}t        ||d¬«      }t        |«      D ]r  \  }}|\  }}}}}}}}|t        d||||||||||dk(  rdnd||   dœ|¤Žgz  }|| _        |r|dz  }| xj                  t        | j                  |d|› �¬«      gz  c_	        Œt t        j                   |Ž | _        t%        | j                  f|||||dœ|¤Ž| _        | j&                  j                  | _        | j+                  «       D ]ý  \  }} t-        | t        j.                  «      r-t        j0                  j3                  | j4                  dd¬«       ŒMt-        | t        j6                  «      rSt        j0                  j9                  | j4                  «       t        j0                  j;                  | j<                  «       Œºt-        | t        j>                  «      sŒÕt        j0                  j;                  | j<                  «       Œÿ y c c}w )Nr   Ú	stem_typerk   Ústage1Ústage2Ústage3Ústage4)Úv1Úv2rÕ   r   r   )r<   rw   r=   rC   é   rc   T)Ú	stagewiserÔ   r�   r�   )r<   rw   r=   r¡   rŠ   r¢   rŒ   r>   rC   r�   rŽ   rb   zstages.)Únum_chsÚ	reductionÚmodule)r°   r±   r²   r³   rC   Úfan_outÚrelu)ÚmodeÚnonlinearityrE   ) r    r!   r°   rË   r²   rC   rv   rp   rj   Úfeature_infor   Ú	enumerater    r·   Údictr"   rm   Ústagesr®   ÚheadrÌ   Únamed_modulesr¤   r^   ÚinitÚkaiming_normal_ÚweightrG   Úones_Úzeros_r'   r¾   )"r(   rÊ   rË   r°   r¸   rÌ   r²   rÍ   rC   r   r   Úkwargsr)   rÏ   rk   Ú
stages_cfgÚcurrent_striderâ   ÚcÚblock_depthsÚdprrs   Ústage_configr<   rw   r=   r¡   r¢   rŒ   r>   rŠ   ÚnÚmr*   s"                                    €r+   r!   zHighPerfGpuNet.__init__Ð  sÆ  ø€ ô 	‰ÑÔØ¨Ñ/ˆØ˜Ñ$ˆ	Ø�z‘?ˆØ˜(‘m S¨¡]°C¸±MÀ3ÀxÁ=ÐQˆ
Ø&ˆÔØ ˆŒØ"ˆŒØˆŒà˜LÑ(Ð(Ð(Ø˜ÒÜð ØØ  ™Ø  ™Øñ	ð
 ñˆD�Iô  ˜z¨HÑ4Ñ;¸Ñ;ˆDŒIàˆàˆØˆÔØ&0Ö1 ˜˜!›Ð1ˆÐ1Ü'¨¸ÐPTÔUˆÜ(¨Ó4ò 	s‰OˆAˆ|ØcoÑ`ˆF�G˜W i°¸[È+ÐW`ØÔ'ð ØØØØ#Ø#Ø%Ø'Ø'ØØ&¨$Ò.‘E°DØ˜a™&ñð ñð ñ ˆFð !(ˆDÔÙØ !Ñ#�Ø×Ò¤$¨t×/@Ñ/@ÈNÐelÐmnÐloÐcpÔ"qÐ!rÑrÖð'	sô( —m‘m VÐ,ˆŒä"Ø×Ñð
à#Ø!ØØ(Øñ
ð ñ
ˆŒ	ð !%§	¡	× 6Ñ 6ˆÔà×&Ñ&Ó(ò 	'‰DˆAˆqÜ˜!œRŸY™YÔ'Ü—‘×'Ñ'¨¯©°yÈvÐ'ÕVÜ˜AœrŸ~™~Ô.Ü—‘—‘˜aŸh™hÔ'Ü—‘—‘˜qŸv™vÕ&Ü˜AœrŸy™yÕ)Ü—‘—‘˜qŸv™vÕ&ñ	'ùòG 2s   ÂJc                 ó.   — t        d|rd¬«      S d¬«      S )Nz^stemz^stages\.(\d+)z^stages\.(\d+).blocks\.(\d+))rp   r§   )rá   )r(   Úcoarses     r+   Úgroup_matcherzHighPerfGpuNet.group_matcher$  s%   € äØÙ(.Ð$ô
ð 	
à4Sô
ð 	
r,   c                 ó4   — | j                   D ]	  }||_        Œ y r.   )râ   r¨   )r(   ÚenableÚss      r+   Úset_grad_checkpointingz%HighPerfGpuNet.set_grad_checkpointing+  s   € à—‘ò 	*ˆAØ#)ˆAÕ ñ	*r,   Úreturnc                 ó.   — | j                   j                  S r.   )rã   r¿   )r(   s    r+   Úget_classifierzHighPerfGpuNet.get_classifier0  s   € à�y‰y�|‰|Ðr,   c                 óP   — || _         | j                  j                  ||||¬«       y )Nr   )r°   rã   rÁ   )r(   r°   r¸   r   r   s        r+   Úreset_classifierzHighPerfGpuNet.reset_classifier4  s"   € Ø&ˆÔØ�	‰	�‰˜ [¸ÀuˆÕMr,   r0   ÚindicesÚnormÚ
stop_earlyÚ
output_fmtÚintermediates_onlyc                 ór  — |dv sJ d«       ‚g }t        t        | j                  «      |«      \  }}	| j                  |«      }t        j
                  j                  «       s|s| j                  }
n| j                  d|	dz    }
t        |
«      D ]#  \  }} ||«      }||v sŒ|j                  |«       Œ% |r|S ||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.Nr   )	r   ro   râ   rp   r$   r«   r¬   rà   r“   )r(   r0   rÿ   r   r  r  r  ÚintermediatesÚtake_indicesÚ	max_indexrâ   Úfeat_idxÚstages                r+   Úforward_intermediatesz$HighPerfGpuNet.forward_intermediates8  sÂ   € ð* ˜YÑ&ÐDÐ(DÓDÐ&ØˆÜ"6´s¸4¿;¹;Ó7GÈÓ"QÑˆ�ið �I‰I�a‹LˆÜ�9‰9×!Ñ!Ô#©:Ø—[‘[‰Fà—[‘[  )¨a¡-Ð0ˆFä(¨Ó0ò 	(‰OˆH�eÙ�a“ˆAØ˜<Ò'Ø×$Ñ$ QÕ'ð	(ñ
 Ø Ð à�-ÐÐr,   Ú
prune_normÚ
prune_headc                 ó    — t        t        | j                  «      |«      \  }}| j                  d|dz    | _        |r| j                  dd«       |S )z@ Prune layers not required for specified intermediates.
        Nr   r   rÅ   )r   ro   râ   rþ   )r(   rÿ   r  r  r  r  s         r+   Úprune_intermediate_layersz(HighPerfGpuNet.prune_intermediate_layersb  sM   € ô #7´s¸4¿;¹;Ó7GÈÓ"QÑˆ�iØ—k‘k . 9¨q¡=Ð1ˆŒÙØ×!Ñ! ! UÔ+ØÐr,   c                 óF   — | j                  |«      }| j                  |«      S r.   )rp   râ   r/   s     r+   Úforward_featureszHighPerfGpuNet.forward_featuresp  s   € Ø�I‰I�a‹LˆØ�{‰{˜1‹~Ðr,   rÂ   c                 óN   — |r| j                  ||¬«      S | j                  |«      S )N)rÂ   )rã   rÄ   s      r+   Úforward_headzHighPerfGpuNet.forward_headt  s%   € Ù6@ˆt�y‰y˜ zˆyÓ2ÐRÀdÇiÁiÐPQÃlÐRr,   c                 óJ   — | j                  |«      }| j                  |«      }|S r.   )r  r  r/   s     r+   r1   zHighPerfGpuNet.forwardw  s'   € Ø×!Ñ! !Ó$ˆØ×Ñ˜aÓ ˆØˆr,   )	rc   éè  rÅ   rÆ   r3   r3   FNNrÈ   )TrÇ   )NFFr  F)r   FT)r4   r5   r6   r   rO   rP   r   r7   rQ   r!   r$   r«   Úignorerõ   rù   r"   ÚModulerü   rþ   ÚTensorr   r   r   r  r  r  r  r1   r8   r9   s   @r+   r   r   Î  sì  ø„ ð
 Ø#Ø$Ø.2Ø!Ø$&Ø!ØØñR'àðR'ð ðR'ð ð	R'ð
 ðR'ð ' s™mðR'ð ðR'ð "ðR'ð õR'ðh ‡Y�Y×Ñò
ó ð
ð ‡Y�Y×Ñò*ó ð*ð ‡Y�Y×Ñð §	¡	ò ó ðñN¨Cð N¸hÀs¹mó Nð 8<ØØ$Ø$Ø',ñ( à�|‰|ð( ð ˜e C¨¨c© NÑ3Ñ4ð( ð ð	( ð
 ð( ð ð( ð !%ð( ð 
ˆt�E—L‘LÑ! 5¨¯©°t¸E¿L¹LÑ7IÐ)IÑ#JÐJÑ	Kó( ðX ./Ø$Ø#ñ	à˜3  S¡	˜>Ñ*ðð ðð ó	òñS¨$ó Sör,   rÔ   )é0   r  é`   )r  r  éà   r   FFrc   é   )r  é€   éÀ  r   TFrc   r  )r  é    é   rb   TFrc   r  )r   éÀ   é   r   TFrc   r  )rÏ   rk   rÐ   rÑ   rÒ   rÓ   )é@   r#  r  )r  r  é   r   FFrc   é   )r$  r  r   r   TFrc   r%  )r   r!  r"  rb   TFrc   r%  )r"  r  é   r   TFrc   r%  )r  r  r  )r  r!  é@  r   FFrc   é   )r'  r  é€  rb   TFrc   r(  )r)  r$  éÀ  rc   TFrc   r(  )r*  é   i   rb   TFrc   r(  rÕ   é   )r,  r,  r#  r   FFrc   rc   )r#  é    r$  r   TFrc   rc   )r$  r#  r   rb   TTr  rc   )r   r  r&  r   TTr  rc   é   r-  )r-  r-  r#  r   FFrc   rc   )r#  r  r$  r   TFrc   rc   )r$  r  r   rb   TTr  rc   )r   r!  r&  r   TTr  rc   )r-  r-  r  r   FFrc   rÖ   )r  r#  é€  r   TFrc   rÖ   )r/  r  r"  rc   TTr  rÖ   )r"  r$  i   r   TTr  rÖ   )r-  r-  r  r   FFrc   r  )r  r#  r   r   TFrc   r  )r   r  r&  rc   TTr  r  )r&  r$  rÆ   r   TTr  r  r  )r  r  r  r   FFrc   r%  )r  r  r   r   TFrc   r%  )r   r!  r&  rc   TTr  r%  )r&  r/  rÆ   r   TTr  r%  r#  )r#  r#  r  r   FFrc   r%  )r  r  r   rb   TFrc   r%  )r   r$  r&  r  TTr  r%  )r&  r   rÆ   rb   TTr  r%  r  )r  r  r!  rb   FFrc   r%  )r!  r!  r   rc   TFrc   r%  )r   r/  r&  r%  TTr  r%  )r&  r"  rÆ   rc   TTr  r%  )
Ú
hgnet_tinyÚhgnet_smallÚ
hgnet_baseÚ
hgnetv2_b0Ú
hgnetv2_b1Ú
hgnetv2_b2Ú
hgnetv2_b3Ú
hgnetv2_b4Ú
hgnetv2_b5Ú
hgnetv2_b6c                 ót   — |j                  dd«      }t        t        | |ft        |    t	        d|¬«      dœ|¤ŽS )NÚout_indices)r   r   rb   rc   T)Úflatten_sequentialr;  )Ú	model_cfgÚfeature_cfg)Úpopr   r   Ú
model_cfgsrá   )ÚvariantÚ
pretrainedrê   r;  s       r+   Ú_create_hgnetrC  Ý  sK   € Ø—*‘*˜]¨LÓ9€KÜÜØØðô ˜WÑ%Ü¨D¸kÔJñð ñð r,   c                 ó6   — | dddddt         t        dddd	d
dœ|¥S )Nr  )rc   r  r  )r(  r(  gáz®Gáî?Úbicubiczhead.fczstem.stem1.convr2   )rc   r+  r+  z
apache-2.0)Úurlr°   Ú
input_sizeÚ	pool_sizeÚcrop_pctÚinterpolationre   ÚstdÚ
classifierÚ
first_convÚtest_crop_pctÚtest_input_sizeÚlicenser	   )rF  rê   s     r+   Ú_cfgrQ  é  s9   € àØ¨=ÀvØ¨IÜ%Ô.BØÐ/@Ø°Øñ	ð ð	ð 	r,   zhgnet_tiny.paddle_in1kzstem.stem.0.convztimm/)rM  Ú	hf_hub_idzhgnet_tiny.ssld_in1kzhgnet_small.paddle_in1kzhgnet_small.ssld_in1kzhgnet_base.ssld_in1kzhgnetv2_b0.ssld_stage2_ft_in1k)rR  z!hgnetv2_b0.ssld_stage1_in22k_in1kzhgnetv2_b1.ssld_stage2_ft_in1kz!hgnetv2_b1.ssld_stage1_in22k_in1kzhgnetv2_b2.ssld_stage2_ft_in1kz!hgnetv2_b2.ssld_stage1_in22k_in1kzhgnetv2_b3.ssld_stage2_ft_in1kz!hgnetv2_b3.ssld_stage1_in22k_in1kzhgnetv2_b4.ssld_stage2_ft_in1kz!hgnetv2_b4.ssld_stage1_in22k_in1kzhgnetv2_b5.ssld_stage2_ft_in1kz!hgnetv2_b5.ssld_stage1_in22k_in1k)zhgnetv2_b6.ssld_stage2_ft_in1kz!hgnetv2_b6.ssld_stage1_in22k_in1krú   c                 ó   — t        dd| i|¤ŽS )NrB  )r0  ©rC  ©rB  rê   s     r+   r0  r0  %  ó   € äÑG°*ÐGÀÑGÐGr,   c                 ó   — t        dd| i|¤ŽS )NrB  )r1  rT  rU  s     r+   r1  r1  *  s   € äÑH°:ÐHÀÑHÐHr,   c                 ó   — t        dd| i|¤ŽS )NrB  )r2  rT  rU  s     r+   r2  r2  /  rV  r,   c                 ó   — t        d| ddœ|¤ŽS )NT©rB  rC   )r3  rT  rU  s     r+   r3  r3  4  ó   € äÐU°*ÀdÑUÈfÑUÐUr,   c                 ó   — t        d| ddœ|¤ŽS )NTrZ  )r4  rT  rU  s     r+   r4  r4  9  r[  r,   c                 ó   — t        d| ddœ|¤ŽS )NTrZ  )r5  rT  rU  s     r+   r5  r5  >  r[  r,   c                 ó   — t        d| ddœ|¤ŽS )NTrZ  )r6  rT  rU  s     r+   r6  r6  C  r[  r,   c                 ó   — t        dd| i|¤ŽS )NrB  )r7  rT  rU  s     r+   r7  r7  H  rV  r,   c                 ó   — t        dd| i|¤ŽS )NrB  )r8  rT  rU  s     r+   r8  r8  M  rV  r,   c                 ó   — t        dd| i|¤ŽS )NrB  )r9  rT  rU  s     r+   r9  r9  R  rV  r,   rÈ   )rN   ):Ú__doc__Útypingr   r   r   r   r   r   r$   Útorch.nnr"   Útorch.nn.functionalÚ
functionalrƒ   Ú	timm.datar
   r   Útimm.layersr   r   r   r   Ú_builderr   Ú	_featuresr   Ú	_registryr   r   Ú_manipulater   Ú__all__r  r   r;   rS   rZ   rj   rv   r‰   r    r®   r   rá   r@  rC  rQ  Údefault_cfgsr0  r1  r2  r3  r4  r5  r6  r7  r8  r9  rE   r,   r+   ú<module>ro     sÝ  ðñ÷ <× ;ã Ý ß Ð ç Aß `Ó `Ý *Ý +ß <Ý 'àÐ
€ô*˜2Ÿ9™9ô *ô"*�—	‘	ô *ôZ"�R—Y‘Yô "ôJ&�—	‘	ô &ô,ˆR�Y‰Yô ô,AˆR�Y‰Yô AôH^�r—y‘yô ^ôB=�r—y‘yô =ô@>�R—Y‘Yô >ôBl�R—Y‘Yô lñ^ ð Ú â6Ú7Ú7Ú7ñð Ú!â8Ú7Ú7Ú8ñð Ú!â8Ú7Ú7Ú8ñð Ø˜�Hâ5Ú5Ú5Ú7ñð Ø˜�Hâ5Ú5Ú5Ú7ñð Ø˜�Hâ5Ú5Ú6Ú7ñð Ø˜�Hâ6Ú6Ú7Ú8ñð Ø˜�Hâ6Ú6Ú7Ú8ñð Ø˜�Hâ6Ú7Ú7Ú8ñð Ø˜�Hâ6Ú7Ú7Ú8ñôi]€
ó@	ó
ñ %ð ,&Ø™dØ%Øôð,&ð ™DØ%Øôð	,&ð ™tØ%Øô ð,&ð ™TØ%Øôð,&ð ™DØ%Øôð,&ð  %¡dØô'ð!,&ð$ (©Øô*ð%,&ð( %¡dØô'ð),&ð, (©Øô*ð-,&ð0 %¡dØô'ð1,&ð4 (©Øô*ð5,&ð8 %¡dØô'ð9,&ð< (©Øô*ð=,&ð@ %¡dØô'ðA,&ðD (©Øô*ðE,&ðH %¡dØô'ðI,&ðL (©Øô*ðM,&ñP '+Øô'á)-Øô*òU,&ó ,€ð^ ñH¨nò Hó ðHð ñI¨~ò Ió ðIð ñH¨nò Hó ðHð ñV¨nò Vó ðVð ñV¨nò Vó ðVð ñV¨nò Vó ðVð ñV¨nò Vó ðVð ñH¨nò Hó ðHð ñH¨nò Hó ðHð ñH¨nò Hó ñHr,   