
    khB                        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mZ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&m'Z'm(Z( ddl)m*Z*m+Z+m,Z, dgZ- G d dej\                        Z/ G d dej\                        Z0 G d dej\                        Z1 G d dej\                        Z2 G d dej\                        Z3 G d dej\                        Z4de5de6fdZ7ddde eed !      fd"e8d#e8de5d$e6d%ed&edejr                  fd'Z: G d( dej\                        Z;dwd)ej\                  d*e5d+e6ddfd,Z< ejz                         dxd-ej\                  d.e5d/e5fd0       Z>dyd1e5d2e6d3ede;fd4Z?dyd1e5d2e6d3ede;fd5Z@dzd6e5d3edee5ef   fd7ZA e*i d8 eAd9d:d;      d< eAd9d:d;      d= eAd9d>d?d@d:dA      dB eAd9dCdDd@dE      dF eAd9dCdDd@dE      dG eAd9dCdDd@dE      dH eAd9dCdDd@dE      dI eAd9dCdDd@dE      dJ eAd9dKdLd@dE      dM eAd9dNdO      dP eAd9dNdO      dQ eAd9dNdO      dR eAd9dNdO      dS eAd9dNdO      dT eAd9dNdO      dU eAd9d:dVdWd@X      dY eAd9d:dVdWd@dZ[       eAd9d:dVdWd@X       eAd9d:dVdWd@dZ[       eAd9d@d>d?dCd:dZ\       eAd9d:d]dWd@X       eAd:dZ^       eAd:dZ^       eAd9d:d]dWd@X       eAd:dZ^       eAd:_       eAd:dZ^       eAd9d:dZd]dWd@`       eAd9d:dZd]dWd@`       eAd:dZ^      da      ZBe+dyd2e6d3ede;fdb       ZCe+dyd2e6d3ede;fdc       ZDe+dyd2e6d3ede;fdd       ZEe+dyd2e6d3ede;fde       ZFe+dyd2e6d3ede;fdf       ZGe+dyd2e6d3ede;fdg       ZHe+dyd2e6d3ede;fdh       ZIe+dyd2e6d3ede;fdi       ZJe+dyd2e6d3ede;fdj       ZKe+dyd2e6d3ede;fdk       ZLe+dyd2e6d3ede;fdl       ZMe+dyd2e6d3ede;fdm       ZNe+dyd2e6d3ede;fdn       ZOe+dyd2e6d3ede;fdo       ZPe+dyd2e6d3ede;fdp       ZQe+dyd2e6d3ede;fdq       ZRe+dyd2e6d3ede;fdr       ZSe+dyd2e6d3ede;fds       ZTe+dyd2e6d3ede;fdt       ZUe+dyd2e6d3ede;fdu       ZV e,eWdBdFdGdHdIdJdMdPdQdRdSdTd8d<d=dv       y){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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                        e Zd ZdZ	 	 	 	 	 	 	 	 	 	 	 ddedee   dedededee   ded	ee   d
ee   dee   dee   def fdZddZ	de
j                  de
j                  fdZ xZS )PreActBasiczAPre-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           
         t         |           |xs |}|	xs t        }	|
xs t        t        d      }
|xs |}t        ||z        }|%|dk7  s
||k7  s||k7  r ||||||d|	|
      | _        nd| _         |
|      | _         |	||d|||      | _         |
|      | _	         |	||d||	      | _
        |d
kD  rt        |      | _        yt        j                         | _        y)aw  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.
            
num_groupsNr   Tr+   r,   r-   preactr0   r1      r+   r,   r.   )r,   r.   r   )super__init__r   r   r   r   
downsamplenorm1conv1norm2conv2r   nnIdentity	drop_pathselfr(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   mid_chs	__class__s                 P/var/www/teggl/fontify/venv/lib/python3.12/site-packages/timm/models/resnetv2.pyr=   zPreActBasic.__init__5   s    > 	'38,9
G7<B#G
#V <!78!v{n6PTZ^eTe(!-%%	DO #DO'
6Ncij
(
!hvV
5Ca5G.1R[[]    returnc                 j    t         j                  j                  | j                  j                         y)zLZero-initialize the last convolution weight (not applicable to basic block).N)rC   initzeros_rB   weightrG   s    rJ   zero_init_lastzPreActBasic.zero_init_lasto       
tzz(()rK   xc                     | j                  |      }|}| j                  | j                  |      }| j                  |      }| j                  | j	                  |            }| j                  |      }||z   S zoForward pass.

        Args:
            x: Input tensor.

        Returns:
            Output tensor.
        )r?   r>   r@   rB   rA   rE   rG   rT   x_preactshortcuts       rJ   forwardzPreActBasic.forwards   sn     ::a= ??&x0H JJx JJtzz!}%NN18|rK   )N      ?r   r   Nr   NNNN        rL   N__name__
__module____qualname____doc__intr	   floatr   r=   rR   torchTensorrZ   __classcell__rI   s   @rJ   r'   r'   2   s    K
 &*"%,0,0-1-1-1$&8[8[ c]8[  	8[
 8[ 8[ %SM8[ 8[  )8[ !*8[ !*8[ !*8[ "8[t* %,, rK   r'   c                        e Zd ZdZ	 	 	 	 	 	 	 	 	 	 	 ddedee   dedededee   ded	ee   d
ee   dee   dee   def fdZddZ	de
j                  de
j                  fdZ xZS )PreActBottlenecka  Pre-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-   r.   r/   r0   r1   r2   r3   c           
         t         |           |xs |}|	xs t        }	|
xs t        t        d      }
|xs |}t        ||z        }| ||||||d|	|
      | _        nd| _         |
|      | _         |	||d      | _         |
|      | _	         |	||d|||      | _
         |
|      | _         |	||d      | _        |d	kD  rt        |      | _        yt        j                         | _        y)
ab  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.
        r5   r6   NTr8   r   r:   r;   r   )r<   r=   r   r   r   r   r>   r?   r@   rA   rB   norm3conv3r   rC   rD   rE   rF   s                 rJ   r=   zPreActBottleneck.__init__   s    > 	'38,9
G7<B#G
#V <!78!(!-%%	DO #DO'
3
(
!F^djk
(
!4
5Ca5G.1R[[]rK   rL   c                 j    t         j                  j                  | j                  j                         y)z,Zero-initialize the last convolution weight.N)rC   rN   rO   rm   rP   rQ   s    rJ   rR   zPreActBottleneck.zero_init_last   rS   rK   rT   c                 0   | j                  |      }|}| j                  | j                  |      }| j                  |      }| j                  | j	                  |            }| j                  | j                  |            }| j                  |      }||z   S rV   )r?   r>   r@   rB   rA   rm   rl   rE   rW   s       rJ   rZ   zPreActBottleneck.forward   s     ::a= ??&x0H JJx JJtzz!}%JJtzz!}%NN18|rK   N      ?r   r   Nr   NNNNr\   r]   r^   rh   s   @rJ   rj   rj      s     &*"&,0,0-1-1-1$&:[:[ c]:[  	:[
 :[ :[ %SM:[ :[  ):[ !*:[ !*:[ !*:[ ":[x* %,, rK   rj   c                        e Zd ZdZ	 	 	 	 	 	 	 	 	 	 	 ddedee   dedededee   ded	ee   d
ee   dee   dee   def fdZddZ	de
j                  de
j                  fdZ xZS )
BottleneckzUNon Pre-activation bottleneck block, equiv to V1.5/V1b Bottleneck. Used for ViT.
    r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   c           	         t         |           |xs |}|xs t        j                  }|	xs t        }	|
xs t        t        d      }
|xs |}t        ||z        }| |||||d|	|
      | _        nd | _         |	||d      | _	         |
|      | _
         |	||d|||      | _         |
|      | _         |	||d      | _         |
|d      | _        |d	kD  rt        |      nt        j                          | _         |d
      | _        y )Nr5   r6   F)r+   r,   r9   r0   r1   r   r:   r;   	apply_actr   T)inplace)r<   r=   rC   ReLUr   r   r   r   r>   r@   r?   rB   rA   rm   rl   r   rD   rE   act3rF   s                 rJ   r=   zBottleneck.__init__   s    	'38(	,9
G7<B#G
#V <!78!(!%%DO #DO3
(
!F^djk
(
!4
59
5Ca5G.1R[[]d+	rK   rL   c                     t        | j                  dd      4t        j                  j	                  | j                  j
                         yy)z+Zero-initialize the last batch norm weight.rP   N)getattrrl   rC   rN   rO   rP   rQ   s    rJ   rR   zBottleneck.zero_init_last  s4    4::x.:GGNN4::,,- ;rK   rT   c                 Z   |}| j                   | j                  |      }| j                  |      }| j                  |      }| j                  |      }| j	                  |      }| j                  |      }| j                  |      }| j                  |      }| j                  ||z         }|S rV   )	r>   r@   r?   rB   rA   rm   rl   rE   ry   )rG   rT   rY   s      rJ   rZ   zBottleneck.forward   s     ??&q)H JJqMJJqMJJqMJJqMJJqMJJqMNN1IIa(l#rK   rp   r]   r^   rh   s   @rJ   rs   rs      s    
 &*"&,0,0-1-1-1$&+,+, c]+,  	+,
 +, +, %SM+, +,  )+, !*+, !*+, !*+, "+,Z.
 %,, rK   rs   c                        e Zd ZdZ	 	 	 	 	 	 ddededededee   dedee   d	ee   f fd
Zde	j                  de	j                  fdZ xZS )DownsampleConvz$1x1 convolution downsampling module.r(   r)   r+   r,   r-   r9   r0   r1   c	                     t         t        |            |||d|      | _        |rt	        j
                         | _        y  ||d      | _        y )Nr   r+   Fru   )r<   r~   r=   convrC   rD   norm)
rG   r(   r)   r+   r,   r-   r9   r0   r1   rI   s
            rJ   r=   zDownsampleConv.__init__=  s@     	nd,.vw&A	%+BKKM	Gu1U	rK   rT   rL   c                 B    | j                  | j                  |            S ztForward pass.

        Args:
            x: Input tensor.

        Returns:
            Downsampled tensor.
        )r   r   rG   rT   s     rJ   rZ   zDownsampleConv.forwardL  s     yy1&&rK   r   r   NTNNr_   r`   ra   rb   rc   r	   boolr   r=   re   rf   rZ   rg   rh   s   @rJ   r~   r~   :  s    . ,0-1-1VV V 	V
 V %SMV V !*V !*V	' 	'%,, 	'rK   r~   c                        e Zd ZdZ	 	 	 	 	 	 ddededededee   dedee   d	ee   f fd
Zde	j                  de	j                  fdZ xZS )DownsampleAvgz/AvgPool downsampling as in 'D' ResNet variants.r(   r)   r+   r,   r-   r9   r0   r1   c	                 ^   t         t        |           |dk(  r|nd}	|dkD  s|dkD  r2|	dk(  r|dkD  rt        nt        j
                  }
 |
d|	dd      | _        nt	        j                         | _         |||dd      | _        |rt	        j                         | _	        y  ||d      | _	        y )Nr      TF)	ceil_modecount_include_padr   ru   )
r<   r   r=   r   rC   	AvgPool2dpoolrD   r   r   )rG   r(   r)   r+   r,   r-   r9   r0   r1   
avg_strideavg_pool_fnrI   s              rJ   r=   zDownsampleAvg.__init__[  s     	mT+-'1}V!
A:A+5?x!|-QSQ]Q]K#AzTUZ[DIDIvw!<	%+BKKM	Gu1U	rK   rT   rL   c                 `    | j                  | j                  | j                  |                  S r   )r   r   r   r   s     rJ   rZ   zDownsampleAvg.forwardp  s$     yy499Q<011rK   r   r   rh   s   @rJ   r   r   X  s    9 ,0-1-1VV V 	V
 V %SMV V !*V !*V*	2 	2%,, 	2rK   r   c                        e Zd ZdZddddedddfdededed	ed
ededededee	e      de
dee
   dee
   dee
   def fdZdej                  dej                  fdZ xZS )ResNetStagezResNet Stage.rq   r   FNr(   r)   r+   r,   depthr*   r.   avg_down	block_dprblock_fnr/   r0   r1   block_kwargsc                 t   t         t        |           d| _        |dv rdnd}t	        |||      }|rt
        nt        }|}t        j                         | _	        t        |      D ]Q  }|	r|	|   nd}|dk(  r|nd}| j                  j                  t        |       |
||f|||||||d||       |}|}d }S y )	NF)r   r   r   r   )r/   r0   r1   r\   r   )r+   r,   r*   r.   r-   r2   r3   )r<   r   r=   grad_checkpointingdictr   r~   rC   
Sequentialblocksrange
add_modulestr)rG   r(   r)   r+   r,   r   r*   r.   r   r   r   r/   r0   r1   r   r-   layer_kwargsr2   prev_chs	block_idxr3   rI   s                        rJ   r=   zResNetStage.__init__~  s    " 	k4)+"'&&0aiJS]^&.]N
mmou 	I5>Yy1BN(A~V1FKK""3y>84 !)-%-4 4 4  H%NJ%	rK   rT   rL   c                     | j                   r6t        j                  j                         st	        | j
                  |      }|S | j                  |      }|S )zForward pass through all blocks in the stage.

        Args:
            x: Input tensor.

        Returns:
            Output tensor.
        )r   re   jitis_scriptingr   r   r   s     rJ   rZ   zResNetStage.forward  sG     ""599+A+A+Ct{{A.A  AArK   )r_   r`   ra   rb   rj   rc   rd   r   r	   r   r   r   r=   re   rf   rZ   rg   rh   s   @rJ   r   r   |  s     #'"/3!1,0-1-1++ + 	+
 + +  + + +  U,+ +  )+ !*+ !*+  +Z %,, rK   r   	stem_typerL   c                 B    t        dD cg c]  }|| v  c}      S c c}w )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     rJ   is_stem_deepr     s"     (:;1Y;<<;s   @    Tr5   r6   r(   r)   r9   r0   r1   c                 n   t               }|dv sJ t        |      rd|v rd|z  dz  |dz  f}n
|dz  |dz  f} || |d   dd      |d<    ||d         |d	<    ||d   |d
   dd
      |d<    ||d
         |d<    ||d
   |dd
      |d<   |s( ||      |d<   n || |dd      |d<   |s ||      |d<   d|v r5t        j                  d
d      |d<   t        j                  ddd      |d<   n2d|v rt        dddd      |d<   nt        j                  ddd
      |d<   t        j                  |      S )N)r   fixedsamer   
deep_fixed	deep_samer   r   r:      r   r   )kernel_sizer+   r@   r?   r   rB   rA   rm   rl      r   r   r   r\   pad)r   r+   paddingr   r   max)r   r   rC   ConstantPad2d	MaxPool2dr   r   )r(   r)   r   r9   r0   r1   stemstem_chss           rJ   create_resnetv2_stemr     su    =DZZZZ Iy Gq('Q,7H1gl3H"68A;AaPW"8A;/W"8A;STUW"8A;/W"8A;QqQW&w/DM "&'qKV%g.DL)&&q"-U||!QGV	9	$U!VTV ||!QGV==rK   c            '           e Zd ZdZdddddddd	d
dd
dej
                   eed      eddd
fde	e
   dee
df   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d ed!ed"ef& fd#Zej$                  j&                  d>d"ed$d%fd&       Zej$                  j'                         d?d'ed(ed$d%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j4                  fd.       ZdAde
dee   d$d%fd/Z	 	 	 	 	 dBd0ej<                  d1eee
e	e
   f      d2ed3ed4ed5ed$ee	ej<                     eej<                  e	ej<                     f   f   fd6Z 	 	 	 dCd1ee
e	e
   f   d7ed8efd9Z!d0ej<                  d$ej<                  fd:Z"d@d0ej<                  d;ed$ej<                  fd<Z#d0ej<                  d$ej<                  fd=Z$ xZ%S )Dr%   z7Implementation of Pre-activation (v2) ResNet mode.
    )      i   i     r:   avgr5   r   r   r   FTrq   r6   r\   layerschannels.num_classesin_chansglobal_pooloutput_stridewidth_factorr   r   r   r9   basicr*   r/   r1   r0   	drop_rater3   rR   c                    t         #|           || _        || _        |}t	        ||      }t        |      }g | _        t        ||z        }t        |||	|||      | _	        |rt        |	      rdndnd}| j                  j                  t        |d|             |}d}d	}t        j                  d
|t        |            j!                  |      D cg c]  }|j#                          }}|r|rt$        nt&        }n
|rJ t(        }t+        j,                         | _        t1        t3        |||            D ]  \  }\  }}}t        ||z        } |d
k(  rd	nd}!||k\  r||!z  }d	}!t5        || |!||||
|||||      }"| }||!z  }| xj                  t        ||d|       gz  c_        | j.                  j7                  t9        |      |"        |x| _        | _        |r || j:                        nt+        j>                         | _         tC        | j:                  ||| j                  d      | _"        | jG                  |       yc c}w )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)
        )r/   )r0   r1   z
stem.conv3	stem.convz	stem.normr   )num_chs	reductionmodule   r   r   )
r+   r,   r   r*   r   r/   r0   r1   r   r   zstages.T)	pool_typer   use_convrR   N)$r<   r=   r   r   r   r   feature_infor   r   r   r   appendr   re   linspacesumsplittolistr'   rj   rs   rC   r   stages	enumeratezipr   r   r   num_featureshead_hidden_sizerD   r   r   headinit_weights)$rG   r   r   r   r   r   r   r   r   r   r   r9   r   r*   r/   r1   r0   r   r3   rR   wf	stem_featr   curr_strider,   rT   
block_dprsr   	stage_idxdcbdprr)   r+   stagerI   s$                                      rJ   r=   zResNetV2.__init__  sU   T 	&"'
iH
!),	!(R-0(!!
	 SY\)%<\+^i	  h!I!VW*/..NCPVK*X*^*^_e*fgQahhjg
g&+{1AH9!Hmmo'0VXz1R'S 	:#I|1d$QV,G#q.QaFm+F"!)!#%%!E H6!K$x;Y`aj`kWl"m!nnKK""3y>59/	:2 5=<D15;Jt001	"!nn
	 	8U hs   IrL   Nc                 :    t        t        t        |      |        y)zInitialize model weights.r   N)r    r   _init_weights)rG   rR   s     rJ   r   zResNetV2.init_weightse  s     	GM.I4PrK   checkpoint_pathprefixc                     t        | ||       y)zLoad pretrained weights.N)_load_weights)rG   r   r   s      rJ   load_pretrainedzResNetV2.load_pretrainedj  s     	dOV4rK   coarsec                 ,    t        d|rdnddg      }|S )z"Group parameters for optimization.z^stemz^stages\.(\d+))z^stages\.(\d+)\.blocks\.(\d+)N)z^norm)i )r   r   )r   )rG   r   matchers      rJ   group_matcherzResNetV2.group_matchero  s)     (.$8$5
 rK   enablec                 4    | j                   D ]	  }||_         y)z)Enable or disable gradient checkpointing.N)r   r   )rG   r   r   s      rJ   set_grad_checkpointingzResNetV2.set_grad_checkpointing{  s      	*A#)A 	*rK   c                 .    | j                   j                  S )zGet the classifier head.)r   fcrQ   s    rJ   get_classifierzResNetV2.get_classifier  s     yy||rK   c                 J    || _         | j                  j                  ||       y)zReset the classifier head.

        Args:
            num_classes: Number of classes for new classifier.
            global_pool: Global pooling type.
        N)r   r   reset)rG   r   r   s      rJ   reset_classifierzResNetV2.reset_classifier  s     '		[1rK   rT   indicesr   
stop_early
output_fmtintermediates_onlyc                    |dv sJ d       g }t        d|      \  }}	d}
|j                  dd \  }}| j                  D ]'  } ||      }|j                  dd |dz  |dz  fk(  s&|}) |
|v r|j                         t	        | j
                        }t        j                  j                         s|s| j
                  }n| j
                  d|	 }t        |d	      D ]O  \  }
} ||      }|
|v s|
|k(  r'|r| j                  |      n|}|j                  |       ?|j                  |       Q |r|S |
|k(  r| j                  |      }||fS )
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   re   r   r   r   r   )rG   rT   r  r   r  r  r  intermediatestake_indices	max_indexfeat_idxHWr   x_downlast_idxr   r   x_inters                      rJ   forward_intermediateszResNetV2.forward_intermediates  sc   * Y&D(DD&"6q'"Bi wwrs|1II 	DQAwwrs|Aq1u~-	 |#  (t{{#99!!#:[[F[[),F(q9 	,OHeaA<'x'.2diilG!((1!((+	,   x		!A-rK   
prune_norm
prune_headc                     t        d|      \  }}| j                  d| | _        |rt        j                         | _        |r| j                  dd       |S )z@ Prune layers not required for specified intermediates.
        r	  Nr   r   )r   r   rC   rD   r   r  )rG   r  r  r  r  r  s         rJ   prune_intermediate_layersz"ResNetV2.prune_intermediate_layers  sP     #7q'"Bikk*9-DI!!!R(rK   c                 l    | j                  |      }| j                  |      }| j                  |      }|S )zForward pass through feature extraction layers.

        Args:
            x: Input tensor.

        Returns:
            Feature tensor.
        )r   r   r   r   s     rJ   forward_featureszResNetV2.forward_features  s0     IIaLKKNIIaLrK   
pre_logitsc                 N    |r| j                  ||      S | j                  |      S )zForward pass through classifier head.

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

        Returns:
            Classification logits or features.
        )r  )r   )rG   rT   r  s      rJ   forward_headzResNetV2.forward_head  s(     7Atyyzy2RdiiPQlRrK   c                 J    | j                  |      }| j                  |      }|S )zoForward pass.

        Args:
            x: Input tensor.

        Returns:
            Output logits.
        )r  r   r   s     rJ   rZ   zResNetV2.forward  s)     !!!$a rK   )Tzresnet/F)N)NFFr  F)r   FT)&r_   r`   ra   rb   rC   rx   r   r   r   r   rc   r
   r   r   rd   r   r=   re   r   ignorer   r   r   r   r   r   Moduler   r	   r  rf   r   r  r  r  r   rZ   rg   rh   s   @rJ   r%   r%     sl    )?#$!# !""&"$''#*<B#G#,!$&#()k9Ik9 CHok9 	k9
 k9 k9 k9 k9 k9 k9 k9 k9 k9  k9  k9  !!k9" !#k9$ %k9& "'k9( !)k9Z 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 %,, rK   r   namerR   c                 r   t        | t        j                        sd|v rpt        | t        j                        rVt        j                  j                  | j                  dd       t        j                  j                  | j                         yt        | t        j                        rct        j                  j                  | j                  dd       | j                  *t        j                  j                  | j                         yyt        | t        j                  t        j                  t        j                  f      rSt        j                  j                  | j                         t        j                  j                  | j                         y|rt        | d	      r| j                          yyy)
zInitialize module weights.

    Args:
        module: PyTorch module to initialize.
        name: Module name.
        zero_init_last: Zero-initialize last layer weights.
    head.fcr\   g{Gz?)meanstdfan_outrelu)modenonlinearityNrR   )
isinstancerC   LinearConv2drN   normal_rP   rO   biaskaiming_normal_BatchNorm2d	LayerNorm	GroupNormones_hasattrrR   )r   r&  rR   s      rJ   r   r     s
    &"))$d):z&RTR[R[?\
CT:
v{{#	FBII	&
IFS;;"GGNN6;;' #	FR^^R\\2<<H	I
fmm$
v{{#	GF,<= >rK   modelr   r   c                    dd l }d }|j                  |      }t        | j                  j                  j
                  j                  d    ||| d               }| j                  j                  j
                  j                  |       | j                  j
                  j                   ||| d                | j                  j                  j                   ||| d                t        t        | j                  dd       t        j                        r| j                  j                  j
                  j                  d   || d   j                  d	   k(  rv| j                  j                  j
                  j                   ||| d                | j                  j                  j                  j                   ||| d
                t!        | j"                  j%                               D ]]  \  }\  }}	t!        |	j&                  j%                               D ]-  \  }
\  }}d}| d|dz    d|
dz   dd}|j(                  j
                  j                   ||| d| d                |j*                  j
                  j                   ||| d| d                |j,                  j
                  j                   ||| d| d                |j.                  j
                  j                   ||| d                |j0                  j
                  j                   ||| d                |j2                  j
                  j                   ||| d                |j.                  j                  j                   ||| d                |j0                  j                  j                   ||| d                |j2                  j                  j                   ||| d                |j4                  || d| d   }|j4                  j                  j
                  j                   ||             0 ` y )Nr   c                 p    | j                   dk(  r| j                  g d      } t        j                  |       S )zPossibly convert HWIO to OIHW.r   )r:   r   r   r   )ndim	transposere   
from_numpy)conv_weightss    rJ   t2pz_load_weights.<locals>.t2p  s1    !'11,?L--rK   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   rP   r  copy_r   r3  r/  r{   r   rC   r1  r   r   r   named_childrenr   r@   rB   rm   r?   rA   rl   r>   )r:  r   r   nprA  weightsstem_conv_wisnamer   jbnamerD  cnameblock_prefixws                   rJ   r   r     s   . ggo&G"

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

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

  Wx7G-H%I!JK&u||'B'B'DE ;>E5!*5<<+F+F+H!I 	;A~u)E$XU1q5'q1uSkCLKK$$SL>E7'1R)S%TUKK$$SL>E7'1R)S%TUKK$$SL>E7'1R)S%TUKK$$SL>AS1T)U%VWKK$$SL>AS1T)U%VWKK$$SL>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:	;;rK   variant
pretrainedkwargsc                 B    t        d      }t        t        | |fd|i|S )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%   )rU  rV  rW  rZ  s       rJ   _create_resnetv2r[  =  s4     $/K':  rK   c           	      @    t        | f|dt        t        d      d|S )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)rV  r   r0   )r[  r   r   )rU  rV  rW  s      rJ   _create_resnetv2_bitr^  P  s3     9$/	
  rK   urlc                 0    | dddddt         t        ddd
|S )	Nr   )r:      ra  )r   r   g      ?bilinearr   r(  )
r_  r   
input_size	pool_sizecrop_pctinterpolationr)  r*  
first_conv
classifierr   )r_  rW  s     rJ   _cfgri  d  s0    =vJ'0F!  rK   z%resnetv2_50x1_bit.goog_distilled_in1kztimm/bicubic)	hf_hub_idrf  custom_loadz-resnetv2_152x2_bit.goog_teacher_in21k_ft_in1kz1resnetv2_152x2_bit.goog_teacher_in21k_ft_in1k_384)r:     rm  )   rn  r[   )rk  rc  rd  re  rf  rl  z$resnetv2_50x1_bit.goog_in21k_ft_in1k)r:     ro  )   rp  )rk  rc  rd  re  rl  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:     rq  )   rr  zresnetv2_50x1_bit.goog_in21kiSU  )rk  r   rl  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:      rs  )rk  rf  re  test_input_sizetest_crop_pctz resnetv2_18d.ra4_e3600_r224_in1kz
stem.conv1)rk  rf  re  rt  ru  rg  )rk  re  rc  rd  rt  rf  rg  gffffff?)rf  rg  )rf  )rk  rf  rg  re  rt  ru  )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                 &    t        	 d| g ddd|S )zResNetV2-50x1-BiT model.r:   r      r:   r   rV  r   r   )resnetv2_50x1_bitr^  rV  rW  s     rJ   rz  rz    -      c(2<VWc[ac crK   c                 &    t        	 d| g ddd|S )zResNetV2-50x3-BiT model.rw  r:   ry  )resnetv2_50x3_bitr{  r|  s     rJ   r  r    r}  rK   c                 &    t        	 d| g ddd|S )zResNetV2-101x1-BiT model.r:   r      r:   r   ry  )resnetv2_101x1_bitr{  r|  s     rJ   r  r    -      e)3MXYe]ce erK   c                 &    t        	 d| g ddd|S )zResNetV2-101x3-BiT model.r  r:   ry  )resnetv2_101x3_bitr{  r|  s     rJ   r  r    r  rK   c                 &    t        	 d| g ddd|S )zResNetV2-152x2-BiT model.r:   r   $   r:   r   ry  )resnetv2_152x2_bitr{  r|  s     rJ   r  r    r  rK   c                 &    t        	 d| g ddd|S )zResNetV2-152x4-BiT model.r  r   ry  )resnetv2_152x4_bitr{  r|  s     rJ   r  r    r  rK   c           	      f    t        g ddddt        t              }t        dd| it        |fi |S )zResNetV2-18 model.r   r   r   r   r      r   r   Tr[   r   r   r   r*   r0   r1   rV  )resnetv2_18r   r   r   r[  rV  rW  
model_argss      rJ   r  r    s>     &9TW ^J _j_DD^W]D^__rK   c           
      j    t        g ddddt        t        dd      }t        dd| it        |fi |S )	z'ResNetV2-18d model (deep stem variant).r  r  Tr[   r   r   r   r   r*   r0   r1   r   r   rV  )resnetv2_18dr  r  s      rJ   r  r    sC     &9TW ^vX\J `z`T*E_X^E_``rK   c           	      b    t        ddddt        t              }t        dd| it        |fi |S )zResNetV2-34 model.rw  r  Tr[   r  rV  )resnetv2_34r  r  s      rJ   r  r    s>     &9TW ^J _j_DD^W]D^__rK   c           
      f    t        ddddt        t        dd      }t        dd| it        |fi |S )	z'ResNetV2-34d model (deep stem variant).rw  r  Tr[   r   r  rV  )resnetv2_34dr  r  s      rJ   r  r    sC     &9TW ^vX\J `z`T*E_X^E_``rK   c           	      `    t        g dt        t              }t        dd| it        |fi |S )zResNetV2-50 model.rw  r   r0   r1   rV  )resnetv2_50r  r  s      rJ   r  r  %  s1     \mP^_J_j_DD^W]D^__rK   c           	      d    t        g dt        t        dd      }t        dd| it        |fi |S )z'ResNetV2-50d model (deep stem variant).rw  r   Tr   r0   r1   r   r   rV  )resnetv2_50dr  r  s      rJ   r  r  ,  s:     .4)J `z`T*E_X^E_``rK   c           	      d    t        g dt        t        dd      }t        dd| it        |fi |S )z)ResNetV2-50t model (tiered stem variant).rw  r   Tr  rV  )resnetv2_50tr  r  s      rJ   r  r  5  s:     .T+J `z`T*E_X^E_``rK   c           	      `    t        g dt        t              }t        dd| it        |fi |S )zResNetV2-101 model.r  r  rV  )resnetv2_101r  r  s      rJ   r  r  >  1     ]}Q_`J`z`T*E_X^E_``rK   c           	      d    t        g dt        t        dd      }t        dd| it        |fi |S )z(ResNetV2-101d model (deep stem variant).r  r   Tr  rV  )resnetv2_101dr  r  s      rJ   r  r  E  :     >4)J a
ad:F`Y_F`aarK   c           	      `    t        g dt        t              }t        dd| it        |fi |S )zResNetV2-152 model.r  r  rV  )resnetv2_152r  r  s      rJ   r  r  N  r  rK   c           	      d    t        g dt        t        dd      }t        dd| it        |fi |S )z(ResNetV2-152d model (deep stem variant).r  r   Tr  rV  )resnetv2_152dr  r  s      rJ   r  r  U  r  rK   c           	      d    t        g dt        t        dd      }t        dd| it        |fi |S )z,ResNetV2-50d model with Group Normalization.rw  r   Tr  rV  )resnetv2_50d_gn)r   r   r   r[  r  s      rJ   r  r  `  s:     ,4)J c*cZHb[aHbccrK   c           	      d    t        g dt        t        dd      }t        dd| it        |fi |S )z ResNetV2-50d model with EvoNorm.rw  r   Tr  rV  )resnetv2_50d_evos)r   r   r   r[  r  s      rJ   r  r  i  s:     +4)J eJe$zJd]cJdeerK   c           	      d    t        g dt        t        dd      }t        dd| it        |fi |S )z6ResNetV2-50d model with Filter Response Normalization.rw  r   Tr  rV  )resnetv2_50d_frn)r   r   r   r[  r  s      rJ   r  r  r  s;     BY4)J d:djIc\bIcddrK   )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   Tr"  r#  )r   )Xrb   collectionsr   	functoolsr   typingr   r   r   r   r	   r
   r   re   torch.nnrC   	timm.datar   r   timm.layersr   r   r   r   r   r   r   r   r   r   r   r   r   _builderr   	_featuresr   _manipulater   r    r!   	_registryr"   r#   r$   __all__r%  r'   rj   rs   r~   r   r   r   r   r   rc   r   r   r%   r   no_gradr   r[  r^  ri  default_cfgsrz  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r_    rK   rJ   <module>r     s	  > $  D D D   Ex x x x * + F F Y Y,U")) Up^ryy ^BL L^'RYY '<!2BII !2H<")) <~	=C 	=D 	= (&|C*** * 	*
 * * ]]*ZJryy JZ "))  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' rK   