U
    ¯Ê¹jß8  ã                	   @   sÐ  d Z ddlZddlmZ ddlZddlmZ ddlm  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d�d�ZG dd„ dejƒZG dd„ dejƒZG dd„ dejƒZ G dd„ dejƒZ!ejdœdd„Z"d1dd„Z#d2dd „Z$ee$ƒ e$d!d"�e$ƒ e$d!d"�e$d!d"�e$d!d"�d#œƒZ%ed3e!d$œd%d&„ƒZ&ed4e!d$œd'd(„ƒZ'ed5e!d$œd)d*„ƒZ(ed6e!d$œd+d,„ƒZ)ed7e!d$œd-d.„ƒZ*ed8e!d$œd/d0„ƒZ+dS )9aA  
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©ÚIMAGENET_DEFAULT_MEANÚIMAGENET_DEFAULT_STD)ÚSelectAdaptivePool2dÚLinearÚmake_divisibleé   )Úbuild_model_with_cfg)ÚSqueezeExciteÚ	ConvBnAct)Úcheckpoint_seq)Úregister_modelÚgenerate_default_cfgsÚGhostNetZhard_sigmoidé   )Zdivisor)Z
gate_layerZrd_round_fnc                       s4   e Zd Zdddddejf‡ fdd„	Zdd„ Z‡  ZS )	ÚGhostModuler	   é   é   Tc	                    s°   t t| ƒ ¡  || _t || ¡}	|	|d  }
t tj||	|||d dd�t 	|	¡|r`|dd�nt 
¡ ¡| _t tj|	|
|d|d |	dd�t 	|
¡|r |dd�nt 
¡ ¡| _d S )Nr	   r   F©ÚbiasT©Zinplace©Úgroupsr   )Úsuperr   Ú__init__Úout_chsÚmathÚceilÚnnÚ
SequentialÚConv2dÚBatchNorm2dÚIdentityÚprimary_convÚcheap_operation©ÚselfÚin_chsr   Úkernel_sizeÚratioZdw_sizeÚstrideÚuse_actÚ	act_layerZinit_chsZnew_chs©Ú	__class__© úS/var/www/html/bwave/python/venv/lib/python3.8/site-packages/timm/models/ghostnet.pyr      s    ýýzGhostModule.__init__c                 C   sH   |   |¡}|  |¡}tj||gdd�}|d d …d | j…d d …d d …f S )Nr	   ©Údim)r$   r%   ÚtorchÚcatr   )r'   ÚxÚx1Úx2Úoutr0   r0   r1   Úforward;   s    

zGhostModule.forward©Ú__name__Ú
__module__Ú__qualname__r   ÚReLUr   r:   Ú__classcell__r0   r0   r.   r1   r      s   ÷r   c                       s4   e Zd Zdddddejf‡ fdd„	Zdd„ Z‡  ZS )	ÚGhostModuleV2r	   r   r   Tc	                    s  t ƒ  ¡  t ¡ | _|| _t || ¡}	|	|d  }
t tj	||	|||d dd�t 
|	¡|rf|dd�nt ¡ ¡| _t tj	|	|
|d|d |	dd�t 
|
¡|r¦|dd�nt ¡ ¡| _t tj	|||||d dd�t 
|¡tj	||ddd	|dd
�t 
|¡tj	||ddd|dd
�t 
|¡¡| _d S )Nr	   r   Fr   Tr   r   )r	   é   )r   r   )r)   r+   Úpaddingr   r   )rB   r	   )r   r   )r   r   r   ZSigmoidÚgate_fnr   r   r   r    r!   r"   r#   r$   r%   Ú
short_convr&   r.   r0   r1   r   C   s.    

ýýúzGhostModuleV2.__init__c                 C   s„   |   tj|ddd�¡}|  |¡}|  |¡}tj||gdd�}|d d …d | j…d d …d d …f tj|  	|¡|j
d |j
d fdd� S )	Nr   )r)   r+   r	   r2   éþÿÿÿéÿÿÿÿZnearest)ÚsizeÚmode)rE   ÚFZ
avg_pool2dr$   r%   r4   r5   r   ZinterpolaterD   Úshape)r'   r6   Úresr7   r8   r9   r0   r0   r1   r:   f   s    

$  ÿzGhostModuleV2.forwardr;   r0   r0   r.   r1   rA   B   s   ÷#rA   c                       s6   e Zd ZdZddejddf‡ fdd„	Zdd	„ Z‡  ZS )
ÚGhostBottleneckz  Ghost bottleneck w/ optional SEr   r	   ç        Úoriginalc	           
         s,  t t| ƒ ¡  |d k	o|dk}	|| _|dkr@t||d|d�| _nt||d|d�| _| jdkrŒtj|||||d d |dd�| _	t 
|¡| _nd | _	d | _|	r¨t||d	�nd | _t||dd
�| _||krÜ| jdkrÜt ¡ | _nLt tj|||||d d |dd�t 
|¡tj||ddddd�t 
|¡¡| _d S )NrN   rO   T)r,   r-   r	   r   F)r+   rC   r   r   )Zrd_ratio)r,   r   )r+   rC   r   )r   rM   r   r+   r   Úghost1rA   r   r!   Úconv_dwr"   Úbn_dwÚ	_SE_LAYERÚseÚghost2r    Úshortcut)
r'   r(   Úmid_chsr   Zdw_kernel_sizer+   r-   Úse_ratiorI   Zhas_ser.   r0   r1   r   r   sJ    
   
  þ   
  þúzGhostBottleneck.__init__c                 C   s\   |}|   |¡}| jd k	r,|  |¡}|  |¡}| jd k	r@|  |¡}|  |¡}||  |¡7 }|S ©N)rP   rQ   rR   rT   rU   rV   )r'   r6   rV   r0   r0   r1   r:   ¤   s    






zGhostBottleneck.forward)	r<   r=   r>   Ú__doc__r   r?   r   r:   r@   r0   r0   r.   r1   rM   o   s   ÷2rM   c                       st   e Zd Zd‡ fdd	„	Zejjddd„ƒZejjddd„ƒZejjdd„ ƒZ	ddd„Z
dd„ Zdd„ Zdd„ Z‡  ZS )r   éè  ç      ð?r   é    Úavgçš™™™™™É?Úv1c	              
      s8  t t| ƒ ¡  |dkstdƒ‚|| _|| _|| _d| _g | _t	d| dƒ}	t
j||	ddddd	�| _| j t|	dd
d�¡ t
 |	¡| _t
jdd�| _|	}
t
 g ¡}d}d}d}| jD ]Ð}g }d}|D ]x\}}}}}t	|| dƒ}t	|| dƒ}i }|dk�r|dk�rd|d< | t|
||||fd|i|—Ž¡ |}
|d7 }qÂ|dk�rj|d9 }| j t|
|d|› �d�¡ | t
j|Ž ¡ |d7 }q²t	|| dƒ}| t
 t|
|dƒ¡¡ | | _}
t
j|Ž | _d | _}t|d�| _t
j|
|ddddd	�| _t
jdd�| _|�rt
 d¡nt
 ¡ | _ |dk�r*t!||ƒnt
 ¡ | _"d S )Nr]   z7only output_stride==32 is valid, dilation not supportedFé   r   r   r   r	   r   Ú	conv_stem)Znum_chsZ	reductionÚmoduleTr   r   Úv2ZattnrI   rX   zblocks.i   ©Z	pool_type)#r   r   r   ÚAssertionErrorÚcfgsÚnum_classesÚ	drop_rateÚgrad_checkpointingZfeature_infor   r   r!   rb   ÚappendÚdictr"   Úbn1r?   Úact1Z
ModuleListrM   r    r   Zpool_dimÚblocksÚnum_featuresr   Úglobal_poolÚ	conv_headÚact2ÚFlattenr#   Úflattenr   Ú
classifier)r'   rg   rh   ÚwidthZin_chansZoutput_striderq   ri   ÚversionZstem_chsZprev_chsZstagesZ	stage_idxZ	layer_idxZ
net_strideÚcfgZlayersÚsÚkZexp_sizeÚcrX   r   rW   Zlayer_kwargsr.   r0   r1   r   »   s`    

"

  ÿ


zGhostNet.__init__Fc                 C   s    t d|rdndd fdgd�}|S )Nz^conv_stem|bn1z^blocks\.(\d+)z^blocks\.(\d+)\.(\d+))rr   )iŸ† )Ústemro   )rl   )r'   ZcoarseZmatcherr0   r0   r1   Úgroup_matcherÿ   s    þþzGhostNet.group_matcherTc                 C   s
   || _ d S rY   )rj   )r'   Úenabler0   r0   r1   Úset_grad_checkpointing
  s    zGhostNet.set_grad_checkpointingc                 C   s   | j S rY   )rv   )r'   r0   r0   r1   Úget_classifier  s    zGhostNet.get_classifierc                 C   sL   || _ t|d�| _|r t d¡nt ¡ | _|dkr>t| j|ƒnt ¡ | _	d S )Nre   r	   r   )
rh   r   rq   r   rt   r#   ru   r   rp   rv   )r'   rh   rq   r0   r0   r1   Úreset_classifier  s    zGhostNet.reset_classifierc                 C   sN   |   |¡}|  |¡}|  |¡}| jr@tj ¡ s@t| j|dd�}n
|  |¡}|S )NT)ru   )	rb   rm   rn   rj   r4   ÚjitZis_scriptingr   ro   ©r'   r6   r0   r0   r1   Úforward_features  s    



zGhostNet.forward_featuresc                 C   sT   |   |¡}|  |¡}|  |¡}|  |¡}| jdkrFtj|| j| jd�}|  |¡}|S )NrN   )ÚpÚtraining)	rq   rr   rs   ru   ri   rJ   Zdropoutr‡   rv   r„   r0   r0   r1   Úforward_head#  s    





zGhostNet.forward_headc                 C   s   |   |¡}|  |¡}|S rY   )r…   rˆ   r„   r0   r0   r1   r:   -  s    

zGhostNet.forward)r[   r\   r   r]   r^   r_   r`   )F)T)r^   )r<   r=   r>   r   r4   rƒ   Úignorer~   r€   r�   r‚   r…   rˆ   r:   r@   r0   r0   r.   r1   r   º   s$          ÷D




)Úmodelc                 C   s,   i }|   ¡ D ]\}}d|krq|||< q|S )NÚtotal)Úitems)Z
state_dictrŠ   Zout_dictr{   Úvr0   r0   r1   Úcheckpoint_filter_fn3  s    
rŽ   r\   Fc                 K   s
  dddddggdddddggdddddggd	dd
ddggd	dd
ddggdddddggdddddgdddddgdddddgdddddgdddddggd	ddddggd	ddddgd	ddddgd	ddddgd	ddddggg	}t f ||dœ|—Ž}tt| |ftt dd�dœ|—ŽS )z%
    Constructs a GhostNet model
    r   ra   r   r	   é0   é   r   éH   rB   é(   g      Ð?éx   éð   éP   éÈ   é¸   ià  ép   i   é    iÀ  )rg   rw   T)Zflatten_sequential)Zpretrained_filter_fnZfeature_cfg)rl   r
   r   rŽ   )Úvariantrw   Ú
pretrainedÚkwargsrg   Zmodel_kwargsr0   r0   r1   Ú_create_ghostnet<  sF    üýìþýýûúr�   Ú c                 K   s   | dddddt tdddœ
|–S )	Nr[   )r   éà   rŸ   )é   r    g      ì?Zbicubicrb   rv   )
Úurlrh   Z
input_sizeZ	pool_sizeZcrop_pctÚinterpolationZmeanZstdZ
first_convrv   r   )r¡   rœ   r0   r0   r1   Ú_cfgi  s          üûr£   ztimm/)Z	hf_hub_id)zghostnet_050.untrainedzghostnet_100.in1kzghostnet_130.untrainedzghostnetv2_100.in1kzghostnetv2_130.in1kzghostnetv2_160.in1k)Úreturnc                 K   s   t dd| dœ|—Ž}|S )z GhostNet-0.5x Úghostnet_050g      à?©rw   r›   )r¥   ©r�   ©r›   rœ   rŠ   r0   r0   r1   r¥   ‰  s    r¥   c                 K   s   t dd| dœ|—Ž}|S )z GhostNet-1.0x Úghostnet_100r\   r¦   )r©   r§   r¨   r0   r0   r1   r©   �  s    r©   c                 K   s   t dd| dœ|—Ž}|S )z GhostNet-1.3x Úghostnet_130çÍÌÌÌÌÌô?r¦   )rª   r§   r¨   r0   r0   r1   rª   —  s    rª   c                 K   s   t dd| ddœ|—Ž}|S )z GhostNetV2-1.0x Úghostnetv2_100r\   rd   ©rw   r›   rx   )r¬   r§   r¨   r0   r0   r1   r¬   ž  s    r¬   c                 K   s   t dd| ddœ|—Ž}|S )z GhostNetV2-1.3x Úghostnetv2_130r«   rd   r­   )r®   r§   r¨   r0   r0   r1   r®   ¥  s    r®   c                 K   s   t dd| ddœ|—Ž}|S )z GhostNetV2-1.6x Úghostnetv2_160gš™™™™™ù?rd   r­   )r¯   r§   r¨   r0   r0   r1   r¯   ¬  s    r¯   )r\   F)rž   )F)F)F)F)F)F),rZ   r   Ú	functoolsr   r4   Ztorch.nnr   Ztorch.nn.functionalZ
functionalrJ   Z	timm.datar   r   Ztimm.layersr   r   r   Z_builderr
   Z_efficientnet_blocksr   r   Z_manipulater   Ú	_registryr   r   Ú__all__rS   ÚModuler   rA   rM   r   rŽ   r�   r£   Zdefault_cfgsr¥   r©   rª   r¬   r®   r¯   r0   r0   r0   r1   Ú<module>   s`   	$-Ky	
-

ÿÿÿÿñ