


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()
lowercase_           =	logging.get_logger(__name__)
def       UpperCamelCase__     (  SCREAMING_SNAKE_CASE__						):
 __lowerCamelCase		:							str							=						ConvNextConfig()

 if "tiny" in checkpoint_url:
  __lowerCamelCase		:							int							=						[3, 3, 9, 3]
  __lowerCamelCase		:							Any							=						[96, 192, 384, 768]
 if "small" in checkpoint_url:
  __lowerCamelCase		:							Dict							=						[3, 3, 27, 3]
  __lowerCamelCase		:							int							=						[96, 192, 384, 768]
 if "base" in checkpoint_url:
  __lowerCamelCase		:							str							=						[3, 3, 27, 3]
  __lowerCamelCase		:							int							=						[128, 256, 512, 1_024]
 if "large" in checkpoint_url:
  __lowerCamelCase		:							int							=						[3, 3, 27, 3]
  __lowerCamelCase		:							int							=						[192, 384, 768, 1_536]
 if "xlarge" in checkpoint_url:
  __lowerCamelCase		:							List[Any]							=						[3, 3, 27, 3]
  __lowerCamelCase		:							Optional[Any]							=						[256, 512, 1_024, 2_048]

 if "1k" in checkpoint_url:
  __lowerCamelCase		:							Optional[int]							=						1_000
  __lowerCamelCase		:							int							=						'imagenet-1k-id2label.json'
  __lowerCamelCase		:							Union[str, Any]							=						(1, 1_000)
 else:
  __lowerCamelCase		:							Union[str, Any]							=						21_841
  __lowerCamelCase		:							Optional[int]							=						'imagenet-22k-id2label.json'
  __lowerCamelCase		:							int							=						(1, 21_841)

 __lowerCamelCase		:							Dict							=						'huggingface/label-files'
 __lowerCamelCase		:							List[Any]							=						num_labels
 __lowerCamelCase		:							Optional[Any]							=						json.load(open(hf_hub_download(SCREAMING_SNAKE_CASE__			,       SCREAMING_SNAKE_CASE__			,       repo_type='dataset'						)			,       'r'						)						)
 __lowerCamelCase		:							Any							=						{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_205]
  del idalabel[15_027]
 __lowerCamelCase		:							str							=						idalabel
 __lowerCamelCase		:							int							=						{v: k for k, v in idalabel.items()}
 __lowerCamelCase		:							Union[str, Any]							=						hidden_sizes
 __lowerCamelCase		:							Optional[int]							=						depths

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

 return name
def       UpperCamelCase__     (  ):
 __lowerCamelCase		:							int							=						'http://images.cocodataset.org/val2017/000000039769.jpg'
 __lowerCamelCase		:							Any							=						Image.open(requests.get(SCREAMING_SNAKE_CASE__			,       stream=SCREAMING_SNAKE_CASE__						).raw						)
 return im
@torch.no_grad()
def       UpperCamelCase__     (  SCREAMING_SNAKE_CASE__			,       SCREAMING_SNAKE_CASE__						):
 __lowerCamelCase					,     __lowerCamelCase		:							Tuple							=						get_convnext_config(SCREAMING_SNAKE_CASE__						)
 # load original state_dict from URL
 __lowerCamelCase		:							Dict							=						torch.hub.load_state_dict_from_url(SCREAMING_SNAKE_CASE__						)['model']
 # rename keys
 for key in state_dict.copy().keys():
  __lowerCamelCase		:							Any							=						state_dict.pop(SCREAMING_SNAKE_CASE__						)
  __lowerCamelCase		:							Any							=						val
 # add prefix to all keys expect classifier head
 for key in state_dict.copy().keys():
  __lowerCamelCase		:							Any							=						state_dict.pop(SCREAMING_SNAKE_CASE__						)
  if not key.startswith('classifier'						):
   __lowerCamelCase		:							List[str]							=						'convnext.' + key
  __lowerCamelCase		:							List[str]							=						val

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

 # Check outputs on an image, prepared by ConvNextImageProcessor
 __lowerCamelCase		:							Any							=						224 if '224' in checkpoint_url else 384
 __lowerCamelCase		:							Optional[Any]							=						ConvNextImageProcessor(size=SCREAMING_SNAKE_CASE__						)
 __lowerCamelCase		:							str							=						image_processor(images=prepare_img()			,       return_tensors='pt'						).pixel_values

 __lowerCamelCase		:							int							=						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":
  __lowerCamelCase		:							Union[str, Any]							=						torch.tensor([-0.1_210, -0.6_605, 0.1_918]						)
 elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_small_1k_224_ema.pth":
  __lowerCamelCase		:							List[str]							=						torch.tensor([-0.4_473, -0.1_847, -0.6_365]						)
 elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_base_1k_224_ema.pth":
  __lowerCamelCase		:							Union[str, Any]							=						torch.tensor([0.4_525, 0.7_539, 0.0_308]						)
 elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_base_1k_384.pth":
  __lowerCamelCase		:							Union[str, Any]							=						torch.tensor([0.3_561, 0.6_350, -0.0_384]						)
 elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_large_1k_224_ema.pth":
  __lowerCamelCase		:							Union[str, Any]							=						torch.tensor([0.4_174, -0.0_989, 0.1_489]						)
 elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_large_1k_384.pth":
  __lowerCamelCase		:							Any							=						torch.tensor([0.2_513, -0.1_349, -0.1_613]						)
 elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_base_22k_224.pth":
  __lowerCamelCase		:							List[str]							=						torch.tensor([1.2_980, 0.3_631, -0.1_198]						)
 elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_large_22k_224.pth":
  __lowerCamelCase		:							Tuple							=						torch.tensor([1.2_963, 0.1_227, 0.1_723]						)
 elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_xlarge_22k_224.pth":
  __lowerCamelCase		:							Optional[Any]							=						torch.tensor([1.7_956, 0.8_390, 0.2_820]						)
 elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_base_22k_1k_224.pth":
  __lowerCamelCase		:							int							=						torch.tensor([-0.2_822, -0.0_502, -0.0_878]						)
 elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_base_22k_1k_384.pth":
  __lowerCamelCase		:							Dict							=						torch.tensor([-0.5_672, -0.0_730, -0.4_348]						)
 elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_large_22k_1k_224.pth":
  __lowerCamelCase		:							str							=						torch.tensor([0.2_681, 0.2_365, 0.6_246]						)
 elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_large_22k_1k_384.pth":
  __lowerCamelCase		:							List[str]							=						torch.tensor([-0.2_642, 0.3_931, 0.5_116]						)
 elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_xlarge_22k_1k_224_ema.pth":
  __lowerCamelCase		:							Dict							=						torch.tensor([-0.6_677, -0.1_873, -0.8_379]						)
 elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnext_xlarge_22k_1k_384_ema.pth":
  __lowerCamelCase		:							List[str]							=						torch.tensor([-0.7_749, -0.2_967, -0.6_444]						)
 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...'						)
 __lowerCamelCase		:							Tuple							=						'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__":
       lowercase_           =	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.',
       )

       lowercase_           =	parser.parse_args()
       convert_convnext_checkpoint(args.checkpoint_url, args.pytorch_dump_folder_path)





from __future__ import annotations
def       UpperCamelCase__     (  SCREAMING_SNAKE_CASE__			,       SCREAMING_SNAKE_CASE__			,       SCREAMING_SNAKE_CASE__			,       SCREAMING_SNAKE_CASE__						):
 __lowerCamelCase					,     __lowerCamelCase		:							str							=						m - 1, 0
 while i >= 0 and j < n:
  if key == mat[i][j]:
   print(f'Key {key} found at row- {i + 1} column- {j + 1}'						)
   return
  if key < mat[i][j]:
   i -= 1
  else:
   j += 1
 print(f'Key {key} not found'						)
def       UpperCamelCase__     (  ):
 __lowerCamelCase		:							List[Any]							=						[[2, 5, 7], [4, 8, 13], [9, 11, 15], [12, 17, 20]]
 __lowerCamelCase		:							int							=						int(input('Enter the element to be searched:'						)						)
 print(SCREAMING_SNAKE_CASE__						)
 search_in_a_sorted_matrix(SCREAMING_SNAKE_CASE__			,       len(SCREAMING_SNAKE_CASE__						)			,       len(mat[0]						)			,       SCREAMING_SNAKE_CASE__						)


if __name__ == "__main__":
       import doctest

       doctest.testmod()
       main()

