


import argparse
import json
import os

import requests
import torch
from huggingface_hub import hf_hub_download
from PIL import Image

from transformers import ConvNextImageProcessor, ConvNextVaConfig, ConvNextVaForImageClassification
from transformers.image_utils import PILImageResampling
from transformers.utils import logging


logging.set_verbosity_info()
lowerCamelCase		      = logging.get_logger(__name__)




def 			a_   (					SCREAMING_SNAKE_CASE__      :   Optional[int]  ):
       '''simple docstring'''





       _lowerCamelCase :	List[Any]						=ConvNextVaConfig()

       if "atto" in checkpoint_url:
              _lowerCamelCase :	int						=[2, 2, 6, 2]
              _lowerCamelCase :	Optional[Any]						=[40, 80, 160, 320]
       if "femto" in checkpoint_url:
              _lowerCamelCase :	str						=[2, 2, 6, 2]
              _lowerCamelCase :	Any						=[48, 96, 192, 384]
       if "pico" in checkpoint_url:
              _lowerCamelCase :	int						=[2, 2, 6, 2]
              _lowerCamelCase :	Optional[int]						=[64, 128, 256, 512]
       if "nano" in checkpoint_url:
              _lowerCamelCase :	str						=[2, 2, 8, 2]
              _lowerCamelCase :	List[Any]						=[80, 160, 320, 640]
       if "tiny" in checkpoint_url:
              _lowerCamelCase :	List[Any]						=[3, 3, 9, 3]
              _lowerCamelCase :	Optional[int]						=[96, 192, 384, 768]
       if "base" in checkpoint_url:
              _lowerCamelCase :	Dict						=[3, 3, 27, 3]
              _lowerCamelCase :	Optional[int]						=[128, 256, 512, 1_024]
       if "large" in checkpoint_url:
              _lowerCamelCase :	Optional[int]						=[3, 3, 27, 3]
              _lowerCamelCase :	Optional[int]						=[192, 384, 768, 1_536]
       if "huge" in checkpoint_url:
              _lowerCamelCase :	Tuple						=[3, 3, 27, 3]
              _lowerCamelCase :	List[Any]						=[352, 704, 1_408, 2_816]

       _lowerCamelCase :	List[Any]						=1_000
       _lowerCamelCase :	List[Any]						='imagenet-1k-id2label.json'
       _lowerCamelCase :	Optional[int]						=(1, 1_000)

       _lowerCamelCase :	str						='huggingface/label-files'
       _lowerCamelCase :	Optional[Any]						=num_labels
       _lowerCamelCase :	str						=json.load(open(hf_hub_download(SCREAMING_SNAKE_CASE__	,    SCREAMING_SNAKE_CASE__	,    repo_type='dataset'  )	,    'r'  )  )
       _lowerCamelCase :	List[Any]						={int(SCREAMING_SNAKE_CASE__  ): v for k, v in idalabel.items()}

       _lowerCamelCase :	List[str]						=idalabel
       _lowerCamelCase :	List[Any]						={v: k for k, v in idalabel.items()}
       _lowerCamelCase :	Optional[Any]						=hidden_sizes
       _lowerCamelCase :	Dict						=depths

       return config, expected_shape




def 			a_   (					SCREAMING_SNAKE_CASE__      :   List[str]  ):
       '''simple docstring'''





       if "downsample_layers.0.0" in name:
              _lowerCamelCase :	Union[str, Any]						=name.replace('downsample_layers.0.0'	,    'embeddings.patch_embeddings'  )
       if "downsample_layers.0.1" in name:
              _lowerCamelCase :	Optional[Any]						=name.replace('downsample_layers.0.1'	,    'embeddings.norm'  )  # we rename to layernorm later on
       if "downsample_layers.1.0" in name:
              _lowerCamelCase :	Union[str, Any]						=name.replace('downsample_layers.1.0'	,    'stages.1.downsampling_layer.0'  )
       if "downsample_layers.1.1" in name:
              _lowerCamelCase :	List[str]						=name.replace('downsample_layers.1.1'	,    'stages.1.downsampling_layer.1'  )
       if "downsample_layers.2.0" in name:
              _lowerCamelCase :	Any						=name.replace('downsample_layers.2.0'	,    'stages.2.downsampling_layer.0'  )
       if "downsample_layers.2.1" in name:
              _lowerCamelCase :	Tuple						=name.replace('downsample_layers.2.1'	,    'stages.2.downsampling_layer.1'  )
       if "downsample_layers.3.0" in name:
              _lowerCamelCase :	Optional[Any]						=name.replace('downsample_layers.3.0'	,    'stages.3.downsampling_layer.0'  )
       if "downsample_layers.3.1" in name:
              _lowerCamelCase :	Dict						=name.replace('downsample_layers.3.1'	,    'stages.3.downsampling_layer.1'  )
       if "stages" in name and "downsampling_layer" not in name:
              # stages.0.0. for instance should be renamed to stages.0.layers.0.
              _lowerCamelCase :	Optional[int]						=name[: len('stages.0'  )] + '.layers' + name[len('stages.0'  ) :]
       if "gamma" in name:
              _lowerCamelCase :	Tuple						=name.replace('gamma'	,    'weight'  )
       if "beta" in name:
              _lowerCamelCase :	Optional[int]						=name.replace('beta'	,    'bias'  )
       if "stages" in name:
              _lowerCamelCase :	Optional[Any]						=name.replace('stages'	,    'encoder.stages'  )
       if "norm" in name:
              _lowerCamelCase :	str						=name.replace('norm'	,    'layernorm'  )
       if "head" in name:
              _lowerCamelCase :	Union[str, Any]						=name.replace('head'	,    'classifier'  )

       return name




def 			a_   (					):
       '''simple docstring'''





       _lowerCamelCase :	List[Any]						='http://images.cocodataset.org/val2017/000000039769.jpg'
       _lowerCamelCase :	Tuple						=Image.open(requests.get(SCREAMING_SNAKE_CASE__	,    stream=SCREAMING_SNAKE_CASE__  ).raw  )
       return im




def 			a_   (					SCREAMING_SNAKE_CASE__      :   Optional[int]  ):
       '''simple docstring'''





       if "224" in checkpoint_url:
              _lowerCamelCase :	Dict						=224
              _lowerCamelCase :	List[Any]						=224 / 256
       elif "384" in checkpoint_url:
              _lowerCamelCase :	Dict						=384
              _lowerCamelCase :	str						=None
       else:
              _lowerCamelCase :	Optional[Any]						=512
              _lowerCamelCase :	Union[str, Any]						=None

       return ConvNextImageProcessor(
           size=SCREAMING_SNAKE_CASE__	,    crop_pct=SCREAMING_SNAKE_CASE__	,    image_mean=[0.4_85, 0.4_56, 0.4_06]	,    image_std=[0.2_29, 0.2_24, 0.2_25]	,    resample=PILImageResampling.BICUBIC	,    )




@torch.no_grad()
def 			a_   (					SCREAMING_SNAKE_CASE__      :   Optional[Any]	,    SCREAMING_SNAKE_CASE__      :   Optional[int]	,    SCREAMING_SNAKE_CASE__      :   int	,    SCREAMING_SNAKE_CASE__      :   Any  ):
       '''simple docstring'''





       print('Downloading original model from checkpoint...'  )
       # define ConvNeXTV2 configuration based on URL
       _lowerCamelCase			,  _lowerCamelCase :	Optional[int]						=get_convnextva_config(SCREAMING_SNAKE_CASE__  )
       # load original state_dict from URL
       _lowerCamelCase :	Optional[int]						=torch.hub.load_state_dict_from_url(SCREAMING_SNAKE_CASE__  )['model']

       print('Converting model parameters...'  )
       # rename keys
       for key in state_dict.copy().keys():
              _lowerCamelCase :	Optional[int]						=state_dict.pop(SCREAMING_SNAKE_CASE__  )
              _lowerCamelCase :	Dict						=val
       # add prefix to all keys expect classifier head
       for key in state_dict.copy().keys():
              _lowerCamelCase :	Tuple						=state_dict.pop(SCREAMING_SNAKE_CASE__  )
              if not key.startswith('classifier'  ):
                     _lowerCamelCase :	str						='convnextv2.' + key
              _lowerCamelCase :	List[Any]						=val

       # load HuggingFace model
       _lowerCamelCase :	Optional[int]						=ConvNextVaForImageClassification(SCREAMING_SNAKE_CASE__  )
       model.load_state_dict(SCREAMING_SNAKE_CASE__  )
       model.eval()

       # Check outputs on an image, prepared by ConvNextImageProcessor
       _lowerCamelCase :	Dict						=convert_preprocessor(SCREAMING_SNAKE_CASE__  )
       _lowerCamelCase :	Tuple						=preprocessor(images=prepare_img()	,    return_tensors='pt'  )
       _lowerCamelCase :	Optional[int]						=model(**SCREAMING_SNAKE_CASE__  ).logits

       # note: the logits below were obtained without center cropping
       if checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im1k/convnextv2_atto_1k_224_ema.pt":
              _lowerCamelCase :	Tuple						=torch.tensor([-0.39_30, 0.17_47, -0.52_46, 0.41_77, 0.42_95]  )
       elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im1k/convnextv2_femto_1k_224_ema.pt":
              _lowerCamelCase :	Optional[int]						=torch.tensor([-0.17_27, -0.53_41, -0.78_18, -0.47_45, -0.65_66]  )
       elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im1k/convnextv2_pico_1k_224_ema.pt":
              _lowerCamelCase :	Dict						=torch.tensor([-0.03_33, 0.15_63, -0.91_37, 0.10_54, 0.03_81]  )
       elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im1k/convnextv2_nano_1k_224_ema.pt":
              _lowerCamelCase :	str						=torch.tensor([-0.17_44, -0.15_55, -0.07_13, 0.09_50, -0.14_31]  )
       elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im1k/convnextv2_tiny_1k_224_ema.pt":
              _lowerCamelCase :	Dict						=torch.tensor([0.99_96, 0.19_66, -0.43_86, -0.34_72, 0.66_61]  )
       elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im1k/convnextv2_base_1k_224_ema.pt":
              _lowerCamelCase :	Optional[Any]						=torch.tensor([-0.25_53, -0.67_08, -0.13_59, 0.25_18, -0.24_88]  )
       elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im1k/convnextv2_large_1k_224_ema.pt":
              _lowerCamelCase :	List[str]						=torch.tensor([-0.06_73, -0.56_27, -0.37_53, -0.27_22, 0.01_78]  )
       elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im1k/convnextv2_huge_1k_224_ema.pt":
              _lowerCamelCase :	Tuple						=torch.tensor([-0.63_77, -0.74_58, -0.21_50, 0.11_84, -0.05_97]  )
       elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_nano_22k_224_ema.pt":
              _lowerCamelCase :	str						=torch.tensor([1.07_99, 0.23_22, -0.88_60, 1.02_19, 0.62_31]  )
       elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_nano_22k_384_ema.pt":
              _lowerCamelCase :	str						=torch.tensor([0.37_66, 0.49_17, -1.14_26, 0.99_42, 0.60_24]  )
       elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_tiny_22k_224_ema.pt":
              _lowerCamelCase :	Union[str, Any]						=torch.tensor([0.42_20, -0.69_19, -0.43_17, -0.28_81, -0.66_09]  )
       elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_tiny_22k_384_ema.pt":
              _lowerCamelCase :	Any						=torch.tensor([0.10_82, -0.82_86, -0.50_95, 0.46_81, -0.80_85]  )
       elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_base_22k_224_ema.pt":
              _lowerCamelCase :	Optional[Any]						=torch.tensor([-0.24_19, -0.62_21, 0.21_76, -0.09_80, -0.75_27]  )
       elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_base_22k_384_ema.pt":
              _lowerCamelCase :	List[Any]						=torch.tensor([0.03_91, -0.43_71, 0.37_86, 0.12_51, -0.27_84]  )
       elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_large_22k_224_ema.pt":
              _lowerCamelCase :	Dict						=torch.tensor([-0.05_04, 0.56_36, -0.17_29, -0.65_07, -0.39_49]  )
       elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_large_22k_384_ema.pt":
              _lowerCamelCase :	Tuple						=torch.tensor([0.35_60, 0.94_86, 0.31_49, -0.26_67, -0.51_38]  )
       elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_huge_22k_384_ema.pt":
              _lowerCamelCase :	int						=torch.tensor([-0.24_69, -0.45_50, -0.58_53, -0.08_10, 0.03_09]  )
       elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_huge_22k_512_ema.pt":
              _lowerCamelCase :	Tuple						=torch.tensor([-0.30_90, 0.08_02, -0.06_82, -0.19_79, -0.28_26]  )
       else:
              raise ValueError(F'''Unknown URL: {checkpoint_url}'''  )

       assert torch.allclose(logits[0, :5]	,    SCREAMING_SNAKE_CASE__	,    atol=1e-3  )
       assert logits.shape == expected_shape
       print('Model outputs match the original results!'  )

       if save_model:
              print('Saving model to local...'  )
              # Create folder to save model
              if not os.path.isdir(SCREAMING_SNAKE_CASE__  ):
                     os.mkdir(SCREAMING_SNAKE_CASE__  )

              model.save_pretrained(SCREAMING_SNAKE_CASE__  )
              preprocessor.save_pretrained(SCREAMING_SNAKE_CASE__  )

       _lowerCamelCase :	Optional[Any]						='convnextv2'
       if "atto" in checkpoint_url:
              model_name += "-atto"
       if "femto" in checkpoint_url:
              model_name += "-femto"
       if "pico" in checkpoint_url:
              model_name += "-pico"
       if "nano" in checkpoint_url:
              model_name += "-nano"
       elif "tiny" in checkpoint_url:
              model_name += "-tiny"
       elif "base" in checkpoint_url:
              model_name += "-base"
       elif "large" in checkpoint_url:
              model_name += "-large"
       elif "huge" in checkpoint_url:
              model_name += "-huge"
       if "22k" in checkpoint_url and "1k" not in checkpoint_url:
              model_name += "-22k"
       elif "22k" in checkpoint_url and "1k" in checkpoint_url:
              model_name += "-22k-1k"
       elif "1k" in checkpoint_url:
              model_name += "-1k"
       if "224" in checkpoint_url:
              model_name += "-224"
       elif "384" in checkpoint_url:
              model_name += "-384"
       elif "512" in checkpoint_url:
              model_name += "-512"

       if push_to_hub:
              print(F'''Pushing {model_name} to the hub...'''  )
              model.push_to_hub(SCREAMING_SNAKE_CASE__  )
              preprocessor.push_to_hub(SCREAMING_SNAKE_CASE__  )


if __name__ == "__main__":
 lowerCamelCase		      = argparse.ArgumentParser()
 # Required parameters
 parser.add_argument(
     '--checkpoint_url',
     default='https://dl.fbaipublicfiles.com/convnext/convnextv2/im1k/convnextv2_atto_1k_224_ema.pt',
     type=str,
     help='URL of the original ConvNeXTV2 checkpoint you\'d like to convert.',
 )
 parser.add_argument(
     '--pytorch_dump_folder_path',
     default='model',
     type=str,
     help='Path to the output PyTorch model directory.',
 )
 parser.add_argument('--save_model', action='store_true', help='Save model to local')
 parser.add_argument('--push_to_hub', action='store_true', help='Push model and image preprocessor to the hub')

 lowerCamelCase		      = parser.parse_args()
 convert_convnextva_checkpoint(
     args.checkpoint_url, args.pytorch_dump_folder_path, args.save_model, args.push_to_hub
 )






from typing import TYPE_CHECKING

from ...utils import (
    OptionalDependencyNotAvailable,
    _LazyModule,
    is_tf_available,
    is_tokenizers_available,
    is_torch_available,
)


lowerCamelCase		      = {
    'configuration_deberta_v2': ['DEBERTA_V2_PRETRAINED_CONFIG_ARCHIVE_MAP', 'DebertaV2Config', 'DebertaV2OnnxConfig'],
    'tokenization_deberta_v2': ['DebertaV2Tokenizer'],
}

try:
 if not is_tokenizers_available():
  raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
 pass
else:
 lowerCamelCase		      = ['DebertaV2TokenizerFast']

try:
 if not is_tf_available():
  raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
 pass
else:
 lowerCamelCase		      = [
     'TF_DEBERTA_V2_PRETRAINED_MODEL_ARCHIVE_LIST',
     'TFDebertaV2ForMaskedLM',
     'TFDebertaV2ForQuestionAnswering',
     'TFDebertaV2ForSequenceClassification',
     'TFDebertaV2ForTokenClassification',
     'TFDebertaV2Model',
     'TFDebertaV2PreTrainedModel',
 ]

try:
 if not is_torch_available():
  raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
 pass
else:
 lowerCamelCase		      = [
     'DEBERTA_V2_PRETRAINED_MODEL_ARCHIVE_LIST',
     'DebertaV2ForMaskedLM',
     'DebertaV2ForMultipleChoice',
     'DebertaV2ForQuestionAnswering',
     'DebertaV2ForSequenceClassification',
     'DebertaV2ForTokenClassification',
     'DebertaV2Model',
     'DebertaV2PreTrainedModel',
 ]


if TYPE_CHECKING:
 from .configuration_deberta_va import (
     DEBERTA_V2_PRETRAINED_CONFIG_ARCHIVE_MAP,
     DebertaVaConfig,
     DebertaVaOnnxConfig,
 )
 from .tokenization_deberta_va import DebertaVaTokenizer

 try:
  if not is_tokenizers_available():
   raise OptionalDependencyNotAvailable()
 except OptionalDependencyNotAvailable:
  pass
 else:
  from .tokenization_deberta_va_fast import DebertaVaTokenizerFast

 try:
  if not is_tf_available():
   raise OptionalDependencyNotAvailable()
 except OptionalDependencyNotAvailable:
  pass
 else:
  from .modeling_tf_deberta_va import (
      TF_DEBERTA_V2_PRETRAINED_MODEL_ARCHIVE_LIST,
      TFDebertaVaForMaskedLM,
      TFDebertaVaForQuestionAnswering,
      TFDebertaVaForSequenceClassification,
      TFDebertaVaForTokenClassification,
      TFDebertaVaModel,
      TFDebertaVaPreTrainedModel,
  )

 try:
  if not is_torch_available():
   raise OptionalDependencyNotAvailable()
 except OptionalDependencyNotAvailable:
  pass
 else:
  from .modeling_deberta_va import (
      DEBERTA_V2_PRETRAINED_MODEL_ARCHIVE_LIST,
      DebertaVaForMaskedLM,
      DebertaVaForMultipleChoice,
      DebertaVaForQuestionAnswering,
      DebertaVaForSequenceClassification,
      DebertaVaForTokenClassification,
      DebertaVaModel,
      DebertaVaPreTrainedModel,
  )

else:
 import sys

 lowerCamelCase		      = _LazyModule(__name__, globals()['__file__'], _import_structure, module_spec=__spec__)


