
    ^jUP                     J   d Z ddlmZ ddlmZ ddl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ZmZ ddlmZmZmZmZmZmZ dd	lmZ dd
lmZ ddlmZ ddl m!Z!m"Z" ddl#m$Z$m%Z% dgZ& eeejN                        Z( G d dejR                        Z*	 	 	 	 	 	 d;de+de+de,de,de+de,dee
e,e+e,e+f      f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+de
eejR                     eee.ef      f   fd!Z/ G d" dejR                        Z0d#e.d$e1de0fd%Z2d=d&e.dee.ef   fd'Z3 e$ e3d()       e3d()       e3d()       e3d()       e3d()       e3        e3        e3        e3d(d*dd+d,-       e3d(d*dd+d,-       e3d(d.d*dd+d,/       e3d(d.d*dd+d,/      d0      Z4e%d>d$e1de0fd1       Z5e%d>d$e1de0fd2       Z6e%d>d$e1de0fd3       Z7e%d>d$e1de0fd4       Z8e%d>d$e1de0fd5       Z9e%d>d$e1de0fd6       Z:e%d>d$e1de0fd7       Z;e%d>d$e1de0fd8       Z<e%d>d$e1de0fd9       Z=e%d>d$e1de0fd:       Z>y)?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                        e Zd ZdZ	 	 	 	 	 	 	 	 	 ddedededeeef   dededed	ed
edee	j                     f fdZddedefdZdej                  dej                  fdZ xZS )LinearBottleneckzLinear 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           
         ||d}t         |           |dk(  xr |d   |d   k(  xr ||k  | _        || _        || _        |dk7  r.t        t        ||z        |      }t        ||fd|i|| _        n	|}d| _        t        ||fd||d   |d	d
|| _	        |dkD  r*t        |fdt        t        ||z        |      i|| _        nd| _        t        |	      | _        t        ||dfdd	i|| _        |
| _        y)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_channelsr5   )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                  ]/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/timm/models/rexnet.pyr8   zLinearBottleneck.__init__(   s1   : /"aK\HQK8A;,F\6U\K\!#?#E&9*<$=vNF'R)RrRDMF DM"	
 a[	
 	
 a< j^CQYHYDZ\b5cjgijDGDG&|4#FGQN%N2N"    expreturnc                 J    |r| j                   j                  S | j                  S )zGet feature channel count.

        Args:
            exp: Return expanded channels if True.

        Returns:
            Number of feature channels.
        )r>   r;   )rD   rJ   s     rH   feat_channelszLinearBottleneck.feat_channelse   s!     -0t||((FT5F5FFrI   xc                    |}| j                   | j                  |      }| j                  |      }| j                  | j                  |      }| j                  |      }| j	                  |      }| j
                  r_| j                  | j                  |      }t        j                  |ddd| j                  f   |z   |dd| j                  df   gd      }|S )zoForward pass.

        Args:
            x: Input tensor.

        Returns:
            Output tensor.
        Nr   r   )dim)
r=   r>   rA   rB   rC   r9   r*   torchcatr:   )rD   rN   shortcuts      rH   forwardzLinearBottleneck.forwardp   s     ==$a ALLO77
AKKNMM!~~)NN1%		1Q$"2"2 223h>!TEUEUEVBV@WX^_`ArI   )	)r   r   r/           r   swishrelu6NNNF)__name__
__module____qualname____doc__r@   r	   floatstrr   nnModuler8   boolrM   rQ   TensorrT   __classcell__rG   s   @rH   r    r    "   s     )/" $ '-1;#;# ;# 	;#
 CHo;# ;# ;# ;# ;# ;#  		*;#z	G 	G# 	G %,, rI   r    r/   
width_mult
depth_multinitial_chs	final_chsr&   r'   rK   c           
      D   g d}g d}|D cg c]  }t        ||z         }}t        t        |      D 	cg c]  \  }	}|gdg||	   dz
  z  z    c}}	g       }dg|d   z  dgt        |dd       z  z   }
t        |dd       dz  }| dk  r|| z  n|}g }t        |dz        D ]8  }|j	                  t        t        || z        |	             |||dz  dz  z  z  }: d
g|d   |d   z   z  |gt        |dd       z  z   }t        t        ||
||            S c c}w c c}}	w )as  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      rj   r2   r2      )r   rj   rj   rj   r   rj   r   r      Nr2   r/   r0   rU   rj   )	r   sum	enumeraterangeappendr   r<   listzip)re   rf   rg   rh   r&   r'   layersstrideselementidx
exp_ratiosdepthbase_chsout_chs_listi	se_ratioss                   rH   
_block_cfgr}      sT   *  F G8>?Wd7Z'(?F?9U\K]^<3G9sfSkAo66^`bcGvayA3VABZ#88Jq	NQE+5+;{Z'H L5A: 3N5J1F+GQWXYI!c!1223 q	F1I-.(c&*o1MMIL*gyABB @^s
   DD
	block_cfgprev_chsoutput_strider(   r)   drop_path_ratec
                 J   ||	d}
|g}g }d}d}g }t        |       }t        |       D ]  \  }\  }}}}|}|dkD  r0|dk(  rdnd|dz
   }|t        |d   ||      gz  }||k\  r||z  }d}||z  |dz
  z  }|d	kD  rt        |      nd
}|j	                  t        d||||||f|||||d
|
       ||z  }|}|}||d   j                         gz  } t        d|z  |      }|t        |d   |dt        |      dz
         gz  }|j	                  t        ||fd|i|
       ||fS )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,   rj   r   r   stemz	features.)num_chs	reductionmodulerU   N)
r!   r"   r%   r#   r$   r&   r'   r(   r)   r*   i   r0   r(    )	lenrn   dictr   rp   r    rM   r   r   )r~   r   re   r'   r   r(   r)   r   r-   r.   rE   feat_chsfeature_infocurr_strider$   features
num_blocks	block_idxchsr%   r#   r&   next_dilationfname	block_dprr*   pen_chss                              rH   _build_blocksr      s   6 U	+BzHLKHHYJ9B99M 35	5CFH A:'1nFIi!m_2MET(2,+V[\]]Lm+ (6 1"Y.*q.A	+4r>HY't	( 
.%
 
 	 	v Xb\//122536 TJ.?GT(2,+PYZ]^fZgjkZkYlNmnooLOOK'MYM"MN\!!rI   c                       e Zd ZdZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d'dedededededed	ed
ededededededef fdZej                  j                  d(dedeeef   fd       Zej                  j                  d)deddfd       Zej                  j                  dej"                  fd       Zd*dedee   dd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de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 xZS )-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   rg   rh   re   rf   r&   r'   r(   r)   	drop_rater   c           
         t         |           ||d}|| _        || _        || _        d| _        |dv sJ |dk  rd|z  nd}t        t        ||z        |
      }t        ||dfd|d	|| _	        t        |||||	|
      }t        ||||
||||fi |\  }| _        |d
   j                  x| _        | _        t!        j"                  | | _        t'        | j                  |||fi || _        t+        |        y)a  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)          r/   r   r0   r2   rj   )r#   r(   r   N)r7   r8   r   r   r   grad_checkpointingr   r<   r   r   r}   r   r   r;   num_featureshead_hidden_sizer_   
Sequentialr   r   headr   )rD   r   r   r   r   rg   rh   re   rf   r&   r'   r(   r)   r   r   r-   r.   rE   stem_base_chsstem_chsr~   r   rG   s                         rH   r8   zRexNet.__init__   s(   J 	/& ""'++++5+;Z!%
(B"CVT(A[a9[XZ[	z:{IxY_`	&3
'
 
'
#$# 5=RL4M4MMD1x0"4#4#4k;PY`]_`	!$'rI   coarserK   c                      t        dd      }|S )zGroup matcher for parameter groups.

        Args:
            coarse: Whether to use coarse grouping.

        Returns:
            Dictionary of grouped parameters.
        z^stemz^features\.(\d+))r   blocks)r   )rD   r   matchers      rH   group_matcherzRexNet.group_matcher>  s     &
 rI   enablec                     || _         y)zEnable or disable gradient checkpointing.

        Args:
            enable: Whether to enable gradient checkpointing.
        N)r   )rD   r   s     rH   set_grad_checkpointingzRexNet.set_grad_checkpointingN  s     #)rI   c                 .    | j                   j                  S )zTGet the classifier module.

        Returns:
            Classifier module.
        )r   fc)rD   s    rH   get_classifierzRexNet.get_classifierW  s     yy||rI   c                     || _         ||R||d}||n| j                  j                  j                  }t	        | j
                  ||| j                  fi || _        y| j                  j                  ||       y)zReset 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)rD   r   r   r-   r.   rE   r   s          rH   reset_classifierzRexNet.reset_classifier`  st     '!2"U3B'2'>DIIDYDYDcDcI&t'8'8+yRVR`R`gdfgDIIIOOK5rI   rN   indicesnorm
stop_early
output_fmtintermediates_onlyc                 |   |dv sJ d       g }| j                   D cg c]"  }t        |d   j                  d      d         $ }	}t        t	        |	      |      \  }
}|
D cg c]  }|	|   	 }
}|	|   }| j                  |      }t        j                  j                         s|s| j                  }n| j                  d|dz    }t        |      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.r   .r   Nr   )r   r@   splitr   r   r   rQ   jitis_scriptingr   rn   r   r   rp   )rD   rN   r   r   r   r   r   intermediatesinfo
stage_endstake_indices	max_indexr{   stagesfeat_idxstages                   rH   forward_intermediateszRexNet.forward_intermediateso  s=   * Y&D(DD&EIEVEVWTc$x...s3B78W
W"6s:"Pi/;<!
1<<y)	 IIaL99!!#:]]F]]>IM2F(0 	(OHe&&uyy/E/E/Gua(!H<'$$Q'	(   -/ X<s   'D4!D9
prune_norm
prune_headc                    | j                   D cg c]"  }t        |d   j                  d      d         $ }}t        t	        |      |      \  }}||   }| j
                  d|dz    | _        |r| j                  dd       |S c c}w )aE  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   r@   r   r   r   r   r   )rD   r   r   r   r   r   r   r   s           rH   prune_intermediate_layersz RexNet.prune_intermediate_layers  s      FJEVEVWTc$x...s3B78W
W"6s:"Piy)	ny1}5!!!R( Xs   'Bc                     | j                  |      }| j                  r6t        j                  j	                         st        | j                  |      }|S | j                  |      }|S )zForward pass through feature extraction layers.

        Args:
            x: Input tensor.

        Returns:
            Feature tensor.
        )r   r   rQ   r   r   r   r   rD   rN   s     rH   forward_featureszRexNet.forward_features  sU     IIaL""599+A+A+Ct}}a0A  a ArI   
pre_logitsc                 N    |r| j                  ||      S | j                  |      S )zForward pass through head.

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

        Returns:
            Classification logits or features.
        )r   )r   )rD   rN   r   s      rH   forward_headzRexNet.forward_head  s(     7Atyyzy2RdiiPQlRrI   c                 J    | j                  |      }| j                  |      }|S )zoForward pass.

        Args:
            x: Input tensor.

        Returns:
            Output logits.
        )r   r   r   s     rH   rT   zRexNet.forward  s)     !!!$a rI   )r2     avgr   r      r/   r/   gUUUUUU?r   rV   rW   g?rU   NNrX   )T)NNN)NFFr   F)r   FT)rY   rZ   r[   r\   r@   r^   r]   r8   rQ   r   ignorera   r   r   r   r   r_   r`   r   r   r   rb   r   r   r	   r   r   r   r   rT   rc   rd   s   @rH   r   r      s    #$!#!  # ##$ '"$&#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 %,, rI   variant
pretrainedc                 B    t        d      }t        t        | |fd|i|S )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       rH   _create_rexnetr     s8     $/K  	
  rI   urlc                 2    | dddddt         t        dddd	|S )
zCreate default configuration dictionary.

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

    Returns:
        Configuration dictionary.
    r   )r2      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     rH   _cfgr     s5     4}SYI%.B!
 # rI   ztimm/)	hf_hub_idgffffff?)r2      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                     t        d| fi |S )zReXNet V1 1.0x
rexnet_100r   r   r   s     rH   r   r   #  s     ,
=f==rI   c                      t        d| fddi|S )zReXNet V1 1.3x
rexnet_130re   ?r   r   s     rH   r   r   )       ,
MsMfMMrI   c                      t        d| fddi|S )zReXNet V1 1.5x
rexnet_150re         ?r   r   s     rH   r   r   /  r   rI   c                      t        d| fddi|S )zReXNet V1 2.0x
rexnet_200re          @r   r   s     rH   r  r  5  r   rI   c                      t        d| fddi|S )zReXNet V1 3.0x
rexnet_300re         @r   r   s     rH   r  r  ;  r   rI   c                      t        d| fddi|S )z*ReXNet V1 1.0x w/ rounded (mod 8) channelsrexnetr_100r'   r   r   r   s     rH   r  r  A  s     -HAHHHrI   c                 "    t        d| fddd|S )z*ReXNet V1 1.3x w/ rounded (mod 8) channelsrexnetr_130r   r   re   r'   r   r   s     rH   r	  r	  G       -XAXQWXXrI   c                 "    t        d| fddd|S )z*ReXNet V1 1.5x w/ rounded (mod 8) channelsrexnetr_150r   r   r
  r   r   s     rH   r  r  M  r  rI   c                 "    t        d| fddd|S )z*ReXNet V1 2.0x w/ rounded (mod 8) channelsrexnetr_200r  r   r
  r   r   s     rH   r  r  S  r  rI   c                 "    t        d| fddd|S )z+ReXNet V1 3.0x w/ rounded (mod 16) channelsrexnetr_300r  r   r
  r   r   s     rH   r  r  Y  s     -YBYRXYYrI   )r/   r/   r   r   rU   r   )r   r   rV   rW   rU   NN)r   rX   )?r\   	functoolsr   mathr   typingr   r   r   r   r	   r
   r   rQ   torch.nnr_   	timm.datar   r   timm.layersr   r   r   r   r   r   _builderr   _efficientnet_builderr   	_featuresr   _manipulater   r   	_registryr   r   __all__BatchNorm2dr?   r`   r    r]   r@   r}   r^   r   r   ra   r   r   default_cfgsr   r   r   r  r  r  r	  r  r  r  r   rI   rH   <module>r      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rI   