
    kh                     B   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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jV                        Z, G d dejV                        Z- G d dejV                        Z. G d dejV                        Z/ G d dejV                        Z0 G d dejV                        Z1dee2ejf                  f   dejV                  d ee2ejf                  f   fd!Z4d5d"e2d#e5d$e6d%ed e1f
d&Z7d6d'Z8 e( e8        e8d()       e8        e8d()       e8d()       e8d()       e8        e8d()       e8        e8       d*
      Z9e'd7d e1fd+       Z:e'd7d e1fd,       Z;e'd7d e1fd-       Z<e'd7d e1fd.       Z=e'd7d e1fd/       Z>e'd7d e1fd0       Z?e'd7d$e6d%ed e1fd1       Z@e'd7d$e6d%ed e1fd2       ZAe'd7d$e6d%ed e1fd3       ZBe'd7d$e6d%ed e1fd4       ZCy)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CallableDictListSetOptionalTupleUnionIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)SelectAdaptivePool2dLinearmake_divisible	LayerType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                  fdededededed	ed
ef fdZdej                  dej                  fdZ
 xZS )GhostModuler         in_chsout_chskernel_sizeratiodw_sizestride	act_layerc                    t         t        |           || _        t	        j
                  ||z        }||dz
  z  }	t        j                  t        j                  |||||dz  d      t        j                  |       |d            | _
        t        j                  t        j                  ||	|d|dz  |d      t        j                  |	       |d            | _        y )Nr   r%   FbiasTinplacegroupsr0   )superr$   __init__r(   mathceilnn
SequentialConv2dBatchNorm2dprimary_convcheap_operationselfr'   r(   r)   r*   r+   r,   r-   init_chsnew_chs	__class__s             P/var/www/teggl/fontify/venv/lib/python3.12/site-packages/timm/models/ghostnet.pyr6   zGhostModule.__init__$   s     	k4)+99Wu_-eai(MMIIfhV[A=MTYZNN8$d#
  "}}IIh!WaZW\]NN7#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(   )r@   rF   x1x2outs        rD   forwardzGhostModule.forward?   sR    q!!!"%iiRa(1mt||mQ)**rE   __name__
__module____qualname__r9   ReLUintr   r6   rK   TensorrP   __classcell__rC   s   @rD   r$   r$   #   s|    
  !#%77

 
 	

 
 
 
 !
6+ +%,, +rE   r$   c                        e Zd Zddddej                  fdededededed	ed
ef fdZdej                  dej                  fdZ
 xZS )GhostModuleV2r   r%   r&   r'   r(   r)   r*   r+   r,   r-   c                 <   t         
|           t        j                         | _        || _        t        j                  ||z        }||dz
  z  }	t        j                  t        j                  |||||dz  d      t        j                  |       |d            | _        t        j                  t        j                  ||	|d|dz  |d      t        j                  |	       |d            | _        t        j                  t        j                  |||||dz  d      t        j                  |      t        j                  ||ddd	|d
      t        j                  |      t        j                  ||ddd|d
      t        j                  |            | _        y )Nr   r%   Fr/   Tr1   r3   r      r   r%   r)   r,   paddingr4   r0   r^   r   r%   r   )r5   r6   r9   Sigmoidgate_fnr(   r7   r8   r:   r;   r<   r=   r>   
short_convr?   s             rD   r6   zGhostModuleV2.__init__G   sO    	zz|99Wu_-eai(MMIIfhV[A=MTYZNN8$d#

  "}}IIh!W\(Y^_NN7#d# 

 --IIfg{FK1<LSXYNN7#IIgwF1f]dkpqNN7#IIgwF1f]dkpqNN7#
rE   rF   rG   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   rI   nearestsizemode)rf   F
avg_pool2dr=   r>   rK   rL   r(   interpolatere   shape)r@   rF   resrM   rN   rO   s         rD   rP   zGhostModuleV2.forwardi   s    ooall1!AFGq!!!"%iiRa(1mt||mQ)*Q]]LLSYYr]CIIbM$B.T T 	TrE   rQ   rY   s   @rD   r[   r[   F   s    
  !#%77 
 
  
 	 

  
  
  
 ! 
DT T%,, TrE   r[   c                        e Zd Zddddej                  dfdedededed	ed
ededef fdZd Z	d Z
d Zd Zd Zd Z xZS )GhostModuleV3r   r%   r&   originalr'   r(   r)   r*   r+   r,   r-   rn   c	                    t         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'        ||	|||dz  d        c}      | _         |d      | _        t        j,                  |	      | _        t        j"                  t%        | j                        D cg c]  }t'        |	|
|d|dz  dd        c}      | _        t'        |	|
ddd	dd       | _         |d      | _        | j                  d
v rt        j6                  t        j8                  |||||dz  d      t        j,                  |      t        j8                  ||ddd|d      t        j,                  |      t        j8                  ||ddd|d      t        j,                  |            nt        j                         | _        |	| _        |	| _        || _         y c c}w c c}w )Nr   r&   Fr%   )pad_typer-   Tr1   rx   
group_sizer-   r   shortcutr/   r]   r_   r`   rb   rc   )!r5   ru   r6   r9   rd   re   r(   r7   r8   rn   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;   rf   in_channelsr4   r)   )r@   r'   r(   r)   r*   r+   r,   r-   rn   rA   rB   _rC   s               rD   r6   zGhostModuleV3.__init__s   s8    	mT+-zz|99Wu_-eai(	!" "D#%;;=D  $!% "-243I3I-JL() vxf{VWGW"$ L!

 #,D"9 nnX6 mm-243I3I-JL() x'1w!|XY"$ L

  )7Aq1YZfjk )$ 7 YY,& --IIfg{FKNQVWNN7#IIgwE!U[binoNN7#IIgwE!U[binoNN7#
 -/KKM 	 $"3LLs   I=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   rI   r{   r%   rh   ri   rj   rk   rl   )r~   r=   r>   r   r   r   r   r   r   rK   rL   rn   rf   ro   rp   r(   rq   re   rr   )r@   rF   rM   rN   r   r   rO   rs   s           rD   rP   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rE   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)   ro   padr   r   r}   r   r@   kernel_scale
bias_scaler   kernel_identitybias_identitykernel_conv	bias_convix_kernel_biaskernel_final
bias_finals                rD   _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''rE   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)   ro   r   r   r   r}   r   r   s                rD   _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''rE   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)dtypedevicer   r%   rj   
isinstancer   convweightbn1running_meanrunning_varr0   epsr9   r<   hasattrr   r4   rK   zerosr)   r   r   r   r   sqrtreshaper@   branchkernelr   r   gammabetar   	input_dimkernel_valueistdts                rD   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 <A ;< !A	M!%!1!1Q!6!%!1!1Q!6"7 8< ".^^F!..L ,,KMME;;D**CS &&(S[!!"aA.z4,"6"<<<<rE   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,   ra   dilationr4   r0   r   r   r   r   r   r   )r~   r   r9   r;   r   r   r   r   r)   r,   ra   r   r4   r=   r   datar0   r:   r   r   r   r>   r   
parametersdetach_r   __delattr__)r@   primary_kernelprimary_biascheap_kernel
cheap_biasparas         rD   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)*-.rE   c                 $    | j                          y Nr   r@   s    rD   reparameterizezGhostModuleV3.reparameterizeJ      rE   )rR   rS   rT   r9   rU   rV   r   strr6   rP   r   r   r   r   r   rX   rY   s   @rD   ru   ru   r   s    
  !#%77"3#3# 3# 	3#
 3# 3# 3# !3# 3#jX.(0(0=@9v rE   ru   c                        e Zd ZdZddej
                  ddfdededed	ed
ede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           rv   r'   mid_chsr(   dw_kernel_sizer,   r-   se_ratiorn   c	                 &   t         t        |           |d uxr |dkD  }	|| _        |dk(  rt	        |||      | _        nt        |||      | _        | j                  dkD  rBt        j                  |||||dz
  dz  |d      | _	        t        j                  |      | _        nd | _	        d | _        |	rt        ||      nd | _        t	        ||t        j                        | _        ||k(  r)| j                  dk(  rt        j                          | _        y t        j                   t        j                  |||||dz
  dz  |d      t        j                  |      t        j                  ||ddd	d
      t        j                  |            | _        y )Nr   rv   )r-   r   r%   Fr,   ra   r4   r0   rd_ratior   r,   ra   r0   )r5   r   r6   r,   r$   ghost1r[   r9   r;   conv_dwr<   bn_dw	_SE_LAYERser   ghost2r:   r|   )r@   r'   r   r(   r   r,   r-   r   rn   has_serC   s             rD   r6   zGhostBottleneck.__init__Q  sb    	ot-/%7(R- :%fgKDK'9MDK ;;?99.')A-gEKDL 0DJDLDJ <B)Gh7t "'7bkkJ W!1MMODMMM		FN6+A-1&uN v&		&'1QNw'DMrE   rF   rG   c                    |}| j                  |      }| j                  "| j                  |      }| j                  |      }| j                  | j                  |      }| j	                  |      }|| j                  |      z  }|S r   )r   r   r   r   r   r|   )r@   rF   r|   s      rD   rP   zGhostBottleneck.forward  s|     KKN <<#QA

1A 77
A KKN	T]]8$$rE   )rR   rS   rT   __doc__r9   rU   rV   r   floatr   r6   rK   rW   rP   rX   rY   s   @rD   r   r   N  s    / #$"$'' "00 0 	0
  0 0  0 0 0d %,, rE   r   c                        e Zd ZdZddej
                  ddfdededed	ed
ede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   rv   r'   r   r(   r   r,   r-   r   rn   c	                 ~   t         t        |           |d uxr |dkD  }	|| _        d| _        d| _        | j
                  s2t        j                         | _        t        j                         | _	        t        ||||      | _        | j                  dkD  rwt        j                  t        | j                        D 
cg c]  }
t        |||||dz
  dz  dd        c}
      | _        t        ||ddddd       | _        || _        || _        n2t        j                         | _        t        j                         | _        d | _        |	rt)        ||	      nt        j                         | _        t        ||t        j                  d
      | _        ||k(  r)| j                  dk(  rt        j                         | _        y t        j0                  t        j2                  |||||dz
  dz  |d      t        j4                  |      t        j2                  ||dddd      t        j4                  |            | _        y c c}
w )Nr   r&   F)r-   rn   r   r%   ry   r   r   rv   r   r   )r5   r   r6   r,   r}   r~   r9   r   r   r   ru   r   r   r   r   dw_rpr_convdw_rpr_scaler)   r   dw_rpr_skipr   r   r   r|   r:   r;   r<   )r@   r'   r   r(   r   r,   r-   r   rn   r   r   rC   s              rD   r6   zGhostBottleneckV3.__init__  s    	/1%7(R-!";;=DLDJ $FGytT ;;?!}}?DTE[E[?\^:; 7G^V~`aOafgNg#$6 ^ D
 !*'7Aq1YZfj kD-D&D!}}D "D <B)Gh7r{{} $GWR\] W!1KKMDMMM		FN6+A-1&uN v&		&'1QNw'DM-^s   ;H:rF   rG   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|   )r@   rF   r|   rM   r   s        rD   rP   zGhostBottleneckV3.forward  s     KKN ;;?LLOJJqM&&q)#'#3#3 )K+a.(B) GGAJ KKN	T]]8$$rE   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)   ro   r   r   r   r}   r   r   s                rD   _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''rE   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                rD   r   z!GhostBottleneckV3._fuse_bn_tensor  r   rE   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   r9   r;   r   r   r   r   r)   ra   r   r4   r   r   r   r0   r   r   r   r   r   r   )r@   	dw_kerneldw_biasr   s       rD   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']+rE   c                 $    | j                          y r   r   r   s    rD   r   z GhostBottleneckV3.reparameterizeF  r   rE   )rR   rS   rT   r   r9   rU   rV   r   r   r   r6   rK   rW   rP   r   r   r   r   rX   rY   s   @rD   r   r     s    , #$#%77 "88 8 	8
  8 8 !8 8 8t %,, 4(0=@< rE   r   c                       e Zd Z	 	 	 	 	 	 	 d 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   num_classeswidthin_chansoutput_strideglobal_pool	drop_rateversionc	                    t         t        |           |dk(  sJ d       || _        || _        || _        d| _        g | _        |dk(  rt        nt        }	t        d|z  d      }
t        j                  ||
ddd	d
      | _        | j                  j                  t        |
dd             t        j                   |
      | _        t        j$                  d      | _        |
}t        j(                  g       }d}d}d}| j                  D ]  }g }d	}|D ]k  \  }}}}}t        ||z  d      }t        ||z  d      }i }|dk(  r
|d	kD  rd|d<   |dk(  r
|d	kD  rd|d<   |j                   |	|||||fd|i|       |}|d	z  }m |d	kD  r/|dz  }| j                  j                  t        ||d|              |j                  t        j*                  |        |d	z  } t        |z  d      }|j                  t        j*                  t-        ||d	                   |x| _        }t        j*                  | | _        || _        dx| _        }t7        |      | _        t        j                  ||d	d	dd
      | _        t        j$                  d      | _        |rt        j>                  d	      nt        j@                         | _!        |dkD  rtE        ||      | _#        y t        j@                         | _#        y )N    z7only output_stride==32 is valid, dilation not supportedFv3   r   r&   r%   r   r/   	conv_stem)num_chs	reductionmoduleTr1   r   v2attnrn   r|   r   zblocks.i   	pool_type)$r5   r   r6   cfgsr   r   grad_checkpointingfeature_infor   r   r   r9   r;   r   appenddictr<   r   rU   act1r   r:   r   pool_dimblocksnum_featureshead_hidden_sizer   r   	conv_headact2Flattenr   flattenr   
classifier)r@   r  r   r   r   r   r   r   r   
Bottleneckstem_chsprev_chsstages	stage_idx	layer_idx
net_stridecfglayersskexp_sizecr   r(   r   layer_kwargsrC   s                             rD   r6   zGhostNet.__init__K  s    	h&("]$]]"	&""'*1T/&
 ""u*a08Xq!QUK  h!i!YZ>>(+GGD)	 r"		
99 	CFA/2 
+8Q!(UA6(E)91=!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$CDE#**mmV, %*../+F8WaADIGGD)	(3rzz!}:E/&+6r{{}rE   rG   c                     t               S r   )setr   s    rD   no_weight_decayzGhostNet.no_weight_decay  s	    urE   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  )r@   r(  matchers      rD   group_matcherzGhostNet.group_matcher  s,    "&,"2JDQ(
 rE   enablec                     || _         y r   )r	  )r@   r-  s     rD   set_grad_checkpointingzGhostNet.set_grad_checkpointing  s
    "(rE   c                     | j                   S r   )r  r   s    rD   get_classifierzGhostNet.get_classifier  s    rE   c                    || _         t        |      | _        |rt        j                  d      nt        j
                         | _        |dkD  rt        | j                  |      | _	        y t        j
                         | _	        y )Nr  r   r   )
r   r   r   r9   r  r   r  r   r  r  )r@   r   r   s      rD   reset_classifierzGhostNet.reset_classifier  s[    &/+F(3rzz!}HSVW&!6!6D]_]h]h]jrE   rF   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.rj   r   Nr  .r   )start)r
  rV   splitr   lenr   r  r   r  rK   jitis_scriptingr  	enumerater	  r   )r@   rF   r4  r5  r6  r7  r8  intermediatesinfo
stage_endstake_indices	max_indexr   feat_idxr  stages                   rD   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.
        rj   r   Nr  r;  r    )r
  rV   r=  r   r>  r  r3  )r@   r4  rJ  rK  rC  rD  rE  rF  s           rD   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	  rK   r?  r@  r   r  r@   rF   s     rD   forward_featureszGhostNet.forward_features  so    NN1HHQKIIaL""599+A+A+Ct{{At<A  AArE   
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   ro   dropoutrU  r  )r@   rF   rR  s      rD   forward_headzGhostNet.forward_head   sv    QNN1IIaLLLO>>B		!t~~FAq6DOOA$66rE   c                 J    | j                  |      }| j                  |      }|S r   )rQ  rW  rP  s     rD   rP   zGhostNet.forward	  s'    !!!$a rE   c                     t        | d       y )NFr1   r   r   s    rD   convert_to_deployzGhostNet.convert_to_deploy  s    T51rE   )        ?r&   r   avgg?v1F)T)r]  )NFFr:  F)r   FT)!rR   rS   rT   rV   r   r   r6   rK   r?  ignorer   r'  boolr   r   r,  r/  r9   Moduler1  r3  rW   r	   r   r   r
   rI  rN  rQ  rW  rP   rZ  rX   rY   s   @rD   r   r   J  sd     $!#$"D] D] 	D]
 D] D] D] D] D]P YY   YYD T#s(^   YY)T ) ) YY		  kC kc k 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 %,, 
2rE   
state_dictmodelrG   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        rD   checkpoint_filter_fnrk    s    z!-
H  " 1A:(a-		%(AA:*/		%(Aa< OrE   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   )r^   rr  (         ?r%   )r^   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   )r^   r{     rt  r%   )r^     r|  r   r   )r^   r}  r|  rt  r   )r  r   T)flatten_sequential)pretrained_filter_fnfeature_cfg )r  r   r   rk  )rl  r   rm  rn  r  model_kwargss         rD   _create_ghostnetr  "  s     
			 	 								
 
  					
)D4   L
   2D1  rE   c                 0    | dddddt         t        ddd
|S )	Nr[  )r&      r  )   r  g      ?bicubicr   r  )
urlr   
input_size	pool_sizecrop_pctinterpolationmeanr   
first_convr  r   )r  rn  s     rD   _cfgr  O  s0    4}SYI%.B!	
  rE   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      rD   r  r  v       X3:XQWXELrE   c                 "    t        dd| d|}|S )z GhostNet-1.0x r\  r  )ghostnet_100r  r  s      rD   r  r  }  r  rE   c                 "    t        dd| d|}|S )z GhostNet-1.3x ?r  )ghostnet_130r  r  s      rD   r  r    r  rE   c                 $    t        dd| dd|}|S )z GhostNetV2-1.0x r\  r  r   rm  r   )ghostnetv2_100r  r  s      rD   r  r    !     hSZY]haghELrE   c                 $    t        dd| dd|}|S )z GhostNetV2-1.3x r  r  r  )ghostnetv2_130r  r  s      rD   r  r    r  rE   c                 $    t        dd| dd|}|S )z GhostNetV2-1.6x 皙?r  r  )ghostnetv2_160r  r  s      rD   r  r    r  rE   c                 $    t        dd| dd|}|S )z GhostNetV3-0.5x r  r   r  )ghostnetv3_050r  r  s      rD   r  r    r  rE   c                 $    t        dd| dd|}|S )z GhostNetV3-1.0x r\  r   r  )ghostnetv3_100r  r  s      rD   r  r    r  rE   c                 $    t        dd| dd|}|S )z GhostNetV3-1.3x r  r   r  )ghostnetv3_130r  r  s      rD   r  r    r  rE   c                 $    t        dd| dd|}|S )z GhostNetV3-1.6x r  r   r  )ghostnetv3_160r  r  s      rD   r  r    r  rE   )r\  F)rM  r_  )Dr   r7   	functoolsr   typingr   r   r   r   r   r	   r
   r   rK   torch.nnr9   torch.nn.functional
functionalro   	timm.datar   r   timm.layersr   r   r   r   timm.utils.modelr   _builderr   _efficientnet_blocksr   r   	_featuresr   _manipulater   	_registryr   r   __all__r   rb  r$   r[   ru   r   r   r   r   rW   rk  r   ra  r  r  default_cfgsr  r  r  r  r  r  r  r  r  r  r  rE   rD   <module>r     s  
   I I I     A O O 1 * : + ' <, Mn'R`jkJlm	 +"))  +F)TBII )TXY BII Y xHbii HVn 		 n bE2ryy E2P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  rE   