
    RЦiE5              
       @   S r SSKJrJrJrJrJrJrJrJ	r	  SSK
r
SSKJr  SSKJs  Jr  SSKJrJr  SSKJrJrJrJrJrJr  SSKJr  SSKJr  SS	KJr  SS
K J!r!J"r"  S/r# " S S\RH                  5      r% " S S\RL                  5      r' " S S\RL                  5      r(S\\)\
RT                  4   S\RL                  S\\)\
RT                  4   4S jr+S%S\)S\S\\)\4   4S jjr,\"" \," SS9\," SS9\," SS9\," SS9\," 5       \," 5       \," 5       S.5      r-S&S\)S\.S\S\(4S jjr/\!S&S\.S\S\(4S jj5       r0\!S&S\.S\S\(4S jj5       r1\!S&S\.S\S\(4S  jj5       r2\!S&S\.S\S\(4S! jj5       r3\!S&S\.S\S\(4S" jj5       r4\!S&S\.S\S\(4S# jj5       r5\!S&S\.S\S\(4S$ jj5       r6g)'al  
Implementation of Prof-of-Concept Network: StarNet.

We make StarNet as simple as possible [to show the key contribution of element-wise multiplication]:
    - like NO layer-scale in network design,
    - and NO EMA during training,
    - which would improve the performance further.

Created by: Xu Ma (Email: ma.xu1@northeastern.edu)
Modified Date: Mar/29/2024
    )AnyDictListOptionalSetTupleUnionTypeNIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)DropPathSelectAdaptivePool2dLinear	LayerTypetrunc_normal_calculate_drop_path_rates   )build_model_with_cfg)feature_take_indices)checkpoint_seq)register_modelgenerate_default_cfgsStarNetc                   T   ^  \ rS rSr      S
S\S\S\S\S\S\4U 4S jjjrS	rU =r$ )ConvBN   in_channelsout_channelskernel_sizestridepaddingwith_bnc	           	        > XxS.n
[         TU ]  5         U R                  S[        R                  " XU4XES.U
DU	D65        U(       a  U R                  S[        R
                  " U40 U
D65        [        R                  R                  U R                  R                  S5        [        R                  R                  U R                  R                  S5        g g )Ndevicedtypeconvr!   r"   bnr   r   )super__init__
add_modulennConv2dBatchNorm2dinit	constant_r*   weightbias)selfr   r   r    r!   r"   r#   r&   r'   kwargsdd	__class__s              R/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/timm/models/starnet.pyr,   ConvBN.__init__   s     /		{!d;A!dVX!d\b!d 	eOOD".."D"DEGGdggnna0GGdggllA.      )r   r   r   TNN)	__name__
__module____qualname____firstlineno__intboolr,   __static_attributes____classcell__r8   s   @r9   r   r      s[    
  ! // / 	/
 / / / /r;   r   c            
          ^  \ rS rSrSS\R
                  SS4S\S\S\S\\R                     4U 4S	 jjjr
S
\R                  S\R                  4S jrSrU =r$ )Block3              Ndim	mlp_ratio	drop_path	act_layerc                   > XVS.n[         TU ]  5         [        XSSS4USS.UD6U l        [        XU-  S4SS0UD6U l        [        XU-  S4SS0UD6U l        [        X!-  US4SS0UD6U l        [        XSSS4USS.UD6U l        U" 5       U l        US	:  a  [        U5      U l        g [        R                  " 5       U l        g )
Nr%      r   rI   T)groupsr#   r#   FrJ   )r+   r,   r   dwconvf1f2gdwconv2actr   r.   IdentityrM   )	r5   rK   rL   rM   rN   r&   r'   r7   r8   s	           r9   r,   Block.__init__4   s     /Sq!QOsDOBO#oqF%F2F#oqF%F2F	aDDDc1aQUQbQ;09B),BKKMr;   xreturnc                     UnU R                  U5      nU R                  U5      U R                  U5      pCU R                  U5      U-  nU R	                  U R                  U5      5      nX R                  U5      -   nU$ N)rR   rS   rT   rW   rV   rU   rM   )r5   rZ   residualx1x2s        r9   forwardBlock.forwardG   si    KKNTWWQZBHHRL2LL#~~a((r;   )rW   rM   rR   rV   rS   rT   rU   )r=   r>   r?   r@   r.   ReLU6rA   floatr
   Moduler,   torchTensorra   rC   rD   rE   s   @r9   rG   rG   3   sv     !)+RR R 	R
 BIIR R& %,,  r;   rG   c                     ^  \ rS rSrS/ SQSSS\R
                  SSSSS	S	4S
\S\\   S\S\S\S\	\R                     S\S\S\S\4U 4S jjjrS r\R                  R                   S\4S j5       r\R                  R                   S-S\S\\\4   4S jj5       r\R                  R                   S.S\4S jj5       r\R                  R                   S\R                  4S j5       rS/S\S\\   4S jjr     S0S\R6                  S\\\\\   4      S \S!\S"\S#\S\\\R6                     \\R6                  \\R6                     4   4   4S$ jjr   S1S\\\\   4   S%\S&\4S' jjrS\R6                  S\R6                  4S( jr S-S\R6                  S)\S\R6                  4S* jjr!S\R6                  S\R6                  4S+ jr"S,r#U =r$$ )2r   Q       rI   rI            rJ     rI   avgNbase_dimdepthsrL   	drop_ratedrop_path_raterN   num_classesin_chansglobal_pooloutput_stridec                 f  > XS.n[         TU ]  5         U
S:X  d   eXpl        Xl        X@l        SU l        / U l        Sn[        R                  " [        X4SSSS.UD6U" 5       5      U l
        Un[        U[        U5      5      n/ nSn[        [        U5      5       H  nUSU-  -  n[        UUS4SSS	.UD6n[        UU   5       Vs/ s H  n[        UUUUU-      U40 UD6PM     nnUUU   -  nUnUR!                  [        R                  " U/UQ76 5        U R                  R!                  [#        USUS-   -  S
U 3S95        M     [        R                  " U6 U l        U=U l        U l        [        R*                  " U R&                  40 UD6U l        [/        U	S9U l        U	(       a  [        R2                  " S5      O[        R4                  " 5       U l        US:  a  [9        U R&                  U40 UD6O[        R4                  " 5       U l        U R=                  U R>                  5        g s  snf )Nr%   rj   FrI      r   )r    r!   r"   r   r)   zstages.)num_chs	reductionmodule	pool_type) r+   r,   ru   rv   rs   grad_checkpointingfeature_infor.   
Sequentialr   stemr   sumrangelenrG   appenddictstagesnum_featureshead_hidden_sizer0   normr   rw   FlattenrX   flattenr   headapply_init_weights)r5   rq   rr   rL   rs   rt   rN   ru   rv   rw   rx   r&   r'   r6   r7   stem_chsprev_chsdprr   curi_layer	embed_dimdown_sampleriblocksr8   s                            r9   r,   StarNet.__init__R   s     /"""& ""' MM8P1QPRPK
	  (FDS[)G 1</I!(IqTATQSTLZ_`fgn`oZpqZpUVeIy#cAg,	PRPZpFq6'?"C HMM"-->v>?$$T$GAIQXPYGZ&\ ] * mmV,4<<D1NN4#4#4;;	/+F(3rzz!}DORSOF4,,k@R@Y[YdYdYf	

4%%& rs   H.c                 $   [        U[        R                  [        R                  45      (       am  [	        UR
                  SS9  [        U[        R                  5      (       a9  UR                  b+  [        R                  R                  UR                  S5        g g g [        U[        R                  5      (       aU  [        R                  R                  UR                  S5        [        R                  R                  UR
                  S5        g g )Ng{Gz?)stdr   g      ?)

isinstancer.   r   r/   r   r3   r4   r1   r2   r0   )r5   ms     r9   r   StarNet._init_weights   s    a"))RYY/00!((,!RYY''AFF,>!!!&&!, -?'2>>**GGaffa(GGahh, +r;   r[   c                     [        5       $ r]   )setr5   s    r9   no_weight_decayStarNet.no_weight_decay   s	    ur;   coarsec                 4    [        SU(       a  SOSS 4S/S9nU$ )Nz
^stem\.\d+z^stages\.(\d+)z^stages\.(\d+)\.(\d+))r   )i )r   r   )r   )r5   r   matchers      r9   group_matcherStarNet.group_matcher   s,    &,"2JDQ#
 r;   enablec                     Xl         g r]   )r   )r5   r   s     r9   set_grad_checkpointingStarNet.set_grad_checkpointing   s    "(r;   c                     U R                   $ r]   )r   r   s    r9   get_classifierStarNet.get_classifier   s    yyr;   c           	      <   Xl         UbE  [        US9U l        U(       a  [        R                  " S5      O[        R
                  " 5       U l        US:  a  [        U R                  U[        U R                  [        R                  5      (       a   U R                  R                  R                  OS [        U R                  [        R                  5      (       a   U R                  R                  R                  OS S9U l
        g [        R
                  " 5       U l
        g )Nr~   r   r   r%   )ru   r   rw   r.   r   rX   r   r   r   r   r   r3   r&   r'   )r5   ru   rw   s      r9   reset_classifierStarNet.reset_classifier   s    &"3kJD,72::a=R[[]DL
 1_	 !!;.8BII.N.N499##**TX,6tyy")),L,L$))""((RV
	 #%++-	 		r;   rZ   indicesr   
stop_early
output_fmtintermediates_onlyc                    US;   d   S5       e/ n[        [        U R                  5      U5      u  p[        U R                  5      S-
  n
U R                  U5      n[        R
                  R                  5       (       d  U(       d  U R                  nOU R                  SU	S-    n[        U5       H  u  pU R                  (       a/  [        R
                  R                  5       (       d  [        X5      nOU" U5      nX;   d  MT  U(       a  X:X  a  U R                  U5      nOUnUR                  U5        M     U(       a  U$ WU
:X  a  U R                  U5      nX4$ )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.r   N)r   r   r   r   rf   jitis_scripting	enumerater   r   r   r   )r5   rZ   r   r   r   r   r   intermediatestake_indices	max_indexlast_idxr   feat_idxstagex_inters                  r9   forward_intermediatesStarNet.forward_intermediates   s   * Y&D(DD&"6s4;;7G"Qt{{#a' IIaL99!!##:[[F[[)a-0F(0OH&&uyy/E/E/G/G"5,!H'H0"iilGG$$W-  1   x		!Ar;   
prune_norm
prune_headc                     [        [        U R                  5      U5      u  pEU R                  SUS-    U l        U(       a  [        R                  " 5       U l        U(       a  U R                  SS5        U$ )z?Prune layers not required for specified intermediates.
        Nr   r    )r   r   r   r.   rX   r   r   )r5   r   r   r   r   r   s         r9   prune_intermediate_layers!StarNet.prune_intermediate_layers   s[     #7s4;;7G"Qkk.9q=1DI!!!R(r;   c                    U R                  U5      nU R                  (       a:  [        R                  R	                  5       (       d  [        U R                  U5      nOU R                  U5      nU R                  U5      nU$ r]   )r   r   rf   r   r   r   r   r   r5   rZ   s     r9   forward_featuresStarNet.forward_features   sY    IIaL""599+A+A+C+Ct{{A.AAAIIaLr;   
pre_logitsc                     U R                  U5      nU R                  U5      nU R                  S:  a)  [        R                  " XR                  U R
                  S9nU(       a  U$ U R                  U5      $ )NrJ   )ptraining)rw   r   rs   Fdropoutr   r   )r5   rZ   r   s      r9   forward_headStarNet.forward_head  sX    QLLO>>B		!~~FAq0DIIaL0r;   c                 J    U R                  U5      nU R                  U5      nU$ r]   )r   r   r   s     r9   ra   StarNet.forward
  s'    !!!$a r;   )rs   r   r   rw   r   r   r   rv   r   ru   r   r   r   F)Tr]   )NFFr   F)r   FT)%r=   r>   r?   r@   r.   rc   rA   r   rd   r
   re   strr,   r   rf   r   ignorer   r   rB   r   r   r   r   r   r   r   rg   r	   r   r   r   r   r   ra   rC   rD   rE   s   @r9   r   r   Q   s     -!$&)+#$!#5'5' I5' 	5'
 5' "5' BII5' 5' 5' 5' 5' 5'n- YY   YYD T#s(^   YY)T ) ) YY		  
0C 
0hsm 
0 8<$$',3 ||3  eCcN343  	3 
 3  3  !%3  
tELL!5tELL7I)I#JJ	K3 n ./$#	3S	>*  	 %,, 5<< 1ell 1 1 1 %,,  r;   
state_dictmodelr[   c                 &    U R                  SU 5      $ )Nr   )get)r   r   s     r9   checkpoint_filter_fnr     s    >>,
33r;   urlr6   c                 8    U SSSSS[         [        SSSS	S
SS.UE$ )Nro   )rI      r   )rP   rP   g      ?bicubiczstem.0.convr   zarXiv:2403.19967zRewrite the Starsz*https://github.com/ma-xu/Rewrite-the-Starsz
apache-2.0)r   ru   
input_size	pool_sizecrop_pctinterpolationmeanr   
first_conv
classifier	paper_ids
paper_name
origin_urllicenser   )r   r6   s     r9   _cfgr     s;    4}SYI%.B#6')B|	 	 	r;   ztimm/)	hf_hub_id)zstarnet_s1.in1kzstarnet_s2.in1kzstarnet_s3.in1kzstarnet_s4.in1kzstarnet_s050.untrainedzstarnet_s100.untrainedzstarnet_s150.untrainedvariant
pretrainedc           	      F    [        [        X4[        [        SSS9S.UD6nU$ )N)r   r   rz   rI   T)out_indicesflatten_sequential)pretrained_filter_fnfeature_cfg)r   r   r   r   )r   r   r6   r   s       r9   _create_starnetr   8  s4     1\dK 	E Lr;   c           	      H    [        S/ SQS9n[        SSU 0[        U40 UD6D6$ )N   )rz   rz      rI   rq   rr   r   )
starnet_s1r   r   r   r6   
model_argss      r9   r   r   B  ,    r,7J]J]$zB\U[B\]]r;   c           	      H    [        S/ SQS9n[        SSU 0[        U40 UD6D6$ )Nrj   )r   rz      rz   r   r   )
starnet_s2r  r  s      r9   r  r  H  r  r;   c           	      H    [        S/ SQS9n[        SSU 0[        U40 UD6D6$ )Nrj   )rz   rz   r   rn   r   r   )
starnet_s3r  r  s      r9   r	  r	  N  r  r;   c           	      H    [        S/ SQS9n[        SSU 0[        U40 UD6D6$ )Nrj   rk   r   r   )
starnet_s4r  r  s      r9   r  r  T  s,    r-8J]J]$zB\U[B\]]r;   c           	      J    [        S/ SQSS9n[        SSU 0[        U40 UD6D6$ )N   )r   r   rI   r   rI   rq   rr   rL   r   )starnet_s050r  r  s      r9   r  r  [  .    r,!DJ_j_DD^W]D^__r;   c           	      J    [        S/ SQSS9n[        SSU 0[        U40 UD6D6$ )N   )r   rz   rn   r   rn   r  r   )starnet_s100r  r  s      r9   r  r  a  r  r;   c           	      J    [        S/ SQSS9n[        SSU 0[        U40 UD6D6$ )Nr   )r   rz   rn   rz   rI   r  r   )starnet_s150r  r  s      r9   r  r  g  r  r;   )r   r   )7__doc__typingr   r   r   r   r   r   r	   r
   rf   torch.nnr.   torch.nn.functional
functionalr   	timm.datar   r   timm.layersr   r   r   r   r   r   _builderr   	_featuresr   _manipulater   	_registryr   r   __all__r   r   re   rG   r   r   rg   r   r   default_cfgsrB   r   r   r  r	  r  r  r  r  r<   r;   r9   <module>r#     s  
 F E E     A s s * + ' <+/R]] /.BII <|bii |~4T#u||*;%< 4RYY 4SWX[]b]i]iXiSj 4
c 
# 
$sCx. 
 %    #f"f"f'& .S d c g  ^4 ^3 ^7 ^ ^
 ^4 ^3 ^7 ^ ^
 ^4 ^3 ^7 ^ ^
 ^4 ^3 ^7 ^ ^ `T `S `W ` `
 `T `S `W ` `
 `T `S `W ` `r;   