


import argparse
import json
from pathlib import Path

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

from transformers import ConvNextConfig, ConvNextForImageClassification, ConvNextImageProcessor
from transformers.utils import logging


logging.set_verbosity_info()
__UpperCAmelCase			:			Tuple			      =					logging.get_logger(__name__)


def   a						(				SCREAMING_SNAKE_CASE_   :		Optional[int]							):






       """simple docstring"""





       UpperCamelCase     :						str 						=		ConvNextConfig()

       if "tiny" in checkpoint_url:
              UpperCamelCase     :						Union[str, Any] 						=		[3, 3, 9, 3]
              UpperCamelCase     :						str 						=		[9_6, 1_9_2, 3_8_4, 7_6_8]
       if "small" in checkpoint_url:
              UpperCamelCase     :						Dict 						=		[3, 3, 2_7, 3]
              UpperCamelCase     :						Optional[int] 						=		[9_6, 1_9_2, 3_8_4, 7_6_8]
       if "base" in checkpoint_url:
              UpperCamelCase     :						Optional[int] 						=		[3, 3, 2_7, 3]
              UpperCamelCase     :						Tuple 						=		[1_2_8, 2_5_6, 5_1_2, 1_0_2_4]
       if "large" in checkpoint_url:
              UpperCamelCase     :						Optional[Any] 						=		[3, 3, 2_7, 3]
              UpperCamelCase     :						int 						=		[1_9_2, 3_8_4, 7_6_8, 1_5_3_6]
       if "xlarge" in checkpoint_url:
              UpperCamelCase     :						List[Any] 						=		[3, 3, 2_7, 3]
              UpperCamelCase     :						List[Any] 						=		[2_5_6, 5_1_2, 1_0_2_4, 2_0_4_8]

       if "1k" in checkpoint_url:
              UpperCamelCase     :						List[str] 						=		1_0_0_0
              UpperCamelCase     :						List[Any] 						=		'''imagenet-1k-id2label.json'''
              UpperCamelCase     :						str 						=		(1, 1_0_0_0)
       else:
              UpperCamelCase     :						Optional[int] 						=		2_1_8_4_1
              UpperCamelCase     :						int 						=		'''imagenet-22k-id2label.json'''
              UpperCamelCase     :						str 						=		(1, 2_1_8_4_1)

       UpperCamelCase     :						List[Any] 						=		'''huggingface/label-files'''
       UpperCamelCase     :						int 						=		num_labels
       UpperCamelCase     :						Union[str, Any] 						=		json.load(open(hf_hub_download(SCREAMING_SNAKE_CASE_				,      SCREAMING_SNAKE_CASE_				,      repo_type='''dataset'''							)				,      '''r'''							)							)
       UpperCamelCase     :						int 						=		{int(SCREAMING_SNAKE_CASE_							): v for k, v in idalabel.items()}
       if "1k" not in checkpoint_url:
              # this dataset contains 21843 labels but the model only has 21841
              # we delete the classes as mentioned in https://github.com/google-research/big_transfer/issues/18
              del idalabel[9_2_0_5]
              del idalabel[1_5_0_2_7]
       UpperCamelCase     :						int 						=		idalabel
       UpperCamelCase     :						List[Any] 						=		{v: k for k, v in idalabel.items()}
       UpperCamelCase     :						int 						=		hidden_sizes
       UpperCamelCase     :						Any 						=		depths

       return config, expected_shape


def   a						(				SCREAMING_SNAKE_CASE_   :		Dict							):






       """simple docstring"""





       if "downsample_layers.0.0" in name:
              UpperCamelCase     :						int 						=		name.replace('''downsample_layers.0.0'''				,      '''embeddings.patch_embeddings'''							)
       if "downsample_layers.0.1" in name:
              UpperCamelCase     :						Union[str, Any] 						=		name.replace('''downsample_layers.0.1'''				,      '''embeddings.norm'''							)  # we rename to layernorm later on
       if "downsample_layers.1.0" in name:
              UpperCamelCase     :						Dict 						=		name.replace('''downsample_layers.1.0'''				,      '''stages.1.downsampling_layer.0'''							)
       if "downsample_layers.1.1" in name:
              UpperCamelCase     :						Optional[int] 						=		name.replace('''downsample_layers.1.1'''				,      '''stages.1.downsampling_layer.1'''							)
       if "downsample_layers.2.0" in name:
              UpperCamelCase     :						Tuple 						=		name.replace('''downsample_layers.2.0'''				,      '''stages.2.downsampling_layer.0'''							)
       if "downsample_layers.2.1" in name:
              UpperCamelCase     :						Tuple 						=		name.replace('''downsample_layers.2.1'''				,      '''stages.2.downsampling_layer.1'''							)
       if "downsample_layers.3.0" in name:
              UpperCamelCase     :						int 						=		name.replace('''downsample_layers.3.0'''				,      '''stages.3.downsampling_layer.0'''							)
       if "downsample_layers.3.1" in name:
              UpperCamelCase     :						List[Any] 						=		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.
              UpperCamelCase     :						Dict 						=		name[: len('''stages.0'''							)] + '''.layers''' + name[len('''stages.0'''							) :]
       if "stages" in name:
              UpperCamelCase     :						Any 						=		name.replace('''stages'''				,      '''encoder.stages'''							)
       if "norm" in name:
              UpperCamelCase     :						Union[str, Any] 						=		name.replace('''norm'''				,      '''layernorm'''							)
       if "gamma" in name:
              UpperCamelCase     :						str 						=		name.replace('''gamma'''				,      '''layer_scale_parameter'''							)
       if "head" in name:
              UpperCamelCase     :						Any 						=		name.replace('''head'''				,      '''classifier'''							)

       return name


def   a						(				):






       """simple docstring"""





       UpperCamelCase     :						Tuple 						=		'''http://images.cocodataset.org/val2017/000000039769.jpg'''
       UpperCamelCase     :						Optional[int] 						=		Image.open(requests.get(SCREAMING_SNAKE_CASE_				,      stream=SCREAMING_SNAKE_CASE_							).raw							)
       return im


@torch.no_grad()
def   a						(				SCREAMING_SNAKE_CASE_   :		List[str]				,      SCREAMING_SNAKE_CASE_   :		Any							):






       """simple docstring"""





       UpperCamelCase						,			UpperCamelCase     :						List[str] 						=		get_convnext_config(SCREAMING_SNAKE_CASE_							)
       # load original state_dict from URL
       UpperCamelCase     :						int 						=		torch.hub.load_state_dict_from_url(SCREAMING_SNAKE_CASE_							)['''model''']
       # rename keys
       for key in state_dict.copy().keys():
              UpperCamelCase     :						Optional[Any] 						=		state_dict.pop(SCREAMING_SNAKE_CASE_							)
              UpperCamelCase     :						List[Any] 						=		val
       # add prefix to all keys expect classifier head
       for key in state_dict.copy().keys():
              UpperCamelCase     :						List[Any] 						=		state_dict.pop(SCREAMING_SNAKE_CASE_							)
              if not key.startswith('''classifier'''							):
                     UpperCamelCase     :						List[str] 						=		'''convnext.''' + key
              UpperCamelCase     :						Tuple 						=		val

       # load HuggingFace model
       UpperCamelCase     :						Any 						=		ConvNextForImageClassification(SCREAMING_SNAKE_CASE_							)
       model.load_state_dict(SCREAMING_SNAKE_CASE_							)
       model.eval()

       # Check outputs on an image, prepared by ConvNextImageProcessor
       UpperCamelCase     :						Tuple 						=		2_2_4 if '''224''' in checkpoint_url else 3_8_4
       UpperCamelCase     :						int 						=		ConvNextImageProcessor(size=SCREAMING_SNAKE_CASE_							)
       UpperCamelCase     :						Dict 						=		image_processor(images=prepare_img()				,      return_tensors='''pt'''							).pixel_values

       UpperCamelCase     :						Union[str, Any] 						=		model(SCREAMING_SNAKE_CASE_							).logits

       # note: the logits below were obtained without center cropping
       if checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_tiny_1k_224_ema.pth":
              UpperCamelCase     :						Tuple 						=		torch.tensor([-0.1210, -0.6605, 0.1918]							)
       elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_small_1k_224_ema.pth":
              UpperCamelCase     :						int 						=		torch.tensor([-0.4473, -0.1847, -0.6365]							)
       elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_base_1k_224_ema.pth":
              UpperCamelCase     :						Optional[Any] 						=		torch.tensor([0.4525, 0.7539, 0.0308]							)
       elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_base_1k_384.pth":
              UpperCamelCase     :						Dict 						=		torch.tensor([0.3561, 0.6350, -0.0384]							)
       elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_large_1k_224_ema.pth":
              UpperCamelCase     :						Optional[int] 						=		torch.tensor([0.4174, -0.0989, 0.1489]							)
       elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_large_1k_384.pth":
              UpperCamelCase     :						Dict 						=		torch.tensor([0.2513, -0.1349, -0.1613]							)
       elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_base_22k_224.pth":
              UpperCamelCase     :						List[str] 						=		torch.tensor([1.2980, 0.3631, -0.1198]							)
       elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_large_22k_224.pth":
              UpperCamelCase     :						Union[str, Any] 						=		torch.tensor([1.2963, 0.1227, 0.1723]							)
       elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_xlarge_22k_224.pth":
              UpperCamelCase     :						str 						=		torch.tensor([1.7956, 0.8390, 0.2820]							)
       elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_base_22k_1k_224.pth":
              UpperCamelCase     :						Union[str, Any] 						=		torch.tensor([-0.2822, -0.0502, -0.0878]							)
       elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_base_22k_1k_384.pth":
              UpperCamelCase     :						Optional[Any] 						=		torch.tensor([-0.5672, -0.0730, -0.4348]							)
       elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_large_22k_1k_224.pth":
              UpperCamelCase     :						Union[str, Any] 						=		torch.tensor([0.2681, 0.2365, 0.6246]							)
       elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_large_22k_1k_384.pth":
              UpperCamelCase     :						List[str] 						=		torch.tensor([-0.2642, 0.3931, 0.5116]							)
       elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_xlarge_22k_1k_224_ema.pth":
              UpperCamelCase     :						Tuple 						=		torch.tensor([-0.6677, -0.1873, -0.8379]							)
       elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_xlarge_22k_1k_384_ema.pth":
              UpperCamelCase     :						List[str] 						=		torch.tensor([-0.7749, -0.2967, -0.6444]							)
       else:
              raise ValueError(F"""Unknown URL: {checkpoint_url}"""							)

       assert torch.allclose(logits[0, :3]				,      SCREAMING_SNAKE_CASE_				,      atol=1E-3							)
       assert logits.shape == expected_shape

       Path(SCREAMING_SNAKE_CASE_							).mkdir(exist_ok=SCREAMING_SNAKE_CASE_							)
       print(F"""Saving model to {pytorch_dump_folder_path}"""							)
       model.save_pretrained(SCREAMING_SNAKE_CASE_							)
       print(F"""Saving image processor to {pytorch_dump_folder_path}"""							)
       image_processor.save_pretrained(SCREAMING_SNAKE_CASE_							)

       print('''Pushing model to the hub...'''							)
       UpperCamelCase     :						str 						=		'''convnext'''
       if "tiny" in checkpoint_url:
              model_name += "-tiny"
       elif "small" in checkpoint_url:
              model_name += "-small"
       elif "base" in checkpoint_url:
              model_name += "-base"
       elif "xlarge" in checkpoint_url:
              model_name += "-xlarge"
       elif "large" in checkpoint_url:
              model_name += "-large"
       if "224" in checkpoint_url:
              model_name += "-224"
       elif "384" in checkpoint_url:
              model_name += "-384"
       if "22k" in checkpoint_url and "1k" not in checkpoint_url:
              model_name += "-22k"
       if "22k" in checkpoint_url and "1k" in checkpoint_url:
              model_name += "-22k-1k"

       model.push_to_hub(
           repo_path_or_name=Path(SCREAMING_SNAKE_CASE_				,      SCREAMING_SNAKE_CASE_							)				,      organization='''nielsr'''				,      commit_message='''Add model'''				,      )


if __name__ == "__main__":
  __UpperCAmelCase			:			Dict			      =					argparse.ArgumentParser()
  # Required parameters
  parser.add_argument(
      "--checkpoint_url",
      default="https://dl.fbaipublicfiles.com/convnext/convnext_tiny_1k_224_ema.pth",
      type=str,
      help="URL of the original ConvNeXT checkpoint you'd like to convert.",
  )
  parser.add_argument(
      "--pytorch_dump_folder_path",
      default=None,
      type=str,
      required=True,
      help="Path to the output PyTorch model directory.",
  )

  __UpperCAmelCase			:			Optional[Any]			      =					parser.parse_args()
  convert_convnext_checkpoint(args.checkpoint_url, args.pytorch_dump_folder_path)





import os

from apache_beam.io.filesystems import FileSystems
from apache_beam.pipeline import Pipeline

from .logging import get_logger


__UpperCAmelCase			:			Optional[Any]			      =					2 << 20  # 2mb
__UpperCAmelCase			:			List[Any]			      =					get_logger(__name__)



class  UpperCAmelCase_						(				_a):
       '''simple docstring'''






       def 			_lowercase (  self    ):




              """simple docstring"""




              UpperCamelCase     :						Optional[Any] 						=		self._options.get_all_options().get('''runner'''    )
              return runner in [None, "DirectRunner", "PortableRunner"]




def   a						(				SCREAMING_SNAKE_CASE_   :		str				,      SCREAMING_SNAKE_CASE_   :		int				,      SCREAMING_SNAKE_CASE_   :		Optional[Any]=False							):






       """simple docstring"""





       UpperCamelCase     :						int 						=		FileSystems
       if fs.exists(SCREAMING_SNAKE_CASE_							):
              if force_upload:
                     logger.info(F"""Remote path already exist: {remote_file_path}. Overwriting it as force_upload=True."""							)
              else:
                     logger.info(F"""Remote path already exist: {remote_file_path}. Skipping it as force_upload=False."""							)
                     return
       with fs.create(SCREAMING_SNAKE_CASE_							) as remote_file:
              with open(SCREAMING_SNAKE_CASE_				,      '''rb'''							) as local_file:
                     UpperCamelCase     :						List[str] 						=		local_file.read(SCREAMING_SNAKE_CASE_							)
                     while chunk:
                            remote_file.write(SCREAMING_SNAKE_CASE_							)
                            UpperCamelCase     :						Any 						=		local_file.read(SCREAMING_SNAKE_CASE_							)


def   a						(				SCREAMING_SNAKE_CASE_   :		str				,      SCREAMING_SNAKE_CASE_   :		Optional[Any]				,      SCREAMING_SNAKE_CASE_   :		List[str]=False							):






       """simple docstring"""





       UpperCamelCase     :						List[Any] 						=		FileSystems
       if os.path.exists(SCREAMING_SNAKE_CASE_							):
              if force_download:
                     logger.info(F"""Local path already exist: {remote_file_path}. Overwriting it as force_upload=True."""							)
              else:
                     logger.info(F"""Local path already exist: {remote_file_path}. Skipping it as force_upload=False."""							)
                     return
       with fs.open(SCREAMING_SNAKE_CASE_							) as remote_file:
              with open(SCREAMING_SNAKE_CASE_				,      '''wb'''							) as local_file:
                     UpperCamelCase     :						List[str] 						=		remote_file.read(SCREAMING_SNAKE_CASE_							)
                     while chunk:
                            local_file.write(SCREAMING_SNAKE_CASE_							)
                            UpperCamelCase     :						str 						=		remote_file.read(SCREAMING_SNAKE_CASE_							)

