


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   snake_case_	(    snake_case	)    ->							Any:
       lowercase__:  Tuple         =  ConvNextVaConfig()

       if "atto" in checkpoint_url:
              lowercase__:  List[Any]         =  [2, 2, 6, 2]
              lowercase__:  Tuple         =  [40, 80, 1_60, 3_20]
       if "femto" in checkpoint_url:
              lowercase__:  Tuple         =  [2, 2, 6, 2]
              lowercase__:  int         =  [48, 96, 1_92, 3_84]
       if "pico" in checkpoint_url:
              lowercase__:  List[str]         =  [2, 2, 6, 2]
              lowercase__:  Dict         =  [64, 1_28, 2_56, 5_12]
       if "nano" in checkpoint_url:
              lowercase__:  str         =  [2, 2, 8, 2]
              lowercase__:  Union[str, Any]         =  [80, 1_60, 3_20, 6_40]
       if "tiny" in checkpoint_url:
              lowercase__:  List[str]         =  [3, 3, 9, 3]
              lowercase__:  Tuple         =  [96, 1_92, 3_84, 7_68]
       if "base" in checkpoint_url:
              lowercase__:  Optional[Any]         =  [3, 3, 27, 3]
              lowercase__:  int         =  [1_28, 2_56, 5_12, 10_24]
       if "large" in checkpoint_url:
              lowercase__:  Optional[int]         =  [3, 3, 27, 3]
              lowercase__:  Any         =  [1_92, 3_84, 7_68, 15_36]
       if "huge" in checkpoint_url:
              lowercase__:  int         =  [3, 3, 27, 3]
              lowercase__:  Dict         =  [3_52, 7_04, 14_08, 28_16]

       lowercase__:  str         =  10_00
       lowercase__:  List[str]         =  'imagenet-1k-id2label.json'
       lowercase__:  Tuple         =  (1, 10_00)

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

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

       return config, expected_shape




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

       return name




def   snake_case_	(    )    ->							int:
       lowercase__:  str         =  'http://images.cocodataset.org/val2017/000000039769.jpg'
       lowercase__:  Tuple         =  Image.open(requests.get(snake_case     ,				stream=snake_case	).raw	)
       return im




def   snake_case_	(    snake_case	)    ->							Union[str, Any]:
       if "224" in checkpoint_url:
              lowercase__:  int         =  2_24
              lowercase__:  int         =  2_24 / 2_56
       elif "384" in checkpoint_url:
              lowercase__:  int         =  3_84
              lowercase__:  Dict         =  None
       else:
              lowercase__:  int         =  5_12
              lowercase__:  List[str]         =  None

       return ConvNextImageProcessor(
           size=snake_case     ,				crop_pct=snake_case     ,				image_mean=[0.4_8_5, 0.4_5_6, 0.4_0_6]     ,				image_std=[0.2_2_9, 0.2_2_4, 0.2_2_5]     ,				resample=PILImageResampling.BICUBIC     ,				)




@torch.no_grad()
def   snake_case_	(    snake_case     ,				snake_case     ,				snake_case     ,				snake_case	)    ->							List[Any]:
       print('Downloading original model from checkpoint...'	)
       # define ConvNeXTV2 configuration based on URL
       lowercase__     ,		lowercase__:  Optional[int]         =  get_convnextva_config(snake_case	)
       # load original state_dict from URL
       lowercase__:  List[str]         =  torch.hub.load_state_dict_from_url(snake_case	)['model']

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

       # load HuggingFace model
       lowercase__:  List[str]         =  ConvNextVaForImageClassification(snake_case	)
       model.load_state_dict(snake_case	)
       model.eval()

       # Check outputs on an image, prepared by ConvNextImageProcessor
       lowercase__:  Any         =  convert_preprocessor(snake_case	)
       lowercase__:  List[Any]         =  preprocessor(images=prepare_img()     ,				return_tensors='pt'	)
       lowercase__:  Dict         =  model(**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":
              lowercase__:  int         =  torch.tensor([-0.3_9_3_0, 0.1_7_4_7, -0.5_2_4_6, 0.4_1_7_7, 0.4_2_9_5]	)
       elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im1k/convnextv2_femto_1k_224_ema.pt":
              lowercase__:  List[str]         =  torch.tensor([-0.1_7_2_7, -0.5_3_4_1, -0.7_8_1_8, -0.4_7_4_5, -0.6_5_6_6]	)
       elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im1k/convnextv2_pico_1k_224_ema.pt":
              lowercase__:  int         =  torch.tensor([-0.0_3_3_3, 0.1_5_6_3, -0.9_1_3_7, 0.1_0_5_4, 0.0_3_8_1]	)
       elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im1k/convnextv2_nano_1k_224_ema.pt":
              lowercase__:  Dict         =  torch.tensor([-0.1_7_4_4, -0.1_5_5_5, -0.0_7_1_3, 0.0_9_5_0, -0.1_4_3_1]	)
       elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im1k/convnextv2_tiny_1k_224_ema.pt":
              lowercase__:  Any         =  torch.tensor([0.9_9_9_6, 0.1_9_6_6, -0.4_3_8_6, -0.3_4_7_2, 0.6_6_6_1]	)
       elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im1k/convnextv2_base_1k_224_ema.pt":
              lowercase__:  List[str]         =  torch.tensor([-0.2_5_5_3, -0.6_7_0_8, -0.1_3_5_9, 0.2_5_1_8, -0.2_4_8_8]	)
       elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im1k/convnextv2_large_1k_224_ema.pt":
              lowercase__:  Optional[int]         =  torch.tensor([-0.0_6_7_3, -0.5_6_2_7, -0.3_7_5_3, -0.2_7_2_2, 0.0_1_7_8]	)
       elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im1k/convnextv2_huge_1k_224_ema.pt":
              lowercase__:  Dict         =  torch.tensor([-0.6_3_7_7, -0.7_4_5_8, -0.2_1_5_0, 0.1_1_8_4, -0.0_5_9_7]	)
       elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_nano_22k_224_ema.pt":
              lowercase__:  Dict         =  torch.tensor([1.0_7_9_9, 0.2_3_2_2, -0.8_8_6_0, 1.0_2_1_9, 0.6_2_3_1]	)
       elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_nano_22k_384_ema.pt":
              lowercase__:  Any         =  torch.tensor([0.3_7_6_6, 0.4_9_1_7, -1.1_4_2_6, 0.9_9_4_2, 0.6_0_2_4]	)
       elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_tiny_22k_224_ema.pt":
              lowercase__:  Optional[int]         =  torch.tensor([0.4_2_2_0, -0.6_9_1_9, -0.4_3_1_7, -0.2_8_8_1, -0.6_6_0_9]	)
       elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_tiny_22k_384_ema.pt":
              lowercase__:  Union[str, Any]         =  torch.tensor([0.1_0_8_2, -0.8_2_8_6, -0.5_0_9_5, 0.4_6_8_1, -0.8_0_8_5]	)
       elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_base_22k_224_ema.pt":
              lowercase__:  List[str]         =  torch.tensor([-0.2_4_1_9, -0.6_2_2_1, 0.2_1_7_6, -0.0_9_8_0, -0.7_5_2_7]	)
       elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_base_22k_384_ema.pt":
              lowercase__:  Optional[int]         =  torch.tensor([0.0_3_9_1, -0.4_3_7_1, 0.3_7_8_6, 0.1_2_5_1, -0.2_7_8_4]	)
       elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_large_22k_224_ema.pt":
              lowercase__:  List[str]         =  torch.tensor([-0.0_5_0_4, 0.5_6_3_6, -0.1_7_2_9, -0.6_5_0_7, -0.3_9_4_9]	)
       elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_large_22k_384_ema.pt":
              lowercase__:  Union[str, Any]         =  torch.tensor([0.3_5_6_0, 0.9_4_8_6, 0.3_1_4_9, -0.2_6_6_7, -0.5_1_3_8]	)
       elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_huge_22k_384_ema.pt":
              lowercase__:  Union[str, Any]         =  torch.tensor([-0.2_4_6_9, -0.4_5_5_0, -0.5_8_5_3, -0.0_8_1_0, 0.0_3_0_9]	)
       elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_huge_22k_512_ema.pt":
              lowercase__:  int         =  torch.tensor([-0.3_0_9_0, 0.0_8_0_2, -0.0_6_8_2, -0.1_9_7_9, -0.2_8_2_6]	)
       else:
              raise ValueError(f'Unknown URL: {checkpoint_url}'	)

       assert torch.allclose(logits[0, :5]     ,				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(snake_case	):
                     os.mkdir(snake_case	)

              model.save_pretrained(snake_case	)
              preprocessor.save_pretrained(snake_case	)

       lowercase__:  Union[str, 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(snake_case	)
              preprocessor.push_to_hub(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
 )






import numpy as np
from cva import COLOR_BGR2GRAY, cvtColor, imread, imshow, waitKey

from digital_image_processing.filters.convolve import img_convolve




def   snake_case_	(    snake_case	)    ->							List[str]:
       lowercase__:  Any         =  np.array([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]]	)
       lowercase__:  Optional[Any]         =  np.array([[1, 2, 1], [0, 0, 0], [-1, -2, -1]]	)

       lowercase__:  Optional[int]         =  np.abs(img_convolve(snake_case     ,				snake_case	)	)
       lowercase__:  List[Any]         =  np.abs(img_convolve(snake_case     ,				snake_case	)	)
       # modify the pix within [0, 255]
       lowercase__:  Optional[Any]         =  dst_x * 2_55 / np.max(snake_case	)
       lowercase__:  Dict         =  dst_y * 2_55 / np.max(snake_case	)

       lowercase__:  Tuple         =  np.sqrt((np.square(snake_case	)) + (np.square(snake_case	))	)
       lowercase__:  str         =  dst_xy * 2_55 / np.max(snake_case	)
       lowercase__:  Tuple         =  dst_xy.astype(np.uinta	)

       lowercase__:  List[Any]         =  np.arctana(snake_case     ,				snake_case	)
       return dst, theta


if __name__ == "__main__":
 # read original image
 __lowerCAmelCase									=				imread('''../image_data/lena.jpg''')
 # turn image in gray scale value
 __lowerCAmelCase									=				cvtColor(img, COLOR_BGR2GRAY)

 __lowerCAmelCase			,__lowerCAmelCase									=				sobel_filter(gray)

 # show result images
 imshow('''sobel filter''', sobel_grad)
 imshow('''sobel theta''', sobel_theta)
 waitKey(0)


