
    ^j P                        d Z ddlZddlmZ ddl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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jJ                        Z& G d dejJ                        Z' G d dejJ                        Z(d'de
j                  jJ                  fdZ)d(dZ*d)dZ+ e" e+d       e+d       e+d       e+d       e+d       e+d       e+d       e+d      d      Z,e!d*de(fd       Z-e!d*de(fd        Z.e!d*de(fd!       Z/e!d*de(fd"       Z0e!d*de(fd#       Z1e!d*de(fd$       Z2e!d*de(fd%       Z3e!d*de(fd&       Z4y)+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                        e Zd Z	 	 	 	 	 	 	 ddededededededef fdZd	 Zd
 Zed        Z	edd       Z
d Zd Z xZS )RepGhostModulein_chsout_chskernel_sizedw_sizestriderelureparamc
           
      0   ||	d}
t         |           || _        |}|}t        j                  t        j
                  |||||dz  fddi|
t        j                  |fi |
|rt        j                  d      nt        j                               | _	        g }g }|rH|j                  t        j                                |j                  t        j                  |fi |
       t        j                  | | _        t        j                  | | _        t        j                  t        j
                  |||d|dz  f|dd|
t        j                  |fi |
      | _        |rt        j                  d      | _        y t        j                         | _        y )	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_chsr9   r:   	__class__s                  _/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/models/repghost.pyr0   zRepGhostModule.__init__   sP    /MMIIfhV[A=M`TY`]_`NN8*r*%)BGGD!r{{}
 	r{{}-R^^H;;<==+6	2!}}IIh!WaZcW\c`bcNN7)b) 

 /3BGGE*		    c                     | j                  |      }| j                  |      }t        | j                  | j                        D ]  \  }}| | ||            z   } | j                  |      S N)r7   r;   zipr9   r:   r$   )r<   xx1x2convbns         rA   forwardzRepGhostModule.forwardF   sf    q!!!"%D,,dnn= 	#HD"bbl"B	#yy}rB   c                 F   | j                  | j                  d   | j                  d         \  }}t        | j                  | j                        D ]L  \  }}| j                  |||j
                  d   |j                        \  }}|| j                  |      z  }||z  }N ||fS )Nr   r   )_fuse_bn_tensorr;   rE   r9   r:   shaper(   _pad_1x1_to_3x3_tensor)r<   	kernel3x3bias3x3rI   rJ   kernelr+   s          rA   get_equivalent_kernel_biasz)RepGhostModule.get_equivalent_kernel_biasM   s    !11$2F2Fq2I4K_K_`aKbc	7D,,dnn= 	HD"//b)//!:LiN^N^_LFD44V<<ItOG	 '!!rB   c                 `    | yt         j                  j                  j                  | g d      S )Nr   )r   r   r   r   )torchr1   
functionalpad)	kernel1x1s    rA   rO   z%RepGhostModule._pad_1x1_to_3x3_tensorU   s(    88&&**9lCCrB   c                    |r|n|j                   j                  d   }|r|n|j                  j                  }t	        | t
        j                        r| j                  }| j                  8J t	        | t
        j                        sJ t        j                  |ddd|      }t	        |t
        j                        rv|j                   }|j                  }|j                  }|j                  }|j                  }	||	z   j                         }
||
z  j                  dddd      }||z  |||z  |
z  z
  fS t	        |t
        j                        sJ |t        j                   |      j#                  |j                        fS )Nr   r   )r(   )running_meanrN   weightr(   
isinstancer1   r3   r+   r6   rU   onesr4   running_varepssqrtreshapezerosto)rI   rJ   in_channelsr(   rR   r[   r_   gammabetar`   stdts               rA   rM   zRepGhostModule._fuse_bn_tensor\   s;   %0kboo6K6KA6N!ryy'7'7dBII&[[F99$$$dBKK000ZZQ1VDFb"..)??L..KIIE77D&&C$**,C%%b!Q2AA:tlU&:S&@@@@"bkk***u{{;/226==AAArB   c                    t        | j                        dk(  rt        | j                        dk(  ry | j                         \  }}|j                  |j
                  d}t        j                  d| j                  d   j                  | j                  d   j                  | j                  d   j                  | j                  d   j                  | j                  d   j                  | j                  d   j                  dd|| _        || j                  j                  _        || j                  j"                  _        | j%                  d       | j%                  d       g | _        g | _        y )Nr   r'   T)re   out_channelsr!   paddingdilationr.   r+   r9   r:    )lenr9   r:   rS   r(   r)   r1   r3   r;   re   rk   r!   rl   rm   r.   r\   datar+   __delattr__)r<   rR   r+   r=   s       rA   switch_to_deployzRepGhostModule.switch_to_deploys   s<   t A%#dnn*=*B668=!yy  ,,Q/;;--a0==,,Q/;;((+33))!,55''*11    ,2##()-!!&'%rB   c                 $    | j                          y rD   )rr   r<   s    rA   reparameterizezRepGhostModule.reparameterize   s    rB   )r      r   TTNN)NN)__name__
__module____qualname__intboolr0   rK   rS   staticmethodrO   rM   rr   ru   __classcell__r@   s   @rA   r   r      s    
  ! &F&F &F 	&F
 &F &F &F &FP" D D B B,* rB   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 Z xZS )RepGhostBottleneckz# RepGhost bottleneck w/ optional SErv   r           TNr   mid_chsr    dw_kernel_sizer#   	act_layerse_ratior%   c                    |	|
d}t         |           |d uxr |dkD  }|| _        t        ||fd|d|| _        | 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|d|| _        ||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   T)r$   r%   r   r*   F)r#   rl   r.   r+   rd_ratior   )r#   rl   r+   )r/   r0   r#   r   ghost1r1   r3   conv_dwr4   bn_dw	_SE_LAYERseghost2r2   shortcut)r<   r   r   r    r   r#   r   r   r%   r(   r)   r=   has_ser@   s                rA   r0   zRepGhostBottleneck.__init__   s    /%7(R- %VWW4WTVW ;;?99	 ')A-	 	DL 626DJDLDJ BH)G=h="=T %WgYE7YVXY W!1MMODMMM		"	 "+A-1!	 	 v,,		&'1TQTQSTw-"-DMrB   c                    |}| j                  |      }| j                  "| j                  |      }| j                  |      }| j                  | j                  |      }| j	                  |      }|| j                  |      z  }|S rD   )r   r   r   r   r   r   )r<   rF   r   s      rA   rK   zRepGhostBottleneck.forward   s|     KKN <<#QA

1A 77
A KKN	T]]8$$rB   )rw   rx   ry   __doc__r1   r5   rz   r   Modulefloatr{   r0   rK   r}   r~   s   @rA   r   r      s    - #$)+  >> > 	>
  > > BII> > >@rB   r   c                   @    e Zd Z	 	 	 	 	 	 	 	 	 ddeee      dededededededef fd	Ze	j                  j                  dd
       Ze	j                  j                  d d       Ze	j                  j                  dej                  fd       Zd!dedee   fdZ	 	 	 	 	 d"de	j&                  deeeee   f      dededededeee	j&                     ee	j&                  ee	j&                     f   f   fdZ	 	 	 d#deeee   f   dedefdZd ZddefdZd Zd Z xZS )$r   cfgsnum_classeswidthin_chansoutput_strideglobal_pool	drop_rater%   c                    t         |           |	|
d}|dk(  sJ d       || _        || _        || _        || _        d| _        g | _        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       }t&        }d}d}| j                  D ]  }g }d	}|D ]G  \  }}}}}t        ||z  d      }t        ||z  d      }|j                   ||||||f||d|       |}I |d	kD  r/|dz  }| j                  j                  t        ||d|              |j                  t        j(                  |        |d	z  } t        |z  dz  d      }|j                  t        j(                  t+        ||d	fi |             |x| _        }t        j(                  | | _        || _        dx| _        }t5        |      | _        t        j                  ||d	d	dfd
di|| _        t        j                   d      | _        |rt        j<                  d	      nt        j>                         | _         |dkD  rtC        ||fi || _"        y t        j>                         | _"        y )Nr'       z7only output_stride==32 is valid, dilation not supportedF   r   rv   r*   r   r+   	conv_stem)num_chs	reductionmoduleTr,   r   )r   r%   zblocks.i   	pool_type)#r/   r0   r   r   r   r   grad_checkpointingfeature_infor   r1   r3   r   r8   dictr4   bn1r5   act1
ModuleListr   r2   r   pool_dimblocksnum_featureshead_hidden_sizer   r   	conv_headact2Flattenr6   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   r@   s                              rA   r0   zRepGhostNet.__init__   s    	/"]$]]"	& ""' ""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=eHgw1oxaholnop"	#
 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rB   c                 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<   coarsematchers      rA   group_matcherzRepGhostNet.group_matcher)  s,    "&,"2JDQ(
 rB   c                     || _         y rD   )r   )r<   enables     rA   set_grad_checkpointingz"RepGhostNet.set_grad_checkpointing4  s
    "(rB   returnc                     | j                   S rD   )r   rt   s    rA   get_classifierzRepGhostNet.get_classifier8  s    rB   c                    || _         |At        |      | _        |rt        j                  d      nt        j
                         | _        |dkD  rt        | j                  d      r | j                  j                  j                  nd }t        | j                  d      r | j                  j                  j                  nd }||d}t        | j                  |fi || _        y t        j
                         | _        y )Nr   r   r   r\   r'   )r   r   r   r1   r   r6   r   hasattrr   r\   r(   r)   r   r   )r<   r   r   r(   r)   r=   s         rA   reset_classifierzRepGhostNet.reset_classifier<  s    &"3kJD,72::a=R[[]DL?6=doox6XT__++22^bF4;DOOX4VDOO**00\`E"U3B$T%:%:KN2NDO kkmDOrB   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.rZ   r   Nr   .r   )start)r   rz   splitr   ro   r   r8   r   r   rU   jitis_scriptingr   	enumerater   r   )r<   rF   r   r   r   r   r   intermediatesinfo
stage_endstake_indices	max_indexifeat_idxr   stages                   rA   forward_intermediatesz!RepGhostNet.forward_intermediatesJ  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.
        rZ   r   Nr   r   r    )r   rz   r   r   ro   r   r   )r<   r   r   r   r   r   r   r   s           rA   prune_intermediate_layersz%RepGhostNet.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   rU   r   r   r   r   r<   rF   s     rA   forward_featureszRepGhostNet.forward_features  so    NN1HHQKIIaL""599+A+A+Ct{{At<A  AArB   
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   Fdropoutr   r   )r<   rF   r   s      rA   forward_headzRepGhostNet.forward_head  sv    QNN1IIaLLLO>>B		!t~~FAq6DOOA$66rB   c                 J    | j                  |      }| j                  |      }|S rD   )r   r   r   s     rA   rK   zRepGhostNet.forward  s'    !!!$a rB   c                     t        | d       y )NF)do_copy)repghost_model_convertrt   s    rA   convert_to_deployzRepGhostNet.convert_to_deploy  s    tU3rB   )	        ?rv   r   avgg?TNNF)TrD   )NFFr   F)r   FT)rw   rx   ry   r   rz   r   strr{   r0   rU   r   ignorer   r   r1   r   r   r   r   Tensorr   r   r   r   r   r   rK   r   r}   r~   s   @rA   r   r      s     $!#$" ActDz"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
4rB   modelc                     |rt        j                  |       } | j                         D ]  }t        |d      s|j	                          ! |$t        j                  | j                         |       | S )zQ
    taken from from https://github.com/DingXiaoH/RepVGG/blob/main/repvgg.py
    rr   )copydeepcopymodulesr   rr   rU   save
state_dict)r   	save_pathr   r   s       rA   r   r     se     e$--/ &6-.##%& 

5##%y1LrB   c                     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dt        d      i|S )z(
    Constructs a RepGhostNet model
    )rv      r   r   r   )rv      r	  r   r*   )rv   $   r	  r   r   )   r
  (         ?r*   )r  <   r  r  r   )rv   x   P   r   r*   )rv   d   r  r   r   )rv   r  r  r   r   )rv      p   r  r   )rv   P  r  r  r   )r  r     r  r*   )r    r  r   r   )r  r  r  r  r   )r   r   feature_cfgT)flatten_sequentialrn   )r   r   r   )variantr   
pretrainedkwargsr   model_kwargss         rA   _create_repghostnetr    s     
			 									
 
  					
)D4   L
   D1	
  rB   c                 2    | dddddt         t        dddd	|S )
Nr   )rv      r  )   r   g      ?bicubicr   r   mit)urlr   
input_size	pool_sizecrop_pctinterpolationmeanrh   
first_convr   licenser	   )r#  r  s     rA   _cfgr+    s3    4}SYI%.B!  rB   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                 "    t        dd| d|}|S )z RepGhostNet-0.5x g      ?r   r  )repghostnet_050r  r  r  r   s      rA   r/  r/          ^^W]^ELrB   c                 "    t        dd| d|}|S )z RepGhostNet-0.58x g(\?r.  )repghostnet_058r0  r1  s      rA   r4  r4          _*_X^_ELrB   c                 "    t        dd| d|}|S )z RepGhostNet-0.8x g?r.  )repghostnet_080r0  r1  s      rA   r7  r7  "  r2  rB   c                 "    t        dd| d|}|S )z RepGhostNet-1.0x r   r.  )repghostnet_100r0  r1  s      rA   r9  r9  )  r2  rB   c                 "    t        dd| d|}|S )z RepGhostNet-1.11x g(\?r.  )repghostnet_111r0  r1  s      rA   r;  r;  0  r5  rB   c                 "    t        dd| d|}|S )z RepGhostNet-1.3x g?r.  )repghostnet_130r0  r1  s      rA   r=  r=  6  r2  rB   c                 "    t        dd| d|}|S )z RepGhostNet-1.5x g      ?r.  )repghostnet_150r0  r1  s      rA   r?  r?  =  r2  rB   c                 "    t        dd| d|}|S )z RepGhostNet-2.0x g       @r.  )repghostnet_200r0  r1  s      rA   rA  rA  D  r2  rB   )NT)r   F)r   r   )5r   r  	functoolsr   typingr   r   r   r   r   rU   torch.nnr1   torch.nn.functionalrV   r   	timm.datar
   r   timm.layersr   r   r   _builderr   _efficientnet_blocksr   r   	_featuresr   _manipulater   	_registryr   r   __all__r   r   r   r   r   r   r  r+  default_cfgsr/  r4  r7  r9  r;  r=  r?  rA  rn   rB   rA   <module>rO     s     5 5     A D D * : + ' </ Mn'R`jkJlm	l RYY l ^V VrC4")) C4L%((// )X %  ! ! ! ! ! ! !;!& !H ;   ;   ;   ;   ;  
 ;   ;   ;  rB   