
    RЦi P                        S r SSKrSSKJr  SSK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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\RJ                  5      r& " S S\RJ                  5      r' " S S\RJ                  5      r(S'S\
R                  RJ                  4S jjr)S(S jr*S)S jr+\"" \+" SS9\+" SS9\+" SS9\+" SS9\+" SS9\+" SS9\+" SS9\+" SS9S.5      r,\!S*S\(4S jj5       r-\!S*S\(4S  jj5       r.\!S*S\(4S! jj5       r/\!S*S\(4S" jj5       r0\!S*S\(4S# jj5       r1\!S*S\(4S$ jj5       r2\!S*S\(4S% jj5       r3\!S*S\(4S& jj5       r4g)+z
An implementation of RepGhostNet Model as defined in:
RepGhost: A Hardware-Efficient Ghost Module via Re-parameterization. https://arxiv.org/abs/2211.06088

Original implementation: https://github.com/ChengpengChen/RepGhost
    N)partial)ListOptionalTupleUnionTypeIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)SelectAdaptivePool2dLinearmake_divisible   )build_model_with_cfg)SqueezeExcite	ConvBnAct)feature_take_indices)checkpoint_seq)register_modelgenerate_default_cfgsRepGhostNethard_sigmoid   )divisor)
gate_layerrd_round_fnc                      ^  \ rS rSr       SS\S\S\S\S\S\S\4U 4S	 jjjrS
 rS r\	S 5       r
\	SS j5       rS rS rSrU =r$ )RepGhostModule   in_chsout_chskernel_sizedw_sizestriderelureparamc
           
      T  > XS.n
[         TU ]  5         X l        UnUn[        R                  " [        R
                  " XX5US-  4SS0U
D6[        R                  " U40 U
D6U(       a  [        R                  " SS9O[        R                  " 5       5      U l	        / n/ nU(       aJ  UR                  [        R                  " 5       5        UR                  [        R                  " U40 U
D65        [        R                  " U6 U l        [        R                  " U6 U l        [        R                  " [        R
                  " XUSUS-  4USS.U
D6[        R                  " U40 U
D65      U l        U(       a  [        R                  " SS9U l        g [        R                  " 5       U l        g )	Ndevicedtype   biasFTinplacer   )groupsr,   )super__init__r!   nn
SequentialConv2dBatchNorm2dReLUIdentityprimary_convappendfusion_conv	fusion_bncheap_operationr%   )selfr    r!   r"   r#   r$   r%   r&   r)   r*   ddinit_chsnew_chsr:   r;   	__class__s                  S/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/timm/models/repghost.pyr1   RepGhostModule.__init__   sF    /MMIIf[A=M`TY`]_`NN8*r*%)BGGD!r{{}
 	r{{}-R^^H;;<==+6	2!}}IIh!WaZcW\c`bcNN7)b) 

 /3BGGE*		    c                     U R                  U5      nU R                  U5      n[        U R                  U R                  5       H  u  pEX5" U" U5      5      -   nM     U R                  U5      $ N)r8   r<   zipr:   r;   r%   )r=   xx1x2convbns         rB   forwardRepGhostModule.forwardF   s_    q!!!"%D,,dnn=HDbbl"B >yy}rD   c                 <   U R                  U R                  S   U R                  S   5      u  p[        U R                  U R                  5       HH  u  p4U R                  X4UR
                  S   UR                  5      u  pVXR                  U5      -  nX&-  nMJ     X4$ )Nr   r   )_fuse_bn_tensorr<   rG   r:   r;   shaper)   _pad_1x1_to_3x3_tensor)r=   	kernel3x3bias3x3rK   rL   kernelr,   s          rB   get_equivalent_kernel_bias)RepGhostModule.get_equivalent_kernel_biasM   s    !11$2F2Fq2I4K_K_`aKbc	D,,dnn=HD//)//!:LiN^N^_LF44V<<IOG > !!rD   c                 b    U c  g[         R                  R                  R                  U / SQ5      $ )Nr   )r   r   r   r   )torchr2   
functionalpad)	kernel1x1s    rB   rR   %RepGhostModule._pad_1x1_to_3x3_tensorU   s(    88&&**9lCCrD   c                 2   U(       a  UOUR                   R                  S   nU(       a  UOUR                  R                  n[	        U [
        R                  5      (       a  U R                  nU R                  b   eO9[	        U [
        R                  5      (       d   e[        R                  " USSSUS9n[	        U[
        R                  5      (       ar  UR                   nUR                  nUR                  nUR                  nUR                  n	Xi-   R                  5       n
Xz-  R                  SSSS5      nXK-  XU-  U
-  -
  4$ [	        U[
        R                  5      (       d   eU[        R                   " U5      R#                  UR                  5      4$ )Nr   r   )r)   )running_meanrQ   weightr)   
isinstancer2   r4   r,   r7   rY   onesr5   running_varepssqrtreshapezerosto)rK   rL   in_channelsr)   rU   r`   rd   gammabetare   stdts               rB   rP   RepGhostModule._fuse_bn_tensor\   s?   %0kboo6K6KA6N!ryy'7'7dBII&&[[F99$$$dBKK0000ZZQ1VDFb"..))??L..KIIE77D&&C$**,C%%b!Q2A:tU&:S&@@@@"bkk****u{{;/226==AAArD   c                    [        U R                  5      S:X  a  [        U R                  5      S:X  a  g U R                  5       u  pUR                  UR
                  S.n[        R                  " SU R                  S   R                  U R                  S   R                  U R                  S   R                  U R                  S   R                  U R                  S   R                  U R                  S   R                  SS.UD6U l        XR                  R                  l        X R                  R"                  l        U R%                  S5        U R%                  S5        / U l        / U l        g )Nr   r(   T)rj   out_channelsr"   paddingdilationr/   r,   r:   r;    )lenr:   r;   rV   r)   r*   r2   r4   r<   rj   rq   r"   rr   rs   r/   ra   datar,   __delattr__)r=   rU   r,   r>   s       rB   switch_to_deployRepGhostModule.switch_to_deploys   s6   t A%#dnn*=*B668=!yy  ,,Q/;;--a0==,,Q/;;((+33))!,55''*11    ,2##()-!!&'%rD   c                 $    U R                  5         g rF   )rx   r=   s    rB   reparameterizeRepGhostModule.reparameterize   s    rD   )r<   r;   r:   r!   r8   r%   )r      r   TTNN)NN)__name__
__module____qualname____firstlineno__intboolr1   rM   rV   staticmethodrR   rP   rx   r|   __static_attributes____classcell__rA   s   @rB   r   r      s    
  ! &F&F &F 	&F
 &F &F &F &F &FP" D D B B,*   rD   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U =r$ )RepGhostBottleneck   z"RepGhost bottleneck w/ optional SEr~   r           TNr    mid_chsr!   dw_kernel_sizer$   	act_layerse_ratior&   c                   > XS.n[         TU ]  5         US L=(       a    US:  nXPl        [        X4SUS.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US.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   T)r%   r&   r   r+   F)r$   rr   r/   r,   rd_ratior   )r$   rr   r,   )r0   r1   r$   r   ghost1r2   r4   conv_dwr5   bn_dw	_SE_LAYERseghost2r3   shortcut)r=   r    r   r!   r   r$   r   r   r&   r)   r*   r>   has_serA   s                rB   r1   RepGhostBottleneck.__init__   s    /%7(R- %VW4WTVW ;;?99	 ')A-	 	DL 626DJDLDJ BH)G=h="=T %WYE7YVXY !1MMODMMM		"	 "+A-1!	 	 v,,		&1TQTQSTw-"-DMrD   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$ rF   )r   r   r   r   r   r   )r=   rH   r   s      rB   rM   RepGhostBottleneck.forward   sz     KKN <<#QA

1A 77
A KKN	]]8$$rD   )r   r   r   r   r   r   r$   )r   r   r   r   __doc__r2   r6   r   r   Modulefloatr   r1   rM   r   r   r   s   @rB   r   r      s    - #$)+  >> > 	>
  > > BII> > > >@ rD   r   c                   d  ^  \ rS rSr         S S\\\      S\S\S\S\S\S\S	\4U 4S
 jjjr	\
R                  R                  S!S j5       r\
R                  R                  S"S j5       r\
R                  R                  S\R                   4S j5       rS#S\S\\   4S jjr     S$S\
R(                  S\\\\\   4      S\S\S\S\S\\\
R(                     \\
R(                  \\
R(                     4   4   4S jjr   S%S\\\\   4   S\S\4S jjrS rS!S\4S jjrS rS rSrU =r$ )&r      cfgsnum_classeswidthin_chansoutput_strideglobal_pool	drop_rater&   c                   > [         TU ]  5         XS.nUS:X  d   S5       eXl        X l        X@l        Xpl        SU l        / U l        [        SU-  S5      n[        R                  " XLS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[&        nSnSnU R                   H  n/ nS	nU HH  u  nnnnn[        UU-  S5      n[        UU-  S5      nUR                  U" UUUUU4UUS.UD65        UnMJ     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-  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[5        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  [C        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   r   r~   r+   r   r,   	conv_stem)num_chs	reductionmoduleTr-   r   )r   r&   zblocks.i   	pool_type)#r0   r1   r   r   r   r   grad_checkpointingfeature_infor   r2   r4   r   r9   dictr5   bn1r6   act1
ModuleListr   r3   r   pool_dimblocksnum_featureshead_hidden_sizer   r   	conv_headact2Flattenr7   flattenr   
classifier)r=   r   r   r   r   r   r   r   r&   r)   r*   r>   stem_chsprev_chsstagesblock	stage_idx
net_stridecfglayersskexp_sizecr   r!   r   rA   s                              rB   r1   RepGhostNet.__init__   s    	/"]$]]"	& ""' ""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=eHgw1oxaholnop"	 03
 1ua
!!(($
WYKCX*Z [MM"--01NI  !E!1A!5q9bmmIh$Ib$IJK#**mmV, %*../+F8WaAODOBOGGD)	(3rzz!}@Ka&+<<UWU`U`UbrD   c                 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   )r=   coarsematchers      rB   group_matcherRepGhostNet.group_matcher)  s,    "&,"2JDQ(
 rD   c                     Xl         g rF   )r   )r=   enables     rB   set_grad_checkpointing"RepGhostNet.set_grad_checkpointing4  s    "(rD   returnc                     U R                   $ rF   )r   r{   s    rB   get_classifierRepGhostNet.get_classifier8  s    rD   c                    Xl         UbE  [        US9U l        U(       a  [        R                  " S5      O[        R
                  " 5       U l        US:  a  [        U R                  S5      (       a   U R                  R                  R                  OS n[        U R                  S5      (       a   U R                  R                  R                  OS nX4S.n[        U R                  U40 UD6U l        g [        R
                  " 5       U l        g )Nr   r   r   ra   r(   )r   r   r   r2   r   r7   r   hasattrr   ra   r)   r*   r   r   )r=   r   r   r)   r*   r>   s         rB   reset_classifierRepGhostNet.reset_classifier<  s    &"3kJD,72::a=R[[]DL?6=doox6X6XT__++22^bF4;DOOX4V4VDOO**00\`E"3B$T%:%:KN2NDO kkmDOrD   rH   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.r_   r   Nr   .r   )start)r   r   splitr   ru   r   r9   r   r   rY   jitis_scriptingr   	enumerater   r   )r=   rH   r   r   r   r   r   intermediatesinfo
stage_endstake_indices	max_indexifeat_idxr   stages                   rB   forward_intermediates!RepGhostNet.forward_intermediatesJ  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.
        r_   r   Nr   r   r    )r   r   r   r   ru   r   r   )r=   r   r   r   r   r   r   r   s           rB   prune_intermediate_layers%RepGhostNet.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   rY   r   r   r   r   r=   rH   s     rB   forward_featuresRepGhostNet.forward_features  sr    NN1HHQKIIaL""599+A+A+C+Ct{{At<A  AArD   
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   Fdropoutr  r   )r=   rH   r  s      rB   forward_headRepGhostNet.forward_head  st    QNN1IIaLLLO>>B		!~~FAq6DOOA$66rD   c                 J    U R                  U5      nU R                  U5      nU$ rF   )r   r  r   s     rB   rM   RepGhostNet.forward  s'    !!!$a rD   c                     [        U SS9  g )NF)do_copy)repghost_model_convertr{   s    rB   convert_to_deployRepGhostNet.convert_to_deploy  s    tU3rD   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )	        ?r~   r   avgg?TNNF)TrF   )NFFr   F)r   FT)r   r   r   r   r   r   r   strr   r1   rY   r   ignorer   r   r2   r   r   r   r   Tensorr   r   r   r   r   r  rM   r  r   r   r   s   @rB   r   r      s     $!#$" ActDz"Ac Ac 	Ac
 Ac Ac Ac Ac Ac AcF YY  YY) ) YY		  ,C ,hsm ," 8<$$',3 ||3  eCcN343  	3 
 3  3  !%3  
tELL!5tELL7I)I#JJ	K3 n ./$#	3S	>*  	 7$ 7
4 4rD   modelc                    U(       a  [         R                  " U 5      n U R                  5        H&  n[        US5      (       d  M  UR	                  5         M(     Ub%  [
        R                  " U R                  5       U5        U $ )zI
taken from from https://github.com/DingXiaoH/RepVGG/blob/main/repvgg.py
rx   )copydeepcopymodulesr   rx   rY   save
state_dict)r  	save_pathr  r   s       rB   r  r    sc     e$--/6-..##% " 

5##%y1LrD   c                     / 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S90UD6$ )z 
Constructs a RepGhostNet model
)r~      r   r   r   )r~      r"  r   r+   )r~   $   r"  r   r   )   r#  (         ?r+   )r$  <   r%  r&  r   )r~   x   P   r   r+   )r~   d   r)  r   r   )r~   r(  r)  r   r   )r~      p   r&  r   )r~   P  r,  r&  r   )r$  r-     r&  r+   )r$    r.  r   r   )r$  r/  r.  r&  r   )r   r   feature_cfgT)flatten_sequentialrt   )r   r   r   )variantr   
pretrainedkwargsr   model_kwargss         rB   _create_repghostnetr6    s     
			 									
 
  					
)D4   L
   D1	
  rD   c                 2    U SSSSS[         [        SSSS	.UE$ )
Nr  )r~      r8  )   r9  g      ?bicubicr   r   mit)urlr   
input_size	pool_sizecrop_pctinterpolationmeanrm   
first_convr   licenser	   )r<  r4  s     rB   _cfgrD    s3    4}SYI%.B!  rD   ztimm/)	hf_hub_id)zrepghostnet_050.in1kzrepghostnet_058.in1kzrepghostnet_080.in1kzrepghostnet_100.in1kzrepghostnet_111.in1kzrepghostnet_130.in1kzrepghostnet_150.in1kzrepghostnet_200.in1kr   c                 "    [        SSU S.UD6nU$ )zRepGhostNet-0.5x g      ?r   r3  )repghostnet_050r6  r3  r4  r  s      rB   rH  rH          ^^W]^ELrD   c                 "    [        SSU S.UD6nU$ )zRepGhostNet-0.58x g(\?rG  )repghostnet_058rI  rJ  s      rB   rM  rM          _*_X^_ELrD   c                 "    [        SSU S.UD6nU$ )zRepGhostNet-0.8x g?rG  )repghostnet_080rI  rJ  s      rB   rP  rP  "  rK  rD   c                 "    [        SSU S.UD6nU$ )zRepGhostNet-1.0x r  rG  )repghostnet_100rI  rJ  s      rB   rR  rR  )  rK  rD   c                 "    [        SSU S.UD6nU$ )zRepGhostNet-1.11x g(\?rG  )repghostnet_111rI  rJ  s      rB   rT  rT  0  rN  rD   c                 "    [        SSU S.UD6nU$ )zRepGhostNet-1.3x g?rG  )repghostnet_130rI  rJ  s      rB   rV  rV  6  rK  rD   c                 "    [        SSU S.UD6nU$ )zRepGhostNet-1.5x g      ?rG  )repghostnet_150rI  rJ  s      rB   rX  rX  =  rK  rD   c                 "    [        SSU S.UD6nU$ )zRepGhostNet-2.0x g       @rG  )repghostnet_200rI  rJ  s      rB   rZ  rZ  D  rK  rD   )NT)r  F)r   r  )5r   r  	functoolsr   typingr   r   r   r   r   rY   torch.nnr2   torch.nn.functionalrZ   r  	timm.datar
   r   timm.layersr   r   r   _builderr   _efficientnet_blocksr   r   	_featuresr   _manipulater   	_registryr   r   __all__r   r   r   r   r   r  r6  rD  default_cfgsrH  rM  rP  rR  rT  rV  rX  rZ  rt   rD   rB   <module>rh     s     5 5     A D D * : + ' </ Mn'R`jkJlm	l RYY l ^V VrC4")) C4L%((// )X %  ! ! ! ! ! ! !;!& !H ;   ;   ;   ;   ;  
 ;   ;   ;  rD   