o
    پiB                     @   s  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 dej.Z/G dd dej.Z0G dd dej.Z1G dd dej.Z2G dd dej.Z3G dd dej.Z4de5de6fddZ7ddd eeed!d"fd#e8d$e8de5d%e6d&ed'edej9fd(d)Z:G d*d dej.Z;dd+ej.d,e5d-e6ddfd.d/Z<e= dd1ej.d2e5d3e5fd4d5Z>dd7e5d8e6d9ede;fd:d;Z?dd7e5d8e6d9ede;fd<d=Z@dd>e5d9edee5ef fd?d@ZAe*i dAeAdBdCd dDdEeAdBdCd dDdFeAdBdGdHdIdCd dJdKeAdBdLdMdId dNdOeAdBdLdMdId dNdPeAdBdLdMdId dNdQeAdBdLdMdId dNdReAdBdLdMdId dNdSeAdBdTdUdId dNdVeAdBdWd dXdYeAdBdWd dXdZeAdBdWd dXd[eAdBdWd dXd\eAdBdWd dXd]eAdBdWd dXd^eAdBdCd_d`dIdadbeAdBdCd_d`dIdcddeAdBdCd_d`dIdaeAdBdCd_d`dIdcddeAdBdIdGdHdLdCdcdeeAdBdCdfd`dIdaeAdCdcdgeAdCdcdgeAdBdCdfd`dIdaeAdCdcdgeAdCdheAdCdcdgeAdBdCdcdfd`dIdieAdBdCdcdfd`dIdieAdCdcdgdjZBe+dd8e6d9ede;fdkdlZCe+dd8e6d9ede;fdmdnZDe+dd8e6d9ede;fdodpZEe+dd8e6d9ede;fdqdrZFe+dd8e6d9ede;fdsdtZGe+dd8e6d9ede;fdudvZHe+dd8e6d9ede;fdwdxZIe+dd8e6d9ede;fdydzZJe+dd8e6d9ede;fd{d|ZKe+dd8e6d9ede;fd}d~ZLe+dd8e6d9ede;fddZMe+dd8e6d9ede;fddZNe+dd8e6d9ede;fddZOe+dd8e6d9ede;fddZPe+dd8e6d9ede;fddZQe+dd8e6d9ede;fddZRe+dd8e6d9ede;fddZSe+dd8e6d9ede;fddZTe+dd8e6d9ede;fddZUe+dd8e6d9ede;fddZVe,eWdKdOdPdQdRdSdVdYdZd[d\d]dAdEdFd dS )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dZdddZ	de
jde
jfddZ  ZS )PreActBasiczAPre-activation basic block (not in typical 'v2' implementations).N      ?r           in_chsout_chsbottle_ratiostridedilationfirst_dilationgroups	act_layer
conv_layer
norm_layer
proj_layerdrop_path_ratec              
      s   t    |p|}|	pt}	|
pttdd}
|p|}t|| }|dur=|dks/||ks/||kr=||||||d|	|
d| _nd| _|
|| _|	||d|||d| _|
|| _	|	||d||d	| _
|d
krjt|| _dS t | _dS )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.   preactr1   r2      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/   r0   r1   r2   r3   r4   mid_chs	__class__ H/home/ubuntu/.local/lib/python3.10/site-packages/timm/models/resnetv2.pyr=   5   s.   
 


$zPreActBasic.__init__returnc                 C      t j| jj dS )zLZero-initialize the last convolution weight (not applicable to basic block).N)rC   initzeros_rB   weightrG   rK   rK   rL   zero_init_lasto      zPreActBasic.zero_init_lastxc                 C   sN   |  |}|}| jdur| |}| |}| | |}| |}|| S zoForward pass.

        Args:
            x: Input tensor.

        Returns:
            Output tensor.
        N)r?   r>   r@   rB   rA   rE   rG   rU   x_preactshortcutrK   rK   rL   forwards   s   
	



zPreActBasic.forward)Nr'   r   r   Nr   NNNNr(   rM   N__name__
__module____qualname____doc__intr   floatr   r=   rS   torchTensorrZ   __classcell__rK   rK   rI   rL   r&   2   sP    	

:r&   c                       r%   )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.
    N      ?r   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   c              
      s   t    |p|}|	pt}	|
pttdd}
|p|}t|| }|dur1||||||d|	|
d| _nd| _|
|| _|	||d| _|
|| _	|	||d|||d| _
|
|| _|	||d| _|d	krgt|| _dS t | _dS )
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   rI   rK   rL   r=      s2   




$zPreActBottleneck.__init__rM   c                 C   rN   )z,Zero-initialize the last convolution weight.N)rC   rO   rP   ri   rQ   rR   rK   rK   rL   rS      rT   zPreActBottleneck.zero_init_lastrU   c                 C   s^   |  |}|}| jdur| |}| |}| | |}| | |}| |}|| S rV   )r?   r>   r@   rB   rA   ri   rh   rE   rW   rK   rK   rL   rZ      s   
	



zPreActBottleneck.forwardNrg   r   r   Nr   NNNNr(   r[   r\   rK   rK   rI   rL   rf      sP    	

<rf   c                       r%   )
BottleneckzUNon Pre-activation bottleneck block, equiv to V1.5/V1b Bottleneck. Used for ViT.
    Nrg   r   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   c              	      s   t    |p|}|ptj}|	pt}	|
pttdd}
|p|}t|| }|d ur5|||||d|	|
d| _nd | _|	||d| _	|
|| _
|	||d|||d| _|
|| _|	||d| _|
|dd| _|d	krjt|nt | _|d
d| _d S )Nr5   r6   F)r,   r-   r9   r1   r2   r   r:   r;   	apply_actr   T)inplace)r<   r=   rC   ReLUr   r   r   r   r>   r@   r?   rB   rA   ri   rh   r   rD   rE   act3rF   rI   rK   rL   r=      s4   





zBottleneck.__init__rM   c                 C   s*   t | jdddurtj| jj dS dS )z+Zero-initialize the last batch norm weight.rQ   N)getattrrh   rC   rO   rP   rQ   rR   rK   rK   rL   rS     s   zBottleneck.zero_init_lastrU   c                 C   sp   |}| j dur|  |}| |}| |}| |}| |}| |}| |}| |}| || }|S rV   )	r>   r@   r?   rB   rA   ri   rh   rE   rp   )rG   rU   rY   rK   rK   rL   rZ      s   









zBottleneck.forwardrj   r[   r\   rK   rK   rI   rL   rk      sP    	

-rk   c                       r   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dZde	j
de	j
fddZ  ZS )DownsampleConvz$1x1 convolution downsampling module.r   NTr)   r*   r,   r-   r.   r9   r1   r2   c	           	         sD   t t|   |||d|d| _|rt | _d S ||dd| _d S )Nr   r,   Frl   )r<   rs   r=   convrC   rD   norm)	rG   r)   r*   r,   r-   r.   r9   r1   r2   rI   rK   rL   r=   =  s   $zDownsampleConv.__init__rU   rM   c                 C   s   |  | |S ztForward pass.

        Args:
            x: Input tensor.

        Returns:
            Downsampled tensor.
        )rv   ru   rG   rU   rK   rK   rL   rZ   L  s   	zDownsampleConv.forwardr   r   NTNNr]   r^   r_   r`   ra   r   boolr   r=   rc   rd   rZ   re   rK   rK   rI   rL   rs   :  s4    	rs   c                       rr   )DownsampleAvgz/AvgPool downsampling as in 'D' ResNet variants.r   NTr)   r*   r,   r-   r.   r9   r1   r2   c	                    s   t t|   |dkr|nd}	|dks|dkr.|	dkr!|dkr!tntj}
|
d|	ddd| _nt | _|||ddd| _|rEt | _	d S ||dd| _	d S )Nr      TF)	ceil_modecount_include_padrt   rl   )
r<   r|   r=   r   rC   	AvgPool2dpoolrD   ru   rv   )rG   r)   r*   r,   r-   r.   r9   r1   r2   
avg_strideavg_pool_fnrI   rK   rL   r=   [  s   
$zDownsampleAvg.__init__rU   rM   c                 C   s   |  | | |S rw   )rv   ru   r   rx   rK   rK   rL   rZ   p     	zDownsampleAvg.forwardry   rz   rK   rK   rI   rL   r|   X  s4    	r|   c                       s   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dZdejdejfddZ  ZS )ResNetStagezResNet Stage.rg   r   FNr)   r*   r,   r-   depthr+   r/   avg_down	block_dprblock_fnr0   r1   r2   block_kwargsc                    s   t t|   d| _|dv rdnd}t|||d}|rtnt}|}t | _	t
|D ]2}|	r2|	| nd}|dkr:|nd}| j	t||
||f|||||||d|| |}|}d }q*d S )	NF)r   r}   r   r}   )r0   r1   r2   r(   r   )r,   r-   r+   r/   r.   r3   r4   )r<   r   r=   grad_checkpointingdictr|   rs   rC   
Sequentialblocksrange
add_modulestr)rG   r)   r*   r,   r-   r   r+   r/   r   r   r   r0   r1   r2   r   r.   layer_kwargsr3   prev_chs	block_idxr4   rI   rK   rL   r=   ~  s<   

zResNetStage.__init__rU   rM   c                 C   s.   | j rtj st| j|}|S | |}|S )zForward pass through all blocks in the stage.

        Args:
            x: Input tensor.

        Returns:
            Output tensor.
        )r   rc   jitis_scriptingr   r   rx   rK   rK   rL   rZ     s
   	
zResNetStage.forward)r]   r^   r_   r`   rf   ra   rb   r{   r   r   r   r   r=   rc   rd   rZ   re   rK   rK   rI   rL   r   |  sP    	

-r   	stem_typerM   c                    s   t  fdddD S )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.
    c                    s   g | ]}| v qS rK   rK   ).0sr   rK   rL   
<listcomp>      z is_stem_deep.<locals>.<listcomp>)deeptiered)anyr   rK   r   rL   is_stem_deep  r   r   @    Tr5   r6   r)   r*   r9   r1   r2   c                 C   sT  t  }|dv s	J t|rcd|v rd| d |d f}n|d |d f}|| |d ddd|d< ||d |d	< ||d |d
 dd
d|d< ||d
 |d< ||d
 |dd
d|d< |sb|||d< n|| |ddd|d< |su|||d< d|v rtd
d|d< tjdddd|d< nd|v rtddddd|d< n
tjddd
d|d< t|S )N)r   fixedsamer   
deep_fixed	deep_samer   r   r:      r}   r   )kernel_sizer,   r@   r?   r   rB   rA   ri   rh      ru   rv   r   r(   pad)r   r,   paddingr   r   max)r   r   rC   ConstantPad2d	MaxPool2dr   r   )r)   r*   r   r9   r1   r2   stemstem_chsrK   rK   rL   create_resnetv2_stem  s0   
r   c                '       s0  e Zd ZdZdddddddd	d
dd
dejeed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#d$ZejjdLd"ed%d&fd'd(Zej dMd*ed+ed%d&fd,d-ZejjdNd.ed%eeef fd/d0ZejjdLd1ed%d&fd2d3Zejjd%ejfd4d5ZdOde
dee d%d&fd6d7Z	&	
	
	8	
dPd9e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?d@Z 		
	dQd:ee
e	e
 f dAedBefdCdDZ!d9ejd%ejfdEdFZ"dNd9ejdGed%ejfdHdIZ#d9ejd%ejfdJdKZ$  Z%S )Rr$   z7Implementation of Pre-activation (v2) ResNet mode.
    )      i   i     r:   avgr5   r   r   r   FTrg   r6   r(   layerschannels.num_classesin_chansglobal_pooloutput_stridewidth_factorr   r   r   r9   basicr+   r0   r2   r1   	drop_rater4   rS   c           "         s  t    || _|| _|}t||d}t|}g | _t|| }t|||	|||d| _	|r5t
|	r3dndnd}| jt|d|d |}d}d	}d
d td|t||D }|rb|r_tnt}n|rfJ t}t | _tt|||D ]N\}\}}}t|| }|dkrd	nd} ||kr|| 9 }d	} t||| ||||
|||||d}!|}|| 9 }|  jt||d| dg7  _| jt||! qu| | _| _|r|| jnt | _t | j||| jdd| _!| j"|d dS )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)
        )r0   )r1   r2   z
stem.conv3	stem.convz	stem.normr}   )num_chs	reductionmodule   r   c                 S   s   g | ]}|  qS rK   )tolist)r   rU   rK   rK   rL   r   9  r   z%ResNetV2.__init__.<locals>.<listcomp>r   )
r,   r-   r   r+   r   r0   r1   r2   r   r   zstages.T)	pool_typer   use_convrS   N)#r<   r=   r   r   r   r   feature_infor   r   r   r   appendr   rc   linspacesumsplitr&   rf   rk   rC   r   stages	enumeratezipr   r   r   num_featureshead_hidden_sizerD   rv   r   headinit_weights)"rG   r   r   r   r   r   r   r   r   r   r   r9   r   r+   r0   r2   r1   r   r4   rS   wf	stem_featr   curr_strider-   
block_dprsr   	stage_idxdcbdprr*   r,   stagerI   rK   rL   r=     sz   
*"
 zResNetV2.__init__rM   Nc                 C   s   t tt|d|  dS )zInitialize model weights.r   N)r   r   _init_weights)rG   rS   rK   rK   rL   r   e  s   zResNetV2.init_weightsresnet/checkpoint_pathprefixc                 C   s   t | || dS )zLoad pretrained weights.N)_load_weights)rG   r   r   rK   rK   rL   load_pretrainedj  s   zResNetV2.load_pretrainedcoarsec                 C   s   t d|rdnddgd}|S )z"Group parameters for optimization.z^stemz^stages\.(\d+))z^stages\.(\d+)\.blocks\.(\d+)N)z^norm)i )r   r   )r   )rG   r   matcherrK   rK   rL   group_matchero  s   zResNetV2.group_matcherenablec                 C   s   | j D ]}||_qdS )z)Enable or disable gradient checkpointing.N)r   r   )rG   r   r   rK   rK   rL   set_grad_checkpointing{  s   
zResNetV2.set_grad_checkpointingc                 C   s   | j jS )zGet the classifier head.)r   fcrR   rK   rK   rL   get_classifier  s   zResNetV2.get_classifierc                 C   s   || _ | j|| dS )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   rK   rK   rL   reset_classifier  s   zResNetV2.reset_classifierNCHWrU   indicesrv   
stop_early
output_fmtintermediates_onlyc                 C   s&  |dv sJ dg }t d|\}}	d}
|jdd \}}| jD ]}||}|jdd |d |d fkr6|}q|
|v r@|| t| j}tj sL|sP| j}n| jd|	 }t	|dd	D ]$\}
}||}|
|v r|
|kr||rt| 
|n|}|| q]|| q]|r|S |
|kr| 
|}||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:

        )r   zOutput shape must be NCHW.   r   Nr}   r   )start)r   shaper   r   lenr   rc   r   r   r   rv   )rG   rU   r   rv   r   r   r   intermediatestake_indices	max_indexfeat_idxHWr   x_downlast_idxr   r   x_interrK   rK   rL   forward_intermediates  s:   




zResNetV2.forward_intermediates
prune_norm
prune_headc                 C   s@   t d|\}}| jd| | _|rt | _|r| dd |S )z@ Prune layers not required for specified intermediates.
        r   Nr   r   )r   r   rC   rD   rv   r   )rG   r   r   r  r   r   rK   rK   rL   prune_intermediate_layers  s   
z"ResNetV2.prune_intermediate_layersc                 C   s"   |  |}| |}| |}|S )zForward pass through feature extraction layers.

        Args:
            x: Input tensor.

        Returns:
            Feature tensor.
        )r   r   rv   rx   rK   rK   rL   forward_features  s   
	

zResNetV2.forward_features
pre_logitsc                 C   s   |r	| j ||dS |  |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   rU   r  rK   rK   rL   forward_head  s   
zResNetV2.forward_headc                 C   s   |  |}| |}|S )zoForward pass.

        Args:
            x: Input tensor.

        Returns:
            Output logits.
        )r  r  rx   rK   rK   rL   rZ     s   
	
zResNetV2.forward)Tr   F)N)NFFr   F)r   FT)&r]   r^   r_   r`   rC   ro   r   r   r   r   ra   r	   r   r{   rb   r   r=   rc   r   ignorer   r   r   r   r   r   Moduler   r   r   rd   r
   r   r  r  r  rZ   re   rK   rK   rI   rL   r$     s    

	
m 
;
r   namerS   c                 C   s   t | tjsd|v r#t | tjr#tjj| jddd tj| j dS t | tjrCtjj	| jddd | jdurAtj| j dS dS t | tj
tjtjfr^tj| j tj| j dS |rkt| d	rm|   dS dS dS )
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nonlinearityNrS   )
isinstancerC   LinearConv2drO   normal_rQ   rP   biaskaiming_normal_BatchNorm2d	LayerNorm	GroupNormones_hasattrrS   )r   r
  rS   rK   rK   rL   r     s    
r   r   modelr   r   c              
   C   s  dd l }dd }||}t| jjjjd ||| d }| jjj| | jj||| d  | jj	||| d  t
t| jdd tjr~| jjjjd || d	 jd
 kr~| jjj||| d	  | jjj	||| d  t| j D ]\}\}}	t|	j D ]\}
\}}d}| d|d  d|
d dd}|jj||| d| d  |jj||| d| d  |jj||| d| d  |jj||| d  |jj||| d  |jj||| d  |jj	||| d  |jj	||| d  |jj	||| d  |jd urK|| d| d }|jjj|| qqd S )Nr   c                 S   s"   | j dkr| g d} t| S )zPossibly convert HWIO to OIHW.r   )r:   r}   r   r   )ndim	transposerc   
from_numpy)conv_weightsrK   rK   rL   t2p  s   

z_load_weights.<locals>.t2pr   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   ru   rQ   r   copy_rv   r  r  rq   r   rC   r  r   r   r   named_childrenr   r@   rB   ri   r?   rA   rh   r>   )r  r   r   npr"  weightsstem_conv_wisnamer   jbnamer%  cnameblock_prefixwrK   rK   rL   r     s@   
$ """r   Fvariant
pretrainedkwargsc                 K   s"   t d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$   )r6  r7  r8  r:  rK   rK   rL   _create_resnetv2=  s   
r;  c                 K   s    t | f|dttd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)r7  r   r1   )r;  r   r   )r6  r7  r8  rK   rK   rL   _create_resnetv2_bitP  s   
r=  urlc                 K   s   | dddddt tddd
|S )	Nr   )r:      r?  )r   r   g      ?bilinearr   r  )
r>  r   
input_size	pool_sizecrop_pctinterpolationr  r  
first_conv
classifierr   )r>  r8  rK   rK   rL   _cfgd  s   rG  z%resnetv2_50x1_bit.goog_distilled_in1kztimm/bicubic)	hf_hub_idrD  custom_loadz-resnetv2_152x2_bit.goog_teacher_in21k_ft_in1kz1resnetv2_152x2_bit.goog_teacher_in21k_ft_in1k_384)r:     rK  )   rL  r'   )rI  rA  rB  rC  rD  rJ  z$resnetv2_50x1_bit.goog_in21k_ft_in1k)r:     rM  )   rN  )rI  rA  rB  rC  rJ  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:     rO  )   rP  zresnetv2_50x1_bit.goog_in21kiSU  )rI  r   rJ  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:      rQ  )rI  rD  rC  test_input_sizetest_crop_pctz resnetv2_18d.ra4_e3600_r224_in1kz
stem.conv1)rI  rD  rC  rR  rS  rE  )rI  rC  rA  rB  rR  rD  rE  gffffff?)rD  rE  )rD  )rI  rD  rE  rC  rR  rS  )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                 K      t 	d| g ddd|S )zResNetV2-50x1-BiT model.resnetv2_50x1_bitr:   r      r:   r   r7  r   r   N)rU  r=  r7  r8  rK   rK   rL   rU       
rU  c                 K   rT  )zResNetV2-50x3-BiT model.resnetv2_50x3_bitrV  r:   rX  N)r\  rY  rZ  rK   rK   rL   r\    r[  r\  c                 K   rT  )zResNetV2-101x1-BiT model.resnetv2_101x1_bitr:   r      r:   r   rX  N)r]  rY  rZ  rK   rK   rL   r]    r[  r]  c                 K   rT  )zResNetV2-101x3-BiT model.resnetv2_101x3_bitr^  r:   rX  N)r`  rY  rZ  rK   rK   rL   r`    r[  r`  c                 K   rT  )zResNetV2-152x2-BiT model.resnetv2_152x2_bitr:   r   $   r:   r}   rX  N)ra  rY  rZ  rK   rK   rL   ra    r[  ra  c                 K   rT  )zResNetV2-152x4-BiT model.resnetv2_152x4_bitrb  r   rX  N)rd  rY  rZ  rK   rK   rL   rd    r[  rd  c                 K   s6   t g ddddttd}td	d| it |fi |S )
zResNetV2-18 model.r}   r}   r}   r}   r      r   r   Tr'   r   r   r   r+   r1   r2   resnetv2_18r7  N)ri  r   r   r   r;  r7  r8  
model_argsrK   rK   rL   ri    s
   ri  c              
   K   s:   t g ddddttddd}td
d| it |fi |S )z'ResNetV2-18d model (deep stem variant).re  rf  Tr'   r   r   r   r   r+   r1   r2   r   r   resnetv2_18dr7  N)rn  rj  rk  rK   rK   rL   rn    s
   rn  c                 K   s2   t ddddttd}td	d| it |fi |S )
zResNetV2-34 model.rV  rf  Tr'   rh  resnetv2_34r7  N)ro  rj  rk  rK   rK   rL   ro    s
   ro  c              
   K   s6   t ddddttddd}td
d| it |fi |S )z'ResNetV2-34d model (deep stem variant).rV  rf  Tr'   r   rm  resnetv2_34dr7  N)rp  rj  rk  rK   rK   rL   rp    s
   rp  c                 K   0   t g dttd}tdd| it |fi |S )zResNetV2-50 model.rV  r   r1   r2   resnetv2_50r7  N)rs  rj  rk  rK   rK   rL   rs  %     rs  c                 K   4   t g dttddd}tdd| it |fi |S )	z'ResNetV2-50d model (deep stem variant).rV  r   Tr   r1   r2   r   r   resnetv2_50dr7  N)rw  rj  rk  rK   rK   rL   rw  ,  
   
rw  c                 K   ru  )	z)ResNetV2-50t model (tiered stem variant).rV  r   Trv  resnetv2_50tr7  N)ry  rj  rk  rK   rK   rL   ry  5  rx  ry  c                 K   rq  )zResNetV2-101 model.r^  rr  resnetv2_101r7  N)rz  rj  rk  rK   rK   rL   rz  >  rt  rz  c                 K   ru  )	z(ResNetV2-101d model (deep stem variant).r^  r   Trv  resnetv2_101dr7  N)r{  rj  rk  rK   rK   rL   r{  E  rx  r{  c                 K   rq  )zResNetV2-152 model.rb  rr  resnetv2_152r7  N)r|  rj  rk  rK   rK   rL   r|  N  rt  r|  c                 K   ru  )	z(ResNetV2-152d model (deep stem variant).rb  r   Trv  resnetv2_152dr7  N)r}  rj  rk  rK   rK   rL   r}  U  rx  r}  c                 K   ru  )	z,ResNetV2-50d model with Group Normalization.rV  r   Trv  resnetv2_50d_gnr7  N)r~  )r   r   r   r;  rk  rK   rK   rL   r~  `  rx  r~  c                 K   ru  )	z ResNetV2-50d model with EvoNorm.rV  r   Trv  resnetv2_50d_evosr7  N)r  )r   r   r   r;  rk  rK   rK   rL   r  i  rx  r  c                 K   ru  )	z6ResNetV2-50d model with Filter Response Normalization.rV  r   Trv  resnetv2_50d_frnr7  N)r  )r   r   r   r;  rk  rK   rK   rL   r  r  rx  r  )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   )Xr`   collectionsr   	functoolsr   typingr   r   r   r   r   r	   r
   rc   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&   rf   rk   rs   r|   r   r   r{   r   ra   r   r   r$   r   no_gradr   r;  r=  rG  default_cfgsrU  r\  r]  r`  ra  rd  ri  rn  ro  rp  rs  rw  ry  rz  r{  r|  r}  r~  r  r  r]   rK   rK   rK   rL   <module>   s   $<XaO$?

-  % 
!$'*-047;
d				
