Ë
    éÓ^j P  ã                   ó  — d Z ddlZddlmZ ddl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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jJ                  «      Z& G d„ dejJ                  «      Z' G d„ dejJ                  «      Z(d'de
j                  jJ                  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"„«       Z0e!d*de(fd#„«       Z1e!d*de(fd$„«       Z2e!d*de(fd%„«       Z3e!d*de(fd&„«       Z4y)+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ÚType©Ú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                   ó†   ‡ — e Zd Z	 	 	 	 	 	 	 ddededededededefˆ fd„Zd	„ Zd
„ Zed„ «       Z	edd„«       Z
d„ Zd„ Zˆ xZS )ÚRepGhostModuleÚin_chsÚout_chsÚkernel_sizeÚdw_sizeÚstrideÚreluÚreparamc
           
      ó0  •— ||	dœ}
t         ‰| �  «        || _        |}|}t        j                  t        j
                  |||||dz  fddi|
¤Žt        j                  |fi |
¤Ž|rt        j                  d¬«      nt        j                  «       «      | _	        g }g }|rH|j                  t        j                  «       «       |j                  t        j                  |fi |
¤Ž«       t        j                  |Ž | _        t        j                  |Ž | _        t        j                  t        j
                  |||d|dz  f|ddœ|
¤Žt        j                  |fi |
¤Ž«      | _        |rt        j                  d¬«      | _        y t        j                  «       | _        y )	N©ÚdeviceÚdtypeé   ÚbiasFT©Úinplacer   )Úgroupsr+   )ÚsuperÚ__init__r    ÚnnÚ
SequentialÚConv2dÚBatchNorm2dÚReLUÚIdentityÚprimary_convÚappendÚfusion_convÚ	fusion_bnÚcheap_operationr$   )Úselfr   r    r!   r"   r#   r$   r%   r(   r)   ÚddÚinit_chsÚnew_chsr9   r:   Ú	__class__s                  €ú_/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/models/repghost.pyr0   zRepGhostModule.__init__   sP  ø€ ð ¨Ñ/ˆÜ‰ÑÔØˆŒØˆØˆäŸM™MÜ�I‰I�f˜h¨°V¸[ÈAÑ=MÑ`ÐTYÐ`Ð]_Ñ`Ü�N‰N˜8Ñ* rÑ*Ù%)ŒB�G‰G˜DÕ!¬r¯{©{«}ó
ˆÔð ˆØˆ	ÙØ×ÑœrŸ{™{›}Ô-Ø×ÑœRŸ^™^¨HÑ;¸Ñ;Ô<äŸ=™=¨+Ð6ˆÔÜŸ™¨	Ð2ˆŒä!Ÿ}™}Ü�I‰I�h ¨°!°W¸a±ZÐcÈÐW\ÑcÐ`bÑcÜ�N‰N˜7Ñ) bÑ)ó 
ˆÔñ
 /3”B—G‘G EÔ*ˆ�	¼¿¹»ˆ�	ó    c                 óÚ   — | j                  |«      }| j                  |«      }t        | j                  | j                  «      D ]  \  }}| | ||«      «      z   }Œ | j                  |«      S ©N)r7   r;   Úzipr9   r:   r$   )r<   ÚxÚx1Úx2ÚconvÚbns         rA   ÚforwardzRepGhostModule.forwardF   sf   € Ø×Ñ˜qÓ!ˆØ×!Ñ! "Ó%ˆÜ˜D×,Ñ,¨d¯n©nÓ=ò 	#‰HˆD�"Ø‘b™˜b›“lÑ"‰Bð	#à�y‰y˜‹}ÐrB   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_tensorr;   rE   r9   r:   Úshaper(   Ú_pad_1x1_to_3x3_tensor)r<   Ú	kernel3x3Úbias3x3rI   rJ   Úkernelr+   s          rA   Úget_equivalent_kernel_biasz)RepGhostModule.get_equivalent_kernel_biasM   s¨   € Ø!×1Ñ1°$×2FÑ2FÀqÑ2IÈ4×K_ÑK_Ð`aÑKbÓcÑˆ	�7Ü˜D×,Ñ,¨d¯n©nÓ=ò 	‰HˆD�"Ø×/Ñ/°°b¸)¿/¹/È!Ñ:LÈi×N^ÑN^Ó_‰LˆF�DØ˜×4Ñ4°VÓ<Ñ<ˆIØ�t‰O‰Gð	ð ˜'Ð!Ð!rB   c                 ó`   — | €yt         j                  j                  j                  | g d¢«      S )Nr   )r   r   r   r   )Útorchr1   Ú
functionalÚpad)Ú	kernel1x1s    rA   rO   z%RepGhostModule._pad_1x1_to_3x3_tensorU   s(   € àÐØä—8‘8×&Ñ&×*Ñ*¨9²lÓCÐCrB   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   )r(   éÿÿÿÿ)Úrunning_meanrN   Úweightr(   Ú
isinstancer1   r3   r+   r6   rU   Úonesr4   Úrunning_varÚepsÚsqrtÚreshapeÚzerosÚto)rI   rJ   Úin_channelsr(   rR   r[   r_   ÚgammaÚbetar`   ÚstdÚts               rA   rM   zRepGhostModule._fuse_bn_tensor\   s;  € á%0‘k°b·o±o×6KÑ6KÈAÑ6NˆÙ!‘ r§y¡y×'7Ñ'7ˆÜ�dœBŸI™IÔ&Ø—[‘[ˆFØ—9‘9Ð$Ð$Ð$ä˜d¤B§K¡KÔ0Ð0Ð0Ü—Z‘Z ¨Q°°1¸VÔDˆFä�bœ"Ÿ.™.Ô)ØŸ?™?ˆLØŸ.™.ˆKØ—I‘IˆEØ—7‘7ˆDØ—&‘&ˆCØ Ñ$×*Ñ*Ó,ˆCØ˜‘×%Ñ% b¨!¨Q°Ó2ˆAØ˜A‘:˜t l°UÑ&:¸SÑ&@Ñ@Ð@Ð@Ü˜"œbŸk™kÔ*Ð*Ð*Ø”u—{‘{ ;Ó/×2Ñ2°6·=±=ÓAÐAÐArB   c                 óâ  — t        | j                  «      dk(  rt        | j                  «      dk(  ry | j                  «       \  }}|j                  |j
                  dœ}t        j                  d| j                  d   j                  | j                  d   j                  | j                  d   j                  | j                  d   j                  | j                  d   j                  | j                  d   j                  ddœ|¤Ž| _        || j                  j                  _        || j                  j"                  _        | j%                  d«       | j%                  d«       g | _        g | _        y )Nr   r'   T)re   Úout_channelsr!   ÚpaddingÚdilationr.   r+   r9   r:   © )Úlenr9   r:   rS   r(   r)   r1   r3   r;   re   rk   r!   rl   rm   r.   r\   Údatar+   Ú__delattr__)r<   rR   r+   r=   s       rA   Úswitch_to_deployzRepGhostModule.switch_to_deploys   s<  € Üˆt×ÑÓ  AÒ%¬#¨d¯n©nÓ*=ÀÒ*BØØ×6Ñ6Ó8‰ˆ�ØŸ™°·±Ñ=ˆÜ!Ÿy™yð  Ø×,Ñ,¨QÑ/×;Ñ;Ø×-Ñ-¨aÑ0×=Ñ=Ø×,Ñ,¨QÑ/×;Ñ;Ø×(Ñ(¨Ñ+×3Ñ3Ø×)Ñ)¨!Ñ,×5Ñ5Ø×'Ñ'¨Ñ*×1Ñ1Øñ ð ñ ˆÔð ,2ˆ×Ñ×#Ñ#Ô(Ø)-ˆ×Ñ×!Ñ!Ô&Ø×Ñ˜Ô'Ø×Ñ˜Ô%ØˆÔØˆ�rB   c                 ó$   — | j                  «        y rD   )rr   ©r<   s    rA   ÚreparameterizezRepGhostModule.reparameterizeˆ   s   € Ø×ÑÕrB   )r   é   r   TTNN)NN)Ú__name__Ú
__module__Ú__qualname__ÚintÚboolr0   rK   rS   ÚstaticmethodrO   rM   rr   ru   Ú__classcell__©r@   s   @rA   r   r      s¬   ø„ ð
  !ØØØØ ØØñ&Fàð&Fð ð&Fð ð	&Fð
 ð&Fð ð&Fð ð&Fð õ&FòPò"ð ñDó ðDð òBó ðBò,ö* rB   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„ Zˆ xZS )ÚRepGhostBottleneckz# RepGhost bottleneck w/ optional SErv   r   ç        TNr   Úmid_chsr    Údw_kernel_sizer#   Ú	act_layerÚse_ratior%   c                 óð  •— |	|
dœ}t         ‰| �  «        |d uxr |dkD  }|| _        t        ||fd|dœ|¤Ž| _        | 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|dœ|¤Ž| _        ||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�   T)r$   r%   r   r*   F)r#   rl   r.   r+   Úrd_ratior   )r#   rl   r+   )r/   r0   r#   r   Úghost1r1   r3   Úconv_dwr4   Úbn_dwÚ	_SE_LAYERÚseÚghost2r2   Úshortcut)r<   r   r‚   r    rƒ   r#   r„   r…   r%   r(   r)   r=   Úhas_ser@   s                €rA   r0   zRepGhostBottleneck.__init__�   s¯  ø€ ð ¨Ñ/ˆÜ‰ÑÔØ Ð%Ò7¨(°R©-ˆØˆŒô % V¨WÐW¸4ÈÑWÐTVÑWˆŒð �;‰;˜Š?ÜŸ9™9ØØØð	ð Ø'¨Ñ)¨AÑ-ØØñ	ð ñ	ˆDŒLô Ÿ™¨Ñ6°2Ñ6ˆD�JàˆDŒLØˆDŒJñ BH”)˜GÑ=¨hÐ=¸"Ò=ÈTˆŒô % W¨gÐY¸EÈ7ÑYÐVXÑYˆŒð �WÒ §¡°Ò!1ÜŸM™M›OˆD�MäŸM™MÜ—	‘	ØØØ"ð	ð "Ø+¨AÑ-°Ñ1Ø!Øñ	ð ñ	ô —‘˜vÑ,¨Ñ,Ü—	‘	˜& '¨1ÐT°QÀÈÑTÐQSÑTÜ—‘˜wÑ-¨"Ñ-óˆD�MrB   c                 ó  — |}| j                  |«      }| j                  �"| j                  |«      }| j                  |«      }| j                  �| j                  |«      }| j	                  |«      }|| j                  |«      z  }|S rD   )rˆ   r‰   rŠ   rŒ   r�   rŽ   )r<   rF   rŽ   s      rA   rK   zRepGhostBottleneck.forwardÏ   s|   € Øˆð �K‰K˜‹Nˆð �<‰<Ð#Ø—‘˜Q“ˆAØ—
‘
˜1“ˆAð �7‰7ÐØ—‘˜“
ˆAð �K‰K˜‹Nˆà	ˆT�]‰]˜8Ó$Ñ$ˆØˆrB   )rw   rx   ry   Ú__doc__r1   r5   rz   r   ÚModuleÚfloatr{   r0   rK   r}   r~   s   @rA   r€   r€   Œ   s‚   ø„ Ù-ð #$ØØ)+¯©Ø Ø ØØñ>àð>ð ð>ð ð	>ð
  ð>ð ð>ð ˜BŸI™I‘ð>ð ð>ð õ>ö@rB   r€   c                   ó@  ‡ — e Zd Z	 	 	 	 	 	 	 	 	 ddeee      dededededededefˆ 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   ÚcfgsÚnum_classesÚwidthÚin_chansÚoutput_strideÚglobal_poolÚ	drop_rater%   c                 óª  •— t         ‰| �  «        |	|
dœ}|dk(  sJ d«       ‚|| _        || _        || _        || _        d| _        g | _        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 «      }t&        }d}d}| j                  D ]¬  }g }d	}|D ]G  \  }}}}}t        ||z  d«      }t        ||z  d«      }|j                   ||||||f||dœ|¤Ž«       |}ŒI |d	kD  r/|dz  }| j                  j                  t        ||d|› �¬«      «       |j                  t        j(                  |Ž «       |d	z  }Œ® t        |z  dz  d«      }|j                  t        j(                  t+        ||d	fi |¤Ž«      «       |x| _        }t        j(                  |Ž | _        || _        dx| _        }t5        |¬«      | _        t        j                  ||d	d	dfd
di|¤Ž| _        t        j                   d¬«      | _        |rt        j<                  d	«      nt        j>                  «       | _         |dkD  rtC        ||fi |¤Ž| _"        y t        j>                  «       | _"        y )Nr'   é    z7only output_stride==32 is valid, dilation not supportedFé   r   rv   r*   r   r+   Ú	conv_stem)Únum_chsÚ	reductionÚmoduleTr,   r   )r…   r%   zblocks.i   ©Ú	pool_type)#r/   r0   r•   r–   r˜   r›   Úgrad_checkpointingÚfeature_infor   r1   r3   rŸ   r8   Údictr4   Úbn1r5   Úact1Ú
ModuleListr€   r2   r   Úpool_dimÚblocksÚnum_featuresÚhead_hidden_sizer   rš   Ú	conv_headÚact2ÚFlattenr6   Úflattenr   Ú
classifier)r<   r•   r–   r—   r˜   r™   rš   r›   r%   r(   r)   r=   Ústem_chsÚprev_chsÚstagesÚblockÚ	stage_idxÚ
net_strideÚcfgÚlayersÚsÚkÚexp_sizeÚcr…   r    r‚   r@   s                              €rA   r0   zRepGhostNet.__init__æ   sÃ  ø€ ô 	‰ÑÔØ¨Ñ/ˆà Ò"Ð]Ð$]Ó]Ð"ØˆŒ	Ø&ˆÔØ ˆŒØ"ˆŒØ"'ˆÔØˆÔô " " 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Ó=�Ø—‘™e H¨g°wÀÀ1ÐoÈxÐahÑoÐlnÑoÔpØ"‘ð	#ð
 �1ŠuØ˜a‘�
Ø×!Ñ!×(Ñ(¬Ø$°
ÀWÈYÈKÐCXô*Zô [à�M‰Mœ"Ÿ-™-¨Ð0Ô1Ø˜‰N‰Ið	ô ! ¨EÑ!1°AÑ!5°qÓ9ˆØ�‰”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ˆ�rB   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§   )r<   ÚcoarseÚmatchers      rA   Úgroup_matcherzRepGhostNet.group_matcher)  s,   € äØ"á&,Ñ"Ð2JÈDÐQØ(ðô
ˆð ˆrB   c                 ó   — || _         y rD   )r¥   )r<   Úenables     rA   Úset_grad_checkpointingz"RepGhostNet.set_grad_checkpointing4  s
   € à"(ˆÕrB   Úreturnc                 ó   — | j                   S rD   )r³   rt   s    rA   Úget_classifierzRepGhostNet.get_classifier8  s   € à�‰ÐrB   c                 óø  — || _         |�At        |¬«      | _        |rt        j                  d«      nt        j
                  «       | _        |dkD  r’t        | j                  d«      r | j                  j                  j                  nd }t        | j                  d«      r | j                  j                  j                  nd }||dœ}t        | j                  |fi |¤Ž| _        y t        j
                  «       | _        y )Nr£   r   r   r\   r'   )r–   r   rš   r1   r±   r6   r²   Úhasattrr³   r\   r(   r)   r   r®   )r<   r–   rš   r(   r)   r=   s         rA   Úreset_classifierzRepGhostNet.reset_classifier<  s·   € Ø&ˆÔØÐ"ä3¸kÔJˆDÔÙ,7œ2Ÿ:™: aœ=¼R¿[¹[»]ˆDŒLØ˜Š?Ü6=¸d¿o¹oÈxÔ6X�T—_‘_×+Ñ+×2Ò2Ð^bˆFÜ4;¸D¿O¹OÈXÔ4V�D—O‘O×*Ñ*×0Ò0Ð\`ˆEØ"¨UÑ3ˆBÜ$ T×%:Ñ%:¸KÑNÈ2ÑNˆD�Oä Ÿk™k›mˆD�OrB   rF   Ú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.rZ   r   Nr¢   ú.r   )Ústart)r¦   rz   Úsplitr   ro   rŸ   r8   r¨   r©   rU   ÚjitÚis_scriptingr¬   Ú	enumerater¥   r   )r<   rF   rÎ   rÏ   rÐ   rÑ   rÒ   ÚintermediatesÚinfoÚ
stage_endsÚtake_indicesÚ	max_indexÚiÚfeat_idxr¶   Ústages                   rA   Úforward_intermediatesz!RepGhostNet.forward_intermediatesJ  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.
        rZ   r   Nr¢   rÕ   r   Ú )r¦   rz   r×   r   ro   r¬   rÍ   )r<   rÎ   rä   rå   rÜ   rÝ   rÞ   rß   s           rA   Úprune_intermediate_layersz%RepGhostNet.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¥   rU   rØ   rÙ   r   r¬   ©r<   rF   s     rA   Úforward_featureszRepGhostNet.forward_features�  so   € Ø�N‰N˜1ÓˆØ�H‰H�Q‹KˆØ�I‰I�a‹LˆØ×"Ò"¬5¯9©9×+AÑ+AÔ+CÜ˜tŸ{™{¨A°tÔ<ˆAð ˆð —‘˜A“ˆAØˆrB   Ú
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³   )r<   rF   rì   s      rA   Úforward_headzRepGhostNet.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Ð6rB   c                 óJ   — | j                  |«      }| j                  |«      }|S rD   )rë   rò   rê   s     rA   rK   zRepGhostNet.forward¢  s'   € Ø×!Ñ! !Ó$ˆØ×Ñ˜aÓ ˆØˆrB   c                 ó   — t        | d¬«       y )NF)Údo_copy)Úrepghost_model_convertrt   s    rA   Úconvert_to_deployzRepGhostNet.convert_to_deploy§  s   € Ü˜t¨UÖ3rB   )	éè  ç      ð?rv   r�   Úavggš™™™™™É?TNN©F)TrD   )NFFrÔ   F)r   FT)rw   rx   ry   r   rz   r“   Ústrr{   r0   rU   rØ   ÚignorerÄ   rÇ   r1   r’   rÊ   r   rÍ   ÚTensorr   r   rã   rè   rë   rò   rK   r÷   r}   r~   s   @rA   r   r   å   sú  ø„ ð  $ØØØ!#Ø$Ø"Ø ØØñAcà�t˜D‘zÑ"ðAcð ðAcð ð	Acð
 ðAcð ðAcð ðAcð ðAcð õAcðF ‡Y�Y×Ñòó ðð ‡Y�Y×Ñò)ó ð)ð ‡Y�Y×Ñð §	¡	ò ó ðñ,¨Cð ,¸hÀs¹mó ,ð" 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¡	˜>Ñ*ðð ðð ó	ò ñ7¨$ó 7òö
4rB   Ú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
    rr   )ÚcopyÚdeepcopyÚmodulesrÌ   rr   rU   ÚsaveÚ
state_dict)rÿ   Ú	save_pathrõ   r¢   s       rA   rö   rö   «  se   € ñ Ü—‘˜eÓ$ˆØ—-‘-“/ò &ˆÜ�6Ð-Õ.Ø×#Ñ#Õ%ð&ð ÐÜ�
‰
�5×#Ñ#Ó% yÔ1Ø€LrB   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
    )rv   é   rž   r   r   )rv   é   r	  r   r*   )rv   é$   r	  r   r   )é   r
  é(   ç      Ð?r*   )r  é<   r  r  r   )rv   éx   éP   r   r*   )rv   éd   r  r   r   )rv   r  r  r   r   )rv   éð   ép   r  r   )rv   éP  r  r  r   )r  r  é    r  r*   )r  éà  r  r   r   )r  r  r  r  r   )r•   r—   Úfeature_cfgT)Úflatten_sequentialrn   )r§   r   r   )Úvariantr—   Ú
pretrainedÚkwargsr•   Úmodel_kwargss         rA   Ú_create_repghostnetr  ¹  s®   € ò 
Ðâ	ÐÚ	Ðâ	Ð Ú	Ðâ	ÐÚ	Ú	Ú	Ú	Ú	ð		
ò 
 Ð Ú	Ú	Ú	Ú	ð	
ð)€Dô4 ð ØØñð ñ€Lô
  ÜØØñô ¨DÔ1ð	ð
 ñð rB   c                 ó2   — | dddddt         t        dddd	œ|¥S )
Nrø   )rv   éà   r  )é   r   g      ì?ÚbicubicrŸ   r³   Úmit)Úurlr–   Ú
input_sizeÚ	pool_sizeÚcrop_pctÚinterpolationÚmeanrh   Ú
first_convr³   Úlicenser	   )r#  r  s     rA   Ú_cfgr+  å  s3   € à 4°}ÐSYØ¨IÜ%Ô.BØ!°Øñð ðð rB   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      rA   r/  r/    ó   € ô  Ð^¸ÈÑ^ÐW]Ñ^€EØ€LrB   c                 ó"   — t        dd| dœ|¤Ž}|S )z RepGhostNet-0.58x g�Âõ(\�â?r.  )Úrepghostnet_058r0  r1  s      rA   r4  r4    ó   € ô  Ð_¸È*Ñ_ÐX^Ñ_€EØ€LrB   c                 ó"   — t        dd| dœ|¤Ž}|S )z RepGhostNet-0.8x gš™™™™™é?r.  )Úrepghostnet_080r0  r1  s      rA   r7  r7  "  r2  rB   c                 ó"   — t        dd| dœ|¤Ž}|S )z RepGhostNet-1.0x rù   r.  )Úrepghostnet_100r0  r1  s      rA   r9  r9  )  r2  rB   c                 ó"   — t        dd| dœ|¤Ž}|S )z RepGhostNet-1.11x gÃõ(\�Âñ?r.  )Úrepghostnet_111r0  r1  s      rA   r;  r;  0  r5  rB   c                 ó"   — t        dd| dœ|¤Ž}|S )z RepGhostNet-1.3x gÍÌÌÌÌÌô?r.  )Úrepghostnet_130r0  r1  s      rA   r=  r=  6  r2  rB   c                 ó"   — t        dd| dœ|¤Ž}|S )z RepGhostNet-1.5x g      ø?r.  )Úrepghostnet_150r0  r1  s      rA   r?  r?  =  r2  rB   c                 ó"   — t        dd| dœ|¤Ž}|S )z RepGhostNet-2.0x g       @r.  )Úrepghostnet_200r0  r1  s      rA   rA  rA  D  r2  rB   )NT)rù   F)rç   rû   )5r‘   r  Ú	functoolsr   Útypingr   r   r   r   r   rU   Útorch.nnr1   Útorch.nn.functionalrV   rð   Ú	timm.datar
   r   Útimm.layersr   r   r   Ú_builderr   Ú_efficientnet_blocksr   r   Ú	_featuresr   Ú_manipulater   Ú	_registryr   r   Ú__all__r‹   r’   r   r€   r   rö   r  r+  Údefault_cfgsr/  r4  r7  r9  r;  r=  r?  rA  rn   rB   rA   ú<module>rO     s  ðñó Ý ß 5Õ 5ã Ý ß Ð ç Aß DÑ DÝ *ß :Ý +Ý 'ß <àˆ/€ñ �M¨nÉ'ÐR`ÐjkÔJlÔm€	ôl �R—Y‘Yô l ô^V˜Ÿ™ô VôrC4�"—)‘)ô C4ñL %§(¡(§/¡/ó ó)óXñ %Ù Øôñ !Øôñ !Øôñ !Øôñ !Øôñ !Øôñ !Øôñ !Øôñ;!&ó !€ðH ñ°;ò ó ðð ñ°;ò ó ðð ñ°;ò ó ðð ñ°;ò ó ðð ñ°;ò ó ðð
 ñ°;ò ó ðð ñ°;ò ó ðð ñ°;ò ó ñrB   