
    Ngb9              
          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" G d dej                  Z#dej        fdZ$d)dZ%d*dZ& e e&             e&d            e&             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-dS ),aA  
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

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
    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GhostNethard_sigmoid   )divisor)
gate_layerrd_round_fnc                   <     e Zd Zdddddej        f fd	Zd Z xZS )GhostModuler         Tc	                 @   t          t          |                                            || _        t	          j        ||z            }	|	|dz
  z  }
t          j        t          j        ||	|||dz  d          t          j	        |	          |r |d          nt          j
                              | _        t          j        t          j        |	|
|d|dz  |	d          t          j	        |
          |r |d          nt          j
                              | _        d S )Nr   r   FbiasTinplacegroupsr   )superr   __init__out_chsmathceilnn
SequentialConv2dBatchNorm2dIdentityprimary_convcheap_operationselfin_chsr%   kernel_sizeratiodw_sizestrideuse_act	act_layerinit_chsnew_chs	__class__s              P/var/www/html/ai-engine/env/lib/python3.11/site-packages/timm/models/ghostnet.pyr$   zGhostModule.__init__    s    	k4  ))+++9Wu_--eai(MIfhV[A=MTYZZZN8$$'.AIId####BKMM
 
  "}Ih!WaZW\]]]N7##'.AIId####BKMM 
  
    c                     |                      |          }|                     |          }t          j        ||gd          }|d d d | j        d d d d f         S )Nr   dim)r-   r.   torchcatr%   )r0   xx1x2outs        r;   forwardzGhostModule.forward<   sf    q!!!!"%%iRa(((111mt|mQQQ)**r<   __name__
__module____qualname__r(   ReLUr$   rF   __classcell__r:   s   @r;   r   r      sb        
 g
 
 
 
 
 
8+ + + + + + +r<   r   c                   <     e Zd Zdddddej        f fd	Zd Z xZS )GhostModuleV2r   r   r   Tc	                    t                                                       t          j                    | _        || _        t          j        ||z            }	|	|dz
  z  }
t          j        t          j	        ||	|||dz  d          t          j
        |	          |r |d          nt          j                              | _        t          j        t          j	        |	|
|d|dz  |	d          t          j
        |
          |r |d          nt          j                              | _        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
        |                    | _        d S )Nr   r   Fr   Tr   r!   )r      )r   r   )r2   r5   paddingr"   r   )rQ   r   )r   r   )r#   r$   r(   Sigmoidgate_fnr%   r&   r'   r)   r*   r+   r,   r-   r.   
short_convr/   s              r;   r$   zGhostModuleV2.__init__D   s    	z||9Wu_--eai(MIfhV[A=MTYZZZN8$$'.AIId####BKMM
 

  "}Ih!W\(Y^___N7##'.AIId####BKMM 
  

 -Ifg{FK1<LSXYYYN7##IgwF1f]dkpqqqN7##IgwF1f]dkpqqqN7##
 
r<   c                    |                      t          j        |dd                    }|                     |          }|                     |          }t          j        ||gd          }|d d d | j        d d d d f         t          j        | 	                    |          |j
        d         |j
        d         fd          z  S )	Nr   )r2   r5   r   r>   nearest)sizemode)rU   F
avg_pool2dr-   r.   r@   rA   r%   interpolaterT   shape)r0   rB   resrC   rD   rE   s         r;   rF   zGhostModuleV2.forwardg   s    ooal1!AFFFGGq!!!!"%%iRa(((111mt|mQQQ)*Q]LLSYr]CIbM$B.T .T .T T 	Tr<   rG   rM   s   @r;   rO   rO   C   sj        
 g!
 !
 !
 !
 !
 !
FT T T T T T Tr<   rO   c                   >     e Zd ZdZddej        ddf fd	Zd Z xZS )GhostBottleneckz  Ghost bottleneck w/ optional SEr   r           originalc	                 >   t          t          |                                            |d uo|dk    }	|| _        |dk    rt	          ||d|          | _        n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 )Nrc   rd   T)r6   r7   r   r   F)r5   rR   r"   r   )rd_ratio)r6   r   )r5   rR   r   )r#   rb   r$   r5   r   ghost1rO   r(   r*   conv_dwr+   bn_dw	_SE_LAYERseghost2r)   shortcut)r0   r1   mid_chsr%   dw_kernel_sizer5   r7   se_ratior[   has_ser:   s             r;   r$   zGhostBottleneck.__init__s   s    	ot$$--///%7(R- :%fgtyYYYDKK'QZ[[[DK ;??9.')A-gEK K KDL 00DJJDLDJ <BK)Gh7777t "'7EBBB W!1!1MOODMMMM	FN6+A-1&uN N N v&&	&'1QNNNw'' DMMMr<   c                 (   |}|                      |          }| j        *|                     |          }|                     |          }| j        |                     |          }|                     |          }||                     |          z  }|S N)rg   rh   ri   rk   rl   rm   )r0   rB   rm   s      r;   rF   zGhostBottleneck.forward   s     KKNN <#QA

1A 7

A KKNN	T]]8$$$r<   )	rH   rI   rJ   __doc__r(   rK   r$   rF   rL   rM   s   @r;   rb   rb   p   sf        ** g0 0 0 0 0 0d      r<   rb   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fdZd ZddefdZd Z xZS )r           ?r       avg皙?v1c	                 
   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           }d}d}d}| j        D ]}g }d}|D ]n\  }}}}}t          ||z  d          }t          ||z  d          }i }|dk    r|dk    rd|d<   |                    t'          |
||||fd|i|           |}
|dz  }o|dk    r2|dz  }| j                            t          |
|d|                      |                    t          j        |            |dz  }t          ||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 )Nrx   z7only output_stride==32 is valid, dilation not supportedF   r   r   r   r   r   	conv_stem)num_chs	reductionmoduleTr   r   v2attnr[   rp   zblocks.i   	pool_type)#r#   r   r$   cfgsnum_classes	drop_rategrad_checkpointingfeature_infor
   r(   r*   r~   appenddictr+   bn1rK   act1
ModuleListrb   r)   r   pool_dimblocksnum_featureshead_hidden_sizer   global_pool	conv_headact2Flattenr,   flattenr	   
classifier)r0   r   r   widthin_chansoutput_strider   r   versionstem_chsprev_chsstages	stage_idx	layer_idx
net_stridecfglayersskexp_sizecrp   r%   rn   layer_kwargsr:   s                            r;   r$   zGhostNet.__init__   s1    	h&&((("""$]"""	&""' ""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==!d??y1}}+1L(oh!QrrYareqrrsss"Q		1uua
!(($
CXYCXCX*Z *Z *Z [ [ [MM"-0111NII E!1155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   )r0   coarsematchers      r;   group_matcherzGhostNet.group_matcher  s<    "&,J""2JDQ(
 
 
 r<   Tc                     || _         d S rs   )r   )r0   enables     r;   set_grad_checkpointingzGhostNet.set_grad_checkpointing  s    "(r<   returnc                     | j         S rs   )r   )r0   s    r;   get_classifierzGhostNet.get_classifier  s
    r<   r   r   c                     || _         t          |          | _        |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   )r0   r   r   s      r;   reset_classifierzGhostNet.reset_classifier  sk    &/+FFF(3Frz!}}}HSVW&!6DDD]_]h]j]jr<   c                 (   |                      |          }|                     |          }|                     |          }| j        r6t          j                                        st          | j        |d          }n|                     |          }|S )NT)r   )	r~   r   r   r   r@   jitis_scriptingr   r   r0   rB   s     r;   forward_featureszGhostNet.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 )Nrc   )ptraining)	r   r   r   r   r   r\   dropoutr   r   )r0   rB   r   s      r;   forward_headzGhostNet.forward_head%  s    QNN1IIaLLLLOO>B	!t~FFFA6qqDOOA$6$66r<   c                 Z    |                      |          }|                     |          }|S rs   )r   r   r   s     r;   rF   zGhostNet.forward.  s-    !!!$$a  r<   )rv   rw   r   rx   ry   rz   r{   F)T)ry   )rH   rI   rJ   r$   r@   r   ignorer   r   r(   Moduler   intstrr   r   boolr   rF   rL   rM   s   @r;   r   r      sH        A] A] A] A] A] A]J Y    Y) ) ) ) Y	    k kC kc k k k k  7 7$ 7 7 7 7      r<   modelc                 R    i }|                                  D ]\  }}d|v r
|||<   |S )Ntotal)items)
state_dictr   out_dictr   vs        r;   checkpoint_filter_fnr   4  sB    H  ""  1a<<Or<   rw   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t          t          d          d|S )z%
    Constructs a GhostNet model
    )r   r}   r}   r   r   )r   0      r   r   )r   H   r   r   r   )rQ   r   (         ?r   )rQ   x   r   r   r   )r      P   r   r   )r      r   r   r   )r      r   r   r   )r   i  p   r   r   )r     r   r   r   )rQ   r      r   r   )rQ     r   r   r   )rQ   r   r   r   r   )r   r   T)flatten_sequential)pretrained_filter_fnfeature_cfg )r   r   r   r   )variantr   
pretrainedkwargsr   model_kwargss         r;   _create_ghostnetr   =  s+    
											 			 																				
 
 		 													
)D4     L
   2D111    r<    c                 4    | dddddt           t          ddd
|S )	Nrv   )r      r   )   r   g      ?bicubicr~   r   )
urlr   
input_size	pool_sizecrop_pctinterpolationmeanstd
first_convr   r   )r   r   s     r;   _cfgr   j  s5    4}SYI%.B!	 
  r<   ztimm/)	hf_hub_id)zghostnet_050.untrainedzghostnet_100.in1kzghostnet_130.untrainedzghostnetv2_100.in1kzghostnetv2_130.in1kzghostnetv2_160.in1kr   c                 $    t          dd| d|}|S )z GhostNet-0.5x ghostnet_050g      ?r   r   )r   r   r   r   r   s      r;   r   r     $     X3:XXQWXXELr<   c                 $    t          dd| d|}|S )z GhostNet-1.0x ghostnet_100rw   r   )r   r   r   s      r;   r   r     r   r<   c                 $    t          dd| d|}|S )z GhostNet-1.3x ghostnet_130?r   )r  r   r   s      r;   r  r    r   r<   c                 &    t          dd| dd|}|S )z GhostNetV2-1.0x ghostnetv2_100rw   r   r   r   r   )r  r   r   s      r;   r  r    '     hSZY]hhaghhELr<   c                 &    t          dd| dd|}|S )z GhostNetV2-1.3x ghostnetv2_130r  r   r  )r	  r   r   s      r;   r	  r	    r  r<   c                 &    t          dd| dd|}|S )z GhostNetV2-1.6x ghostnetv2_160g?r   r  )r  r   r   s      r;   r  r    r  r<   )rw   F)r   r   ).rt   r&   	functoolsr   typingr   r@   torch.nnr(   torch.nn.functional
functionalr\   	timm.datar   r   timm.layersr   r	   r
   _builderr   _efficientnet_blocksr   r   _manipulater   	_registryr   r   __all__rj   r   r   rO   rb   r   r   r   r   default_cfgsr   r   r  r  r	  r  r   r<   r;   <module>r     s                                 A A A A A A A A D D D D D D D D D D * * * * * * : : : : : : : : ' ' ' ' ' ' < < < < < < < <, GMn''R`jkJlJlJlmmm	!+ !+ !+ !+ !+") !+ !+ !+H*T *T *T *T *TBI *T *T *TZH H H H Hbi H H HVv v v v vry v v vrBI    * * * *Z    %$"dff   #dff4    4    4  & &  ,                    (      (      (      r<   