
    RЦiUP                     D   S r SSKJr  SSKJr  SSK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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SK#J$r$J%r%  S/r&\" \\RN                  S9r( " S S\RR                  5      r*      S;S\+S\+S\,S\,S\+S\,S\\
\,\+\,\+4      4S jjr-       S<S\\
\,\+\,\+4      S\,S\+S\,S\,S\.S\.S \+S\
\\RR                     \\\.\4      4   4S! jjr/ " S" S\RR                  5      r0S#\.S$\1S\04S% jr2S=S&\.S\\.\4   4S' jjr3\$" \3" S(S)9\3" S(S)9\3" S(S)9\3" S(S)9\3" S(S)9\3" 5       \3" 5       \3" 5       \3" S(S*SS+S,S-9\3" S(S*SS+S,S-9\3" S(S.S*SS+S,S/9\3" S(S.S*SS+S,S/9S0.5      r4\%S>S$\1S\04S1 jj5       r5\%S>S$\1S\04S2 jj5       r6\%S>S$\1S\04S3 jj5       r7\%S>S$\1S\04S4 jj5       r8\%S>S$\1S\04S5 jj5       r9\%S>S$\1S\04S6 jj5       r:\%S>S$\1S\04S7 jj5       r;\%S>S$\1S\04S8 jj5       r<\%S>S$\1S\04S9 jj5       r=\%S>S$\1S\04S: jj5       r>g)?a  ReXNet

A PyTorch impl of `ReXNet: Diminishing Representational Bottleneck on Convolutional Neural Network` -
https://arxiv.org/abs/2007.00992

Adapted from original impl at https://github.com/clovaai/rexnet
Copyright (c) 2020-present NAVER Corp. MIT license

Changes for timm, feature extraction, and rounded channel variant hacked together by Ross Wightman
Copyright 2020 Ross Wightman
    )partial)ceil)AnyDictListOptionalTupleTypeUnionNIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)ClassifierHeadcreate_act_layerConvNormActDropPathmake_divisibleSEModule   )build_model_with_cfg)efficientnet_init_weights)feature_take_indices)
checkpointcheckpoint_seq)generate_default_cfgsregister_modelRexNet)
norm_layerc                      ^  \ rS rSrSr         SS\S\S\S\\\4   S\S\S	\S
\S\S\	\
R                     4U 4S jjjrSS\S\4S jjrS\R                   S\R                   4S jrSrU =r$ )LinearBottleneck"   zLinear bottleneck block for ReXNet.

A mobile inverted residual bottleneck block as used in MobileNetV2 and subsequent models.
in_chsout_chsstridedilation	exp_ratiose_ratioch_div	act_layerdw_act_layer	drop_pathc           
        > XS.n[         TU ]  5         US:H  =(       a    US   US   :H  =(       a    X:*  U l        Xl        X l        US:w  a)  [        [        X-  5      US9n[        X4SU0UD6U l        O	UnSU l        [        UU4SUUS   US	S
.UD6U l	        US:  a)  [        U4S[        [        X-  5      U5      0UD6U l        OSU l        [        U	5      U l        [        XS4SS	0UD6U l        Xl        g)a  Initialize LinearBottleneck.

Args:
    in_chs: Number of input channels.
    out_chs: Number of output channels.
    stride: Stride for depthwise conv.
    dilation: Dilation rates.
    exp_ratio: Expansion ratio.
    se_ratio: Squeeze-excitation ratio.
    ch_div: Channel divisor.
    act_layer: Activation layer for expansion.
    dw_act_layer: Activation layer for depthwise.
    drop_path: Drop path module.
devicedtyper   r         ?divisorr)   N   F)kernel_sizer$   r%   groups	apply_actrd_channelsr6   )super__init__use_shortcutin_channelsout_channelsr   roundr   conv_expconv_dw
SEWithNormintser   act_dwconv_pwlr+   )selfr"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r.   r/   dddw_chs	__class__s                  Q/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/timm/models/rexnet.pyr9   LinearBottleneck.__init__(   s   : /"aK\HQK8A;,F\6K\!#?#E&*<$=vNF'R)RrRDMF DM"	
 a[	
 	
 a< j^CHYDZ\b5cjgijDGDG&|4#FQN%N2N"    expreturnc                 T    U(       a  U R                   R                  $ U R                  $ )zwGet feature channel count.

Args:
    exp: Return expanded channels if True.

Returns:
    Number of feature channels.
)r?   r<   )rE   rL   s     rI   feat_channelsLinearBottleneck.feat_channelse   s!     -0t||((FT5F5FFrK   xc                    UnU R                   b  U R                  U5      nU R                  U5      nU R                  b  U R                  U5      nU R                  U5      nU R	                  U5      nU R
                  (       a^  U R                  b  U R                  U5      n[        R                  " USS2SU R                  24   U-   USS2U R                  S24   /SS9nU$ )zGForward pass.

Args:
    x: Input tensor.

Returns:
    Output tensor.
Nr   r   )dim)
r>   r?   rB   rC   rD   r:   r+   torchcatr;   )rE   rQ   shortcuts      rI   forwardLinearBottleneck.forwardp   s     ==$a ALLO77
AKKNMM!~~)NN1%		1Q$"2"2 223h>!TEUEUEVBV@WX^_`ArK   )	rC   r?   r>   rD   r+   r;   r<   rB   r:   )	)r   r   r0           r   swishrelu6NNNF)__name__
__module____qualname____firstlineno____doc__rA   r	   floatstrr   nnModuler9   boolrO   rT   TensorrW   __static_attributes____classcell__rH   s   @rI   r    r    "   s     )/" $ '-1;#;# ;# 	;#
 CHo;# ;# ;# ;# ;# ;#  		*;# ;#z	G 	G# 	G %,,  rK   r    r0   
width_mult
depth_multinitial_chs	final_chsr'   r(   rM   c           
      @   / SQn/ SQnU Vs/ s H  n[        X-  5      PM     nn[        [        U5       V	Vs/ s H  u  pU/S/Xi   S-
  -  -   PM     snn	/ 5      nS/US   -  S/[        USS 5      -  -   n
[        USS 5      S-  nU S:  a  X -  OUn/ n[        US-  5       H4  nUR	                  [        [        X-  5      US	95        XUS-  S-  -  -  nM6     S
/US   US   -   -  U/[        USS 5      -  -   n[        [        XX5      5      $ s  snf s  snn	f )aK  Generate ReXNet block configuration.

Args:
    width_mult: Width multiplier.
    depth_mult: Depth multiplier.
    initial_chs: Initial channel count.
    final_chs: Final channel count.
    se_ratio: Squeeze-excitation ratio.
    ch_div: Channel divisor.

Returns:
    List of tuples (out_channels, exp_ratio, stride, se_ratio).
)r      rp   r3   r3      )r   rp   rp   rp   r   rp   r   r      Nr3   r0   r1   rY   rp   )	r   sum	enumeraterangeappendr   r=   listzip)rk   rl   rm   rn   r'   r(   layersstrideselementidx
exp_ratiosdepthbase_chsout_chs_listi	se_ratioss                   rI   
_block_cfgr      sF   *  F G8>?Wd7'(F?9U\K]^K]<3G9sfkAo66K]^`bcGvayA3VABZ#88Jq	NQE+5+;{'H L5A:N51F+GQWXY!c!122  q	F1I-.(c&*o1MMILgABB @^s
   DD
	block_cfgprev_chsoutput_strider)   r*   drop_path_ratec
                 <   XS.n
U/n/ nSnSn/ n[        U 5      n[        U 5       H  u  nu  nnnnUnUS:  a.  US:X  a  SOSUS-
   3nU[        US   UUS9/-  nX:  a  UU-  nSnUU-  US-
  -  nUS	:  a  [        U5      OS
nUR	                  [        SUUUUUU4UUUUUS.
U
D65        UU-  nUnUnXS   R                  5       /-  nM     [        SU-  US9nU[        US   US[        U5      S-
   3S9/-  nUR	                  [        UU4SU0U
D65        X4$ )a  Build ReXNet blocks from configuration.

Args:
    block_cfg: Block configuration list.
    prev_chs: Previous channel count.
    width_mult: Width multiplier.
    ch_div: Channel divisor.
    output_stride: Target output stride.
    act_layer: Activation layer name.
    dw_act_layer: Depthwise activation layer name.
    drop_path_rate: Drop path rate.

Returns:
    Tuple of (features list, feature_info list).
r-   rp   r   r   stemz	features.)num_chs	reductionmodulerY   N)
r"   r#   r&   r$   r%   r'   r(   r)   r*   r+   i   r1   r)    )	lenrt   dictr   rv   r    rO   r   r   )r   r   rk   r(   r   r)   r*   r   r.   r/   rF   feat_chsfeature_infocurr_strider%   features
num_blocks	block_idxchsr&   r$   r'   next_dilationfname	block_dprr+   pen_chss                              rI   _build_blocksr      s   6 	+BzHLKHHYJ9B99M5	5CFH A:'1nFIi!m_2MET(2,+V[\]]L+ (6 1"Y.*q.A	+4r>HY't	( 
.%
 
 	 	v b\//1225 :N6 TJ.?GT(2,+PYZ]^fZgjkZkYlNmnooLOOK'MYM"MN!!rK   c                   D  ^  \ rS rSrSr                S)S\S\S\S\S\S	\S
\S\S\S\S\S\S\S\4U 4S jjjr\	R                  R                  S*S\S\\\4   4S jj5       r\	R                  R                  S+S\SS4S jj5       r\	R                  R                  S\R$                  4S j5       rS,S\S\\   SS4S jjr     S-S\	R,                  S\\\\\   4      S\S\S\S\S\\\	R,                     \\	R,                  \\	R,                     4   4   4S  jjr   S.S\\\\   4   S!\S"\S\\   4S# jjrS\	R,                  S\	R,                  4S$ jrS*S\	R,                  S%\S\	R,                  4S& jjrS\	R,                  S\	R,                  4S' jrS(rU =r $ )/r      zReXNet model architecture.

Based on `ReXNet: Diminishing Representational Bottleneck on Convolutional Neural Network`
- https://arxiv.org/abs/2007.00992
Nin_chansnum_classesglobal_poolr   rm   rn   rk   rl   r'   r(   r)   r*   	drop_rater   c           
        > [         TU ]  5         UUS.nX l        Xl        Xl        SU l        US;   d   eUS:  a  SU-  OSn[        [        UU-  5      U
S9n[        UUS4SUS	.UD6U l	        [        XxXVX5      n[        UUUU
UUUU40 UD6u  nU l        US
   R                  =U l        U l        [         R"                  " U6 U l        ['        U R                  X#U40 UD6U l        [+        U 5        g)a0  Initialize ReXNet.

Args:
    in_chans: Number of input channels.
    num_classes: Number of classes for classification.
    global_pool: Global pooling type.
    output_stride: Output stride.
    initial_chs: Initial channel count.
    final_chs: Final channel count.
    width_mult: Width multiplier.
    depth_mult: Depth multiplier.
    se_ratio: Squeeze-excitation ratio.
    ch_div: Channel divisor.
    act_layer: Activation layer name.
    dw_act_layer: Depthwise activation layer name.
    drop_rate: Dropout rate.
    drop_path_rate: Drop path rate.
r-   F)          r0   r   r1   r3   rp   )r$   r)   r   N)r8   r9   r   r   r   grad_checkpointingr   r=   r   r   r   r   r   r<   num_featureshead_hidden_sizerd   
Sequentialr   r   headr   )rE   r   r   r   r   rm   rn   rk   rl   r'   r(   r)   r*   r   r   r.   r/   rF   stem_base_chsstem_chsr   r   rH   s                         rI   r9   RexNet.__init__   s   J 	/& ""'++++5+;Z!%
(B"CVT(A[a9[XZ[	z{x`	&3
'
 
'
#$# 5=RL4M4MMD1x0"4#4#4kPY`]_`	!$'rK   coarserM   c                     [        SSS9nU$ )zGroup matcher for parameter groups.

Args:
    coarse: Whether to use coarse grouping.

Returns:
    Dictionary of grouped parameters.
z^stemz^features\.(\d+))r   blocks)r   )rE   r   matchers      rI   group_matcherRexNet.group_matcher>  s     &
 rK   enablec                     Xl         g)zgEnable or disable gradient checkpointing.

Args:
    enable: Whether to enable gradient checkpointing.
N)r   )rE   r   s     rI   set_grad_checkpointingRexNet.set_grad_checkpointingN  s
     #)rK   c                 .    U R                   R                  $ )z<Get the classifier module.

Returns:
    Classifier module.
)r   fc)rE   s    rI   get_classifierRexNet.get_classifierW  s     yy||rK   c                     Xl         Uc  UbQ  X4S.nUb  UOU R                  R                  R                  n[	        U R
                  XU R                  40 UD6U l        gU R                  R                  X5        g)zzReset the classifier.

Args:
    num_classes: Number of classes for new classifier.
    global_pool: Global pooling type.
Nr-   )r   r   r   	pool_typer   r   r   reset)rE   r   r   r.   r/   rF   r   s          rI   reset_classifierRexNet.reset_classifier`  sl     '!2"3B'2'>DIIDYDYDcDcI&t'8'8+RVR`R`gdfgDIIIOOK5rK   rQ   indicesnorm
stop_early
output_fmtintermediates_onlyc                    US;   d   S5       e/ nU R                    Vs/ s H#  n[        US   R                  S5      S   5      PM%     n	n[        [	        U	5      U5      u  pU
 Vs/ s H  oU   PM	     n
nX   nU R                  U5      n[        R                  R                  5       (       d  U(       d  U R                  nOU R                  SUS-    n[        U5       He  u  pU R                  (       a/  [        R                  R                  5       (       d  [        X5      nOU" U5      nX;   d  MT  UR                  U5        Mg     U(       a  U$ X4$ s  snf s  snf )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   .r   Nr   )r   rA   splitr   r   r   rT   jitis_scriptingr   rt   r   r   rv   )rE   rQ   r   r   r   r   r   intermediatesinfo
stage_endstake_indices	max_indexr   stagesfeat_idxstages                   rI   forward_intermediatesRexNet.forward_intermediateso  s4   * Y&D(DD&EIEVEVWEVTc$x...s3B78EV
W"6s:"P/;<|!1|<)	 IIaL99!!##:]]F]]>IM2F(0OH&&uyy/E/E/G/Gu(!H'$$Q'  1   / X<s   *E%E
prune_norm
prune_headc                    U R                    Vs/ s H#  n[        US   R                  S5      S   5      PM%     nn[        [	        U5      U5      u  pgXW   nU R
                  SUS-    U l        U(       a  U R                  SS5        U$ s  snf )a  Prune layers not required for specified intermediates.

Args:
    indices: Indices of intermediate layers to keep.
    prune_norm: Whether to prune normalization layer.
    prune_head: Whether to prune the classifier head.

Returns:
    List of indices that were kept.
r   r   r   Nr   r    )r   rA   r   r   r   r   r   )rE   r   r   r   r   r   r   r   s           rI   prune_intermediate_layers RexNet.prune_intermediate_layers  s      FJEVEVWEVTc$x...s3B78EV
W"6s:"P)	ny1}5!!!R( Xs   *Bc                     U R                  U5      nU R                  (       a;  [        R                  R	                  5       (       d  [        U R                  U5      nU$ U R                  U5      nU$ )zjForward pass through feature extraction layers.

Args:
    x: Input tensor.

Returns:
    Feature tensor.
)r   r   rT   r   r   r   r   rE   rQ   s     rI   forward_featuresRexNet.forward_features  sX     IIaL""599+A+A+C+Ct}}a0A  a ArK   
pre_logitsc                 P    U(       a  U R                  XS9$ U R                  U5      $ )zForward pass through head.

Args:
    x: Input features.
    pre_logits: Return features before final linear layer.

Returns:
    Classification logits or features.
)r   )r   )rE   rQ   r   s      rI   forward_headRexNet.forward_head  s&     7Atyyy2RdiiPQlRrK   c                 J    U R                  U5      nU R                  U5      nU$ )zGForward pass.

Args:
    x: Input tensor.

Returns:
    Output logits.
)r   r   r   s     rI   rW   RexNet.forward  s)     !!!$a rK   )
r   r   r   r   r   r   r   r   r   r   )r3     avgr   r      r0   r0   gUUUUUU?r   rZ   r[   g?rY   NNr\   )T)NNN)NFFr   F)r   FT)!r]   r^   r_   r`   ra   rA   rc   rb   r9   rT   r   ignorerf   r   r   r   r   rd   re   r   r   r   rg   r   r   r	   r   r   r   r   rW   rh   ri   rj   s   @rI   r   r      s    #$!#!  # ##$ '"$&#B(B( B( 	B(
 B( B( B( B( B( B( B( B( B( B( "B( B(H YYD T#s(^   YY)T )T ) ) YY		  6C 6hsm 6pt 6$ 8<$$',. ||.  eCcN34.  	. 
 .  .  !%.  
tELL!5tELL7I)I#JJ	K. d ./$#	3S	>*  	
 
c0%,, 5<<  
Sell 
S 
S 
S %,,  rK   variant
pretrainedc                 <    [        SS9n[        [        U U4SU0UD6$ )zCreate a ReXNet model.

Args:
    variant: Model variant name.
    pretrained: Load pretrained weights.
    **kwargs: Additional model arguments.

Returns:
    ReXNet model instance.
T)flatten_sequentialfeature_cfg)r   r   r   )r   r   kwargsr   s       rI   _create_rexnetr     s8     $/K  	
  rK   urlc                 2    U SSSSS[         [        SSSS	.UE$ )
zCreate default configuration dictionary.

Args:
    url: Model weight URL.
    **kwargs: Additional configuration options.

Returns:
    Configuration dictionary.
r   )r3      r   )   r   g      ?bicubicz	stem.convzhead.fcmit)r   r   
input_size	pool_sizecrop_pctinterpolationmeanstd
first_conv
classifierlicenser   )r   r   s     rI   _cfgr    s5     4}SYI%.B!
 # rK   ztimm/)	hf_hub_idgffffff?)r3      r  z
apache-2.0)r  r   test_crop_pcttest_input_sizer   i-.  )r  r   r   r  r  r   )zrexnet_100.nav_in1kzrexnet_130.nav_in1kzrexnet_150.nav_in1kzrexnet_200.nav_in1kzrexnet_300.nav_in1kzrexnetr_100.untrainedzrexnetr_130.untrainedzrexnetr_150.untrainedzrexnetr_200.sw_in12k_ft_in1kzrexnetr_300.sw_in12k_ft_in1kzrexnetr_200.sw_in12kzrexnetr_300.sw_in12kc                     [        SU 40 UD6$ )zReXNet V1 1.0x
rexnet_100r   r   r   s     rI   r  r  #  s     ,
=f==rK   c                      [        SU 4SS0UD6$ )zReXNet V1 1.3x
rexnet_130rk   ?r  r	  s     rI   r  r  )       ,
MsMfMMrK   c                      [        SU 4SS0UD6$ )zReXNet V1 1.5x
rexnet_150rk         ?r  r	  s     rI   r  r  /  r  rK   c                      [        SU 4SS0UD6$ )zReXNet V1 2.0x
rexnet_200rk          @r  r	  s     rI   r  r  5  r  rK   c                      [        SU 4SS0UD6$ )zReXNet V1 3.0x
rexnet_300rk         @r  r	  s     rI   r  r  ;  r  rK   c                      [        SU 4SS0UD6$ )z*ReXNet V1 1.0x w/ rounded (mod 8) channelsrexnetr_100r(   r   r  r	  s     rI   r  r  A  s     -HAHHHrK   c                 "    [        SU 4SSS.UD6$ )z*ReXNet V1 1.3x w/ rounded (mod 8) channelsrexnetr_130r  r   rk   r(   r  r	  s     rI   r  r  G       -XAXQWXXrK   c                 "    [        SU 4SSS.UD6$ )z*ReXNet V1 1.5x w/ rounded (mod 8) channelsrexnetr_150r  r   r  r  r	  s     rI   r  r  M  r  rK   c                 "    [        SU 4SSS.UD6$ )z*ReXNet V1 2.0x w/ rounded (mod 8) channelsrexnetr_200r  r   r  r  r	  s     rI   r   r   S  r  rK   c                 "    [        SU 4SSS.UD6$ )z+ReXNet V1 3.0x w/ rounded (mod 16) channelsrexnetr_300r  r   r  r  r	  s     rI   r"  r"  Y  s     -YBYRXYYrK   )r0   r0   r   r   rY   r   )r   r   rZ   r[   rY   NN)r   r\   )?ra   	functoolsr   mathr   typingr   r   r   r   r	   r
   r   rT   torch.nnrd   	timm.datar   r   timm.layersr   r   r   r   r   r   _builderr   _efficientnet_builderr   	_featuresr   _manipulater   r   	_registryr   r   __all__BatchNorm2dr@   re   r    rb   rA   r   rc   r   r   rf   r   r  default_cfgsr  r  r  r  r  r  r  r  r   r"  r   rK   rI   <module>r1     s  
   @ @ @   A i i * < + 3 <* X"..9
cryy cN  %C%C%C %C 	%C
 %C %C 
%UC&
'(%CX  # "@"c5#u456@"@" @" 	@"
 @" @" @" @" 4		?Dc3h001@"FkRYY k\C T  *c T#s(^ & %'2'2'2'2'2!V!V!V$(S-Q]%_ %)S-Q]%_ !S-Q]_ !S-Q]_'& 4 >4 >f > >
 N4 Nf N N
 N4 Nf N N
 N4 Nf N N
 N4 Nf N N
 ID Iv I I
 YD Yv Y Y
 YD Yv Y Y
 YD Yv Y Y
 ZD Zv Z ZrK   