
    ^j                     >   d Z ddlZddlmZ ddlmZmZ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 ddlmZ dd	lmZ dd
lmZm Z  ddl!m"Z" ddl#m$Z$ ddl%m&Z&m'Z' dgZ( eed eed            Z) G d dejT                        Z+ G d dejT                        Z, G d dejT                        Z- G d dejT                        Z. G d dejT                        Z/ G d dejT                        Z0dee1ejd                  f   dejT                  d ee1ejd                  f   fd!Z3d5d"e1d#e4d$e5d%ed e0f
d&Z6d6d'Z7 e' e7        e7d()       e7        e7d()       e7d()       e7d()       e7        e7d()       e7        e7       d*
      Z8e&d7d e0fd+       Z9e&d7d e0fd,       Z:e&d7d e0fd-       Z;e&d7d e0fd.       Z<e&d7d e0fd/       Z=e&d7d e0fd0       Z>e&d7d$e5d%ed e0fd1       Z?e&d7d$e5d%ed e0fd2       Z@e&d7d$e5d%ed e0fd3       ZAe&d7d$e5d%ed e0fd4       ZBy)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                        e Zd Zddddej                  ddfdedededed	ed
edeej                     f fdZde	j                  de	j                  fdZ xZS )GhostModuler         Nin_chsout_chskernel_sizeratiodw_sizestride	act_layerc
           
         ||	d}
t         |           || _        t        j                  ||z        }||dz
  z  }t        j                  t        j                  |||||dz  fddi|
t        j                  |fi |
 |d            | _	        t        j                  t        j                  |||d|dz  f|dd|
t        j                  |fi |
 |d            | _
        y )	Ndevicedtyper   r$   biasFTinplacegroupsr1   )super__init__r'   mathceilnn
SequentialConv2dBatchNorm2dprimary_convcheap_operationselfr&   r'   r(   r)   r*   r+   r,   r/   r0   ddinit_chsnew_chs	__class__s                _/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/models/ghostnet.pyr7   zGhostModule.__init__%   s     /99Wu_-eai(MMIIfhV[A=M`TY`]_`NN8*r*d#
  "}}IIh!WaZcW\c`bcNN7)b)d# 
    xreturnc                     | j                  |      }| j                  |      }t        j                  ||gd      }|d d d | j                  d d d d f   S )Nr   dim)r>   r?   torchcatr'   )rA   rH   x1x2outs        rF   forwardzGhostModule.forwardC   sR    q!!!"%iiRa(1mt||mQ)**rG   __name__
__module____qualname__r:   ReLUintr   Moduler7   rM   TensorrR   __classcell__rE   s   @rF   r#   r#   $   s    
  !)+

 
 	

 
 
 
 BII
<+ +%,, +rG   r#   c                        e Zd Zddddej                  ddfdedededed	ed
edeej                     f fdZde	j                  de	j                  fdZ xZS )GhostModuleV2r   r$   r%   Nr&   r'   r(   r)   r*   r+   r,   c
                 Z   ||	d}
t         |           t        j                         | _        || _        t        j                  ||z        }||dz
  z  }t        j                  t        j                  |||||dz  fddi|
t        j                  |fi |
 |d            | _        t        j                  t        j                  |||d|dz  f|dd|
t        j                  |fi |
 |d            | _        t        j                  t        j                  |||||dz  fddi|
t        j                  |fi |
t        j                  ||fd	dd
|dd|
t        j                  |fi |
t        j                  ||fddd|dd|
t        j                  |fi |
      | _        y )Nr.   r   r$   r1   FTr2   r4   r      r   r$   r(   r+   paddingr5   r1   ra   r   r$   r   )r6   r7   r:   Sigmoidgate_fnr'   r8   r9   r;   r<   r=   r>   r?   
short_convr@   s                rF   r7   zGhostModuleV2.__init__K   s    /zz|99Wu_-eai(MMIIfhV[A=M`TY`]_`NN8*r*d#

  "}}IIh!W\e(Y^ebdeNN7)b)d# 

 --IIfg{FK1<L_SX_\^_NN7)b)IIgwwF1f]dkpwtvwNN7)b)IIgwwF1f]dkpwtvwNN7)b)
rG   rH   rI   c                    | j                  t        j                  |dd            }| j                  |      }| j	                  |      }t        j                  ||gd      }|d d d | j                  d d d d f   t        j                  | j                  |      |j                  d   |j                  d   fd      z  S )	Nr$   r(   r+   r   rK   nearestsizemode)ri   F
avg_pool2dr>   r?   rM   rN   r'   interpolaterh   shape)rA   rH   resrO   rP   rQ   s         rF   rR   zGhostModuleV2.forwardp   s    ooall1!AFGq!!!"%iiRa(1mt||mQ)*Q]]LLSYYr]CIIbM$B.T T 	TrG   rS   r\   s   @rF   r^   r^   J   s    
  !)+#
#
 #
 	#

 #
 #
 #
 BII#
JT T%,, TrG   r^   c                        e Zd Zddddej                  dddfdededed	ed
ededeej                     def fdZ	d Z
d Zd Zd Zd Zd Z xZS )GhostModuleV3r   r$   r%   originalNr&   r'   r(   r)   r*   r+   r,   rq   c                 $   |	|
d}t         |           t        j                         | _        || _        t        j                  ||z        }||dz
  z  }|| _        d| _	        d| _
        | j                  s2t        j                         | _        t        j                         | _        d | _        d | _        t        j                   t#        | j                        D cg c]  }t%        ||||f|dz  d d| c}      | _         |d      | _        t        j*                  |fi || _        t        j                   t#        | j                        D cg c]  }t%        |||df|dz  dd d	| c}      | _        t%        ||ddfd
dd d	|| _         |d      | _        | j                  dv rt        j4                  t        j6                  |||||dz  fddi|t        j*                  |fi |t        j6                  ||fddd|dd|t        j*                  |fi |t        j6                  ||fddd|dd|t        j*                  |fi |      nt        j                         | _        || _        || _        || _        y c c}w c c}w )Nr.   r   r%   Fr$   )pad_typer,   Tr2   r{   
group_sizer,   r   shortcutr1   r`   rb   rc   re   rf   ) r6   r7   r:   rg   rh   r'   r8   r9   rq   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<   ri   in_channelsr5   r(   )rA   r&   r'   r(   r)   r*   r+   r,   rq   r/   r0   rB   rC   rD   _rE   s                  rF   r7   zGhostModuleV3.__init__z   s    /zz|99Wu_-eai(	!" "D#%;;=D  $!% " T334
/
  	
 %) 
/
 
! #,D"9 nnX<< mm T334-
  		
 !A	 	-
   )7Aqq1YZfjqnpq )$ 7 YY,& --IIfg{FKN]QV]Z\]NN7)b)IIgwuE!U[binurtuNN7)b)IIgwuE!U[binurtuNN7)b)
 -/KKM 	 $"S
/
-
s   JJc                    | j                   r#| j                  |      }| j                  |      }nd}| j                  D ]  }| ||      z  } | j	                  |      }| j                  |      | j                  |      z   }| j                  D ]  }| ||      z  } | j                  |      }t        j                  ||gd      }| j                  dvr|S | j                  t        j                  |dd            }|d d d | j                  d d d d f   t        j                   | j#                  |      |j$                  d   |j$                  d   fd	
      z  S )Nr   r   rK   r~   r$   rk   rl   rm   rn   ro   )r   r>   r?   r   r   r   r   r   r   rM   rN   rq   ri   rr   rs   r'   rt   rh   ru   )rA   rH   rO   rP   r   r   rQ   rv   s           rF   rR   zGhostModuleV3.forward   sN   ??""1%B%%b)BB$($9$9 * &q))*((,B%%b)D,?,?,CCB"&"5"5 )nR(()&&r*BiiBQ'99L(J//!,,qa"JKCq$,,q*+ammS!2		"(FY/X X XrG   c                    d}d}| j                   G| j                  | j                         \  }}| j                  dz  }t        j                  |||||g      }d}d}| j
                  | j                  | j
                        \  }}d}d}t        | j                        D ]-  }| j                  | j                  |         \  }	}
||	z  }||
z  }/ ||z   |z   }||z   |z   }||fS Nr   r$   )	r   _fuse_bn_tensorr(   rr   padr   r   r   r   rA   kernel_scale
bias_scaler   kernel_identitybias_identitykernel_conv	bias_convix_kernel_biaskernel_final
bias_finals                rF   _get_kernel_bias_primaryz&GhostModuleV3._get_kernel_bias_primary   s   
!!-'+';';D<R<R'S$L*""a'C55S#s/CDL  ,-1-A-A$BWBW-X*O]	../ 	B!11$2G2G2KLNGU7"KI	
 #\1OC+m;
Z''rG   c                    d}d}| j                   G| j                  | j                         \  }}| j                  dz  }t        j                  |||||g      }d}d}| j
                  | j                  | j
                        \  }}d}d}t        | j                        D ]-  }| j                  | j                  |         \  }	}
||	z  }||
z  }/ ||z   |z   }||z   |z   }||fS r   )	r   r   r(   rr   r   r   r   r   r   r   s                rF   _get_kernel_bias_cheapz$GhostModuleV3._get_kernel_bias_cheap   s   
+'+';';D<P<P'Q$L*""a'C55S#s/CDL*-1-A-A$BUBU-V*O]	../ 	B!11$2E2Eb2IJNGU7"KI	
 #\1OC+m;
Z''rG   c                    t        |t              r|j                  j                  }|j                  j
                  }|j                  j                  }|j                  j                  }|j                  j                  }|j                  j                  }n2t        |t        j                        sJ t        | d      s| j                  | j                  z  }t        j                  | j                  || j                   | j                   f|j                  j"                  |j                  j$                        }	t'        | j                        D ](  }
d|	|
|
|z  | j                   dz  | j                   dz  f<   * |	| _        | j(                  }|j
                  }|j                  }|j                  }|j                  }|j                  }||z   j+                         }||z  j-                  dddd      }||z  |||z  |z  z
  fS N	id_tensor)r0   r/   r   r$   rm   
isinstancer   convweightbn1running_meanrunning_varr1   epsr:   r=   hasattrr   r5   rM   zerosr(   r0   r/   r   r   sqrtreshaperA   branchkernelr   r   gammabetar   	input_dimkernel_valueistdts                rF   r   zGhostModuleV3._fuse_bn_tensor     fi([[''F!::22L **00KJJ%%E::??D**..Cfbnn5554- ,,;	${{%%y$2B2BDDTDTU ----!==// 
 t//0 eAcdLA	M43C3Cq3H$JZJZ^_J_!_`e!-^^F!..L ,,KMME;;D**CS &&(S[!!"aA.z4,"6"<<<<rG   c           
      V   | j                   ry | j                         \  }}t        j                  | j                  d   j
                  j                  | j                  d   j
                  j                  | j                  d   j
                  j                  | j                  d   j
                  j                  | j                  d   j
                  j                  | j                  d   j
                  j                  | j                  d   j
                  j                  d      | _        || j                  j                  _        || j                  j                   _        t        j"                  | j                  | j$                  | j$                  nt        j"                               | _        | j'                         \  }}t        j                  | j(                  d   j
                  j                  | j(                  d   j
                  j                  | j(                  d   j
                  j                  | j(                  d   j
                  j                  | j(                  d   j
                  j                  | j(                  d   j
                  j                  | j(                  d   j
                  j                  d      | _        || j*                  j                  _        || j*                  j                   _        t        j"                  | j*                  | j,                  | j,                  nt        j"                               | _        | j/                         D ]  }|j1                           t3        | d      r| j5                  d       t3        | d      r| j5                  d       t3        | d      r| j5                  d       t3        | d      r| j5                  d       t3        | d      r| j5                  d       t3        | d	      r| j5                  d	       d| _         y )
Nr   Tr   out_channelsr(   r+   rd   dilationr5   r1   r   r   r   r   r   r   )r   r   r:   r<   r   r   r   r   r(   r+   rd   r   r5   r>   r   datar1   r;   r   r   r   r?   r   
parametersdetach_r   __delattr__)rA   primary_kernelprimary_biascheap_kernel
cheap_biasparas         rF   switch_to_deployzGhostModuleV3.switch_to_deploy&  sP   ??'+'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_

 $(#>#>#@ j!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)*-.rG   c                 $    | j                          y Nr   rA   s    rF   reparameterizezGhostModuleV3.reparameterizea      rG   )rT   rU   rV   r:   rW   rX   r   rY   strr7   rR   r   r   r   r   r   r[   r\   s   @rF   rx   rx   y   s    
  !)+"E#E# E# 	E#
 E# E# E# BIIE# E#NX.(0(0=<9v rG   rx   c                        e Zd ZdZddej
                  ddddfdeded	ed
ededeej                     de	de
f fdZdej                  dej                  fdZ xZS )GhostBottleneckz% GhostV1/V2 bottleneck w/ optional SEr%   r           ry   Nr&   mid_chsr'   dw_kernel_sizer+   r,   se_ratiorq   c                 <   |	|
d}t         |           |d uxr |dkD  }|| _        |dk(  rt        ||fd|i|| _        nt        ||fd|i|| _        | j                  dkD  rDt        j                  |||f||dz
  dz  |dd|| _        t        j                  |fi || _
        nd | _        d | _
        |rt        |fd	|i|nd | _        t        ||fdt        j                  i|| _        ||k(  r)| j                  dk(  rt        j                         | _        y t        j                  t        j                  |||f||dz
  dz  |dd|t        j                  |fi |t        j                  ||dfdd
dd|t        j                  |fi |      | _        y )Nr.   r   ry   r,   r   r$   Fr+   rd   r5   r1   rd_ratior   r+   rd   r1   )r6   r7   r+   r#   ghost1r^   r:   r<   conv_dwr=   bn_dw	_SE_LAYERser   ghost2r;   r   )rA   r&   r   r'   r   r+   r,   r   rq   r/   r0   rB   has_serE   s                rF   r7   zGhostBottleneck.__init__h  s    /%7(R- :%fgQQbQDK'S9SPRSDK ;;?99	 ')A-	 	DL 626DJDLDJ BH)G=h="=T "'7PbkkPRP W!1MMODMMM		"	 "+A-1!	 	 v,,		&'1TQTQSTw-"-DMrG   rH   rI   c                    |}| j                  |      }| j                  "| j                  |      }| j                  |      }| j                  | j                  |      }| j	                  |      }|| j                  |      z  }|S r   )r   r   r   r   r   r   )rA   rH   r   s      rF   rR   zGhostBottleneck.forward  s|     KKN <<#QA

1A 77
A KKN	T]]8$$rG   )rT   rU   rV   __doc__r:   rW   rX   r   rY   floatr   r7   rM   rZ   rR   r[   r\   s   @rF   r   r   e  s    / #$)+ "AA A 	A
  A A BIIA A AF %,, rG   r   c                        e Zd ZdZddej
                  ddddfdeded	ed
ededeej                     de	de
f fdZdej                  dej                  fdZd Zd Zd Zd Z xZS )GhostBottleneckV3z" GhostV3 bottleneck w/ optional SEr%   r   r   ry   Nr&   r   r'   r   r+   r,   r   rq   c                    |	|
d}t         |           |d uxr |dkD  }|| _        d| _        d| _        | j                  s2t        j                         | _        t        j                         | _        t        ||f||d|| _
        | j                  dkD  ryt        j                  t        | j                        D cg c]  }t        ||||f|dz
  dz  dd d| c}      | _        t        ||ddfd	dd d|| _        || _        || _        n2t        j                         | _        t        j                         | _        d | _        |rt'        |fd
|i|nt        j                         | _        t        ||ft
        j                  dd|| _        ||k(  r)| j                  dk(  rt        j                         | _        y t        j.                  t        j0                  |||f||dz
  dz  |dd|t        j2                  |fi |t        j0                  ||dfdd	dd|t        j2                  |fi |      | _        y c c}w )Nr.   r   r%   F)r,   rq   r   r$   r|   r   r   ry   r   r   )r6   r7   r+   r   r   r:   r   r   r   rx   r   r   r   r   dw_rpr_convdw_rpr_scaler(   r   dw_rpr_skipr   r   r   r   r;   r<   r=   )rA   r&   r   r'   r   r+   r,   r   rq   r/   r0   rB   r   r   rE   s                 rF   r7   zGhostBottleneckV3.__init__  sO    /%7(R-!";;=DLDJ $FGZytZWYZ ;;?!}} T334
.  /8		/
 )1,2	/ 	/ 
. 
 D !*'7Aq q1YZfj qnp qD-D&D!}}D "D BH)G=h="=R[[] $GWcR\c`bc W!1KKMDMMM		"	 "+A-1!	 	 v,,		&'1TQTQSTw-"-DM=
.s   = IrH   rI   c                 r   |}| j                  |      }| j                  dkD  r^| j                  r#| j                  |      }| j	                  |      }n/| j                  |      }| j                  D ]  }| ||      z  } |}| j                  |      }| j                  |      }|| j                  |      z  }|S )Nr   )
r   r+   r   r   r   r   r   r   r   r   )rA   rH   r   rO   r   s        rF   rR   zGhostBottleneckV3.forward  s     KKN ;;?LLOJJqM&&q)#'#3#3 )K+a.(B) GGAJ KKN	T]]8$$rG   c                    d}d}| j                   G| j                  | j                         \  }}| j                  dz  }t        j                  |||||g      }d}d}| j
                  | j                  | j
                        \  }}d}d}t        | j                        D ]-  }| j                  | j                  |         \  }	}
||	z  }||
z  }/ ||z   |z   }||z   |z   }||fS r   )	r   r   r(   rr   r   r   r   r   r   r   s                rF   _get_kernel_bias_dwz%GhostBottleneckV3._get_kernel_bias_dw)  s   
('+';';D<M<M'N$L*""a'C55S#s/CDL'-1-A-A$BRBR-S*O]	../ 	B!11$2B2B22FGNGU7"KI	
 #\1OC+m;
Z''rG   c                    t        |t              r|j                  j                  }|j                  j
                  }|j                  j                  }|j                  j                  }|j                  j                  }|j                  j                  }n2t        |t        j                        sJ t        | d      s| j                  | j                  z  }t        j                  | j                  || j                   | j                   f|j                  j"                  |j                  j$                        }	t'        | j                        D ](  }
d|	|
|
|z  | j                   dz  | j                   dz  f<   * |	| _        | j(                  }|j
                  }|j                  }|j                  }|j                  }|j                  }||z   j+                         }||z  j-                  dddd      }||z  |||z  |z  z
  fS r   r   r   s                rF   r   z!GhostBottleneckV3._fuse_bn_tensorA  r   rG   c           
         | j                   s| j                  dk(  ry | j                         \  }}t        j                  | j
                  d   j                  j                  | j
                  d   j                  j                  | j
                  d   j                  j                  | j
                  d   j                  j                  | j
                  d   j                  j                  | j
                  d   j                  j                  | j
                  d   j                  j                  d      | _        || j                  j                  _        || j                  j                   _        t        j"                         | _        | j'                         D ]  }|j)                           t+        | d      r| j-                  d       t+        | d      r| j-                  d       t+        | d      r| j-                  d       d| _         y )Nr   r   Tr   r   r   r   )r   r+   r   r:   r<   r   r   r   r   r(   rd   r   r5   r   r   r   r1   r   r   r   r   r   r   )rA   	dw_kerneldw_biasr   s       rF   r   z"GhostBottleneckV3.switch_to_deploy_  s   ??dkkQ.!557	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']+rG   c                 $    | j                          y r   r   r   s    rF   r   z GhostBottleneckV3.reparameterize}  r   rG   )rT   rU   rV   r   r:   rW   rX   r   rY   r   r   r7   rM   rZ   rR   r   r   r   r   r[   r\   s   @rF   r   r     s    , #$)+ "II I 	I
  I I BIII I IV %,, 4(0=<< rG   r   c                   6    e Zd Z	 	 	 	 	 	 	 	 	 d!deeeeeef            dededededededef fd	Ze	j                  j                  d
efd       Ze	j                  j                  d"ded
eeef   fd       Ze	j                  j                  d#defd       Ze	j                  j                  d
ej(                  fd       Zd$ded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e	j.                  d
e	j.                  fdZd"de	j.                  ded
e	j.                  fdZde	j.                  d
e	j.                  fdZd  Z xZ S )'r   cfgsnum_classeswidthin_chansoutput_strideglobal_pool	drop_rateversionc                    t         |           |	|
d}|dk(  sJ d       || _        || _        || _        || _        d| _        g | _        |dk(  rt        nt        }t        d|z  d      }t        j                  ||dd	d
fddi|| _        | j                  j                  t        |d	d             t        j                   |fi || _        t        j$                  d      | _        |}t        j(                  g       }d}d}d	}| j                  D ]  }g }d
}|D ]t  \  }}}}}t        ||z  d      }t        ||z  d      }t        di |}|dk(  r
|d
kD  rd|d<   |dk(  r
|d
kD  rd|d<   |j                   ||||||fd|i|       |}|d
z  }v |d
kD  r/|d	z  }| j                  j                  t        ||d|              |j                  t        j*                  |        |d
z  } t        |z  d      }|j                  t        j*                  t-        ||d
fi |             |x| _        }t        j*                  | | _        || _        dx| _        }t7        |      | _        t        j                  ||d
d
dfddi|| _        t        j$                  d      | _        |rt        j>                  d
      nt        j@                         | _!        |dkD  rtE        ||fi || _#        y t        j@                         | _#        y )Nr.       z7only output_stride==32 is valid, dilation not supportedFv3   r   r%   r$   r   r1   	conv_stem)num_chs	reductionmoduleTr2   r   v2attnrq   r   r   zblocks.i   	pool_type )$r6   r7   r   r   r   r   grad_checkpointingfeature_infor   r   r   r:   r<   r  appenddictr=   r   rW   act1r   r;   r   pool_dimblocksnum_featureshead_hidden_sizer   r   	conv_headact2Flattenr   flattenr   
classifier)rA   r   r   r   r   r   r   r   r   r/   r0   rB   
Bottleneckstem_chsprev_chsstages	stage_idx	layer_idx
net_stridecfglayersskexp_sizecr   r'   r   layer_kwargsrE   s                                rF   r7   zGhostNet.__init__  s    	/"]$]]"	& ""'*1T/&
 ""u*a08Xq!QQUQbQ  h!i!YZ>>(1b1GGD)	 r"		
99 	CFA/2 
+8Q!(UA6(E)91=#zbzd?y1}+1L(d?y1}+5L(j7GQmT\m`lmn"Q	
 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rG   rI   c                     t               S r   )setr   s    rF   no_weight_decayzGhostNet.no_weight_decay  s	    urG   coarsec                 0    t        d|rdndd fdg      }|S )Nz^conv_stem|bn1z^blocks\.(\d+)z^blocks\.(\d+)\.(\d+))r  )i )stemr  )r  )rA   r)  matchers      rF   group_matcherzGhostNet.group_matcher  s,    "&,"2JDQ(
 rG   enablec                     || _         y r   )r
  )rA   r.  s     rF   set_grad_checkpointingzGhostNet.set_grad_checkpointing  s
    "(rG   c                     | j                   S r   )r  r   s    rF   get_classifierzGhostNet.get_classifier  s    rG   c                    || _         t        |      | _        |rt        j                  d      nt        j
                         | _        |dkD  r[t        | j                  || j                  j                  j                  | j                  j                  j                        | _        y t        j
                         | _        y )Nr  r   r   r.   )r   r   r   r:   r  r   r  r   r  r  r   r/   r0   r  )rA   r   r   s      rF   reset_classifierzGhostNet.reset_classifier  s    &/+F(3rzz!} 1_ !!!;>>((//t~~7L7L7R7R
 #%++- 	rG   rH   indicesnorm
stop_early
output_fmtintermediates_onlyc           	         |dv sJ d       g }dg| j                   dd D cg c]"  }t        |d   j                  d      d         $ c}z   }	t        t	        |	      |      \  }
}|
D cg c]
  }|	|   dz    }
}|	|   }d}| j                  |      }||
v r|j                  |       | j                  |      }| j                  |      }t        j                  j                         s|s| j                  }n| j                  d|dz    }t        |d	      D ]Z  \  }}| j                  r+t        j                  j                         st        ||      }n ||      }||
v sJ|j                  |       \ |r|S ||fS c c}w c c}w )
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.rm   r   Nr  .r   )start)r  rX   splitr   lenr  r  r   r  rM   jitis_scriptingr  	enumerater
  r   )rA   rH   r5  r6  r7  r8  r9  intermediatesinfo
stage_endstake_indices	max_indexr   feat_idxr  stages                   rF   forward_intermediateszGhostNet.forward_intermediates  s   * Y&D(DD&TDL]L]^_^`LabDSh!5!5c!:2!>?bb
"6s:"Pi1=>A
1a>>y)	 NN1|#  #HHQKIIaL99!!#:[[F[[)a-0F(q9 	(OHe&&uyy/E/E/G"5!,!H<'$$Q'	(   -9 c>s   'E:)E?
prune_norm
prune_headc           	         dg| j                   dd D cg c]"  }t        |d   j                  d      d         $ c}z   }t        t	        |      |      \  }}||   }| j
                  d|dz    | _        |r| j                  dd       |S c c}w )z@ Prune layers not required for specified intermediates.
        rm   r   Nr  r<  r    )r  rX   r>  r   r?  r  r4  )rA   r5  rK  rL  rD  rE  rF  rG  s           rF   prune_intermediate_layersz"GhostNet.prune_intermediate_layers$  s     TDL]L]^_^`LabDSh!5!5c!:2!>?bb
"6s:"Piy)	kk.9q=1!!!R( cs   'B
c                    | j                  |      }| j                  |      }| j                  |      }| j                  r8t        j
                  j                         st        | j                  |d      }|S | j                  |      }|S )NT)r  )	r  r   r  r
  rM   r@  rA  r   r  rA   rH   s     rF   forward_featureszGhostNet.forward_features4  so    NN1HHQKIIaL""599+A+A+Ct{{At<A  AArG   
pre_logitsc                 *   | j                  |      }| j                  |      }| j                  |      }| j                  |      }| j                  dkD  r,t        j                  || j                  | j                        }|r|S | j                  |      S )Nr   )ptraining)	r   r  r  r  r   rr   dropoutrV  r  )rA   rH   rS  s      rF   forward_headzGhostNet.forward_head>  sv    QNN1IIaLLLO>>B		!t~~FAq6DOOA$66rG   c                 J    | j                  |      }| j                  |      }|S r   )rR  rX  rQ  s     rF   rR   zGhostNet.forwardG  s'    !!!$a rG   c                     t        | d       y )NFr2   r   r   s    rF   convert_to_deployzGhostNet.convert_to_deployL  s    T51rG   )	        ?r%   r   avgg?v1NNF)T)r^  )NFFr;  F)r   FT)!rT   rU   rV   r   r
   rX   r   r   r7   rM   r@  ignorer   r(  boolr   r   r-  r0  r:   rY   r2  r4  rZ   r   r	   rJ  rO  rR  rX  rR   r[  r[   r\   s   @rF   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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 %,, 
2rG   
state_dictmodelrI   c                     d| v r| d   } i }| j                         D ]C  \  }}d|v rd|v r|j                  dd      }d|v rd|v r|j                  dd      }d|v r?|||<   E |S )Nrc  zbn.z.ghostzbn1.z.dw_rpr_total)itemsreplace)rc  rd  out_dictr"  vs        rF   checkpoint_filter_fnrk  P  s    z!-
H  " 1A:(a-		%(AA:*/		%(Aa< OrG   variantr   
pretrainedkwargsc                     g dgg dgg dgg dgg dgg dgg dg dg dg d	g d
gg dgg dg dg dg dgg	}t        d||d|}t        t        | |ft        t        d      d|S )z%
    Constructs a GhostNet model
    )r%   r   r   r   r   )r%   0      r   r$   )r%   H   rq  r   r   )ra   rr  (         ?r$   )ra   x   rs  rt  r   )r%      P   r   r$   )r%      rw  r   r   )r%      rw  r   r   )r%   i  p   rt  r   )r%     rz  rt  r   )ra   r{     rt  r$   )ra     r|  r   r   )ra   r}  r|  rt  r   )r   r   T)flatten_sequential)pretrained_filter_fnfeature_cfgr	  )r  r   r   rk  )rl  r   rm  rn  r   model_kwargss         rF   _create_ghostnetr  `  s     
			 	 								
 
  					
)D4   L
   2D1  rG   c                 2    | dddddt         t        dddd	|S )
Nr\  )r%      r  )   r  g      ?bicubicr  r  z
apache-2.0)urlr   
input_size	pool_sizecrop_pctinterpolationmeanr   
first_convr  licenser   )r  rn  s     rF   _cfgr    s3    4}SYI%.B!  rG   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                 "    t        dd| d|}|S )z GhostNet-0.5x       ?r   rm  )ghostnet_050r  rm  rn  rd  s      rF   r  r         X3:XQWXELrG   c                 "    t        dd| d|}|S )z GhostNet-1.0x r]  r  )ghostnet_100r  r  s      rF   r  r    r  rG   c                 "    t        dd| d|}|S )z GhostNet-1.3x ?r  )ghostnet_130r  r  s      rF   r  r    r  rG   c                 $    t        dd| dd|}|S )z GhostNetV2-1.0x r]  r  r   rm  r   )ghostnetv2_100r  r  s      rF   r  r    !     hSZY]haghELrG   c                 $    t        dd| dd|}|S )z GhostNetV2-1.3x r  r  r  )ghostnetv2_130r  r  s      rF   r  r    r  rG   c                 $    t        dd| dd|}|S )z GhostNetV2-1.6x 皙?r  r  )ghostnetv2_160r  r  s      rF   r  r    r  rG   c                 $    t        dd| dd|}|S )z GhostNetV3-0.5x r  r   r  )ghostnetv3_050r  r  s      rF   r  r    r  rG   c                 $    t        dd| dd|}|S )z GhostNetV3-1.0x r]  r   r  )ghostnetv3_100r  r  s      rF   r  r    r  rG   c                 $    t        dd| dd|}|S )z GhostNetV3-1.3x r  r   r  )ghostnetv3_130r  r  s      rF   r  r    r  rG   c                 $    t        dd| dd|}|S )z GhostNetV3-1.6x r  r   r  )ghostnetv3_160r  r  s      rF   r  r    r  rG   )r]  F)rN  r`  )Cr   r8   	functoolsr   typingr   r   r   r   r   r	   r
   r   rM   torch.nnr:   torch.nn.functional
functionalrr   	timm.datar   r   timm.layersr   r   r   timm.utils.modelr   _builderr   _efficientnet_blocksr   r   	_featuresr   _manipulater   	_registryr   r   __all__r   rY   r#   r^   rx   r   r   r   r   rZ   rk  r   rb  r  r  default_cfgsr  r  r  r  r  r  r  r  r  r  r	  rG   rF   <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  rG   