
    khOK                        d Z ddlZddlmZ ddl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jH                        Z% G d dejH                        Z& G d dejH                        Z'd'de	j                  jH                  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#       Z0e d*de'fd$       Z1e d*de'fd%       Z2e d*de'fd&       Z3y)+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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                   d     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 )
RepGhostModulec                 $   t         t        |           || _        |}|}	t	        j
                  t	        j                  |||||dz  d      t	        j                  |      |rt	        j                  d      nt	        j                               | _
        g }
g }|rG|
j                  t	        j                                |j                  t	        j                  |             t	        j
                  |
 | _        t	        j
                  | | _        t	        j
                  t	        j                  ||	|d|dz  |d      t	        j                  |	            | _        |rt	        j                  d      | _        y t	        j                         | _        y )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strider3   reparaminit_chsnew_chsr0   r1   	__class__s               P/var/www/teggl/fontify/venv/lib/python3.12/site-packages/timm/models/repghost.pyr&   zRepGhostModule.__init__   s'    	nd,.MMIIfhV[A=MTYZNN8$%)BGGD!r{{}
 	r{{}-R^^H56==+6	2!}}IIh!WaZW\]NN7# 

 /3BGGE*		    c                     | j                  |      }| j                  |      }t        | j                  | j                        D ]  \  }}| | ||            z   } | j                  |      S N)r.   r2   zipr0   r1   r3   )r4   xx1x2convbns         r=   forwardzRepGhostModule.forwardC   sf    q!!!"%D,,dnn= 	#HD"bbl"B	#yy}r>   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_tensorr2   rA   r0   r1   shapedevice_pad_1x1_to_3x3_tensor)r4   	kernel3x3bias3x3rE   rF   kernelr!   s          r=   get_equivalent_kernel_biasz)RepGhostModule.get_equivalent_kernel_biasJ   s    !11$2F2Fq2I4K_K_`aKbc	7D,,dnn= 	HD"//b)//!:LiN^N^_LFD44V<<ItOG	 '!!r>   c                 `    | yt         j                  j                  j                  | g d      S )Nr   )r   r   r   r   )torchr(   
functionalpad)	kernel1x1s    r=   rL   z%RepGhostModule._pad_1x1_to_3x3_tensorR   s(    88&&**9lCCr>   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   )rK   )running_meanrJ   weightrK   
isinstancer(   r*   r!   r-   rR   onesr+   running_varepssqrtreshapezerosto)rE   rF   in_channelsrK   rO   rX   r\   gammabetar]   stdts               r=   rI   zRepGhostModule._fuse_bn_tensorY   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Ar>   c           	         t        | j                        dk(  rt        | j                        dk(  ry | j                         \  }}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                  _        | j!                  d       | j!                  d       g | _        g | _        y )Nr   T)rb   out_channelsr6   paddingdilationr$   r!   r0   r1   )lenr0   r1   rP   r(   r*   r2   rb   rh   r6   ri   rj   r$   rY   datar!   __delattr__)r4   rO   r!   s      r=   switch_to_deployzRepGhostModule.switch_to_deployp   s   t A%#dnn*=*B668!yy,,Q/;;--a0==,,Q/;;((+33))!,55''*11  ,2##()-!!&'%r>   c                 $    | j                          y r@   )rn   r4   s    r=   reparameterizezRepGhostModule.reparameterize   s    r>   )r      r   TT)NN)__name__
__module____qualname__r&   rG   rP   staticmethodrL   rI   rn   rq   __classcell__r<   s   @r=   r   r      s[    
 #FJ" D D B B,& r>   r   c                   H     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 SErr   r           Tc	                    t         t        |           |d uxr |dkD  }	|| _        t	        ||d|      | _        | j                  dkD  rBt        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                         | _        y t        j                  t        j                  |||||dz
  dz  |d      t        j                  |      t        j                  ||ddd	d
      t        j                  |            | _        y )Nr{   T)r3   r9   r   r   F)r8   ri   r$   r!   )rd_ratior   )r8   ri   r!   )r%   rz   r&   r8   r   ghost1r(   r*   conv_dwr+   bn_dw	_SE_LAYERseghost2r)   shortcut)r4   r5   mid_chsr'   dw_kernel_sizer8   	act_layerse_ratior9   has_ser<   s             r=   r&   zRepGhostBottleneck.__init__   sK    	 $02%7(R- %VW4Q ;;?99.')A-gEKDL 0DJDLDJ <B)Gh7t %WgE7S W!1MMODMMM		FN6+A-1&uN v&		&'1QNw'DMr>   c                    |}| j                  |      }| j                  "| j                  |      }| j                  |      }| j                  | j                  |      }| j	                  |      }|| j                  |      z  }|S r@   )r~   r   r   r   r   r   )r4   rB   r   s      r=   rG   zRepGhostBottleneck.forward   s|     KKN <<#QA

1A 77
A KKN	T]]8$$r>   )	rs   rt   ru   __doc__r(   r,   r&   rG   rw   rx   s   @r=   rz   rz      s&    - gg-^r>   rz   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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   c	                    t         t        |           |dk(  sJ d       || _        || _        || _        d| _        g | _        t        d|z  d      }	t        j                  ||	dddd	      | _        | j                  j                  t        |	dd
             t        j                  |	      | _        t        j                   d      | _        |	}
t        j$                  g       }t&        }d}d}| j                  D ]  }g }d}|D ]F  \  }}}}}t        ||z  d      }t        ||z  d      }|j                   ||
||||||             |}
H |dkD  r/|dz  }| j                  j                  t        |
|d|              |j                  t        j(                  |        |dz  } t        |z  dz  d      }|j                  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kD  rtC        ||      | _"        y t        j>                         | _"        y )N    z7only output_stride==32 is valid, dilation not supportedF   r   rr   r   r   r    	conv_stem)num_chs	reductionmoduleTr"   r   )r   r9   zblocks.i   	pool_type)#r%   r   r&   cfgsnum_classes	drop_rategrad_checkpointingfeature_infor   r(   r*   r   r/   dictr+   bn1r,   act1
ModuleListrz   r)   r   pool_dimblocksnum_featureshead_hidden_sizer   global_pool	conv_headact2Flattenr-   flattenr   
classifier)r4   r   r   widthin_chansoutput_strider   r   r9   stem_chsprev_chsstagesblock	stage_idx
net_stridecfglayersskexp_sizecr   r'   r   r<   s                           r=   r&   zRepGhostNet.__init__   s    	k4)+"]$]]"	&""' ""u*a08Xq!QUK  h!i!YZ>>(+GGD)	 r""	
99 	CFA/2 #+8Q!(UA6(E)91=eHgw1xahij"	#
 1ua
!!(($
WYKCX*Z [MM"--01NI	 !E!1A!5q9bmmIh$CDE#**mmV, %*../+F8WaADIGGD)	(3rzz!}:E/&+6r{{}r>   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   )r4   coarsematchers      r=   group_matcherzRepGhostNet.group_matcher  s,    "&,"2JDQ(
 r>   c                     || _         y r@   )r   )r4   enables     r=   set_grad_checkpointingz"RepGhostNet.set_grad_checkpointing  s
    "(r>   returnc                     | j                   S r@   )r   rp   s    r=   get_classifierzRepGhostNet.get_classifier  s    r>   r   r   c                    || _         |At        |      | _        |rt        j                  d      nt        j
                         | _        |dkD  rt        | j                  |      | _	        y t        j
                         | _	        y )Nr   r   r   )
r   r   r   r(   r   r-   r   r   r   r   )r4   r   r   s      r=   reset_classifierzRepGhostNet.reset_classifier"  sa    &"3kJD,72::a=R[[]DLHSVW&!6!6D]_]h]h]jr>   rB   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.rW   r   Nr   .r   )start)r   intsplitr   rk   r   r/   r   r   rR   jitis_scriptingr   	enumerater   r   )r4   rB   r   r   r   r   r   intermediatesinfo
stage_endstake_indices	max_indexifeat_idxr   stages                   r=   forward_intermediatesz!RepGhostNet.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.
        rW   r   Nr   r   r    )r   r   r   r   rk   r   r   )r4   r   r   r   r   r   r   r   s           r=   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   rR   r   r   r   r   r4   rB   s     r=   forward_featureszRepGhostNet.forward_featureso  so    NN1HHQKIIaL""599+A+A+Ct{{At<A  AAr>   
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   )r4   rB   r   s      r=   forward_headzRepGhostNet.forward_heady  sv    QNN1IIaLLLO>>B		!t~~FAq6DOOA$66r>   c                 J    | j                  |      }| j                  |      }|S r@   )r   r   r   s     r=   rG   zRepGhostNet.forward  s'    !!!$a r>   c                     t        | d       y )NF)do_copy)repghost_model_convertrp   s    r=   convert_to_deployzRepGhostNet.convert_to_deploy  s    tU3r>   )        ?rr   r   avgg?TF)Tr@   )NFFr   F)r   FT)rs   rt   ru   r&   rR   r   ignorer   r   r(   Moduler   r   r   strr   Tensorr   r   boolr   r   r   r   r   rG   r   rw   rx   s   @r=   r   r      s    =]~ YY  YY) ) YY		  kC khsm 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	>*  	 7$ 7
4r>   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
    rn   )copydeepcopymoduleshasattrrn   rR   save
state_dict)r   	save_pathr   r   s       r=   r   r     se     e$--/ &6-.##%& 

5##%y1Lr>   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
    )rr      r   r   r   )rr      r  r   r   )rr   $   r  r   r   )   r  (         ?r   )r  <   r  r  r   )rr   x   P   r   r   )rr   d   r  r   r   )rr   r
  r  r   r   )rr      p   r  r   )rr   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     
			 									
 
  					
)D4   L
   D1	
  r>   c                 0    | dddddt         t        ddd
|S )	Nr   )rr      r  )   r  g      ?bicubicr   r   )
urlr   
input_size	pool_sizecrop_pctinterpolationmeanre   
first_convr   r   )r  r  s     r=   _cfgr%    s0    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 g      ?r   r  )repghostnet_050r  r  r  r   s      r=   r)  r)          ^^W]^ELr>   c                 "    t        dd| d|}|S )z RepGhostNet-0.58x g(\?r(  )repghostnet_058r*  r+  s      r=   r.  r.          _*_X^_ELr>   c                 "    t        dd| d|}|S )z RepGhostNet-0.8x g?r(  )repghostnet_080r*  r+  s      r=   r1  r1    r,  r>   c                 "    t        dd| d|}|S )z RepGhostNet-1.0x r   r(  )repghostnet_100r*  r+  s      r=   r3  r3    r,  r>   c                 "    t        dd| d|}|S )z RepGhostNet-1.11x g(\?r(  )repghostnet_111r*  r+  s      r=   r5  r5    r/  r>   c                 "    t        dd| d|}|S )z RepGhostNet-1.3x g?r(  )repghostnet_130r*  r+  s      r=   r7  r7    r,  r>   c                 "    t        dd| d|}|S )z RepGhostNet-1.5x g      ?r(  )repghostnet_150r*  r+  s      r=   r9  r9    r,  r>   c                 "    t        dd| d|}|S )z RepGhostNet-2.0x g       @r(  )repghostnet_200r*  r+  s      r=   r;  r;  #  r,  r>   )NT)r   F)r   r   )4r   r   	functoolsr   typingr   r   r   r   rR   torch.nnr(   torch.nn.functionalrS   r   	timm.datar	   r
   timm.layersr   r   r   _builderr   _efficientnet_blocksr   r   	_featuresr   _manipulater   	_registryr   r   __all__r   r   r   rz   r   r   r  r%  default_cfgsr)  r.  r1  r3  r5  r7  r9  r;  r  r>   r=   <module>rI     s     / /     A D D * : + ' </ Mn'R`jkJlm	g RYY g TE EPy4")) y4x%((// )X %  ! ! ! ! ! ! !;!& !H ;   ;   ;   ;   ;  
 ;   ;   ;  r>   