
    Ng@                     @   d Z ddlZddlmZ ddl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mZ dgZ eed eed                    Z G d dej                  Z  G d dej                  Z! G d dej                  Z"d*dej        j        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%            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)            Z.dS ).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)OptionalIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)SelectAdaptivePool2dLinearmake_divisible   )build_model_with_cfg)SqueezeExcite	ConvBnAct)checkpoint_seq)register_modelgenerate_default_cfgsRepGhostNethard_sigmoid   )divisor)
gate_layerrd_round_fnc                   p     e Zd Z	 	 	 	 	 d fd	Zd Zd Zed             Zedd	            Zd
 Z	d Z
 xZS )RepGhostModuler      Tc                 ,   t          t          |                                            || _        |}|}	t	          j        t	          j        |||||dz  d          t	          j        |          |rt	          j        d          nt	          j	                              | _
        g }
g }|rM|
                    t	          j	                               |                    t	          j        |                     t	          j        |
 | _        t	          j        | | _        t	          j        t	          j        ||	|d|dz  |d          t	          j        |	                    | _        |rt	          j        d          nt	          j	                    | _        d S )N   FbiasTinplacer   )groupsr   )superr   __init__out_chsnn
SequentialConv2dBatchNorm2dReLUIdentityprimary_convappendfusion_conv	fusion_bncheap_operationrelu)selfin_chsr$   kernel_sizedw_sizestrider0   reparaminit_chsnew_chsr-   r.   	__class__s               P/var/www/html/ai-engine/env/lib/python3.11/site-packages/timm/models/repghost.pyr#   zRepGhostModule.__init__   sh    	nd##,,...MIfhV[A=MTYZZZN8$$%)<BGD!!!!r{}}
 
 	 	7r{}}---R^H55666=+6	2!}Ih!WaZW\]]]N7## 
  

 /3EBGE****			    c                     |                      |          }|                     |          }t          | j        | j                  D ]\  }}| | ||                    z   }|                     |          S N)r+   r/   zipr-   r.   r0   )r1   xx1x2convbns         r:   forwardzRepGhostModule.forwardB   sv    q!!!!"%%D,dn== 	# 	#HD"bbbll"BByy}}r;   c                 8   |                      | j        d         | j        d                   \  }}t          | j        | j                  D ]M\  }}|                      |||j        d         |j                  \  }}||                     |          z  }||z  }N||fS )Nr   r   )_fuse_bn_tensorr/   r>   r-   r.   shapedevice_pad_1x1_to_3x3_tensor)r1   	kernel3x3bias3x3rB   rC   kernelr   s          r:   get_equivalent_kernel_biasz)RepGhostModule.get_equivalent_kernel_biasI   s    !11$2Fq2I4K_`aKbcc	7D,dn== 	 	HD"//b)/!:LiN^__LFD44V<<<ItOGG'!!r;   c                 X    | dS t           j        j                            | g d          S )Nr   )r   r   r   r   )torchr%   
functionalpad)	kernel1x1s    r:   rI   z%RepGhostModule._pad_1x1_to_3x3_tensorQ   s,    18&**9lllCCCr;   Nc                    |r|n|j         j        d         }|r|n|j        j        }t	          | t
          j                  r| j        }| j        J n5t	          | t
          j                  sJ t          j
        |ddd|          }t	          |t
          j                  re|j         }|j        }|j        }|j        }|j        }	||	z                                   }
||
z                      dddd          }||z  |||z  |
z  z
  fS t	          |t
          j                  sJ |t          j        |                              |j                  fS )Nr   r   )rH   )running_meanrG   weightrH   
isinstancer%   r'   r   r*   rO   onesr(   running_varepssqrtreshapezerosto)rB   rC   in_channelsrH   rL   rU   rY   gammabetarZ   stdts               r:   rF   zRepGhostModule._fuse_bn_tensorX   sR   %0Nkkbo6KA6N!7ry'7dBI&& 	E[F9$$$$dBK00000ZQ1VDDDFb".)) 	A?L.KIE7D&C$**,,C%%b!Q22AA:tlU&:S&@@@@"bk*****u{;//226=AAAAr;   c           	      L   t          | j                  dk    rt          | j                  dk    rd S |                                 \  }}t	          j        | j        d         j        | j        d         j        | j        d         j	        | j        d         j
        | j        d         j        | j        d         j        d          | _        || j        j        _        || j        j        _        |                     d           |                     d           g | _        g | _        d S )Nr   T)r_   out_channelsr3   paddingdilationr!   r   r-   r.   )lenr-   r.   rM   r%   r'   r/   r_   re   r3   rf   rg   r!   rV   datar   __delattr__)r1   rL   r   s      r:   switch_to_deployzRepGhostModule.switch_to_deployo   s   t  A%%#dn*=*=*B*BF6688!y,Q/;-a0=,Q/;(+3)!,5'*1      ,2#()-!&'''%%%r;   c                 .    |                                   d S r=   )rk   r1   s    r:   reparameterizezRepGhostModule.reparameterize   s    r;   )r   r   r   TT)NN)__name__
__module____qualname__r#   rD   rM   staticmethodrI   rF   rk   rn   __classcell__r9   s   @r:   r   r      s        
 #F #F #F #F #F #FJ  " " " D D \D B B B \B,  &             r;   r   c                   >     e Zd ZdZddej        ddf fd	Zd Z xZS )RepGhostBottleneckz# RepGhost bottleneck w/ optional SEr   r           Tc	                    t          t          |                                            |d uo|dk    }	|| _        t	          ||d|          | _        | j        dk    r@t          j        |||||dz
  dz  |d          | _        t          j	        |          | _
        nd | _        d | _
        |	rt          ||          nd | _        t	          ||d|          | _        ||k    r%| j        dk    rt          j                    | _        d S t          j        t          j        |||||dz
  dz  |d          t          j	        |          t          j        ||ddd	d
          t          j	        |                    | _        d S )Nrw   T)r0   r6   r   r   F)r5   rf   r!   r   )rd_ratior   )r5   rf   r   )r"   rv   r#   r5   r   ghost1r%   r'   conv_dwr(   bn_dw	_SE_LAYERseghost2r&   shortcut)r1   r2   mid_chsr$   dw_kernel_sizer5   	act_layerse_ratior6   has_ser9   s             r:   r#   zRepGhostBottleneck.__init__   s    	 $''00222%7(R- %VW4QQQ ;??9.')A-gEK K KDL 00DJJDLDJ <BK)Gh7777t %WgE7SSS W!1!1MOODMMMM	FN6+A-1&uN N N v&&	&'1QNNNw'' DMMMr;   c                 (   |}|                      |          }| j        *|                     |          }|                     |          }| j        |                     |          }|                     |          }||                     |          z  }|S r=   )rz   r{   r|   r~   r   r   )r1   r?   r   s      r:   rD   zRepGhostBottleneck.forward   s     KKNN <#QA

1A 7

A KKNN	T]]8$$$r;   )	ro   rp   rq   __doc__r%   r)   r#   rD   rs   rt   s   @r:   rv   rv      sf        -- g- - - - - -^      r;   rv   c                        e Zd Z	 	 	 	 	 	 	 d 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 ZddefdZd Zd Z xZS )r           ?r       avg皙?Tc	                    t          t          |                                            |dk    s
J d            || _        || _        || _        d| _        g | _        t          d|z  d          }	t          j
        ||	dddd	          | _        | j                            t          |	dd
                     t          j        |	          | _        t          j        d          | _        |	}
t          j        g           }t&          }d}d}| j        D ]}g }d}|D ]U\  }}}}}t          ||z  d          }t          ||z  d          }|                     ||
||||||                     |}
V|dk    r2|dz  }| j                            t          |
|d|                      |                    t          j        |            |dz  }t          ||z  dz  d          }|                    t          j        t+          |
|d                               |x| _        }
t          j        | | _        |
| _        dx| _        }t5          |          | _        t          j
        |
|dddd	          | _        t          j        d          | _        |rt          j        d          nt          j                    | _         |dk    rtC          ||          nt          j                    | _"        d S )Nr   z7only output_stride==32 is valid, dilation not supportedF   r   r   r   r   r   	conv_stem)num_chs	reductionmoduleTr   r   )r   r6   zblocks.i   	pool_type)#r"   r   r#   cfgsnum_classes	drop_rategrad_checkpointingfeature_infor
   r%   r'   r   r,   dictr(   bn1r)   act1
ModuleListrv   r&   r   pool_dimblocksnum_featureshead_hidden_sizer   global_pool	conv_headact2Flattenr*   flattenr	   
classifier)r1   r   r   widthin_chansoutput_strider   r   r6   stem_chsprev_chsstagesblock	stage_idx
net_stridecfglayersskexp_sizecr   r$   r   r9   s                           r:   r#   zRepGhostNet.__init__   s    	k4  ))+++"""$]"""	&""' ""u*a008Xq!QUKKK  h!L!Y!Y!YZZZ>(++GD)))	 r"""	
9 	 	CFA/2 # #+8Q!(UA66(E)91==eeHgw1xahiiijjj"1uua
!(($
CXYCXCX*Z *Z *Z [ [ [MM"-0111NII E!1A!5q99bmIh$C$CDDEEE#**mV, %*../+FFF8WaADIIIGD)))	(3Frz!}}}:E//&+666r{}}r;   Fc                 8    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   )r1   coarsematchers      r:   group_matcherzRepGhostNet.group_matcher  s<    "&,J""2JDQ(
 
 
 r;   c                     || _         d S r=   )r   )r1   enables     r:   set_grad_checkpointingz"RepGhostNet.set_grad_checkpointing  s    "(r;   returnc                     | j         S r=   )r   rm   s    r:   get_classifierzRepGhostNet.get_classifier  s
    r;   Nr   r   c                    || _         |Ct          |          | _        |rt          j        d          nt          j                    | _        |dk    rt          | j        |          nt          j                    | _	        d S )Nr   r   r   )
r   r   r   r%   r   r*   r   r	   r   r   )r1   r   r   s      r:   reset_classifierzRepGhostNet.reset_classifier!  sq    &"3kJJJD,7J2:a===R[]]DLHSVW&!6DDD]_]h]j]jr;   c                 (   |                      |          }|                     |          }|                     |          }| j        r6t          j                                        st          | j        |d          }n|                     |          }|S )NT)r   )	r   r   r   r   rO   jitis_scriptingr   r   r1   r?   s     r:   forward_featureszRepGhostNet.forward_features)  s}    NN1HHQKKIIaLL" 	59+A+A+C+C 	t{At<<<AAAAr;   
pre_logitsc                 4   |                      |          }|                     |          }|                     |          }|                     |          }| j        dk    r!t          j        || j        | j                  }|r|n|                     |          S )Nrw   )ptraining)	r   r   r   r   r   Fdropoutr   r   )r1   r?   r   s      r:   forward_headzRepGhostNet.forward_head3  s    QNN1IIaLLLLOO>B	!t~FFFA6qqDOOA$6$66r;   c                 Z    |                      |          }|                     |          }|S r=   )r   r   r   s     r:   rD   zRepGhostNet.forward<  s-    !!!$$a  r;   c                 (    t          | d           d S )NF)do_copy)repghost_model_convertrm   s    r:   convert_to_deployzRepGhostNet.convert_to_deployA  s    tU333333r;   )r   r   r   r   r   r   TF)Tr=   )ro   rp   rq   r#   rO   r   ignorer   r   r%   Moduler   intr   strr   r   boolr   rD   r   rs   rt   s   @r:   r   r      sU        =] =] =] =] =] =]~ Y    Y) ) ) ) Y	    k kC khsm k k k k  7 7$ 7 7 7 7  
4 4 4 4 4 4 4r;   Tmodelc                     |rt          j        |           } |                                 D ]&}t          |d          r|                                 '|'t          j        |                                 |           | S )zQ
    taken from from https://github.com/DingXiaoH/RepVGG/blob/main/repvgg.py
    rk   )copydeepcopymoduleshasattrrk   rO   save
state_dict)r   	save_pathr   r   s       r:   r   r   E  s      %e$$--// & &6-.. 	&##%%%
5##%%y111Lr;   r   Fc                     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
    )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_sequential )r   r   r   )variantr   
pretrainedkwargsr   model_kwargss         r:   _create_repghostnetr   S  s(    
											 																							
 
 		 													
)D4     L
    D111	
   r;    c                 4    | 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meanrb   
first_convr   r   )r  r   s     r:   _cfgr	    s5    4}SYI%.B!	 
  r;   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 repghostnet_050g      ?r   r   )r  r   r   r   r   s      r:   r  r    $      ^^^W]^^ELr;   c                 $    t          dd| d|}|S )z RepGhostNet-0.58x repghostnet_058g(\?r  )r  r  r  s      r:   r  r    $      _*__X^__ELr;   c                 $    t          dd| d|}|S )z RepGhostNet-0.8x repghostnet_080g?r  )r  r  r  s      r:   r  r    r  r;   c                 $    t          dd| d|}|S )z RepGhostNet-1.0x repghostnet_100r   r  )r  r  r  s      r:   r  r    r  r;   c                 $    t          dd| d|}|S )z RepGhostNet-1.11x repghostnet_111g(\?r  )r  r  r  s      r:   r  r    r  r;   c                 $    t          dd| d|}|S )z RepGhostNet-1.3x repghostnet_130g?r  )r  r  r  s      r:   r  r    r  r;   c                 $    t          dd| d|}|S )z RepGhostNet-1.5x repghostnet_150g      ?r  )r  r  r  s      r:   r  r    r  r;   c                 $    t          dd| d|}|S )z RepGhostNet-2.0x repghostnet_200g       @r  )r  r  r  s      r:   r  r    r  r;   )NT)r   F)r   r   )/r   r   	functoolsr   typingr   rO   torch.nnr%   torch.nn.functionalrP   r   	timm.datar   r   timm.layersr   r	   r
   _builderr   _efficientnet_blocksr   r   _manipulater   	_registryr   r   __all__r}   r   r   rv   r   r   r   r	  default_cfgsr  r  r  r  r  r  r  r  r   r;   r:   <module>r,     si                                 A A A A A A A A D D D D D D D D D D * * * * * * : : : : : : : : ' ' ' ' ' ' < < < < < < < </ GMn''R`jkJlJlJlmmm	g  g  g  g  g RY g  g  g TE E E E E E E EPt4 t4 t4 t4 t4") t4 t4 t4n %(/    ) ) ) )X    %$ D   !D   !D   !D   !D   !D   !D   !D  ;!& !& ! !H  ;      ;      ;      ;      ;    
  ;      ;      ;      r;   