a
    þdé(  ã                   @   sZ  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 d&dd„Z!d'dd„Z"ee"ƒ e"dde"ƒ dœƒZ#ed(e dœd d!„ƒZ$ed)e dœd"d#„ƒZ%ed*e dœd$d%„ƒZ&dS )+a  
An implementation of GhostNet Model as defined in:
GhostNet: More Features from Cheap Operations. https://arxiv.org/abs/1911.11907
The train script of the model is similar to that of MobileNetV3
Original model: https://github.com/huawei-noah/CV-backbones/tree/master/ghostnet_pytorch
é    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                       s&   e Zd Zd	‡ fdd„	Zdd„ Z‡  ZS )
ÚGhostModuler	   é   é   Tc           
         s´   t t| ƒ ¡  || _t || ¡}||d  }	t tj|||||d ddt 	|¡|rbtj
ddnt ¡ ¡| _t tj||	|d|d |ddt 	|	¡|r¤tj
ddnt ¡ ¡| _d S )Nr	   r   F©ÚbiasT©Zinplace)Úgroupsr   )Úsuperr   Ú__init__Úout_chsÚmathÚceilÚnnÚ
SequentialÚConv2dÚBatchNorm2dÚReLUÚIdentityÚprimary_convÚcheap_operation)
ÚselfÚin_chsr   Zkernel_sizeZratioZdw_sizeÚstrideÚreluZinit_chsZnew_chs©Ú	__class__© ú]/var/www/html/stable-diffusion-webui/venv/lib/python3.9/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	   )Zdim)r$   r%   ÚtorchÚcatr   )r&   ÚxÚx1Zx2Úoutr,   r,   r-   Úforward7   s    

zGhostModule.forward)r	   r   r   r	   T)Ú__name__Ú
__module__Ú__qualname__r   r3   Ú__classcell__r,   r,   r*   r-   r      s        ør   c                       s4   e Zd ZdZddejdf‡ fdd„	Zdd„ Z‡  ZS )	ÚGhostBottleneckz  Ghost bottleneck w/ optional SEr   r	   ç        c           	         s  t t| ƒ ¡  |d uo|dk}|| _t||dd| _| jdkrnt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 )Nr9   T)r)   r	   r   F)r(   Úpaddingr   r   )Zrd_ratior   )r(   r:   r   )r   r8   r   r(   r   Úghost1r   r    Úconv_dwr!   Úbn_dwÚ	_SE_LAYERÚseÚghost2r   Úshortcut)	r&   r'   Úmid_chsr   Zdw_kernel_sizer(   Z	act_layerÚse_ratioZhas_ser*   r,   r-   r   A   s2    

þþúzGhostBottleneck.__init__c                 C   s\   |}|   |¡}| jd ur,|  |¡}|  |¡}| jd ur@|  |¡}|  |¡}||  |¡7 }|S ©N)r;   r<   r=   r?   r@   rA   )r&   r0   rA   r,   r,   r-   r3   o   s    






zGhostBottleneck.forward)	r4   r5   r6   Ú__doc__r   r"   r   r3   r7   r,   r,   r*   r-   r8   >   s   ø.r8   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çš™™™™™É?c                    s  t t| ƒ ¡  |dksJ 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 ¡}
t}d}d}| jD ] }g }d}|D ]H\}}}}}t|| dƒ}t|| dƒ}| ||	|||||d¡ |}	qÂ|dkr:|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 )NrH   z7only output_stride==32 is valid, dilation not supportedFé   r   r   r   r	   r   Ú	conv_stem)Znum_chsZ	reductionÚmoduleTr   r   )rC   zblocks.i   ©Z	pool_type)"r   r   r   ÚcfgsÚnum_classesÚ	drop_rateÚgrad_checkpointingZfeature_infor   r   r    rL   ÚappendÚdictr!   Úbn1r"   Úact1Z
ModuleListr8   r   r   Úpool_dimÚblocksZnum_featuresr   Úglobal_poolÚ	conv_headÚact2ÚFlattenr#   Úflattenr   Ú
classifier)r&   rO   rP   ÚwidthZin_chansZoutput_striderY   rQ   Zstem_chsZprev_chsZstagesÚblockZ	stage_idxZ
net_strideÚcfgZlayersÚsÚkZexp_sizeÚcrC   r   rB   r*   r,   r-   r   †   sT    



ÿ


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+))rZ   )iŸ† )ÚstemrX   )rT   )r&   ZcoarseZmatcherr,   r,   r-   Úgroup_matcherÅ   s    þþzGhostNet.group_matcherTc                 C   s
   || _ d S rD   )rR   )r&   Úenabler,   r,   r-   Úset_grad_checkpointingÐ   s    zGhostNet.set_grad_checkpointingc                 C   s   | j S rD   )r^   )r&   r,   r,   r-   Ú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 )NrN   r	   r   )
rP   r   rY   r   r\   r#   r]   r   rW   r^   )r&   rP   rY   r,   r,   r-   Úreset_classifierØ   s    zGhostNet.reset_classifierc                 C   sN   |   |¡}|  |¡}|  |¡}| jr@tj ¡ s@t| j|dd}n
|  |¡}|S )NT)r]   )	rL   rU   rV   rR   r.   ÚjitZis_scriptingr   rX   ©r&   r0   r,   r,   r-   Úforward_featuresß   s    



zGhostNet.forward_featuresc                 C   sT   |   |¡}|  |¡}|  |¡}|  |¡}| jdkrFtj|| j| jd}|  |¡}|S )Nr9   )ÚpÚtraining)	rY   rZ   r[   r]   rQ   ÚFZdropoutro   r^   rl   r,   r,   r-   Úforward_headé   s    





zGhostNet.forward_headc                 C   s   |   |¡}|  |¡}|S rD   )rm   rq   rl   r,   r,   r-   r3   ó   s    

zGhostNet.forward)rF   rG   r   rH   rI   rJ   )F)T)rI   )r4   r5   r6   r   r.   rk   Úignorerf   rh   ri   rj   rm   rq   r3   r7   r,   r,   r*   r-   r   …   s"         ø?




rG   Fc                 K   s¨   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 f ||dœ|¤Ž}tt| |fdt ddi|¤ŽS )z%
    Constructs a GhostNet model
    )r   rK   rK   r   r	   )r   é0   é   r   r   )r   éH   rt   r   r	   )é   ru   é(   ç      Ð?r   )rv   éx   rw   rx   r	   )r   éð   éP   r   r   )r   éÈ   r{   r   r	   )r   é¸   r{   r   r	   )r   ià  ép   rx   r	   )r   é   r~   rx   r	   )rv   r   é    rx   r   )rv   éÀ  r€   r   r	   )rv   r   r€   rx   r	   )rO   r_   Zfeature_cfgT)Zflatten_sequential)rT   r
   r   )Úvariantr_   Ú
pretrainedÚkwargsrO   Zmodel_kwargsr,   r,   r-   Ú_create_ghostnetù   sD    üýìþýýüûr…   Ú c                 K   s   | dddddt tdddœ
|¥S )	NrF   )r   éà   r‡   )é   rˆ   g      ì?ZbilinearrL   r^   )
ÚurlrP   Z
input_sizeZ	pool_sizeZcrop_pctÚinterpolationÚmeanZstdZ
first_convr^   r   )r‰   r„   r,   r,   r-   Ú_cfg%  s    üûrŒ   zZhttps://github.com/huawei-noah/CV-backbones/releases/download/ghostnet_pth/ghostnet_1x.pth)r‰   )zghostnet_050.untrainedzghostnet_100.in1kzghostnet_130.untrained)Úreturnc                 K   s   t dd| dœ|¤Ž}|S )z GhostNet-0.5x Úghostnet_050g      à?©r_   rƒ   )rŽ   ©r…   ©rƒ   r„   Úmodelr,   r,   r-   rŽ   7  s    rŽ   c                 K   s   t dd| dœ|¤Ž}|S )z GhostNet-1.0x Úghostnet_100rG   r   )r“   r   r‘   r,   r,   r-   r“   >  s    r“   c                 K   s   t dd| dœ|¤Ž}|S )z GhostNet-1.3x Úghostnet_130gÍÌÌÌÌÌô?r   )r”   r   r‘   r,   r,   r-   r”   E  s    r”   )rG   F)r†   )F)F)F)'rE   r   Ú	functoolsr   r.   Ztorch.nnr   Ztorch.nn.functionalZ
functionalrp   Z	timm.datar   r   Ztimm.layersr   r   r   Z_builderr
   Z_efficientnet_blocksr   r   Z_manipulater   Ú	_registryr   r   Ú__all__r>   ÚModuler   r8   r   r…   rŒ   Zdefault_cfgsrŽ   r“   r”   r,   r,   r,   r-   Ú<module>   s>   #Gt
,

ÿü