
    RЦi                     D   S r SSKrSSKJr  SSKJrJrJrJrJ	r	J
r
JrJr  SSKrSSKJr  SSKJs  Jr  SSKJrJr  SSKJrJrJr  SSKJr  SS	KJr  SS
KJrJ r   SSK!J"r"  SSK#J$r$  SSK%J&r&J'r'  S/r(\" \S\" \SS9S9r) " S S\RT                  5      r+ " S S\RT                  5      r, " S S\RT                  5      r- " S S\RT                  5      r. " S S\RT                  5      r/ " S S\RT                  5      r0S\\1\Rd                  4   S\RT                  S \\1\Rd                  4   4S! jr3S5S"\1S#\4S$\5S%\S \04
S& jjr6S6S' jr7\'" \7" 5       \7" S(S)9\7" 5       \7" S(S)9\7" S(S)9\7" S(S)9\7" 5       \7" S(S)9\7" 5       \7" 5       S*.
5      r8\&S7S \04S+ jj5       r9\&S7S \04S, jj5       r:\&S7S \04S- jj5       r;\&S7S \04S. jj5       r<\&S7S \04S/ jj5       r=\&S7S \04S0 jj5       r>\&S7S$\5S%\S \04S1 jj5       r?\&S7S$\5S%\S \04S2 jj5       r@\&S7S$\5S%\S \04S3 jj5       rA\&S7S$\5S%\S \04S4 jj5       rBg)8a  
An implementation of GhostNet & GhostNetV2 Models as defined in:
GhostNet: More Features from Cheap Operations. https://arxiv.org/abs/1911.11907
GhostNetV2: Enhance Cheap Operation with Long-Range Attention. https://proceedings.neurips.cc/paper_files/paper/2022/file/40b60852a4abdaa696b5a1a78da34635-Paper-Conference.pdf
GhostNetV3: Exploring the Training Strategies for Compact Models. https://arxiv.org/abs/2404.11202

The train script & code of models at:
Original model: https://github.com/huawei-noah/CV-backbones/tree/master/ghostnet_pytorch
Original model: https://github.com/huawei-noah/Efficient-AI-Backbones/blob/master/ghostnetv2_pytorch/model/ghostnetv2_torch.py
Original model: https://github.com/huawei-noah/Efficient-AI-Backbones/blob/master/ghostnetv3_pytorch/ghostnetv3.py
    N)partial)AnyDictListSetOptionalTupleUnionTypeIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)SelectAdaptivePool2dLinearmake_divisiblereparameterize_model   )build_model_with_cfg)SqueezeExcite	ConvBnAct)feature_take_indices)checkpoint_seq)register_modelgenerate_default_cfgsGhostNethard_sigmoid   )divisor)
gate_layerrd_round_fnc                      ^  \ rS rSrSSSS\R
                  SS4S\S\S\S	\S
\S\S\\R                     4U 4S jjjr	S\
R                  S\
R                  4S jrSrU =r$ )GhostModule$   r         Nin_chsout_chskernel_sizeratiodw_sizestride	act_layerc
           
        > XS.n
[         TU ]  5         X l        [        R                  " X$-  5      nXS-
  -  n[
        R                  " [
        R                  " XX6US-  4SS0U
D6[
        R                  " U40 U
D6U" SS95      U l	        [
        R                  " [
        R                  " XUSUS-  4USS.U
D6[
        R                  " U40 U
D6U" SS95      U l
        g )	Ndevicedtyper   r%   biasFTinplacegroupsr2   )super__init__r(   mathceilnn
SequentialConv2dBatchNorm2dprimary_convcheap_operationselfr'   r(   r)   r*   r+   r,   r-   r0   r1   ddinit_chsnew_chs	__class__s                S/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/timm/models/ghostnet.pyr8   GhostModule.__init__%   s     /99W_-ai(MMIIf[A=M`TY`]_`NN8*r*d#
  "}}IIh!WaZcW\c`bcNN7)b)d# 
    xreturnc                     U R                  U5      nU R                  U5      n[        R                  " X#/SS9nUS S 2S U R                  2S S 2S S 24   $ )Nr   dim)r?   r@   torchcatr(   )rB   rJ   x1x2outs        rG   forwardGhostModule.forwardC   sP    q!!!"%iia(1mt||mQ)**rI   )r@   r(   r?   __name__
__module____qualname____firstlineno__r;   ReLUintr   Moduler8   rO   TensorrT   __static_attributes____classcell__rF   s   @rG   r#   r#   $   s    
  !)+

 
 	

 
 
 
 BII
 
<+ +%,, + +rI   r#   c                      ^  \ rS rSrSSSS\R
                  SS4S\S\S\S	\S
\S\S\\R                     4U 4S jjjr	S\
R                  S\
R                  4S jrSrU =r$ )GhostModuleV2J   r   r%   r&   Nr'   r(   r)   r*   r+   r,   r-   c
                 V  > XS.n
[         TU ]  5         [        R                  " 5       U l        X l        [        R                  " X$-  5      nXS-
  -  n[        R                  " [        R                  " XX6US-  4SS0U
D6[        R                  " U40 U
D6U" SS95      U l        [        R                  " [        R                  " XUSUS-  4USS.U
D6[        R                  " U40 U
D6U" SS95      U l        [        R                  " [        R                  " XX6US-  4SS0U
D6[        R                  " U40 U
D6[        R                  " X"4S	SS
USS.U
D6[        R                  " U40 U
D6[        R                  " X"4SSSUSS.U
D6[        R                  " U40 U
D65      U l        g )Nr/   r   r%   r2   FTr3   r5   r      r   r%   r)   r,   paddingr6   r2   rg   r   r%   r   )r7   r8   r;   Sigmoidgate_fnr(   r9   r:   r<   r=   r>   r?   r@   
short_convrA   s                rG   r8   GhostModuleV2.__init__K   s    /zz|99W_-ai(MMIIf[A=M`TY`]_`NN8*r*d#

  "}}IIh!W\e(Y^ebdeNN7)b)d# 

 --IIf{K1<L_SX_\^_NN7)b)IIgwF1f]dkpwtvwNN7)b)IIgwF1f]dkpwtvwNN7)b)
rI   rJ   rK   c                 v   U R                  [        R                  " USSS95      nU R                  U5      nU R	                  U5      n[
        R                  " X4/SS9nUS S 2S U R                  2S S 2S S 24   [        R                  " U R                  U5      UR                  S   UR                  S   4SS9-  $ )	Nr%   r)   r,   r   rM   nearestsizemode)ro   F
avg_pool2dr?   r@   rO   rP   r(   interpolatern   shape)rB   rJ   resrQ   rR   rS   s         rG   rT   GhostModuleV2.forwardp   s    ooall1!AFGq!!!"%iia(1mt||mQ)*Q]]LLSYYr]CIIbM$B.T T 	TrI   )r@   rn   r(   r?   ro   rV   ra   s   @rG   rc   rc   J   s    
  !)+#
#
 #
 	#

 #
 #
 #
 BII#
 #
JT T%,, T TrI   rc   c                      ^  \ rS rSrSSSS\R
                  SSS4S\S\S	\S
\S\S\S\\R                     S\	4U 4S jjjr
S rS rS rS rS rS rSrU =r$ )GhostModuleV3y   r   r%   r&   originalNr'   r(   r)   r*   r+   r,   r-   rx   c                 6  > XS.n[         TU ]  5         [        R                  " 5       U l        X l        [        R                  " X$-  5      nXS-
  -  nXl        SU l	        SU l
        U R                  (       d4  [        R                  " 5       U l        [        R                  " 5       U l        S U l        S U l        [        R                   " [#        U R                  5       Vs/ s H  n[%        UUUU4US-  S S.UD6PM     sn5      U l        U" SS9U l        [        R*                  " U40 UD6U l        [        R                   " [#        U R                  5       Vs/ s H  n[%        UUUS4US-  SS S	.UD6PM     sn5      U l        [%        XSS4S
SS S	.UD6U l        U" SS9U l        U R                  S;   a  [        R4                  " [        R6                  " XX6US-  4SS0UD6[        R*                  " U40 UD6[        R6                  " X"4SSSUSS.UD6[        R*                  " U40 UD6[        R6                  " X"4SSSUSS.UD6[        R*                  " U40 UD65      O[        R                  " 5       U l        Xl        Xl        XPl        g s  snf s  snf )Nr/   r   r&   Fr%   )pad_typer-   Tr3   r   
group_sizer-   r   shortcutr2   rf   rh   ri   rk   rl   ) r7   r8   r;   rm   rn   r(   r9   r:   rx   num_conv_branches
infer_modeIdentityr?   r@   primary_rpr_skipprimary_rpr_scale
ModuleListranger   primary_rpr_convprimary_activationr>   cheap_rpr_skipcheap_rpr_convcheap_rpr_scalecheap_activationr<   r=   ro   in_channelsr6   r)   )rB   r'   r(   r)   r*   r+   r,   r-   rx   r0   r1   rC   rD   rE   _rF   s                  rG   r8   GhostModuleV3.__init__z   s    /zz|99W_-ai(	!" "D#%;;=D  $!% " T334
/
 5! 	
 %)  5
/
 
! #,D"9 nnX<< mm T334-
 5! 		
 !A	 	 5-
   )Aqq1YZfjqnpq )$ 7 YY,& --IIf{KN]QV]Z\]NN7)b)IIguE!U[binurtuNN7)b)IIguE!U[binurtuNN7)b)
 -/KKM 	 $"S
/
-
s   !J Jc                    U R                   (       a#  U R                  U5      nU R                  U5      nOSnU R                   H  nX$" U5      -  nM     U R	                  U5      nU R                  U5      U R                  U5      -   nU R                   H  nX5" U5      -  nM     U R                  U5      n[        R                  " X#/SS9nU R                  S;  a  U$ U R                  [        R                  " USSS95      nUS S 2S U R                  2S S 2S S 24   [        R                   " U R#                  U5      UR$                  S   UR$                  S   4S	S
9-  $ )Nr   r   rM   r   r%   rr   rs   rt   ru   rv   )r   r?   r@   r   r   r   r   r   r   rO   rP   rx   ro   ry   rz   r(   r{   rn   r|   )rB   rJ   rQ   rR   r   r   rS   r}   s           rG   rT   GhostModuleV3.forward   sB   ??""1%B%%b)BB$($9$9 &q)) %:((,B%%b)D,?,?,CCB"&"5"5nR(( #6&&r*BiiQ'99L(J//!,,qa"JKCq$,,q*+ammS!2		"(FY/X X XrI   c                    SnSnU R                   bE  U R                  U R                   5      u  pU R                  S-  n[        R                  " XX3U/5      nSnSnU R
                  b  U R                  U R
                  5      u  pESnSn[        U R                  5       H+  nU R                  U R                  U   5      u  pXi-  nXz-  nM-     Xa-   U-   nXr-   U-   nX4$ Nr   r%   )	r   _fuse_bn_tensorr)   ry   padr   r   r   r   rB   kernel_scale
bias_scaler   kernel_identitybias_identitykernel_conv	bias_convix_kernel_biaskernel_final
bias_finals                rG   _get_kernel_bias_primary&GhostModuleV3._get_kernel_bias_primary   s    
!!-'+';';D<R<R'S$L""a'C55Ss/CDL  ,-1-A-A$BWBW-X*O	../B!11$2G2G2KLNG"KI 0
 #1OC+m;
''rI   c                    SnSnU R                   bE  U R                  U R                   5      u  pU R                  S-  n[        R                  " XX3U/5      nSnSnU R
                  b  U R                  U R
                  5      u  pESnSn[        U R                  5       H+  nU R                  U R                  U   5      u  pXi-  nXz-  nM-     Xa-   U-   nXr-   U-   nX4$ r   )	r   r   r)   ry   r   r   r   r   r   r   s                rG   _get_kernel_bias_cheap$GhostModuleV3._get_kernel_bias_cheap   s    
+'+';';D<P<P'Q$L""a'C55Ss/CDL*-1-A-A$BUBU-V*O	../B!11$2E2Eb2IJNG"KI 0
 #1OC+m;
''rI   c                    [        U[        5      (       a  UR                  R                  nUR                  R
                  nUR                  R                  nUR                  R                  nUR                  R                  nUR                  R                  nGO8[        U[        R                  5      (       d   e[        U S5      (       d  U R                  U R                  -  n[        R                  " U R                  XR                   U R                   4UR                  R"                  UR                  R$                  S9n	['        U R                  5       H'  n
SXX-  U R                   S-  U R                   S-  4'   M)     Xl        U R(                  nUR
                  nUR                  nUR                  nUR                  nUR                  nXG-   R+                  5       nX[-  R-                  SSSS5      nX,-  XcU-  U-  -
  4$ N	id_tensor)r1   r0   r   r%   rt   
isinstancer   convweightbn1running_meanrunning_varr2   epsr;   r>   hasattrr   r6   rO   zerosr)   r1   r0   r   r   sqrtreshaperB   branchkernelr   r   gammabetar   	input_dimkernel_valueistdts                rG   r   GhostModuleV3._fuse_bn_tensor     fi(([[''F!::22L **00KJJ%%E::??D**..Cfbnn55554-- ,,;	${{%%y2B2BDDTDTU ----!==// 
 t//0AcdLAM43C3Cq3H$JZJZ^_J_!_` 1!-^^F!..L ,,KMME;;D**C &&([!!"aA.z4"6"<<<<rI   c                    U R                   (       a  g U R                  5       u  p[        R                  " U R                  S   R
                  R                  U R                  S   R
                  R                  U R                  S   R
                  R                  U R                  S   R
                  R                  U R                  S   R
                  R                  U R                  S   R
                  R                  U R                  S   R
                  R                  SS9U l        XR                  R                  l        X R                  R                   l        [        R"                  " U R                  U R$                  b  U R$                  O[        R"                  " 5       5      U l        U R'                  5       u  p4[        R                  " U R(                  S   R
                  R                  U R(                  S   R
                  R                  U R(                  S   R
                  R                  U R(                  S   R
                  R                  U R(                  S   R
                  R                  U R(                  S   R
                  R                  U R(                  S   R
                  R                  SS9U l        X0R*                  R                  l        X@R*                  R                   l        [        R"                  " U R*                  U R,                  b  U R,                  O[        R"                  " 5       5      U l        U R/                  5        H  nUR1                  5         M     [3        U S5      (       a  U R5                  S5        [3        U S5      (       a  U R5                  S5        [3        U S5      (       a  U R5                  S5        [3        U S5      (       a  U R5                  S5        [3        U S5      (       a  U R5                  S5        [3        U S	5      (       a  U R5                  S	5        SU l         g )
Nr   Tr   out_channelsr)   r,   rj   dilationr6   r2   r   r   r   r   r   r   )r   r   r;   r=   r   r   r   r   r)   r,   rj   r   r6   r?   r   datar2   r<   r   r   r   r@   r   
parametersdetach_r   __delattr__)rB   primary_kernelprimary_biascheap_kernel
cheap_biasparas         rG   switch_to_deployGhostModuleV3.switch_to_deploy&  sQ   ??'+'D'D'F$II--a055AA..q166CC--a055AA((+0077))!,1199**1-22;;((+0077	
 )7  %&2#MM'+'>'>'JD##PRP]P]P_

 $(#>#>#@ !yy++A.33??,,Q/44AA++A.33??&&q)..55''*//77((+0099&&q)..55	 
 ,8##()3!!&!}}  %)%:%:%FD!!BMMO 
 OO%DLLN &4+,,/04,--014+,,/04)**-.4*++./4)**-.rI   c                 $    U R                  5         g Nr   rB   s    rG   reparameterizeGhostModuleV3.reparameterizea      rI   )r   r@   r   r   r   rn   r6   r   r   r   r)   rx   r   r(   r   r?   r   r   r   ro   )rW   rX   rY   rZ   r;   r[   r\   r   r]   strr8   rT   r   r   r   r   r   r_   r`   ra   s   @rG   r   r   y   s    
  !)+"E#E# E# 	E#
 E# E# E# BIIE# E# E#NX.(0(0=<9v   rI   r   c                      ^  \ rS rSrSrSS\R                  SSSS4S\S	\S
\S\S\S\\R                     S\
S\4U 4S jjjrS\R                  S\R                  4S jrSrU =r$ )GhostBottleneckie  z$GhostV1/V2 bottleneck w/ optional SEr&   r           r   Nr'   mid_chsr(   dw_kernel_sizer,   r-   se_ratiorx   c                 Z  > XS.n[         TU ]  5         US L=(       a    US:  nXPl        US:X  a  [        X4SU0UD6U l        O[        X4SU0UD6U l        U R                  S:  aF  [        R                  " UUU4UUS-
  S-  USS.UD6U l        [        R                  " U40 UD6U l
        OS U l        S U l
        U(       a  [        U4S	U0UD6OS U l        [        X#4S[        R                  0UD6U l        X:X  a+  U R                  S:X  a  [        R                  " 5       U l        g [        R                  " [        R                  " UUU4UUS-
  S-  USS.UD6[        R                  " U40 UD6[        R                  " XS4SS
SS.UD6[        R                  " U40 UD65      U l        g )Nr/   r   r   r-   r   r%   Fr,   rj   r6   r2   rd_ratior   r,   rj   r2   )r7   r8   r,   r#   ghost1rc   r;   r=   conv_dwr>   bn_dw	_SE_LAYERser   ghost2r<   r   )rB   r'   r   r(   r   r,   r-   r   rx   r0   r1   rC   has_serF   s                rG   r8   GhostBottleneck.__init__h  s    /%7(R- :%fQQbQDK'S9SPRSDK ;;?99	 ')A-	 	DL 626DJDLDJ BH)G=h="=T "'PbkkPRP !1MMODMMM		"	 "+A-1!	 	 v,,		&1TQTQSTw-"-DMrI   rJ   rK   c                    UnU R                  U5      nU R                  b"  U R                  U5      nU R                  U5      nU R                  b  U R                  U5      nU R	                  U5      nXR                  U5      -  nU$ r   )r   r   r   r   r   r   )rB   rJ   r   s      rG   rT   GhostBottleneck.forward  sz     KKN <<#QA

1A 77
A KKN	]]8$$rI   )r   r   r   r   r   r   r,   )rW   rX   rY   rZ   __doc__r;   r[   r\   r   r]   floatr   r8   rO   r^   rT   r_   r`   ra   s   @rG   r   r   e  s    / #$)+ "AA A 	A
  A A BIIA A A AF %,,  rI   r   c                      ^  \ rS rSrSrSS\R                  SSSS4S\S	\S
\S\S\S\\R                     S\
S\4U 4S jjjrS\R                  S\R                  4S jrS rS rS rS rSrU =r$ )GhostBottleneckV3i  z!GhostV3 bottleneck w/ optional SEr&   r   r   r   Nr'   r   r(   r   r,   r-   r   rx   c                   > XS.n[         TU ]  5         US L=(       a    US:  nXPl        SU l        SU l        U R                  (       d4  [
        R                  " 5       U l        [
        R                  " 5       U l        [        X4XhS.UD6U l
        U R                  S:  az  [
        R                  " [        U R                  5       Vs/ s H  n[        UUUU4US-
  S-  SS S.UD6PM     sn5      U l        [        X"SS4S	SS S.UD6U l        X@l        X l        O4[
        R                  " 5       U l        [
        R                  " 5       U l        S U l        U(       a  ['        U4S
U0UD6O[
        R                  " 5       U l        [        X#4[
        R                  SS.UD6U l        X:X  a+  U R                  S:X  a  [
        R                  " 5       U l        g [
        R.                  " [
        R0                  " UUU4UUS-
  S-  USS.UD6[
        R2                  " U40 UD6[
        R0                  " XS4SS	SS.UD6[
        R2                  " U40 UD65      U l        g s  snf )Nr/   r   r&   F)r-   rx   r   r%   r   r   r   r   r   r   )r7   r8   r,   r   r   r;   r   r   r   r   r   r   r   r   dw_rpr_convdw_rpr_scaler)   r   dw_rpr_skipr   r   r   r   r<   r=   r>   )rB   r'   r   r(   r   r,   r-   r   rx   r0   r1   rC   r   r   rF   s                 rG   r8   GhostBottleneckV3.__init__  sB    /%7(R-!";;=DLDJ $FZyZWYZ ;;?!}} T334
. 5! /8		/
 )1,2	/ 	/ 5
. 
 D !*'Aq q1YZfj qnp qD-&!}}D "D BH)G=h="=R[[] $GcR\c`bc !1KKMDMMM		"	 "+A-1!	 	 v,,		&1TQTQSTw-"-DM=
.s   #IrJ   rK   c                 ~   UnU R                  U5      nU R                  S:  ad  U R                  (       a#  U R                  U5      nU R	                  U5      nO0U R                  U5      nU R                   H  nX4" U5      -  nM     UnU R                  U5      nU R                  U5      nXR                  U5      -  nU$ )Nr   )
r   r,   r   r   r   r   r   r   r   r   )rB   rJ   r   rQ   r   s        rG   rT   GhostBottleneckV3.forward  s     KKN ;;?LLOJJqM&&q)#'#3#3K+a.(B $4 GGAJ KKN	]]8$$rI   c                    SnSnU R                   bE  U R                  U R                   5      u  pU R                  S-  n[        R                  " XX3U/5      nSnSnU R
                  b  U R                  U R
                  5      u  pESnSn[        U R                  5       H+  nU R                  U R                  U   5      u  pXi-  nXz-  nM-     Xa-   U-   nXr-   U-   nX4$ r   )	r   r   r)   ry   r   r   r   r   r   r   s                rG   _get_kernel_bias_dw%GhostBottleneckV3._get_kernel_bias_dw)  s    
('+';';D<M<M'N$L""a'C55Ss/CDL'-1-A-A$BRBR-S*O	../B!11$2B2B22FGNG"KI 0
 #1OC+m;
''rI   c                    [        U[        5      (       a  UR                  R                  nUR                  R
                  nUR                  R                  nUR                  R                  nUR                  R                  nUR                  R                  nGO8[        U[        R                  5      (       d   e[        U S5      (       d  U R                  U R                  -  n[        R                  " U R                  XR                   U R                   4UR                  R"                  UR                  R$                  S9n	['        U R                  5       H'  n
SXX-  U R                   S-  U R                   S-  4'   M)     Xl        U R(                  nUR
                  nUR                  nUR                  nUR                  nUR                  nXG-   R+                  5       nX[-  R-                  SSSS5      nX,-  XcU-  U-  -
  4$ r   r   r   s                rG   r   !GhostBottleneckV3._fuse_bn_tensorA  r   rI   c                 >   U R                   (       d  U R                  S:X  a  g U R                  5       u  p[        R                  " U R
                  S   R                  R                  U R
                  S   R                  R                  U R
                  S   R                  R                  U R
                  S   R                  R                  U R
                  S   R                  R                  U R
                  S   R                  R                  U R
                  S   R                  R                  SS9U l        XR                  R                  l        X R                  R                   l        [        R"                  " 5       U l        U R'                  5        H  nUR)                  5         M     [+        U S5      (       a  U R-                  S5        [+        U S5      (       a  U R-                  S5        [+        U S5      (       a  U R-                  S5        SU l         g )Nr   r   Tr   r   r   r   )r   r,   r  r;   r=   r   r   r   r   r)   rj   r   r6   r   r   r   r2   r   r   r   r   r   r   )rB   	dw_kerneldw_biasr   s       rG   r   "GhostBottleneckV3.switch_to_deploy_  s   ??dkkQ.!557	yy((+00<<))!,11>>((+00<<##A&++22$$Q',,44%%a(--66##A&++22	
 $- !([[]
 OO%DLLN &4'']+4((^,4'']+rI   c                 $    U R                  5         g r   r   r   s    rG   r    GhostBottleneckV3.reparameterize}  r   rI   )r   r   r   r   r   r   r   r   r   r   r)   r   r   r   r,   )rW   rX   rY   rZ   r   r;   r[   r\   r   r]   r   r   r8   rO   r^   rT   r  r   r   r   r_   r`   ra   s   @rG   r   r     s    , #$)+ "II I 	I
  I I BIII I I IV %,, 4(0=<<   rI   r   c                   d  ^  \ rS rSr         S#S\\\\\\4            S\S\S\S\S\S\S	\4U 4S
 jjjr	\
R                  R                  S\4S j5       r\
R                  R                  S$S\S\\\4   4S jj5       r\
R                  R                  S%S\4S jj5       r\
R                  R                  S\R*                  4S j5       rS&S\S\4S jjr     S'S\
R0                  S\\\\\   4      S\S\S\S\S\\\
R0                     \\
R0                  \\
R0                     4   4   4S jjr   S(S\\\\   4   S\S\4S jjrS\
R0                  S\
R0                  4S jrS$S\
R0                  S\S\
R0                  4S jjrS\
R0                  S\
R0                  4S  jrS! r S"r!U =r"$ ))r   i  cfgsnum_classeswidthin_chansoutput_strideglobal_pool	drop_rateversionc                 &  > [         TU ]  5         XS.nUS:X  d   S5       eXl        X l        X@l        Xpl        SU l        / U l        US:X  a  [        O[        n[        SU-  S5      n[        R                  " XMSS	S
4SS0UD6U l        U R                  R                  [        US	SS95        [        R                   " U40 UD6U l        [        R$                  " SS9U l        Un[        R(                  " / 5      nSnSnS	nU R                   H  n/ nS
nU Hy  u  nnnnn[        UU-  S5      n[        UU-  S5      n[        S0 UD6nUS:X  a  US
:  a  SUS'   US:X  a  US
:  a  SUS'   UR                  U" UUUUU4SU0UD65        UnUS
-  nM{     US
:  a,  US	-  nU R                  R                  [        UUSU 3S95        UR                  [        R*                  " U6 5        US
-  nM     [        WU-  S5      nUR                  [        R*                  " [-        UUS
40 UD65      5        U=U l        n[        R*                  " U6 U l        Xl        S=U l        n[7        US9U l        [        R                  " UUS
S
S4SS0UD6U l        [        R$                  " SS9U l        U(       a  [        R>                  " S
5      O[        R@                  " 5       U l!        US:  a  [E        UU40 UD6U l#        g [        R@                  " 5       U l#        g )Nr/       z7only output_stride==32 is valid, dilation not supportedFv3   r   r&   r%   r   r2   	conv_stem)num_chs	reductionmoduleTr3   r   v2attnrx   r   r   zblocks.i   	pool_type )$r7   r8   r  r  r  r  grad_checkpointingfeature_infor   r   r   r;   r=   r  appenddictr>   r   r[   act1r   r<   r   pool_dimblocksnum_featureshead_hidden_sizer   r  	conv_headact2Flattenr   flattenr   
classifier)rB   r  r  r  r  r  r  r  r  r0   r1   rC   
Bottleneckstem_chsprev_chsstages	stage_idx	layer_idx
net_stridecfglayersskexp_sizecr   r(   r   layer_kwargsrF   s                                rG   r8   GhostNet.__init__  s    	/"]$]]"	& ""'*1T/&
 ""u*a08q!QQUQbQ  h!i!YZ>>(1b1GGD)	 r"		
99CFA/2+8Q!(UA6(E)91=#zbzd?y1}+1L(d?y1}+5L(j7GQmT\m`lmn"Q	 03 1ua
!!(($
WYKCX*Z [MM"--01NI' * !E!115bmmIh$Ib$IJK#**mmV, %*../+F8WaAODOBOGGD)	(3rzz!}@Ka&+<<UWU`U`UbrI   rK   c                     [        5       $ r   )setr   s    rG   no_weight_decayGhostNet.no_weight_decay  s	    urI   coarsec                 4    [        SU(       a  SOSS 4S/S9nU$ )Nz^conv_stem|bn1z^blocks\.(\d+)z^blocks\.(\d+)\.(\d+))r+  )i )stemr(  )r%  )rB   rC  matchers      rG   group_matcherGhostNet.group_matcher  s,    "&,"2JDQ(
 rI   enablec                     Xl         g r   )r"  )rB   rI  s     rG   set_grad_checkpointingGhostNet.set_grad_checkpointing  s    "(rI   c                     U R                   $ r   )r/  r   s    rG   get_classifierGhostNet.get_classifier  s    rI   c                    Xl         [        US9U l        U(       a  [        R                  " S5      O[        R
                  " 5       U l        US:  aX  [        U R                  UU R                  R                  R                  U R                  R                  R                  S9U l        g [        R
                  " 5       U l        g )Nr  r   r   r/   )r  r   r  r;   r-  r   r.  r   r*  r+  r   r0   r1   r/  )rB   r  r  s      rG   reset_classifierGhostNet.reset_classifier  s    &/+F(3rzz!} 1_ !!!;>>((//t~~7L7L7R7R
 #%++- 	rI   rJ   indicesnorm
stop_early
output_fmtintermediates_onlyc           	      B   US;   d   S5       e/ nS/U R                   SS  Vs/ s H#  n[        US   R                  S5      S   5      PM%     sn-   n	[        [	        U	5      U5      u  pU
 Vs/ s H
  oU   S-   PM     n
nX   nSnU R                  U5      nX;   a  UR                  U5        U R                  U5      nU R                  U5      n[        R                  R                  5       (       d  U(       d  U R                  nOU R                  SUS-    n[        USS	9 He  u  pU R                  (       a/  [        R                  R                  5       (       d  [        X5      nOU" U5      nX;   d  MT  UR                  U5        Mg     U(       a  U$ X4$ s  snf s  snf )
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.rt   r   Nr  .r   )start)r#  r\   splitr   lenr  r$  r   r&  rO   jitis_scriptingr(  	enumerater"  r   )rB   rJ   rS  rT  rU  rV  rW  intermediatesinfo
stage_endstake_indices	max_indexr   feat_idxr3  stages                   rG   forward_intermediatesGhostNet.forward_intermediates  s~   * Y&D(DD&TDL]L]^_^`LabLaDSh!5!5c!:2!>?Labb
"6s:"P1=>A1a>)	 NN1#  #HHQKIIaL99!!##:[[F[[)a-0F(q9OH&&uyy/E/E/G/G"5,!H'$$Q'  :   9 c>s   *F-F
prune_norm
prune_headc           	      *   S/U R                   SS  Vs/ s H#  n[        US   R                  S5      S   5      PM%     sn-   n[        [	        U5      U5      u  pgXW   nU R
                  SUS-    U l        U(       a  U R                  SS5        U$ s  snf )z?Prune layers not required for specified intermediates.
        rt   r   Nr  rZ  r    )r#  r\   r\  r   r]  r(  rQ  )rB   rS  rj  rk  rb  rc  rd  re  s           rG   prune_intermediate_layers"GhostNet.prune_intermediate_layers$  s     TDL]L]^_^`LabLaDSh!5!5c!:2!>?Labb
"6s:"P)	kk.9q=1!!!R( cs   *Bc                 $   U R                  U5      nU R                  U5      nU R                  U5      nU R                  (       a:  [        R
                  R                  5       (       d  [        U R                  USS9nU$ U R                  U5      nU$ )NT)r.  )	r  r   r&  r"  rO   r^  r_  r   r(  rB   rJ   s     rG   forward_featuresGhostNet.forward_features4  sr    NN1HHQKIIaL""599+A+A+C+Ct{{At<A  AArI   
pre_logitsc                 0   U R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nU R                  S:  a)  [
        R                  " XR                  U R                  S9nU(       a  U$ U R                  U5      $ )Nr   )ptraining)	r  r+  r,  r.  r  ry   dropoutrw  r/  )rB   rJ   rt  s      rG   forward_headGhostNet.forward_head>  st    QNN1IIaLLLO>>B		!~~FAq6DOOA$66rI   c                 J    U R                  U5      nU R                  U5      nU$ r   )rr  ry  rq  s     rG   rT   GhostNet.forwardG  s'    !!!$a rI   c                     [        U SS9  g )NFr3   r   r   s    rG   convert_to_deployGhostNet.convert_to_deployL  s    T51rI   )r&  r,  r(  r   r  r/  r+  r  r  r#  r.  r  r"  r*  r  r  r)  r'  )	        ?r&   r  avgg?v1NNF)T)r  )NFFrY  F)r   FT)#rW   rX   rY   rZ   r   r
   r\   r   r   r8   rO   r^  ignorer   rA  boolr   r   rG  rK  r;   r]   rN  rQ  r^   r   r	   rh  rn  rr  ry  rT   r~  r_   r`   ra   s   @rG   r   r     s     $!#$"HctDsEz!2345Hc Hc 	Hc
 Hc Hc Hc Hc Hc HcX YY   YYD T#s(^   YY)T ) ) YY		  0C 0c 0 8<$$',3 ||3  eCcN343  	3 
 3  3  !%3  
tELL!5tELL7I)I#JJ	K3 n ./$#	3S	>*  	 %,, 5<< 7ell 7 7 7 %,, 
2 2rI   
state_dictmodelrK   c                     SU ;   a  U S   n 0 nU R                  5        HM  u  p4SU;   a  SU;   a  UR                  SS5      nSU;   a  SU;   a  UR                  SS5      nSU;   a  MI  XBU'   MO     U$ )Nr  zbn.z.ghostzbn1.z.dw_rpr_total)itemsreplace)r  r  out_dictr:  vs        rG   checkpoint_filter_fnr  P  s    z!-
H  "A:(a-		%(AA:*/		%(Aa< # OrI   variantr  
pretrainedkwargsc                     / SQ// SQ// SQ// SQ// SQ// SQ// SQ/ SQ/ SQ/ S	Q/ S
Q// SQ// SQ/ SQ/ SQ/ SQ//	n[        SUUS.UD6n[        [        U U4[        [        SS9S.UD6$ )z
Constructs a GhostNet model
)r&   r  r  r   r   )r&   0      r   r%   )r&   H   r  r   r   )rg   r  (         ?r%   )rg   x   r  r  r   )r&      P   r   r%   )r&      r  r   r   )r&      r  r   r   )r&   i  p   r  r   )r&     r  r  r   )rg   r     r  r%   )rg     r  r   r   )rg   r  r  r  r   )r  r  T)flatten_sequential)pretrained_filter_fnfeature_cfgr!  )r%  r   r   r  )r  r  r  r  r  model_kwargss         rG   _create_ghostnetr  `  s     
			 	 								
 
  					
)D4   L
   2D1  rI   c                 2    U SSSSS[         [        SSSS	.UE$ )
Nr  )r&      r  )   r  g      ?bicubicr  r/  z
apache-2.0)urlr  
input_size	pool_sizecrop_pctinterpolationmeanr   
first_convr/  licenser   )r  r  s     rG   _cfgr    s3    4}SYI%.B!  rI   ztimm/)	hf_hub_id)
zghostnet_050.untrainedzghostnet_100.in1kzghostnet_130.untrainedzghostnetv2_100.in1kzghostnetv2_130.in1kzghostnetv2_160.in1kzghostnetv3_050.untrainedzghostnetv3_100.in1kzghostnetv3_130.untrainedzghostnetv3_160.untrainedc                 "    [        SSU S.UD6nU$ )zGhostNet-0.5x       ?r  r  )ghostnet_050r  r  r  r  s      rG   r  r         X3:XQWXELrI   c                 "    [        SSU S.UD6nU$ )zGhostNet-1.0x r  r  )ghostnet_100r  r  s      rG   r  r    r  rI   c                 "    [        SSU S.UD6nU$ )zGhostNet-1.3x ?r  )ghostnet_130r  r  s      rG   r  r    r  rI   c                 $    [        SSU SS.UD6nU$ )zGhostNetV2-1.0x r  r  r  r  r  )ghostnetv2_100r  r  s      rG   r  r    !     hSZY]haghELrI   c                 $    [        SSU SS.UD6nU$ )zGhostNetV2-1.3x r  r  r  )ghostnetv2_130r  r  s      rG   r  r    r  rI   c                 $    [        SSU SS.UD6nU$ )zGhostNetV2-1.6x 皙?r  r  )ghostnetv2_160r  r  s      rG   r  r    r  rI   c                 $    [        SSU SS.UD6nU$ )zGhostNetV3-0.5x r  r  r  )ghostnetv3_050r  r  s      rG   r  r    r  rI   c                 $    [        SSU SS.UD6nU$ )zGhostNetV3-1.0x r  r  r  )ghostnetv3_100r  r  s      rG   r  r    r  rI   c                 $    [        SSU SS.UD6nU$ )zGhostNetV3-1.3x r  r  r  )ghostnetv3_130r  r  s      rG   r  r    r  rI   c                 $    [        SSU SS.UD6nU$ )zGhostNetV3-1.6x r  r  r  )ghostnetv3_160r  r  s      rG   r  r    r  rI   )r  F)rm  r  )Cr   r9   	functoolsr   typingr   r   r   r   r   r	   r
   r   rO   torch.nnr;   torch.nn.functional
functionalry   	timm.datar   r   timm.layersr   r   r   timm.utils.modelr   _builderr   _efficientnet_blocksr   r   	_featuresr   _manipulater   	_registryr   r   __all__r   r]   r#   rc   r   r   r   r   r   r^   r  r   r  r  r  default_cfgsr  r  r  r  r  r  r  r  r  r  r!  rI   rG   <module>r     s  
   E E E     A D D 1 * : + ' <, Mn'R`jkJlm	#+")) #+L,TBII ,T^i BII i XYbii Yx} 		 } @L2ryy L2^T#u||*;%< RYY SWX[]b]i]iXiSj  *c *% *4 *[^ *ck *Z %"f #f     !% !% $3& :          (   (   (   t s x   t s x   t s x   t s x  rI   