Ë
    éÓ^jî�  ã                   ó>  — d Z ddlZddlmZ ddlmZmZmZmZ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 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jT                  «      Z+ G d„ dejT                  «      Z, G d„ dejT                  «      Z- G d„ dejT                  «      Z. G d„ dejT                  «      Z/ G d„ dejT                  «      Z0dee1ejd                  f   dejT                  d ee1ejd                  f   fd!„Z3d5d"e1d#e4d$e5d%ed e0f
d&„Z6d6d'„Z7 e' e7«        e7d(¬)«       e7«        e7d(¬)«       e7d(¬)«       e7d(¬)«       e7«        e7d(¬)«       e7«        e7«       d*œ
«      Z8e&d7d e0fd+„«       Z9e&d7d e0fd,„«       Z:e&d7d e0fd-„«       Z;e&d7d e0fd.„«       Z<e&d7d e0fd/„«       Z=e&d7d e0fd0„«       Z>e&d7d$e5d%ed e0fd1„«       Z?e&d7d$e5d%ed e0fd2„«       Z@e&d7d$e5d%ed e0fd3„«       ZAe&d7d$e5d%ed e0fd4„«       ZBy)8a  
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
GhostNetV3: Exploring the Training Strategies for Compact Models. https://arxiv.org/abs/2404.11202

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
Original model: https://github.com/huawei-noah/Efficient-AI-Backbones/blob/master/ghostnetv3_pytorch/ghostnetv3.py
é    N)Úpartial)ÚAnyÚDictÚListÚSetÚOptionalÚTupleÚUnionÚType©ÚIMAGENET_DEFAULT_MEANÚIMAGENET_DEFAULT_STD)ÚSelectAdaptivePool2dÚLinearÚmake_divisible©Úreparameterize_modelé   )Úbuild_model_with_cfg)ÚSqueezeExciteÚ	ConvBnAct)Úfeature_take_indices)Úcheckpoint_seq)Úregister_modelÚgenerate_default_cfgsÚGhostNetÚhard_sigmoidé   )Údivisor)Ú
gate_layerÚrd_round_fnc                   ó²   ‡ — e Zd Zddddej                  ddfdedededed	ed
edeej                     fˆ fd„Zde	j                  de	j                  fd„Zˆ xZS )ÚGhostModuler   é   é   NÚin_chsÚout_chsÚkernel_sizeÚratioÚdw_sizeÚstrideÚ	act_layerc
           
      óÌ  •— ||	dœ}
t         ‰| �  «        || _        t        j                  ||z  «      }||dz
  z  }t        j                  t        j                  |||||dz  fddi|
¤Žt        j                  |fi |
¤Ž |d¬«      «      | _	        t        j                  t        j                  |||d|dz  f|ddœ|
¤Žt        j                  |fi |
¤Ž |d¬«      «      | _
        y )	N©ÚdeviceÚdtyper   r$   ÚbiasFT©Úinplace©Úgroupsr1   )ÚsuperÚ__init__r'   ÚmathÚceilÚnnÚ
SequentialÚConv2dÚBatchNorm2dÚprimary_convÚcheap_operation©Úselfr&   r'   r(   r)   r*   r+   r,   r/   r0   ÚddÚinit_chsÚnew_chsÚ	__class__s                €ú_/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/models/ghostnet.pyr7   zGhostModule.__init__%   sâ   ø€ ð ¨Ñ/ˆÜ‰ÑÔØˆŒÜ—9‘9˜W u™_Ó-ˆØ˜e a™iÑ(ˆäŸM™MÜ�I‰I�f˜h¨°V¸[ÈAÑ=MÑ`ÐTYÐ`Ð]_Ñ`Ü�N‰N˜8Ñ* rÑ*Ù˜dÔ#ó
ˆÔô  "Ÿ}™}Ü�I‰I�h ¨°!°W¸a±ZÐcÈÐW\ÑcÐ`bÑcÜ�N‰N˜7Ñ) bÑ)Ù˜dÔ#ó 
ˆÕó    ÚxÚreturnc                 ó®   — | j                  |«      }| j                  |«      }t        j                  ||gd¬«      }|d d …d | j                  …d d …d d …f   S )Nr   ©Údim)r>   r?   ÚtorchÚcatr'   )rA   rH   Úx1Úx2Úouts        rF   ÚforwardzGhostModule.forwardC   sR   € Ø×Ñ˜qÓ!ˆØ×!Ñ! "Ó%ˆÜ�i‰i˜˜R˜ aÔ(ˆØ’1�m�t—|‘|�m¢QªÐ)Ñ*Ð*rG   ©Ú__name__Ú
__module__Ú__qualname__r:   ÚReLUÚintr   ÚModuler7   rM   ÚTensorrR   Ú__classcell__©rE   s   @rF   r#   r#   $   sŠ   ø„ ð
  !ØØØØ)+¯©ØØñ
àð
ð ð
ð ð	
ð
 ð
ð ð
ð ð
ð ˜BŸI™I‘õ
ð<+˜Ÿ™ð +¨%¯,©,÷ +rG   r#   c                   ó²   ‡ — e Zd Zddddej                  ddfdedededed	ed
edeej                     fˆ fd„Zde	j                  de	j                  fd„Zˆ xZS )ÚGhostModuleV2r   r$   r%   Nr&   r'   r(   r)   r*   r+   r,   c
                 óZ  •— ||	dœ}
t         ‰| �  «        t        j                  «       | _        || _        t        j                  ||z  «      }||dz
  z  }t        j                  t        j                  |||||dz  fddi|
¤Žt        j                  |fi |
¤Ž |d¬«      «      | _        t        j                  t        j                  |||d|dz  f|ddœ|
¤Žt        j                  |fi |
¤Ž |d¬«      «      | _        t        j                  t        j                  |||||dz  fddi|
¤Žt        j                  |fi |
¤Žt        j                  ||fd	dd
|ddœ|
¤Žt        j                  |fi |
¤Žt        j                  ||fddd|ddœ|
¤Žt        j                  |fi |
¤Ž«      | _        y )Nr.   r   r$   r1   FTr2   r4   ©r   é   ©r   r$   ©r(   r+   Úpaddingr5   r1   ©ra   r   ©r$   r   )r6   r7   r:   ÚSigmoidÚgate_fnr'   r8   r9   r;   r<   r=   r>   r?   Ú
short_convr@   s                €rF   r7   zGhostModuleV2.__init__K   sŸ  ø€ ð ¨Ñ/ˆÜ‰ÑÔÜ—z‘z“|ˆŒØˆŒÜ—9‘9˜W u™_Ó-ˆØ˜e a™iÑ(ˆÜŸM™MÜ�I‰I�f˜h¨°V¸[ÈAÑ=MÑ`ÐTYÐ`Ð]_Ñ`Ü�N‰N˜8Ñ* rÑ*Ù˜dÔ#ó
ˆÔô
  "Ÿ}™}Ü�I‰I�h ¨°!°WÀ±\ÐeÈ(ÐY^ÑeÐbdÑeÜ�N‰N˜7Ñ) bÑ)Ù˜dÔ#ó 
ˆÔô
 Ÿ-™-Ü�I‰I�f˜g {°F¸KÈ1Ñ<LÑ_ÐSXÐ_Ð\^Ñ_Ü�N‰N˜7Ñ) bÑ)Ü�I‰I�g˜wÐw°FÀ1ÈfÐ]dÐkpÑwÐtvÑwÜ�N‰N˜7Ñ) bÑ)Ü�I‰I�g˜wÐw°FÀ1ÈfÐ]dÐkpÑwÐtvÑwÜ�N‰N˜7Ñ) bÑ)ó
ˆ�rG   rH   rI   c                 ó„  — | j                  t        j                  |dd¬«      «      }| j                  |«      }| j	                  |«      }t        j                  ||gd¬«      }|d d …d | j                  …d d …d d …f   t        j                  | j                  |«      |j                  d   |j                  d   fd¬«      z  S )	Nr$   ©r(   r+   r   rK   éþÿÿÿéÿÿÿÿÚnearest©ÚsizeÚmode)ri   ÚFÚ
avg_pool2dr>   r?   rM   rN   r'   Úinterpolaterh   Úshape)rA   rH   ÚresrO   rP   rQ   s         rF   rR   zGhostModuleV2.forwardp   s§   € Ø�o‰oœaŸl™l¨1¸!ÀAÔFÓGˆØ×Ñ˜qÓ!ˆØ×!Ñ! "Ó%ˆÜ�i‰i˜˜R˜ aÔ(ˆØ’1�m�t—|‘|�m¢QªÐ)Ñ*¬Q¯]©]Ø�L‰L˜Ó S§Y¡Y¨r¡]°C·I±I¸b±MÐ$BÈô.Tñ Tð 	TrG   rS   r\   s   @rF   r^   r^   J   sŽ   ø„ ð
  !ØØØØ)+¯©ØØñ#
àð#
ð ð#
ð ð	#
ð
 ð#
ð ð#
ð ð#
ð ˜BŸI™I‘õ#
ðJT˜Ÿ™ð T¨%¯,©,÷ TrG   r^   c                   ó¤   ‡ — e Zd Zddddej                  dddfdededed	ed
ededeej                     defˆ fd„Z	d„ Z
d„ Zd„ Zd„ Zd„ Zd„ Zˆ xZS )ÚGhostModuleV3r   r$   r%   ÚoriginalNr&   r'   r(   r)   r*   r+   r,   rq   c                 ó$  •— |	|
dœ}t         ‰| �  «        t        j                  «       | _        || _        t        j                  ||z  «      }||dz
  z  }|| _        d| _	        d| _
        | j                  s2t        j                  «       | _        t        j                  «       | _        d | _        d | _        t        j                   t#        | j                  «      D �cg c]  }t%        ||||f|dz  d dœ|¤Ž‘Œ c}«      | _         |d¬«      | _        t        j*                  |fi |¤Ž| _        t        j                   t#        | j                  «      D �cg c]  }t%        |||df|dz  dd d	œ|¤Ž‘Œ c}«      | _        t%        ||ddfd
dd d	œ|¤Ž| _         |d¬«      | _        | j                  dv r©t        j4                  t        j6                  |||||dz  fddi|¤Žt        j*                  |fi |¤Žt        j6                  ||fddd|ddœ|¤Žt        j*                  |fi |¤Žt        j6                  ||fddd|ddœ|¤Žt        j*                  |fi |¤Ž«      nt        j                  «       | _        || _        || _        || _        y c c}w c c}w )Nr.   r   r%   Fr$   )Úpad_typer,   Tr2   ©r{   Ú
group_sizer,   r   ©Úshortcutr1   r`   rb   rc   re   rf   ) r6   r7   r:   rg   rh   r'   r8   r9   rq   Únum_conv_branchesÚ
infer_modeÚIdentityr>   r?   Úprimary_rpr_skipÚprimary_rpr_scaleÚ
ModuleListÚranger   Úprimary_rpr_convÚprimary_activationr=   Úcheap_rpr_skipÚcheap_rpr_convÚcheap_rpr_scaleÚcheap_activationr;   r<   ri   Úin_channelsr5   r(   )rA   r&   r'   r(   r)   r*   r+   r,   rq   r/   r0   rB   rC   rD   Ú_rE   s                  €rF   r7   zGhostModuleV3.__init__z   s¦  ø€ ð ¨Ñ/ˆÜ‰ÑÔÜ—z‘z“|ˆŒØˆŒÜ—9‘9˜W u™_Ó-ˆØ˜e a™iÑ(ˆØˆŒ	Ø!"ˆÔØˆŒØ�ŠÜ "§¡£ˆDÔÜ#%§;¡;£=ˆDÔ à $ˆÔØ!%ˆÔÜ "§¡ô ˜T×3Ñ3Ó4ö
/
ð ô ØØØØð	ð
 %¨Ñ)Øñð óò
/
ó 
!ˆÔñ #,°DÔ"9ˆÔÜ Ÿn™n¨XÑ<¸Ñ<ˆÔÜ Ÿm™mô ˜T×3Ñ3Ó4ö-
ð ô ØØØØð		ð
 ! A™ØØñ	ð ó	ò-
ó ˆÔô  )¨°7¸A¸qÐqÈ1ÐYZÐfjÑqÐnpÑqˆÔÙ )°$Ô 7ˆÔð �Y‰Y˜,Ñ&ô Ÿ-™-Ü�I‰I�f˜g {°F¸KÈ¹NÑ]ÐQVÐ]ÐZ\Ñ]Ü�N‰N˜7Ñ) bÑ)Ü�I‰I�g˜wÐu°EÀ!ÈUÐ[bÐinÑuÐrtÑuÜ�N‰N˜7Ñ) bÑ)Ü�I‰I�g˜wÐu°EÀ!ÈUÐ[bÐinÑuÐrtÑuÜ�N‰N˜7Ñ) bÑ)ô
ô -/¯K©K«Mð 	Œð $ˆÔØˆŒØ"ˆÕùòS
/
ùò-
s   ÃJÅJc                 ó¼  — | j                   r#| j                  |«      }| j                  |«      }nd}| j                  D ]  }| ||«      z  }Œ | j	                  |«      }| j                  |«      | j                  |«      z   }| j                  D ]  }| ||«      z  }Œ | j                  |«      }t        j                  ||gd¬«      }| j                  dvr|S | j                  t        j                  |dd¬«      «      }|d d …d | j                  …d d …d d …f   t        j                   | j#                  |«      |j$                  d   |j$                  d   fd	¬
«      z  S )Nr   r   rK   r~   r$   rk   rl   rm   rn   ro   )r�   r>   r?   r‡   rˆ   r‹   r‰   rŠ   rŒ   rM   rN   rq   ri   rr   rs   r'   rt   rh   ru   )rA   rH   rO   rP   r‡   rŠ   rQ   rv   s           rF   rR   zGhostModuleV3.forwardÁ   sN  € Ø�?Š?Ø×"Ñ" 1Ó%ˆBØ×%Ñ% bÓ)‰BàˆBØ$(×$9Ñ$9ò *Ð ØÑ& qÓ)Ñ)‘ð*à×(Ñ(¨Ó,ˆBà×%Ñ% bÓ)¨D×,?Ñ,?ÀÓ,CÑCˆBØ"&×"5Ñ"5ò )�Ø‘n RÓ(Ñ(‘ð)à×&Ñ& rÓ*ˆBä�i‰i˜˜B˜ QÔ'ˆØ�9‰9˜LÑ(ØˆJà—/‘/¤!§,¡,¨q¸aÈÔ"JÓKˆCØ’q˜˜$Ÿ,™,˜¢qªÐ*Ñ+¬a¯m©mØ—‘˜SÓ!¨¯©°2©¸¿	¹	À"¹Ð(FÈYô/Xñ Xð XrG   c                 óÆ  — d}d}| j                   �G| j                  | j                   «      \  }}| j                  dz  }t        j                  |||||g«      }d}d}| j
                  �| j                  | j
                  «      \  }}d}d}t        | j                  «      D ]-  }| j                  | j                  |   «      \  }	}
||	z  }||
z  }Œ/ ||z   |z   }||z   |z   }||fS ©Nr   r$   )	r„   Ú_fuse_bn_tensorr(   rr   Úpadrƒ   r†   r€   r‡   ©rA   Úkernel_scaleÚ
bias_scaler“   Úkernel_identityÚbias_identityÚkernel_convÚ	bias_convÚixÚ_kernelÚ_biasÚkernel_finalÚ
bias_finals                rF   Ú_get_kernel_bias_primaryz&GhostModuleV3._get_kernel_bias_primaryØ   s  € ØˆØˆ
Ø×!Ñ!Ð-Ø'+×';Ñ';¸D×<RÑ<RÓ'SÑ$ˆL˜*Ø×"Ñ" aÑ'ˆCÜŸ5™5 °°S¸#¸sÐ/CÓDˆLàˆØˆØ× Ñ Ð,Ø-1×-AÑ-AÀ$×BWÑBWÓ-XÑ*ˆO˜]àˆØˆ	Ü˜×.Ñ.Ó/ò 	ˆBØ!×1Ñ1°$×2GÑ2GÈÑ2KÓL‰NˆG�UØ˜7Ñ"ˆKØ˜Ñ‰Ið	ð
 # \Ñ1°OÑCˆØ Ñ+¨mÑ;ˆ
Ø˜ZÐ'Ð'rG   c                 óÆ  — d}d}| j                   �G| j                  | j                   «      \  }}| j                  dz  }t        j                  |||||g«      }d}d}| j
                  �| j                  | j
                  «      \  }}d}d}t        | j                  «      D ]-  }| j                  | j                  |   «      \  }	}
||	z  }||
z  }Œ/ ||z   |z   }||z   |z   }||fS r‘   )	r‹   r’   r(   rr   r“   r‰   r†   r€   rŠ   r”   s                rF   Ú_get_kernel_bias_cheapz$GhostModuleV3._get_kernel_bias_cheapð   s  € ØˆØˆ
Ø×ÑÐ+Ø'+×';Ñ';¸D×<PÑ<PÓ'QÑ$ˆL˜*Ø×"Ñ" aÑ'ˆCÜŸ5™5 °°S¸#¸sÐ/CÓDˆLàˆØˆØ×ÑÐ*Ø-1×-AÑ-AÀ$×BUÑBUÓ-VÑ*ˆO˜]àˆØˆ	Ü˜×.Ñ.Ó/ò 	ˆBØ!×1Ñ1°$×2EÑ2EÀbÑ2IÓJ‰NˆG�UØ˜7Ñ"ˆKØ˜Ñ‰Ið	ð
 # \Ñ1°OÑCˆØ Ñ+¨mÑ;ˆ
Ø˜ZÐ'Ð'rG   c                 ó  — t        |t        «      r†|j                  j                  }|j                  j
                  }|j                  j                  }|j                  j                  }|j                  j                  }|j                  j                  }�n2t        |t        j                  «      sJ ‚t        | d«      sÂ| j                  | j                  z  }t        j                  | j                  || j                   | j                   f|j                  j"                  |j                  j$                  ¬«      }	t'        | j                  «      D ](  }
d|	|
|
|z  | j                   dz  | j                   dz  f<   Œ* |	| _        | j(                  }|j
                  }|j                  }|j                  }|j                  }|j                  }||z   j+                  «       }||z  j-                  dddd«      }||z  |||z  |z  z
  fS ©NÚ	id_tensor)r0   r/   r   r$   rm   ©Ú
isinstancer   ÚconvÚweightÚbn1Úrunning_meanÚrunning_varr1   Úepsr:   r=   Úhasattrr�   r5   rM   Úzerosr(   r0   r/   r†   r¥   ÚsqrtÚreshape©rA   ÚbranchÚkernelr«   r¬   ÚgammaÚbetar­   Ú	input_dimÚkernel_valueÚiÚstdÚts                rF   r’   zGhostModuleV3._fuse_bn_tensor  ó²  € Ü�fœiÔ(Ø—[‘[×'Ñ'ˆFØ!Ÿ:™:×2Ñ2ˆLØ Ÿ*™*×0Ñ0ˆKØ—J‘J×%Ñ%ˆEØ—:‘:—?‘?ˆDØ—*‘*—.‘.ŠCä˜f¤b§n¡nÔ5Ð5Ð5Ü˜4 Ô-Ø ×,Ñ,°·±Ñ;�	Ü$Ÿ{™{Ø×%Ñ% y°$×2BÑ2BÀD×DTÑDTÐUØ Ÿ-™-×-Ñ-Ø!Ÿ=™=×/Ñ/ô �ô
 ˜t×/Ñ/Ó0ò e�AØcd�L  A¨	¡M°4×3CÑ3CÀqÑ3HÈ$×JZÑJZÐ^_ÑJ_Ð!_Ò`ðeà!-�”Ø—^‘^ˆFØ!×.Ñ.ˆLØ ×,Ñ,ˆKØ—M‘MˆEØ—;‘;ˆDØ—*‘*ˆCØ˜SÑ ×&Ñ&Ó(ˆØ�S‰[×!Ñ! " a¨¨AÓ.ˆØ˜‰z˜4 ,°Ñ"6¸Ñ"<Ñ<Ð<Ð<rG   c           
      óV  — | j                   ry | j                  «       \  }}t        j                  | j                  d   j
                  j                  | j                  d   j
                  j                  | j                  d   j
                  j                  | j                  d   j
                  j                  | j                  d   j
                  j                  | j                  d   j
                  j                  | j                  d   j
                  j                  d¬«      | _        || j                  j                  _        || j                  j                   _        t        j"                  | j                  | j$                  �| j$                  nt        j"                  «       «      | _        | j'                  «       \  }}t        j                  | j(                  d   j
                  j                  | j(                  d   j
                  j                  | j(                  d   j
                  j                  | j(                  d   j
                  j                  | j(                  d   j
                  j                  | j(                  d   j
                  j                  | j(                  d   j
                  j                  d¬«      | _        || j*                  j                  _        || j*                  j                   _        t        j"                  | j*                  | j,                  �| j,                  nt        j"                  «       «      | _        | j/                  «       D ]  }|j1                  «        Œ t3        | d«      r| j5                  d«       t3        | d«      r| j5                  d«       t3        | d«      r| j5                  d«       t3        | d«      r| j5                  d«       t3        | d«      r| j5                  d«       t3        | d	«      r| j5                  d	«       d| _         y )
Nr   T©r�   Úout_channelsr(   r+   rd   Údilationr5   r1   r‡   r„   rƒ   rŠ   r‹   r‰   )r�   r    r:   r<   r‡   r¨   r�   r¿   r(   r+   rd   rÀ   r5   r>   r©   Údatar1   r;   rˆ   r¢   rŠ   r?   rŒ   Ú
parametersÚdetach_r®   Ú__delattr__)rA   Úprimary_kernelÚprimary_biasÚcheap_kernelÚ
cheap_biasÚparas         rF   Úswitch_to_deployzGhostModuleV3.switch_to_deploy&  sP  € Ø�?Š?ØØ'+×'DÑ'DÓ'FÑ$ˆ˜ÜŸI™IØ×-Ñ-¨aÑ0×5Ñ5×AÑAØ×.Ñ.¨qÑ1×6Ñ6×CÑCØ×-Ñ-¨aÑ0×5Ñ5×AÑAØ×(Ñ(¨Ñ+×0Ñ0×7Ñ7Ø×)Ñ)¨!Ñ,×1Ñ1×9Ñ9Ø×*Ñ*¨1Ñ-×2Ñ2×;Ñ;Ø×(Ñ(¨Ñ+×0Ñ0×7Ñ7Øô	
ˆÔð )7ˆ×Ñ× Ñ Ô%Ø&2ˆ×Ñ×ÑÔ#ÜŸM™MØ×ÑØ'+×'>Ñ'>Ð'JˆD×#Ò#ÔPR×P]ÑP]ÓP_ó
ˆÔð
 $(×#>Ñ#>Ó#@Ñ ˆ�jÜ!Ÿy™yØ×+Ñ+¨AÑ.×3Ñ3×?Ñ?Ø×,Ñ,¨QÑ/×4Ñ4×AÑAØ×+Ñ+¨AÑ.×3Ñ3×?Ñ?Ø×&Ñ& qÑ)×.Ñ.×5Ñ5Ø×'Ñ'¨Ñ*×/Ñ/×7Ñ7Ø×(Ñ(¨Ñ+×0Ñ0×9Ñ9Ø×&Ñ& qÑ)×.Ñ.×5Ñ5Øô	 
ˆÔð ,8ˆ×Ñ×#Ñ#Ô(Ø)3ˆ×Ñ×!Ñ!Ô&ä!Ÿ}™}Ø× Ñ Ø%)×%:Ñ%:Ð%FˆD×!Ò!ÌBÏMÉMËOó 
ˆÔð —O‘OÓ%ò 	ˆDØ�L‰L�Nð	ä�4Ð+Ô,Ø×ÑÐ/Ô0Ü�4Ð,Ô-Ø×ÑÐ0Ô1Ü�4Ð+Ô,Ø×ÑÐ/Ô0ä�4Ð)Ô*Ø×ÑÐ-Ô.Ü�4Ð*Ô+Ø×ÑÐ.Ô/Ü�4Ð)Ô*Ø×ÑÐ-Ô.àˆ�rG   c                 ó$   — | j                  «        y ©N©rÊ   ©rA   s    rF   ÚreparameterizezGhostModuleV3.reparameterizea  ó   € Ø×ÑÕrG   )rT   rU   rV   r:   rW   rX   r   rY   Ústrr7   rR   r    r¢   r’   rÊ   rÏ   r[   r\   s   @rF   rx   rx   y   s¦   ø„ ð
  !ØØØØ)+¯©Ø"ØØñE#àðE#ð ðE#ð ð	E#ð
 ðE#ð ðE#ð ðE#ð ˜BŸI™I‘ðE#ð õE#òNXò.(ò0(ò0=ò<9öv rG   rx   c                   óº   ‡ — e Zd ZdZddej
                  ddddfdeded	ed
ededeej                     de	de
fˆ fd„Zdej                  dej                  fd„Zˆ xZS )ÚGhostBottleneckz% GhostV1/V2 bottleneck w/ optional SEr%   r   ç        ry   Nr&   Úmid_chsr'   Údw_kernel_sizer+   r,   Úse_ratiorq   c                 ó<  •— |	|
dœ}t         ‰| �  «        |d uxr |dkD  }|| _        |dk(  rt        ||fd|i|¤Ž| _        nt        ||fd|i|¤Ž| _        | j                  dkD  rDt        j                  |||f||dz
  dz  |ddœ|¤Ž| _        t        j                  |fi |¤Ž| _
        nd | _        d | _
        |rt        |fd	|i|¤Žnd | _        t        ||fdt        j                  i|¤Ž| _        ||k(  r)| j                  dk(  rt        j                  «       | _        y t        j                  t        j                  |||f||dz
  dz  |ddœ|¤Žt        j                  |fi |¤Žt        j                  ||dfdd
ddœ|¤Žt        j                  |fi |¤Ž«      | _        y )Nr.   rÔ   ry   r,   r   r$   F©r+   rd   r5   r1   Úrd_ratior   ©r+   rd   r1   )r6   r7   r+   r#   Úghost1r^   r:   r<   Úconv_dwr=   Úbn_dwÚ	_SE_LAYERÚser‚   Úghost2r;   r   )rA   r&   rÕ   r'   rÖ   r+   r,   r×   rq   r/   r0   rB   Úhas_serE   s                €rF   r7   zGhostBottleneck.__init__h  sÎ  ø€ ð ¨Ñ/ˆÜ‰ÑÔØ Ð%Ò7¨(°R©-ˆØˆŒð �:ÒÜ% f¨gÑQÀÐQÈbÑQˆD�Kä'¨°ÑSÀ9ÐSÐPRÑSˆDŒKð �;‰;˜Š?ÜŸ9™9ØØØð	ð Ø'¨Ñ)¨AÑ-ØØñ	ð ñ	ˆDŒLô Ÿ™¨Ñ6°2Ñ6ˆD�JàˆDŒLØˆDŒJñ BH”)˜GÑ=¨hÐ=¸"Ò=ÈTˆŒô " '¨7ÑP¼b¿k¹kÐPÈRÑPˆŒð �WÒ §¡°Ò!1ÜŸM™M›OˆD�MäŸM™MÜ—	‘	ØØØ"ð	ð "Ø+¨AÑ-°Ñ1Ø!Øñ	ð ñ	ô —‘˜vÑ,¨Ñ,Ü—	‘	˜& '¨1ÐT°QÀÈÑTÐQSÑTÜ—‘˜wÑ-¨"Ñ-óˆD�MrG   rH   rI   c                 ó  — |}| j                  |«      }| j                  �"| j                  |«      }| j                  |«      }| j                  �| j                  |«      }| j	                  |«      }|| j                  |«      z  }|S rÌ   )rÜ   rÝ   rÞ   rà   rá   r   )rA   rH   r   s      rF   rR   zGhostBottleneck.forward«  s|   € Øˆð �K‰K˜‹Nˆð �<‰<Ð#Ø—‘˜Q“ˆAØ—
‘
˜1“ˆAð �7‰7ÐØ—‘˜“
ˆAð �K‰K˜‹Nˆà	ˆT�]‰]˜8Ó$Ñ$ˆØˆrG   )rT   rU   rV   Ú__doc__r:   rW   rX   r   rY   ÚfloatrÑ   r7   rM   rZ   rR   r[   r\   s   @rF   rÓ   rÓ   e  s¡   ø„ Ù/ð #$ØØ)+¯©Ø Ø"ØØñAàðAð ðAð ð	Að
  ðAð ðAð ˜BŸI™I‘ðAð ðAð õAðF˜Ÿ™ð ¨%¯,©,÷ rG   rÓ   c                   óÒ   ‡ — e Zd ZdZddej
                  ddddfdeded	ed
ededeej                     de	de
fˆ fd„Zdej                  dej                  fd„Zd„ Zd„ Zd„ Zd„ Zˆ xZS )ÚGhostBottleneckV3z" GhostV3 bottleneck w/ optional SEr%   r   rÔ   ry   Nr&   rÕ   r'   rÖ   r+   r,   r×   rq   c                 ó’  •— |	|
dœ}t         ‰| �  «        |d uxr |dkD  }|| _        d| _        d| _        | j                  s2t        j                  «       | _        t        j                  «       | _        t        ||f||dœ|¤Ž| _
        | j                  dkD  ryt        j                  t        | j                  «      D �cg c]  }t        ||||f|dz
  dz  dd dœ|¤Ž‘Œ c}«      | _        t        ||ddfd	dd dœ|¤Ž| _        || _        || _        n2t        j                  «       | _        t        j                  «       | _        d | _        |rt'        |fd
|i|¤Žnt        j                  «       | _        t        ||ft
        j                  ddœ|¤Ž| _        ||k(  r)| j                  dk(  rt        j                  «       | _        y t        j.                  t        j0                  |||f||dz
  dz  |ddœ|¤Žt        j2                  |fi |¤Žt        j0                  ||dfdd	ddœ|¤Žt        j2                  |fi |¤Ž«      | _        y c c}w )Nr.   rÔ   r%   F)r,   rq   r   r$   r|   r   rÚ   ry   rÙ   rÛ   )r6   r7   r+   r€   r�   r:   r‚   rÝ   rÞ   rx   rÜ   r…   r†   r   Údw_rpr_convÚdw_rpr_scaler(   r�   Údw_rpr_skiprß   rà   rá   r   r;   r<   r=   )rA   r&   rÕ   r'   rÖ   r+   r,   r×   rq   r/   r0   rB   râ   rŽ   rE   s                 €rF   r7   zGhostBottleneckV3.__init__Ä  sO  ø€ ð ¨Ñ/ˆÜ‰ÑÔØ Ð%Ò7¨(°R©-ˆØˆŒà!"ˆÔØˆŒØ�ŠÜŸ;™;›=ˆDŒLÜŸ™›ˆDŒJô $ F¨GÐZ¸yÈtÑZÐWYÑZˆŒð �;‰;˜Š?Ü!Ÿ}™}ô ˜T×3Ñ3Ó4ö
.ð ô /8ØØØØð		/ð
 )¨1Ñ,°Ñ2ØØñ	/ð ó	/ò 
.ó 
 ˆDÔô !*¨'°7¸A¸qÐ qÈ1ÐYZÐfjÑ qÐnpÑ qˆDÔØ-ˆDÔØ&ˆDÕä!Ÿ}™}›ˆDÔÜ "§¡£ˆDÔØˆÔñ BH”)˜GÑ=¨hÐ=¸"Ò=ÌRÏ[É[Ë]ˆŒô $ G¨WÐcÄÇÁÐR\ÑcÐ`bÑcˆŒð �WÒ §¡°Ò!1ÜŸK™K›MˆD�MäŸM™MÜ—	‘	ØØØ"ð	ð "Ø+¨AÑ-°Ñ1Ø!Øñ	ð ñ	ô —‘˜vÑ,¨Ñ,Ü—	‘	˜& '¨1ÐT°QÀÈÑTÐQSÑTÜ—‘˜wÑ-¨"Ñ-óˆD�Mùò=
.s   Â= IrH   rI   c                 ór  — |}| j                  |«      }| j                  dkD  r^| j                  r#| j                  |«      }| j	                  |«      }n/| j                  |«      }| j                  D ]  }| ||«      z  }Œ |}| j                  |«      }| j                  |«      }|| j                  |«      z  }|S )Nr   )
rÜ   r+   r�   rÝ   rÞ   rê   ré   rà   rá   r   )rA   rH   r   rO   ré   s        rF   rR   zGhostBottleneckV3.forward  s²   € Øˆð �K‰K˜‹Nˆð �;‰;˜Š?Ø�ŠØ—L‘L “O�Ø—J‘J˜q“M‘à×&Ñ& qÓ)�Ø#'×#3Ñ#3ò )�KØ™+ a›.Ñ(‘Bð)à�ð �G‰G�A‹Jˆð �K‰K˜‹Nˆà	ˆT�]‰]˜8Ó$Ñ$ˆØˆrG   c                 óÆ  — d}d}| j                   �G| j                  | j                   «      \  }}| j                  dz  }t        j                  |||||g«      }d}d}| j
                  �| j                  | j
                  «      \  }}d}d}t        | j                  «      D ]-  }| j                  | j                  |   «      \  }	}
||	z  }||
z  }Œ/ ||z   |z   }||z   |z   }||fS r‘   )	rê   r’   r(   rr   r“   rë   r†   r€   ré   r”   s                rF   Ú_get_kernel_bias_dwz%GhostBottleneckV3._get_kernel_bias_dw)  s  € ØˆØˆ
Ø×ÑÐ(Ø'+×';Ñ';¸D×<MÑ<MÓ'NÑ$ˆL˜*Ø×"Ñ" aÑ'ˆCÜŸ5™5 °°S¸#¸sÐ/CÓDˆLàˆØˆØ×ÑÐ'Ø-1×-AÑ-AÀ$×BRÑBRÓ-SÑ*ˆO˜]àˆØˆ	Ü˜×.Ñ.Ó/ò 	ˆBØ!×1Ñ1°$×2BÑ2BÀ2Ñ2FÓG‰NˆG�UØ˜7Ñ"ˆKØ˜Ñ‰Ið	ð
 # \Ñ1°OÑCˆØ Ñ+¨mÑ;ˆ
Ø˜ZÐ'Ð'rG   c                 ó  — t        |t        «      r†|j                  j                  }|j                  j
                  }|j                  j                  }|j                  j                  }|j                  j                  }|j                  j                  }�n2t        |t        j                  «      sJ ‚t        | d«      sÂ| j                  | j                  z  }t        j                  | j                  || j                   | j                   f|j                  j"                  |j                  j$                  ¬«      }	t'        | j                  «      D ](  }
d|	|
|
|z  | j                   dz  | j                   dz  f<   Œ* |	| _        | j(                  }|j
                  }|j                  }|j                  }|j                  }|j                  }||z   j+                  «       }||z  j-                  dddd«      }||z  |||z  |z  z
  fS r¤   r¦   r²   s                rF   r’   z!GhostBottleneckV3._fuse_bn_tensorA  r¼   rG   c           
      ó  — | j                   s| j                  dk(  ry | j                  «       \  }}t        j                  | j
                  d   j                  j                  | j
                  d   j                  j                  | j
                  d   j                  j                  | j
                  d   j                  j                  | j
                  d   j                  j                  | j
                  d   j                  j                  | j
                  d   j                  j                  d¬«      | _        || j                  j                  _        || j                  j                   _        t        j"                  «       | _        | j'                  «       D ]  }|j)                  «        Œ t+        | d«      r| j-                  d«       t+        | d«      r| j-                  d«       t+        | d«      r| j-                  d«       d| _         y )Nr   r   Tr¾   ré   rê   rë   )r�   r+   rî   r:   r<   ré   r¨   r�   r¿   r(   rd   rÀ   r5   rÝ   r©   rÁ   r1   r‚   rÞ   rÂ   rÃ   r®   rÄ   )rA   Ú	dw_kernelÚdw_biasrÉ   s       rF   rÊ   z"GhostBottleneckV3.switch_to_deploy_  s–  € Ø�?Š?˜dŸk™k¨QÒ.ØØ!×5Ñ5Ó7Ñˆ	�7Ü—y‘yØ×(Ñ(¨Ñ+×0Ñ0×<Ñ<Ø×)Ñ)¨!Ñ,×1Ñ1×>Ñ>Ø×(Ñ(¨Ñ+×0Ñ0×<Ñ<Ø×#Ñ# AÑ&×+Ñ+×2Ñ2Ø×$Ñ$ QÑ'×,Ñ,×4Ñ4Ø×%Ñ% aÑ(×-Ñ-×6Ñ6Ø×#Ñ# AÑ&×+Ñ+×2Ñ2Øô	
ˆŒð $-ˆ�‰×ÑÔ Ø!(ˆ�‰×ÑÔÜ—[‘[“]ˆŒ
ð —O‘OÓ%ò 	ˆDØ�L‰L�Nð	ä�4˜Ô'Ø×Ñ˜]Ô+Ü�4˜Ô(Ø×Ñ˜^Ô,Ü�4˜Ô'Ø×Ñ˜]Ô+àˆ�rG   c                 ó$   — | j                  «        y rÌ   rÍ   rÎ   s    rF   rÏ   z GhostBottleneckV3.reparameterize}  rÐ   rG   )rT   rU   rV   rä   r:   rW   rX   r   rY   rå   rÑ   r7   rM   rZ   rR   rî   r’   rÊ   rÏ   r[   r\   s   @rF   rç   rç   Á  sµ   ø„ Ù,ð #$ØØ)+¯©Ø Ø"ØØñIàðIð ðIð ð	Ið
  ðIð ðIð ˜BŸI™I‘ðIð ðIð õIðV˜Ÿ™ð ¨%¯,©,ó ò4(ò0=ò<ö< rG   rç   c                   ó6  ‡ — e Zd Z	 	 	 	 	 	 	 	 	 d!deeeeeef            dededededededefˆ fd	„Ze	j                  j                  d
efd„«       Ze	j                  j                  d"ded
eeef   fd„«       Ze	j                  j                  d#defd„«       Ze	j                  j                  d
ej(                  fd„«       Zd$ded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e	j.                  d
e	j.                  fd„Zd"de	j.                  ded
e	j.                  fd„Zde	j.                  d
e	j.                  fd„Zd „ Zˆ xZ S )'r   ÚcfgsÚnum_classesÚwidthÚin_chansÚoutput_strideÚglobal_poolÚ	drop_rateÚversionc                 ó  •— t         ‰| �  «        |	|
dœ}|dk(  sJ d«       ‚|| _        || _        || _        || _        d| _        g | _        |dk(  rt        nt        }t        d|z  d«      }t        j                  ||dd	d
fddi|¤Ž| _        | j                  j                  t        |d	d¬«      «       t        j                   |fi |¤Ž| _        t        j$                  d¬«      | _        |}t        j(                  g «      }d}d}d	}| j                  D ]Ù  }g }d
}|D ]t  \  }}}}}t        ||z  d«      }t        ||z  d«      }t        di |¤Ž}|dk(  r
|d
kD  rd|d<   |dk(  r
|d
kD  rd|d<   |j                   ||||||fd|i|¤Ž«       |}|d
z  }Œv |d
kD  r/|d	z  }| j                  j                  t        ||d|› �¬«      «       |j                  t        j*                  |Ž «       |d
z  }ŒÛ t        |z  d«      }|j                  t        j*                  t-        ||d
fi |¤Ž«      «       |x| _        }t        j*                  |Ž | _        || _        dx| _        }t7        |¬«      | _        t        j                  ||d
d
dfddi|¤Ž| _        t        j$                  d¬«      | _        |rt        j>                  d
«      nt        j@                  «       | _!        |dkD  rtE        ||fi |¤Ž| _#        y t        j@                  «       | _#        y )Nr.   é    z7only output_stride==32 is valid, dilation not supportedFÚv3é   r   r%   r$   r   r1   Ú	conv_stem)Únum_chsÚ	reductionÚmoduleTr2   r   Úv2Úattnrq   r   r×   zblocks.i   ©Ú	pool_type© )$r6   r7   rõ   rö   rø   rû   Úgrad_checkpointingÚfeature_inforç   rÓ   r   r:   r<   r  ÚappendÚdictr=   rª   rW   Úact1r…   r;   r   Úpool_dimÚblocksÚnum_featuresÚhead_hidden_sizer   rú   Ú	conv_headÚact2ÚFlattenr‚   Úflattenr   Ú
classifier)rA   rõ   rö   r÷   rø   rù   rú   rû   rü   r/   r0   rB   Ú
BottleneckÚstem_chsÚprev_chsÚstagesÚ	stage_idxÚ	layer_idxÚ
net_strideÚcfgÚlayersÚsÚkÚexp_sizeÚcr×   r'   rÕ   Úlayer_kwargsrE   s                                €rF   r7   zGhostNet.__init__‚  s  ø€ ô 	‰ÑÔØ¨Ñ/ˆà Ò"Ð]Ð$]Ó]Ð"ØˆŒ	Ø&ˆÔØ ˆŒØ"ˆŒØ"'ˆÔØˆÔØ*1°Tª/Õ&¼ˆ
ô " " u¡*¨aÓ0ˆÜŸ™ 8¨X°q¸!¸QÑQÀUÐQÈbÑQˆŒØ×Ñ× Ñ ¤¨hÀ!ÈiÔ!YÔZÜ—>‘> (Ñ1¨bÑ1ˆŒÜ—G‘G DÔ)ˆŒ	Øˆô —‘˜rÓ"ˆØˆ	Øˆ	Øˆ
Ø—9‘9ò 	ˆCØˆFØˆAØ/2ò 
Ñ+��8˜Q ¨!Ü(¨¨U©°AÓ6�Ü(¨°EÑ)9¸1Ó=�Ü#™z b™z�Ø˜d’? y°1¢}Ø+1�L Ñ(Ø˜d’? y°1¢}Ø+5�L Ñ(Ø—‘™j¨°7¸GÀQÈÑmÐT\ÐmÐ`lÑmÔnØ"�Ø˜Q‘‘	ð
ð �1ŠuØ˜a‘�
Ø×!Ñ!×(Ñ(¬Ø$°
ÀWÈYÈKÐCXô*Zô [à�M‰Mœ"Ÿ-™-¨Ð0Ô1Ø˜‰N‰Ið'	ô* ! ¨EÑ!1°1Ó5ˆØ�‰”b—m‘m¤I¨h¸ÀÑ$IÀbÑ$IÓJÔKØ#*Ð*ˆŒ˜ä—m‘m VÐ,ˆŒð %ˆÔØ*.Ð.ˆÔ Ü/¸+ÔFˆÔÜŸ™ 8¨W°a¸¸AÑOÀDÐOÈBÑOˆŒÜ—G‘G DÔ)ˆŒ	Ù(3”r—z‘z !”}¼¿¹»ˆŒØ@KÈaÂœ& ¨+Ñ<¸Ñ<ˆ�ÔUW×U`ÑU`ÓUbˆ�rG   rI   c                 ó   — t        «       S rÌ   )ÚsetrÎ   s    rF   Úno_weight_decayzGhostNet.no_weight_decayÎ  s	   € ä‹uˆrG   Úcoarsec                 ó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  )rA   r)  Úmatchers      rF   Úgroup_matcherzGhostNet.group_matcherÒ  s,   € äØ"á&,Ñ"Ð2JÈDÐQØ(ðô
ˆð ˆrG   Úenablec                 ó   — || _         y rÌ   )r
  )rA   r.  s     rF   Úset_grad_checkpointingzGhostNet.set_grad_checkpointingÝ  s
   € à"(ˆÕrG   c                 ó   — | j                   S rÌ   )r  rÎ   s    rF   Úget_classifierzGhostNet.get_classifierá  s   € à�‰ÐrG   c                 ó†  — || _         t        |¬«      | _        |rt        j                  d«      nt        j
                  «       | _        |dkD  r[t        | j                  || j                  j                  j                  | j                  j                  j                  ¬«      | _        y t        j
                  «       | _        y )Nr  r   r   r.   )rö   r   rú   r:   r  r‚   r  r   r  r  r©   r/   r0   r  )rA   rö   rú   s      rF   Úreset_classifierzGhostNet.reset_classifierå  s‰   € Ø&ˆÔä/¸+ÔFˆÔÙ(3”r—z‘z !”}¼¿¹»ˆŒð ˜1Š_ô !Ø×!Ñ! ;Ø—>‘>×(Ñ(×/Ñ/°t·~±~×7LÑ7L×7RÑ7Rô
ˆ�ô #%§+¡+£-ð 	�rG   rH   Ú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.rm   r   Nr  ú.r   )Ústart)r  rX   Úsplitr   Úlenr  r  rª   r  rM   ÚjitÚis_scriptingr  Ú	enumerater
  r   )rA   rH   r5  r6  r7  r8  r9  ÚintermediatesÚinfoÚ
stage_endsÚtake_indicesÚ	max_indexr¹   Úfeat_idxr  Ústages                   rF   Úforward_intermediateszGhostNet.forward_intermediatesï  s†  € ð* ˜YÑ&ÐDÐ(DÓDÐ&ØˆØ�TÈD×L]ÑL]Ð^_Ð^`ÐLaÖbÀDœS  h¡×!5Ñ!5°cÓ!:¸2Ñ!>Õ?ÒbÑbˆ
Ü"6´s¸:³ÈÓ"PÑˆ�iØ1=Ö>¨A˜
 1™ a›Ð>ˆÐ>Ø˜yÑ)ˆ	ð ˆØ�N‰N˜1ÓˆØ�|Ñ#Ø× Ñ  Ô#Ø�H‰H�Q‹KˆØ�I‰I�a‹LˆÜ�9‰9×!Ñ!Ô#©:Ø—[‘[‰Fà—[‘[  )¨a¡-Ð0ˆFä(¨°qÔ9ò 	(‰OˆH�eØ×&Ò&¬u¯y©y×/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.
        rm   r   Nr  r<  r   Ú )r  rX   r>  r   r?  r  r4  )rA   r5  rK  rL  rD  rE  rF  rG  s           rF   Úprune_intermediate_layersz"GhostNet.prune_intermediate_layers$  s—   € ð �TÈD×L]ÑL]Ð^_Ð^`ÐLaÖbÀDœS  h¡×!5Ñ!5°cÓ!:¸2Ñ!>Õ?ÒbÑbˆ
Ü"6´s¸:³ÈÓ"PÑˆ�iØ˜yÑ)ˆ	Ø—k‘k . 9¨q¡=Ð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
  rM   r@  rA  r   r  ©rA   rH   s     rF   Úforward_featureszGhostNet.forward_features4  so   € Ø�N‰N˜1ÓˆØ�H‰H�Q‹KˆØ�I‰I�a‹LˆØ×"Ò"¬5¯9©9×+AÑ+AÔ+CÜ˜tŸ{™{¨A°tÔ<ˆAð ˆð —‘˜A“ˆAØˆrG   Ú
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û   rr   ÚdropoutrV  r  )rA   rH   rS  s      rF   Úforward_headzGhostNet.forward_head>  sv   € Ø×Ñ˜QÓˆØ�N‰N˜1ÓˆØ�I‰I�a‹LˆØ�L‰L˜‹OˆØ�>‰>˜BÒÜ—	‘	˜!˜tŸ~™~¸¿¹ÔFˆAÙˆqÐ6 D§O¡O°AÓ$6Ð6rG   c                 óJ   — | j                  |«      }| j                  |«      }|S rÌ   )rR  rX  rQ  s     rF   rR   zGhostNet.forwardG  s'   € Ø×!Ñ! !Ó$ˆØ×Ñ˜aÓ ˆØˆrG   c                 ó   — t        | d¬«       y )NFr2   r   rÎ   s    rF   Úconvert_to_deployzGhostNet.convert_to_deployL  s   € Ü˜T¨5Ö1rG   )	éè  ç      ð?r%   rþ   Úavggš™™™™™É?Úv1NN©F)T)r^  )NFFr;  F)r   FT)!rT   rU   rV   r   r
   rX   rå   rÑ   r7   rM   r@  Úignorer   r(  Úboolr   r   r-  r0  r:   rY   r2  r4  rZ   r   r	   rJ  rO  rR  rX  rR   r[  r[   r\   s   @rF   r   r   �  s‰  ø„ ð  $ØØØ!#Ø$Ø"ØØØñHcà�t˜D  s¨E zÑ!2Ñ3Ñ4Ñ5ðHcð ðHcð ð	Hcð
 ðHcð ðHcð ðHcð ðHcð õHcðX ‡Y�Y×Ñð ò ó ðð ‡Y�Y×Ññ Dð °T¸#¸s¸(±^ò ó ðð ‡Y�Y×Ññ)¨Tò )ó ð)ð ‡Y�Y×Ñð §	¡	ò ó ðñ0¨Cð 0¸có 0ð 8<ØØ$Ø$Ø',ñ3 à�|‰|ð3 ð ˜e C¨¨c© NÑ3Ñ4ð3 ð ð	3 ð
 ð3 ð ð3 ð !%ð3 ð 
ˆt�E—L‘LÑ! 5¨¯©°t¸E¿L¹LÑ7IÐ)IÑ#JÐJÑ	Kó3 ðn ./Ø$Ø#ñ	à˜3  S¡	˜>Ñ*ðð ðð ó	ð  %§,¡,ð °5·<±<ó ñ7˜eŸl™lð 7¸ð 7ÈÏÉó 7ð˜Ÿ™ð ¨%¯,©,ó ö
2rG   Ú
state_dictÚmodelrI   c                 óÈ   — d| v r| d   } i }| j                  «       D ]C  \  }}d|v rd|v r|j                  dd«      }d|v rd|v r|j                  dd«      }d|v rŒ?|||<   ŒE |S )Nrc  zbn.z.ghostzbn1.z.dw_rpr_Útotal)ÚitemsÚreplace)rc  rd  Úout_dictr"  Úvs        rF   Úcheckpoint_filter_fnrk  P  s‰   € Ø�zÑ!Ø Ñ-ˆ
à€HØ× Ñ Ó"ò ‰ˆˆ1Ø�A‰:˜( a™-Ø—	‘	˜% Ó(ˆAØ�A‰:˜*¨™/Ø—	‘	˜% Ó(ˆAØ�a‰<ØØˆ�Šðð €OrG   Úvariantr÷   Ú
pretrainedÚkwargsc                 óÚ   — 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   rq  r   r   )ra   rr  é(   ç      Ð?r$   )ra   éx   rs  rt  r   )r%   éð   éP   r   r$   )r%   éÈ   rw  r   r   )r%   é¸   rw  r   r   )r%   ià  ép   rt  r   )r%   é   rz  rt  r   )ra   r{  é    rt  r$   )ra   éÀ  r|  r   r   )ra   r}  r|  rt  r   )rõ   r÷   T)Úflatten_sequential)Úpretrained_filter_fnÚfeature_cfgr	  )r  r   r   rk  )rl  r÷   rm  rn  rõ   Úmodel_kwargss         rF   Ú_create_ghostnetr‚  `  s±   € ò 
Ðâ	ÐÚ	Ðâ	Ð Ú	Ð â	ÐÚ	Ú	Ú	Ú	Ú	ð		
ò 
 Ð Ú	Ú	Ú	Ú	ð	
ð)€Dô4 ð ØØñð ñ€Lô
  ÜØØðô 2Ü¨DÔ1ñð ñð rG   c                 ó2   — | dddddt         t        dddd	œ|¥S )
Nr\  )r%   éà   r„  )é   r…  g      ì?Úbicubicr  r  z
apache-2.0)Úurlrö   Ú
input_sizeÚ	pool_sizeÚcrop_pctÚinterpolationÚmeanrº   Ú
first_convr  Úlicenser   )r‡  rn  s     rF   Ú_cfgr�  �  s3   € à 4°}ÐSYØ¨IÜ%Ô.BØ!°Øñð ðð rG   ztimm/)Ú	hf_hub_id)
zghostnet_050.untrainedzghostnet_100.in1kzghostnet_130.untrainedzghostnetv2_100.in1kzghostnetv2_130.in1kzghostnetv2_160.in1kzghostnetv3_050.untrainedzghostnetv3_100.in1kzghostnetv3_130.untrainedzghostnetv3_160.untrainedc                 ó"   — t        dd| dœ|¤Ž}|S )z GhostNet-0.5x ç      à?©r÷   rm  )Úghostnet_050©r‚  ©rm  rn  rd  s      rF   r”  r”  µ  ó   € ô ÐX°3À:ÑXÐQWÑX€EØ€LrG   c                 ó"   — t        dd| dœ|¤Ž}|S )z GhostNet-1.0x r]  r“  )Úghostnet_100r•  r–  s      rF   r™  r™  ¼  r—  rG   c                 ó"   — t        dd| dœ|¤Ž}|S )z GhostNet-1.3x çÍÌÌÌÌÌô?r“  )Úghostnet_130r•  r–  s      rF   rœ  rœ  Ã  r—  rG   c                 ó$   — t        dd| ddœ|¤Ž}|S )z GhostNetV2-1.0x r]  r  ©r÷   rm  rü   )Úghostnetv2_100r•  r–  s      rF   rŸ  rŸ  Ê  ó!   € ô Ðh°SÀZÐY]ÑhÐagÑh€EØ€LrG   c                 ó$   — t        dd| ddœ|¤Ž}|S )z GhostNetV2-1.3x r›  r  rž  )Úghostnetv2_130r•  r–  s      rF   r¢  r¢  Ñ  r   rG   c                 ó$   — t        dd| ddœ|¤Ž}|S )z GhostNetV2-1.6x çš™™™™™ù?r  rž  )Úghostnetv2_160r•  r–  s      rF   r¥  r¥  Ø  r   rG   c                 ó$   — t        dd| ddœ|¤Ž}|S )z GhostNetV3-0.5x r’  rÿ   rž  )Úghostnetv3_050r•  r–  s      rF   r§  r§  ß  r   rG   c                 ó$   — t        dd| ddœ|¤Ž}|S )z GhostNetV3-1.0x r]  rÿ   rž  )Úghostnetv3_100r•  r–  s      rF   r©  r©  æ  r   rG   c                 ó$   — t        dd| ddœ|¤Ž}|S )z GhostNetV3-1.3x r›  rÿ   rž  )Úghostnetv3_130r•  r–  s      rF   r«  r«  í  r   rG   c                 ó$   — t        dd| ddœ|¤Ž}|S )z GhostNetV3-1.6x r¤  rÿ   rž  )Úghostnetv3_160r•  r–  s      rF   r­  r­  ô  r   rG   )r]  F)rN  r`  )Crä   r8   Ú	functoolsr   Útypingr   r   r   r   r   r	   r
   r   rM   Útorch.nnr:   Útorch.nn.functionalÚ
functionalrr   Ú	timm.datar   r   Útimm.layersr   r   r   Útimm.utils.modelr   Ú_builderr   Ú_efficientnet_blocksr   r   Ú	_featuresr   Ú_manipulater   Ú	_registryr   r   Ú__all__rß   rY   r#   r^   rx   rÓ   rç   r   rÑ   rZ   rk  rå   rb  r‚  r�  Údefault_cfgsr”  r™  rœ  rŸ  r¢  r¥  r§  r©  r«  r­  r	  rG   rF   ú<module>r½     sò  ðñ
ó Ý ß E× EÓ Eã Ý ß Ð ç Aß DÑ DÝ 1å *ß :Ý +Ý 'ß <àˆ,€ñ �M¨nÉ'ÐR`ÐjkÔJlÔm€	ô#+�"—)‘)ô #+ôL,T�B—I‘Iô ,Tô^i �B—I‘Iô i ôXY�b—i‘iô Yôx} ˜Ÿ	™	ô } ô@L2ˆr�y‰yô L2ð^ T¨#¨u¯|©|Ð*;Ñ%<ð ÀRÇYÁYð ÐSWÐX[Ð]b×]iÑ]iÐXiÑSjó ñ *˜cð *¨%ð *À4ð *Ð[^ð *Ðckó *óZñ %Ù"›fÙØôñ #›fÙØôñ  Øôñ  Øôñ !%£ÙØôñ !%£Ù $£ñ3&ó €ð: ñ°ò ó ðð ñ°ò ó ðð ñ°ò ó ðð ñ°(ò ó ðð ñ°(ò ó ðð ñ°(ò ó ðð ñ˜tð °sð ¸xò ó ðð ñ˜tð °sð ¸xò ó ðð ñ˜tð °sð ¸xò ó ðð ñ˜tð °sð ¸xò ó ñrG   