
    RЦi                        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JrJr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'J(r(J)r)  SSK*J+r+J,r,J-r-  S/r. " S S\R^                  5      r0 " S S\R^                  5      r1 " S S\R^                  5      r2 " S S\R^                  5      r3 " S S\R^                  5      r4 " S S\R^                  5      r5S\6S\74S jr8SSS\\" \S S!9SS4S"\9S#\9S\6S$\7S%\S&\S\Rt                  4S' jjr; " S( S\R^                  5      r<SwS)\R^                  S*\6S+\7SS4S, jjr=\R|                  " 5       SxS-\R^                  S.\6S/\64S0 jj5       r?SyS1\6S2\7S3\S\<4S4 jjr@SyS1\6S2\7S3\S\<4S5 jjrASzS6\6S3\S\\6\4   4S7 jjrB\+" 0 S8\B" S9S:SS;9_S<\B" S9S:SS;9_S=\B" S9S>S?S@S:SSA9_SB\B" S9SCSDS@SSE9_SF\B" S9SCSDS@SSE9_SG\B" S9SCSDS@SSE9_SH\B" S9SCSDS@SSE9_SI\B" S9SCSDS@SSE9_SJ\B" S9SKSLS@SSE9_SM\B" S9SNSSO9_SP\B" S9SNSSO9_SQ\B" S9SNSSO9_SR\B" S9SNSSO9_SS\B" S9SNSSO9_ST\B" S9SNSSO9_SU\B" S9S:SVSWS@SX9_SY\B" S9S:SVSWS@SZS[9_\B" S9S:SVSWS@SX9\B" S9S:SVSWS@SZS[9\B" S9S@S>S?SCS:SZS\9\B" S9S:S]SWS@SX9\B" S:SZS^9\B" S:SZS^9\B" S9S:S]SWS@SX9\B" S:SZS^9\B" S:S_9\B" S:SZS^9\B" S9S:SZS]SWS@S`9\B" S9S:SZS]SWS@S`9\B" S:SZS^9Sa.E5      rC\,SyS2\7S3\S\<4Sb jj5       rD\,SyS2\7S3\S\<4Sc jj5       rE\,SyS2\7S3\S\<4Sd jj5       rF\,SyS2\7S3\S\<4Se jj5       rG\,SyS2\7S3\S\<4Sf jj5       rH\,SyS2\7S3\S\<4Sg jj5       rI\,SyS2\7S3\S\<4Sh jj5       rJ\,SyS2\7S3\S\<4Si jj5       rK\,SyS2\7S3\S\<4Sj jj5       rL\,SyS2\7S3\S\<4Sk jj5       rM\,SyS2\7S3\S\<4Sl jj5       rN\,SyS2\7S3\S\<4Sm jj5       rO\,SyS2\7S3\S\<4Sn jj5       rP\,SyS2\7S3\S\<4So jj5       rQ\,SyS2\7S3\S\<4Sp jj5       rR\,SyS2\7S3\S\<4Sq jj5       rS\,SyS2\7S3\S\<4Sr jj5       rT\,SyS2\7S3\S\<4Ss jj5       rU\,SyS2\7S3\S\<4St jj5       rV\,SyS2\7S3\S\<4Su jj5       rW\-" \XSBSFSGSHSISJSMSPSQSRSSSTS8S<S=Sv.5        g){a/  Pre-Activation ResNet v2 with GroupNorm and Weight Standardization.

A PyTorch implementation of ResNetV2 adapted from the Google Big-Transfer (BiT) source code
at https://github.com/google-research/big_transfer to match timm interfaces. The BiT weights have
been included here as pretrained models from their original .NPZ checkpoints.

Additionally, supports non pre-activation bottleneck for use as a backbone for Vision Transformers (ViT) and
extra padding support to allow porting of official Hybrid ResNet pretrained weights from
https://github.com/google-research/vision_transformer

Thanks to the Google team for the above two repositories and associated papers:
* Big Transfer (BiT): General Visual Representation Learning - https://arxiv.org/abs/1912.11370
* An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale - https://arxiv.org/abs/2010.11929
* Knowledge distillation: A good teacher is patient and consistent - https://arxiv.org/abs/2106.05237

Original copyright of Google code below, modifications by Ross Wightman, Copyright 2020.
    )OrderedDict)partial)AnyCallableDictListOptionalTupleUnionNIMAGENET_INCEPTION_MEANIMAGENET_INCEPTION_STD)GroupNormActBatchNormAct2dEvoNorm2dS0FilterResponseNormTlu2dClassifierHeadDropPathcalculate_drop_path_ratesAvgPool2dSamecreate_pool2d	StdConv2dcreate_conv2dget_act_layerget_norm_act_layermake_divisible   )build_model_with_cfg)feature_take_indices)checkpoint_seqnamed_applyadapt_input_conv)generate_default_cfgsregister_modelregister_model_deprecationsResNetV2c                      ^  \ rS rSrSr             SS\S\\   S\S\S\S\\   S	\S
\\   S\\   S\\   S\\   S\4U 4S jjjr	SS jr
S\R                  S\R                  4S jrSrU =r$ )PreActBasic2   zAPre-activation basic block (not in typical 'v2' implementations).in_chsout_chsbottle_ratiostridedilationfirst_dilationgroups	act_layer
conv_layer
norm_layer
proj_layerdrop_path_ratec           
        > XS.n[         TU ]  5         U=(       d    UnU	=(       d    [        n	U
=(       d    [        [        SS9n
U=(       d    Un[        X#-  5      nUb'  US:w  d
  Xe:w  d  X:w  a  U" UU4UUUSU	U
S.UD6U l        OSU l        U
" U40 UD6U l        U	" UUS4XFUS	.UD6U l        U
" U40 UD6U l	        U	" UUS4XWS
.UD6U l
        US:  a  [        U5      U l        g[        R                  " 5       U l        g)a  Initialize PreActBasic block.

Args:
    in_chs: Input channels.
    out_chs: Output channels.
    bottle_ratio: Bottleneck ratio (not used in basic block).
    stride: Stride for convolution.
    dilation: Dilation rate.
    first_dilation: First dilation rate.
    groups: Group convolution size.
    act_layer: Activation layer type.
    conv_layer: Convolution layer type.
    norm_layer: Normalization layer type.
    proj_layer: Projection/downsampling layer type.
    drop_path_rate: Stochastic depth drop rate.
devicedtype    
num_groupsNr   Tr-   r.   r/   preactr2   r3      r-   r.   r0   )r.   r0   r   )super__init__r   r   r   r   
downsamplenorm1conv1norm2conv2r   nnIdentity	drop_pathselfr*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r8   r9   ddmid_chs	__class__s                    S/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/timm/models/resnetv2.pyrB   PreActBasic.__init__5   s$   B /'38,9
G7<B#G
#V !78!v{n6PTZTe(
 !-%%
 
DO #DO-"-
p6cipmop
.2.
!\h\Y[\
5Ca5G.1R[[]    returnc                 j    [         R                  R                  U R                  R                  5        g)zLZero-initialize the last convolution weight (not applicable to basic block).N)rH   initzeros_rG   weightrL   s    rP   zero_init_lastPreActBasic.zero_init_lasts       
tzz(()rR   xc                     U R                  U5      nUnU R                  b  U R                  U5      nU R                  U5      nU R                  U R	                  U5      5      nU R                  U5      nX-   $ zGForward pass.

Args:
    x: Input tensor.

Returns:
    Output tensor.
)rD   rC   rE   rG   rF   rJ   rL   r\   x_preactshortcuts       rP   forwardPreActBasic.forwardw   sl     ::a= ??&x0H JJx JJtzz!}%NN1|rR   )rE   rG   rC   rJ   rD   rF   )N      ?r   r   Nr   NNNN        NNrS   N__name__
__module____qualname____firstlineno____doc__intr	   floatr   rB   rY   torchTensorrb   __static_attributes____classcell__rO   s   @rP   r(   r(   2   s    K
 &*"%,0,0-1-1-1$&<[<[ c]<[  	<[
 <[ <[ %SM<[ <[  )<[ !*<[ !*<[ !*<[ "<[ <[|* %,,  rR   r(   c                      ^  \ rS rSrSr             SS\S\\   S\S\S\S\\   S	\S
\\   S\\   S\\   S\\   S\4U 4S jjjr	SS jr
S\R                  S\R                  4S jrSrU =r$ )PreActBottleneck   zPre-activation (v2) bottleneck block.

Follows the implementation of "Identity Mappings in Deep Residual Networks":
https://github.com/KaimingHe/resnet-1k-layers/blob/master/resnet-pre-act.lua

Except it puts the stride on 3x3 conv when available.
r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   c           
        > XS.n[         TU ]  5         U=(       d    UnU	=(       d    [        n	U
=(       d    [        [        SS9n
U=(       d    Un[        X#-  5      nUb  U" UU4UUUSU	U
S.UD6U l        OSU l        U
" U40 UD6U l        U	" UUS40 UD6U l        U
" U40 UD6U l	        U	" UUS4XFUS	.UD6U l
        U
" U40 UD6U l        U	" UUS40 UD6U l        US
:  a  [        U5      U l        g[        R                  " 5       U l        g)a  Initialize PreActBottleneck block.

Args:
    in_chs: Input channels.
    out_chs: Output channels.
    bottle_ratio: Bottleneck ratio.
    stride: Stride for convolution.
    dilation: Dilation rate.
    first_dilation: First dilation rate.
    groups: Group convolution size.
    act_layer: Activation layer type.
    conv_layer: Convolution layer type.
    norm_layer: Normalization layer type.
    proj_layer: Projection/downsampling layer type.
    drop_path_rate: Stochastic depth drop rate.
r7   r:   r;   NTr=   r   r?   r@   r   )rA   rB   r   r   r   r   rC   rD   rE   rF   rG   norm3conv3r   rH   rI   rJ   rK   s                    rP   rB   PreActBottleneck.__init__   s3   B /'38,9
G7<B#G
#V !78!(
 !-%%
 
DO #DO-"-
9b9
.2.
!qFdjqnpq
.2.
!:r:
5Ca5G.1R[[]rR   rS   c                 j    [         R                  R                  U R                  R                  5        g)z,Zero-initialize the last convolution weight.N)rH   rU   rV   ry   rW   rX   s    rP   rY   PreActBottleneck.zero_init_last   r[   rR   r\   c                 0   U R                  U5      nUnU R                  b  U R                  U5      nU R                  U5      nU R                  U R	                  U5      5      nU R                  U R                  U5      5      nU R                  U5      nX-   $ r^   )rD   rC   rE   rG   rF   ry   rx   rJ   r_   s       rP   rb   PreActBottleneck.forward   s     ::a= ??&x0H JJx JJtzz!}%JJtzz!}%NN1|rR   )rE   rG   ry   rC   rJ   rD   rF   rx   N      ?r   r   Nr   NNNNre   NNrf   rg   rs   s   @rP   ru   ru      s    &*"&,0,0-1-1-1$&>[>[ c]>[  	>[
 >[ >[ %SM>[ >[  )>[ !*>[ !*>[ !*>[ ">[ >[@* %,,  rR   ru   c                      ^  \ rS rSrSr             SS\S\\   S\S\S\S\\   S	\S
\\   S\\   S\\   S\\   S\4U 4S jjjr	SS jr
S\R                  S\R                  4S jrSrU =r$ )
Bottleneck   zUNon Pre-activation bottleneck block, equiv to V1.5/V1b Bottleneck. Used for ViT.
    r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   c           	      X  > XS.n[         TU ]  5         U=(       d    UnU=(       d    [        R                  nU	=(       d    [        n	U
=(       d    [        [        SS9n
U=(       d    Un[        X#-  5      nUb  U" UU4UUSU	U
S.UD6U l        OS U l        U	" UUS40 UD6U l	        U
" U40 UD6U l
        U	" UUS4XFUS.UD6U l        U
" U40 UD6U l        U	" UUS40 UD6U l        U
" U4S	S0UD6U l        US
:  a  [        U5      O[        R                   " 5       U l        U" SS9U l        g )Nr7   r:   r;   F)r-   r.   r>   r2   r3   r   r?   r@   	apply_actr   T)inplace)rA   rB   rH   ReLUr   r   r   r   rC   rE   rD   rG   rF   ry   rx   r   rI   rJ   act3rK   s                    rP   rB   Bottleneck.__init__   sJ   " /'38(	,9
G7<B#G
#V !78!(	 !%%	 	DO #DO9b9
.2.
!qFdjqnpq
.2.
!:r:
?5?B?
5Ca5G.1R[[]d+	rR   rS   c                     [        U R                  SS5      b4  [        R                  R	                  U R                  R
                  5        gg)z+Zero-initialize the last batch norm weight.rW   N)getattrrx   rH   rU   rV   rW   rX   s    rP   rY   Bottleneck.zero_init_last'  s4    4::x.:GGNN4::,,- ;rR   r\   c                 Z   UnU R                   b  U R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nU R	                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nU R                  X-   5      nU$ r^   )	rC   rE   rD   rG   rF   ry   rx   rJ   r   )rL   r\   ra   s      rP   rb   Bottleneck.forward,  s     ??&q)H JJqMJJqMJJqMJJqMJJqMJJqMNN1IIal#rR   )	r   rE   rG   ry   rC   rJ   rD   rF   rx   r   rf   rg   rs   s   @rP   r   r      s    
 &*"&,0,0-1-1-1$&/,/, c]/,  	/,
 /, /, %SM/, /,  )/, !*/, !*/, !*/, "/, /,b.
 %,,  rR   r   c                      ^  \ rS rSrSr        SS\S\S\S\S\\   S\S	\\   S
\\   4U 4S jjjr	S\
R                  S\
R                  4S jrSrU =r$ )DownsampleConviF  z$1x1 convolution downsampling module.r*   r+   r-   r.   r/   r>   r2   r3   c                    > XS.n[         TU ]  5         U" XS4SU0UD6U l        U(       a  [        R                  " 5       U l        g U" U4SS0UD6U l        g )Nr7   r   r-   r   F)rA   rB   convrH   rI   norm)rL   r*   r+   r-   r.   r/   r>   r2   r3   r8   r9   rM   rO   s               rP   rB   DownsampleConv.__init__I  sU     /vG&GBG	%+BKKM	G1[u1[XZ1[	rR   r\   rS   c                 B    U R                  U R                  U5      5      $ zLForward pass.

Args:
    x: Input tensor.

Returns:
    Downsampled tensor.
)r   r   rL   r\   s     rP   rb   DownsampleConv.forward[  s     yy1&&rR   )r   r   r   r   NTNNNNrh   ri   rj   rk   rl   rm   r	   boolr   rB   ro   rp   rb   rq   rr   rs   s   @rP   r   r   F  s    . ,0-1-1\\ \ 	\
 \ %SM\ \ !*\ !*\ \$	' 	'%,, 	' 	'rR   r   c                      ^  \ rS rSrSr        SS\S\S\S\S\\   S\S	\\   S
\\   4U 4S jjjr	S\
R                  S\
R                  4S jrSrU =r$ )DownsampleAvgig  z/AvgPool downsampling as in 'D' ResNet variants.r*   r+   r-   r.   r/   r>   r2   r3   c                 r  > XS.n[         TU ]  5         US:X  a  UOSnUS:  d  US:  a1  US:X  a  US:  a  [        O[        R                  nU" SUSSS9U l        O[        R                  " 5       U l        U" XS4SS0UD6U l        U(       a  [        R                  " 5       U l        g U" U4SS0UD6U l        g )	Nr7   r      TF)	ceil_modecount_include_padr-   r   )	rA   rB   r   rH   	AvgPool2dpoolrI   r   r   )rL   r*   r+   r-   r.   r/   r>   r2   r3   r8   r9   rM   
avg_strideavg_pool_fnrO   s                 rP   rB   DownsampleAvg.__init__j  s     /'1}V!
A:A+5?x!|-QSQ]Q]K#AzTUZ[DIDIvB!BrB	%+BKKM	G1[u1[XZ1[	rR   r\   rS   c                 `    U R                  U R                  U R                  U5      5      5      $ r   )r   r   r   r   s     rP   rb   DownsampleAvg.forward  s$     yy499Q<011rR   )r   r   r   r   r   rs   s   @rP   r   r   g  s    9 ,0-1-1\\ \ 	\
 \ %SM\ \ !*\ !*\ \0	2 	2%,, 	2 	2rR   r   c                      ^  \ rS rSrSrSSSS\SSS4S\S\S	\S
\S\S\S\S\S\	\
\      S\S\	\   S\	\   S\	\   S\4U 4S jjjrS\R                  S\R                  4S jrSrU =r$ )ResNetStagei  zResNet Stage.r   r   FNr*   r+   r-   r.   depthr,   r0   avg_down	block_dprblock_fnr1   r2   r3   block_kwargsc                   > [         TU ]  5         SU l        US;   a  SOSn[        XUS9nU(       a  [        O[
        nUn[        R                  " 5       U l        [        U5       HX  nU	(       a  U	U   OSnUS:X  a  UOSnU R                  R                  [        U5      U
" UU4UUUUUUUS.UDUD65        UnUnS nMZ     g )	NF)r   r   r   r   )r1   r2   r3   re   r   )r-   r.   r,   r0   r/   r4   r5   )rA   rB   grad_checkpointingdictr   r   rH   
Sequentialblocksrange
add_modulestr)rL   r*   r+   r-   r.   r   r,   r0   r   r   r   r1   r2   r3   r   r/   layer_kwargsr4   prev_chs	block_idxr5   rO   s                        rP   rB   ResNetStage.__init__  s    " 	"'&&0aiS]^&.]N
mmouI5>Yy1BN(A~V1FKK""3y>84 !)-%-4 4 4  H%NJ% &rR   r\   rS   c                     U R                   (       a;  [        R                  R                  5       (       d  [	        U R
                  U5      nU$ U R                  U5      nU$ )zgForward pass through all blocks in the stage.

Args:
    x: Input tensor.

Returns:
    Output tensor.
)r   ro   jitis_scriptingr    r   r   s     rP   rb   ResNetStage.forward  sJ     ""599+A+A+C+Ct{{A.A  AArR   )r   r   )rh   ri   rj   rk   rl   ru   rm   rn   r   r	   r   r   r   rB   ro   rp   rb   rq   rr   rs   s   @rP   r   r     s     #'"/3!1,0-1-1++ + 	+
 + +  + + +  U,+ +  )+ !*+ !*+  + +Z %,,  rR   r   	stem_typerS   c                 H    [        S Vs/ s H  oU ;   PM	     sn5      $ s  snf )zCheck if stem type is deep (has multiple convolutions).

Args:
    stem_type: Type of stem to check.

Returns:
    True if stem is deep, False otherwise.
)deeptiered)any)r   ss     rP   is_stem_deepr     s&     (:;(:1Y(:;<<;s   @    Tr:   r;   r*   r+   r>   r2   r3   c                    XgS.n[        5       n	US;   d   e[        U5      (       a  SU;   a  SU-  S-  US-  4n
O
US-  US-  4n
U" X
S   4SSS.UD6U	S	'   U" U
S   40 UD6U	S
'   U" U
S   U
S   4SSS.UD6U	S'   U" U
S   40 UD6U	S'   U" U
S   U4SSS.UD6U	S'   U(       d  U" U40 UD6U	S'   O"U" X4SSS.UD6U	S'   U(       d  U" U40 UD6U	S'   SU;   a4  [        R                  " SS5      U	S'   [        R                  " SSSS9U	S'   O/SU;   a  [        SSSSS9U	S'   O[        R                  " SSSS9U	S'   [        R                  " U	5      $ )Nr7   )r   fixedsamer   
deep_fixed	deep_samer   r   r?      r   r   )kernel_sizer-   rE   rD   r   rG   rF   ry   rx      r   r   r   re   pad)r   r-   paddingr   r   max)r   r   rH   ConstantPad2d	MaxPool2dr   r   )r*   r+   r   r>   r2   r3   r8   r9   rM   stemstem_chss              rP   create_resnetv2_stemr     s    	+B=DZZZZ Iy Gq('Q,7H1gl3H"6A;VAaVSUVW"8A;5"5W"8A;[ST[XZ[W"8A;5"5W"8A;WQqWTVWW&w5"5DM "&QqQbQV%g44DL)&&q"-U||!QGV	9	$U!VTV ||!QGV==rR   c            '          ^  \ rS rSrSrSSSSSSS	S
SSSS\R                  \" \SS9\	SSSSS4S\
\   S\\S4   S\S\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&S4S' jj5       r\R&                  R)                  5       SAS(\S)\S&S4S* jj5       r\R&                  R(                  SBS+\S&\\\4   4S, jj5       r\R&                  R(                  S@S-\S&S4S. jj5       r\R&                  R(                  S&\R6                  4S/ j5       rSCS\S\\   S&S4S0 jjr     SDS1\R>                  S2\\ \\
\   4      S3\S4\S5\S6\S&\ \
\R>                     \\R>                  \
\R>                     4   4   4S7 jjr!   SES2\ \\
\   4   S8\S9\4S: jjr"S1\R>                  S&\R>                  4S; jr#SBS1\R>                  S<\S&\R>                  4S= jjr$S1\R>                  S&\R>                  4S> jr%S?r&U =r'$ )Fr&   i	  z7Implementation of Pre-activation (v2) ResNet mode.
    )      i   i     r?   avgr:   r   r   r   FTr   r;   re   Nlayerschannels.num_classesin_chansglobal_pooloutput_stridewidth_factorr   r   r   r>   basicr,   r1   r3   r2   	drop_rater5   rY   c                 T  > [         T%U ]  5         UUS.nX0l        X@l        UU l        Un[        XS9n[        U5      n/ U l        [        UU-  5      n[        UUU	U4UUS.UD6U l
        U(       a  [        U	5      (       a  SOSOSnU R                  R                  [        USUS95        UnS	nS
n[        UUSS9nU(       a  U(       a  [        O[         nOU(       a   e["        n[$        R&                  " 5       U l        [+        [-        XU5      5       H  u  nu  nn n![        U U-  5      n"US:X  a  S
OSn#UU:  a  UU#-  nS
n#[/        UU"4U#UUUU
UUUU!US.
UD6n$U"nUU#-  nU =R                  [        UUSU 3S9/-  sl        U R(                  R1                  [3        U5      U$5        M     U=U l        U l        U(       a  U" U R4                  40 UD6O[$        R8                  " 5       U l        [=        U R4                  U4UU R                  SS.UD6U l        U RA                  US9  g)a:  
Args:
    layers (List[int]) : number of layers in each block
    channels (List[int]) : number of channels in each block:
    num_classes (int): number of classification classes (default 1000)
    in_chans (int): number of input (color) channels. (default 3)
    global_pool (str): Global pooling type. One of 'avg', 'max', 'avgmax', 'catavgmax' (default 'avg')
    output_stride (int): output stride of the network, 32, 16, or 8. (default 32)
    width_factor (int): channel (width) multiplication factor
    stem_chs (int): stem width (default: 64)
    stem_type (str): stem type (default: '' == 7x7)
    avg_down (bool): average pooling in residual downsampling (default: False)
    preact (bool): pre-activation (default: True)
    act_layer (Union[str, nn.Module]): activation layer
    norm_layer (Union[str, nn.Module]): normalization layer
    conv_layer (nn.Module): convolution module
    drop_rate: classifier dropout rate (default: 0.)
    drop_path_rate: stochastic depth rate (default: 0.)
    zero_init_last: zero-init last weight in residual path (default: False)
r7   )r1   )r2   r3   z
stem.conv3	stem.convz	stem.normr   )num_chs	reductionmodule   r   T)	stagewiser   )
r-   r.   r   r,   r   r1   r2   r3   r   r   zstages.)	pool_typer   use_convrY   N)!rA   rB   r   r   r   r   r   feature_infor   r   r   r   appendr   r   r(   ru   r   rH   r   stages	enumeratezipr   r   r   num_featureshead_hidden_sizerI   r   r   headinit_weights)&rL   r   r   r   r   r   r   r   r   r   r   r>   r   r,   r1   r3   r2   r   r5   rY   r8   r9   rM   wf	stem_featr   curr_strider.   
block_dprsr   	stage_idxdcbdprr+   r-   stagerO   s&                                        rP   rB   ResNetV2.__init__  sf   X 	/& "'
H
!),	!(R-0(	

 "!
 
	 SY\)%<%<\+^i	  h!I!VW.~vQUV
&+{1AH9!Hmmo'0Vz1R'S#I|1d$QV,G#q.QaFm+F" !)!#%%! E H6!K$x;Y`aj`kWl"m!nnKK""3y>591 (T4 5=<D1;AJt007B7r{{}	"
 "nn
 
	 	8rR   rS   c                 4    [        [        [        US9U 5        g)zInitialize model weights.r   N)r!   r   _init_weights)rL   rY   s     rP   r   ResNetV2.init_weights  s     	GM.I4PrR   checkpoint_pathprefixc                     [        XU5        g)zLoad pretrained weights.N)_load_weights)rL   r  r  s      rP   load_pretrainedResNetV2.load_pretrained  s     	dV4rR   coarsec                 0    [        SU(       a  SOSS/S9nU$ )z"Group parameters for optimization.z^stemz^stages\.(\d+))z^stages\.(\d+)\.blocks\.(\d+)N)z^norm)i )r   r   )r   )rL   r  matchers      rP   group_matcherResNetV2.group_matcher  s)     (.$8$5
 rR   enablec                 6    U R                    H	  nXl        M     g)z)Enable or disable gradient checkpointing.N)r   r   )rL   r  r   s      rP   set_grad_checkpointingResNetV2.set_grad_checkpointing  s     A#)  rR   c                 .    U R                   R                  $ )zGet the classifier head.)r   fcrX   s    rP   get_classifierResNetV2.get_classifier  s     yy||rR   c                 F    Xl         U R                  R                  X5        g)zReset the classifier head.

Args:
    num_classes: Number of classes for new classifier.
    global_pool: Global pooling type.
N)r   r   reset)rL   r   r   s      rP   reset_classifierResNetV2.reset_classifier  s     '		1rR   r\   indicesr   
stop_early
output_fmtintermediates_onlyc                    US;   d   S5       e/ n[        SU5      u  pSn
UR                  SS u  pU R                   H*  nU" U5      nUR                  SS US-  US-  4:X  d  M(  UnM,     X;   a  UR                  W5        [	        U R
                  5      n[        R                  R                  5       (       d  U(       d  U R
                  nOU R
                  SU	 n[        USS	9 HX  u  n
nU" U5      nX;   d  M  X:X  a-  U(       a  U R                  U5      OUnUR                  U5        MG  UR                  U5        MZ     U(       a  U$ X: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   Nr   r   )start)r   shaper   r   lenr   ro   r   r   r   r   )rL   r\   r  r   r  r   r!  intermediatestake_indices	max_indexfeat_idxHWr   x_downlast_idxr   r  x_inters                      rP   forward_intermediatesResNetV2.forward_intermediates  sN   * Y&D(DD&"6q'"B wwrs|IIDQAwwrs|Aq1u~-  #  (t{{#99!!##:[[F[[),F(q9OHeaA''.2diilG!((1!((+  :   		!ArR   
prune_norm
prune_headc                     [        SU5      u  pEU R                  SU U l        U(       a  [        R                  " 5       U l        U(       a  U R                  SS5        U$ )z?Prune layers not required for specified intermediates.
        r$  Nr   r   )r   r   rH   rI   r   r  )rL   r  r4  r5  r*  r+  s         rP   prune_intermediate_layers"ResNetV2.prune_intermediate_layers  sN     #7q'"Bkk*9-DI!!!R(rR   c                 l    U R                  U5      nU R                  U5      nU R                  U5      nU$ )zjForward pass through feature extraction layers.

Args:
    x: Input tensor.

Returns:
    Feature tensor.
)r   r   r   r   s     rP   forward_featuresResNetV2.forward_features  s0     IIaLKKNIIaLrR   
pre_logitsc                 P    U(       a  U R                  XS9$ U R                  U5      $ )zForward pass through classifier head.

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

Returns:
    Classification logits or features.
)r<  )r   )rL   r\   r<  s      rP   forward_headResNetV2.forward_head  s&     7Atyyy2RdiiPQlRrR   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     rP   rb   ResNetV2.forward  s)     !!!$a rR   )
r   r   r   r   r   r   r   r   r   r   )Tzresnet/F)N)NFFr#  F)r   FT)(rh   ri   rj   rk   rl   rH   r   r   r   r   r   rm   r
   r   r   rn   r   rB   ro   r   ignorer   r  r   r   r  r  Moduler  r	   r  rp   r   r2  r7  r:  r>  rb   rq   rr   rs   s   @rP   r&   r&   	  s}    )?#$!# !""&"$''#*<B#G#,!$&#(-r9Ir9 CHor9 	r9
 r9 r9 r9 r9 r9 r9 r9 r9 r9  r9  r9  !!r9" !#r9$ %r9& "'r9( !)r9 r9h YYQ4 Q4 Q Q YY5s 5C 5PT 5 5 YY	D 	T#s(^ 	 	 YY*T *T * *
 YY		  2C 2hsm 2W[ 2 8<$$',7 ||7  eCcN347  	7 
 7  7  !%7  
tELL!5tELL7I)I#JJ	K7 v ./$#	3S	>*  	 %,, 5<< 
Sell 
S 
S 
S %,,  rR   r   namerY   c                    [        U [        R                  5      (       d%  SU;   ar  [        U [        R                  5      (       aS  [        R                  R                  U R                  SSS9  [        R                  R                  U R                  5        g[        U [        R                  5      (       aa  [        R                  R                  U R                  SSS9  U R                  b*  [        R                  R                  U R                  5        gg[        U [        R                  [        R                  [        R                  45      (       aS  [        R                  R                  U R                  5        [        R                  R                  U R                  5        gU(       a#  [        U S	5      (       a  U R                  5         ggg)
zInitialize module weights.

Args:
    module: PyTorch module to initialize.
    name: Module name.
    zero_init_last: Zero-initialize last layer weights.
head.fcre   g{Gz?)meanstdfan_outrelu)modenonlinearityNrY   )
isinstancerH   LinearConv2drU   normal_rW   rV   biaskaiming_normal_BatchNorm2d	LayerNorm	GroupNormones_hasattrrY   )r   rF  rY   s      rP   r  r    s    &"))$$d):z&RTR[R[?\?\
CT:
v{{#	FBII	&	&
IFS;;"GGNN6;;' #	FR^^R\\2<<H	I	I
fmm$
v{{#	GF,<== >rR   modelr  r  c                    SS K nS nUR                  U5      n[        U R                  R                  R
                  R                  S   U" XR S3   5      5      nU R                  R                  R
                  R                  U5        U R                  R
                  R                  U" XR S3   5      5        U R                  R                  R                  U" XR S3   5      5        [        [        U R                  SS 5      [        R                  5      (       a  U R                  R                  R
                  R                  S   XR S3   R                  S	   :X  at  U R                  R                  R
                  R                  U" XR S3   5      5        U R                  R                  R                  R                  U" XR S
3   5      5        [!        U R"                  R%                  5       5       GHV  u  nu  p[!        U	R&                  R%                  5       5       GH%  u  n
u  pSnU SUS-    SU
S-   S S3nUR(                  R
                  R                  U" X^ SU S3   5      5        UR*                  R
                  R                  U" X^ SU S3   5      5        UR,                  R
                  R                  U" X^ SU S3   5      5        UR.                  R
                  R                  U" X^ S3   5      5        UR0                  R
                  R                  U" X^ S3   5      5        UR2                  R
                  R                  U" X^ S3   5      5        UR.                  R                  R                  U" X^ S3   5      5        UR0                  R                  R                  U" X^ S3   5      5        UR2                  R                  R                  U" X^ S3   5      5        UR4                  c  GM  X^ SU S3   nUR4                  R                  R
                  R                  U" U5      5        GM(     GMY     g )Nr   c                 t    U R                   S:X  a  U R                  / SQ5      n [        R                  " U 5      $ )zPossibly convert HWIO to OIHW.r   )r?   r   r   r   )ndim	transposero   
from_numpy)conv_weightss    rP   t2p_load_weights.<locals>.t2p7  s1    !'11,?L--rR   r   z%root_block/standardized_conv2d/kernelzgroup_norm/gammazgroup_norm/betar  zhead/conv2d/kernelzhead/conv2d/biasstandardized_conv2dblockz/unit02d/za/z/kernelzb/zc/za/group_norm/gammazb/group_norm/gammazc/group_norm/gammaza/group_norm/betazb/group_norm/betazc/group_norm/betaza/proj/)numpyloadr"   r   r   rW   r'  copy_r   rS  rO  r   r   rH   rQ  r  r   r   named_childrenr   rE   rG   ry   rD   rF   rx   rC   )rZ  r  r  npra  weightsstem_conv_wisnamer  jbnamere  cnameblock_prefixws                   rP   r
  r
  3  s   . ggo&G"

$$Q'Wx?d5e-f)giK	JJOO  -	JJC(2B(C DEF	JJOO#g&@ABC'%**dD1299==JJMM  &&q)Wx?Q5R-S-Y-YZ\-]]

""3w9K/L'M#NO

  Wx7G-H%I!JK&u||'B'B'DE>E!*5<<+F+F+H!IA~)E$XU1q5'q1uSkCLKK$$S>E7'1R)S%TUKK$$S>E7'1R)S%TUKK$$S>E7'1R)S%TUKK$$S>AS1T)U%VWKK$$S>AS1T)U%VWKK$$S>AS1T)U%VWKK""3w?P/Q'R#STKK""3w?P/Q'R#STKK""3w?P/Q'R#ST+nGE7'BC  %%,,223q6: "J FrR   variant
pretrainedkwargsc                 :    [        SS9n[        [        X4SU0UD6$ )zCreate a ResNetV2 model.

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

Returns:
    ResNetV2 model instance.
T)flatten_sequentialfeature_cfg)r   r   r&   )rv  rw  rx  r{  s       rP   _create_resnetv2r|  Y  s2     $/K'  rR   c           
      :    [        U 4US[        [        SS9S.UD6$ )zCreate a ResNetV2 model with BiT weights.

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

Returns:
    ResNetV2 model instance.
r   g:0yE>)eps)rw  r   r2   )r|  r   r   )rv  rw  rx  s      rP   _create_resnetv2_bitr  l  s3     9$/	
  rR   urlc                 2    U SSSSS[         [        SSSS	.UE$ )
Nr   )r?      r  )r   r   g      ?bilinearr   rH  z
apache-2.0)r  r   
input_size	pool_sizecrop_pctinterpolationrI  rJ  
first_conv
classifierlicenser   )r  rx  s     rP   _cfgr    s3    =vJ'0F!  rR   z%resnetv2_50x1_bit.goog_distilled_in1kztimm/bicubic)	hf_hub_idr  custom_loadz-resnetv2_152x2_bit.goog_teacher_in21k_ft_in1kz1resnetv2_152x2_bit.goog_teacher_in21k_ft_in1k_384)r?     r  )   r  rd   )r  r  r  r  r  r  z$resnetv2_50x1_bit.goog_in21k_ft_in1k)r?     r  )   r  )r  r  r  r  r  z$resnetv2_50x3_bit.goog_in21k_ft_in1kz%resnetv2_101x1_bit.goog_in21k_ft_in1kz%resnetv2_101x3_bit.goog_in21k_ft_in1kz%resnetv2_152x2_bit.goog_in21k_ft_in1kz%resnetv2_152x4_bit.goog_in21k_ft_in1k)r?     r  )   r  zresnetv2_50x1_bit.goog_in21kiSU  )r  r   r  zresnetv2_50x3_bit.goog_in21kzresnetv2_101x1_bit.goog_in21kzresnetv2_101x3_bit.goog_in21kzresnetv2_152x2_bit.goog_in21kzresnetv2_152x4_bit.goog_in21kzresnetv2_18.ra4_e3600_r224_in1kg?)r?      r  )r  r  r  test_input_sizetest_crop_pctz resnetv2_18d.ra4_e3600_r224_in1kz
stem.conv1)r  r  r  r  r  r  )r  r  r  r  r  r  r  gffffff?)r  r  )r  )r  r  r  r  r  r  )zresnetv2_34.ra4_e3600_r224_in1kz resnetv2_34d.ra4_e3600_r224_in1kz resnetv2_34d.ra4_e3600_r384_in1kzresnetv2_50.a1h_in1kzresnetv2_50d.untrainedzresnetv2_50t.untrainedzresnetv2_101.a1h_in1kzresnetv2_101d.untrainedzresnetv2_152.untrainedzresnetv2_152d.untrainedzresnetv2_50d_gn.ah_in1kzresnetv2_50d_evos.ah_in1kzresnetv2_50d_frn.untrainedc                 &    [         SU / SQSS.UD6$ )zResNetV2-50x1-BiT model.r?   r      r?   r   rw  r   r   )resnetv2_50x1_bitr  rw  rx  s     rP   r  r    -      c(2<VWc[ac crR   c                 &    [         SU / SQSS.UD6$ )zResNetV2-50x3-BiT model.r  r?   r  )resnetv2_50x3_bitr  r  s     rP   r  r    r  rR   c                 &    [         SU / SQSS.UD6$ )zResNetV2-101x1-BiT model.r?   r      r?   r   r  )resnetv2_101x1_bitr  r  s     rP   r  r    -      e)3MXYe]ce erR   c                 &    [         SU / SQSS.UD6$ )zResNetV2-101x3-BiT model.r  r?   r  )resnetv2_101x3_bitr  r  s     rP   r  r    r  rR   c                 &    [         SU / SQSS.UD6$ )zResNetV2-152x2-BiT model.r?   r   $   r?   r   r  )resnetv2_152x2_bitr  r  s     rP   r  r    r  rR   c                 &    [         SU / SQSS.UD6$ )zResNetV2-152x4-BiT model.r  r   r  )resnetv2_152x4_bitr  r  s     rP   r  r    r  rR   c           	      `    [        / SQSSS[        [        S9n[        SSU 0[        U40 UD6D6$ )zResNetV2-18 model.r   r   r   r   r      r   r   Trd   r   r   r   r,   r2   r3   rw  )resnetv2_18r   r   r   r|  rw  rx  
model_argss      rP   r  r    s>     &9TW ^J _j_DD^W]D^__rR   c                 d    [        / SQSSS[        [        SSS9n[        SSU 0[        U40 UD6D6$ )	z'ResNetV2-18d model (deep stem variant).r  r  Trd   r   r   r   r   r,   r2   r3   r   r   rw  )resnetv2_18dr  r  s      rP   r  r  $  sC     &9TW ^vX\J `z`T*E_X^E_``rR   c           	      \    [        SSSS[        [        S9n[        SSU 0[        U40 UD6D6$ )zResNetV2-34 model.r  r  Trd   r  rw  )resnetv2_34r  r  s      rP   r  r  .  s>     &9TW ^J _j_DD^W]D^__rR   c                 `    [        SSSS[        [        SSS9n[        SSU 0[        U40 UD6D6$ )	z'ResNetV2-34d model (deep stem variant).r  r  Trd   r   r  rw  )resnetv2_34dr  r  s      rP   r  r  8  sC     &9TW ^vX\J `z`T*E_X^E_``rR   c           	      Z    [        / SQ[        [        S9n[        SSU 0[        U40 UD6D6$ )zResNetV2-50 model.r  r   r2   r3   rw  )resnetv2_50r  r  s      rP   r  r  B  s1     \mP^_J_j_DD^W]D^__rR   c           	      ^    [        / SQ[        [        SSS9n[        SSU 0[        U40 UD6D6$ )z'ResNetV2-50d model (deep stem variant).r  r   Tr   r2   r3   r   r   rw  )resnetv2_50dr  r  s      rP   r  r  I  s:     .4)J `z`T*E_X^E_``rR   c           	      ^    [        / SQ[        [        SSS9n[        SSU 0[        U40 UD6D6$ )z)ResNetV2-50t model (tiered stem variant).r  r   Tr  rw  )resnetv2_50tr  r  s      rP   r  r  R  s:     .T+J `z`T*E_X^E_``rR   c           	      Z    [        / SQ[        [        S9n[        SSU 0[        U40 UD6D6$ )zResNetV2-101 model.r  r  rw  )resnetv2_101r  r  s      rP   r  r  [  1     ]}Q_`J`z`T*E_X^E_``rR   c           	      ^    [        / SQ[        [        SSS9n[        SSU 0[        U40 UD6D6$ )z(ResNetV2-101d model (deep stem variant).r  r   Tr  rw  )resnetv2_101dr  r  s      rP   r  r  b  :     >4)J a
ad:F`Y_F`aarR   c           	      Z    [        / SQ[        [        S9n[        SSU 0[        U40 UD6D6$ )zResNetV2-152 model.r  r  rw  )resnetv2_152r  r  s      rP   r  r  k  r  rR   c           	      ^    [        / SQ[        [        SSS9n[        SSU 0[        U40 UD6D6$ )z(ResNetV2-152d model (deep stem variant).r  r   Tr  rw  )resnetv2_152dr  r  s      rP   r  r  r  r  rR   c           	      ^    [        / SQ[        [        SSS9n[        SSU 0[        U40 UD6D6$ )z,ResNetV2-50d model with Group Normalization.r  r   Tr  rw  )resnetv2_50d_gn)r   r   r   r|  r  s      rP   r  r  }  s:     ,4)J c*cZHb[aHbccrR   c           	      ^    [        / SQ[        [        SSS9n[        SSU 0[        U40 UD6D6$ )z ResNetV2-50d model with EvoNorm.r  r   Tr  rw  )resnetv2_50d_evos)r   r   r   r|  r  s      rP   r  r    s:     +4)J eJe$zJd]cJdeerR   c           	      ^    [        / SQ[        [        SSS9n[        SSU 0[        U40 UD6D6$ )z6ResNetV2-50d model with Filter Response Normalization.r  r   Tr  rw  )resnetv2_50d_frn)r   r   r   r|  r  s      rP   r  r    s;     BY4)J d:djIc\bIcddrR   )resnetv2_50x1_bitmresnetv2_50x3_bitmresnetv2_101x1_bitmresnetv2_101x3_bitmresnetv2_152x2_bitmresnetv2_152x4_bitmresnetv2_50x1_bitm_in21kresnetv2_50x3_bitm_in21kresnetv2_101x1_bitm_in21kresnetv2_101x3_bitm_in21kresnetv2_152x2_bitm_in21kresnetv2_152x4_bitm_in21kresnetv2_50x1_bit_distilledresnetv2_152x2_bit_teacherresnetv2_152x2_bit_teacher_384)r   TrB  rC  )r   )Yrl   collectionsr   	functoolsr   typingr   r   r   r   r	   r
   r   ro   torch.nnrH   	timm.datar   r   timm.layersr   r   r   r   r   r   r   r   r   r   r   r   r   r   _builderr   	_featuresr   _manipulater    r!   r"   	_registryr#   r$   r%   __all__rE  r(   ru   r   r   r   r   r   r   r   rm   r   r   r&   r  no_gradr
  r|  r  r  default_cfgsr  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rh    rR   rP   <module>r     s	  > $  D D D   ES S S S * + F F Y Y,Y")) Yxbryy bJP Pf'RYY 'B$2BII $2N<")) <~	=C 	=D 	= (&|C--- - 	-
 - - ]]-`Qryy Qh "))  3  T  UY  , "; ";S ";# "; ";Jc t s x &# 4 3 S[ (	c 	# 	$sCx. 	 % a&+TT.3a&
 4TT63a& 8 HsR[im:oa& +D HsPT-Va&  +D HsPT-V!a&& ,T HsPT.V'a&, ,T HsPT.V-a&2 ,T HsPT.V3a&8 ,T HsPT.V9a&B #Dt%-Ca&H #Dt%-Ia&N $Tt&-Oa&T $Tt&-Ua&Z $Tt&-[a&` $Tt&-aa&h &t#}\_(aia&n '#}\_)!oa&v (,#}\_(a )-#}\_)! )-(TaL): !$]`b #L:"L:!$]`b  $L :"!#L :  $L}C I "&L}C"I #'L#:a& aH c$ c# c( c c c$ c# c( c c e4 e3 e8 e e e4 e3 e8 e e e4 e3 e8 e e e4 e3 e8 e e `D `C `H ` ` aT aS aX a a `D `C `H ` ` aT aS aX a a `D `C `H ` ` aT aS aX a a aT aS aX a a aT aS aX a a bd bc bh b b aT aS aX a a bd bc bh b b d d d d d f$ f# f( f f e e e e e H@@BBBB > >!@!@!@!@#J"Q&Y' rR   