

'''simple docstring'''

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()
UpperCAmelCase				   =  logging.get_logger(__name__)






def 				__UpperCamelCase							(	lowercase__						:  int ):






     '''simple docstring'''





     __lowercase					=ConvNextVaConfig()

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

     __lowercase					=10_00
     __lowercase					='imagenet-1k-id2label.json'
     __lowercase					=(1, 10_00)

     __lowercase					='huggingface/label-files'
     __lowercase					=num_labels
     __lowercase					=json.load(open(hf_hub_download(lowercase__,					lowercase__,					repo_type='dataset' ),					'r' ) )
     __lowercase					={int(lowercase__ ): v for k, v in idalabel.items()}

     __lowercase					=idalabel
     __lowercase					={v: k for k, v in idalabel.items()}
     __lowercase					=hidden_sizes
     __lowercase					=depths

     return config, expected_shape






def 				__UpperCamelCase							(	lowercase__						:  List[Any] ):






     '''simple docstring'''





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

     return name






def 				__UpperCamelCase							(	):






     '''simple docstring'''





     __lowercase					='http://images.cocodataset.org/val2017/000000039769.jpg'
     __lowercase					=Image.open(requests.get(lowercase__,					stream=lowercase__ ).raw )
     return im






def 				__UpperCamelCase							(	lowercase__						:  int ):






     '''simple docstring'''





     if "224" in checkpoint_url:
          __lowercase					=2_24
          __lowercase					=2_24 / 2_56
     elif "384" in checkpoint_url:
          __lowercase					=3_84
          __lowercase					=None
     else:
          __lowercase					=5_12
          __lowercase					=None

     return ConvNextImageProcessor(
         size=lowercase__,					crop_pct=lowercase__,					image_mean=[0.485, 0.456, 0.406],					image_std=[0.229, 0.224, 0.225],					resample=PILImageResampling.BICUBIC,					)






@torch.no_grad()
def 				__UpperCamelCase							(	lowercase__						:  Optional[int],					lowercase__						:  str,					lowercase__						:  str,					lowercase__						:  str ):






     '''simple docstring'''





     print('Downloading original model from checkpoint...' )
     # define ConvNeXTV2 configuration based on URL
     __lowercase		,     __lowercase					=get_convnextva_config(lowercase__ )
     # load original state_dict from URL
     __lowercase					=torch.hub.load_state_dict_from_url(lowercase__ )['model']

     print('Converting model parameters...' )
     # rename keys
     for key in state_dict.copy().keys():
          __lowercase					=state_dict.pop(lowercase__ )
          __lowercase					=val
     # add prefix to all keys expect classifier head
     for key in state_dict.copy().keys():
          __lowercase					=state_dict.pop(lowercase__ )
          if not key.startswith('classifier' ):
               __lowercase					='convnextv2.' + key
          __lowercase					=val

     # load HuggingFace model
     __lowercase					=ConvNextVaForImageClassification(lowercase__ )
     model.load_state_dict(lowercase__ )
     model.eval()

     # Check outputs on an image, prepared by ConvNextImageProcessor
     __lowercase					=convert_preprocessor(lowercase__ )
     __lowercase					=preprocessor(images=prepare_img(),					return_tensors='pt' )
     __lowercase					=model(**lowercase__ ).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					=torch.tensor([-0.3930, 0.1747, -0.5246, 0.4177, 0.4295] )
     elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im1k/convnextv2_femto_1k_224_ema.pt":
          __lowercase					=torch.tensor([-0.1727, -0.5341, -0.7818, -0.4745, -0.6566] )
     elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im1k/convnextv2_pico_1k_224_ema.pt":
          __lowercase					=torch.tensor([-0.0333, 0.1563, -0.9137, 0.1054, 0.0381] )
     elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im1k/convnextv2_nano_1k_224_ema.pt":
          __lowercase					=torch.tensor([-0.1744, -0.1555, -0.0713, 0.0950, -0.1431] )
     elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im1k/convnextv2_tiny_1k_224_ema.pt":
          __lowercase					=torch.tensor([0.9996, 0.1966, -0.4386, -0.3472, 0.6661] )
     elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im1k/convnextv2_base_1k_224_ema.pt":
          __lowercase					=torch.tensor([-0.2553, -0.6708, -0.1359, 0.2518, -0.2488] )
     elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im1k/convnextv2_large_1k_224_ema.pt":
          __lowercase					=torch.tensor([-0.0673, -0.5627, -0.3753, -0.2722, 0.0178] )
     elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im1k/convnextv2_huge_1k_224_ema.pt":
          __lowercase					=torch.tensor([-0.6377, -0.7458, -0.2150, 0.1184, -0.0597] )
     elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_nano_22k_224_ema.pt":
          __lowercase					=torch.tensor([1.0799, 0.2322, -0.8860, 1.0219, 0.6231] )
     elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_nano_22k_384_ema.pt":
          __lowercase					=torch.tensor([0.3766, 0.4917, -1.1426, 0.9942, 0.6024] )
     elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_tiny_22k_224_ema.pt":
          __lowercase					=torch.tensor([0.4220, -0.6919, -0.4317, -0.2881, -0.6609] )
     elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_tiny_22k_384_ema.pt":
          __lowercase					=torch.tensor([0.1082, -0.8286, -0.5095, 0.4681, -0.8085] )
     elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_base_22k_224_ema.pt":
          __lowercase					=torch.tensor([-0.2419, -0.6221, 0.2176, -0.0980, -0.7527] )
     elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_base_22k_384_ema.pt":
          __lowercase					=torch.tensor([0.0391, -0.4371, 0.3786, 0.1251, -0.2784] )
     elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_large_22k_224_ema.pt":
          __lowercase					=torch.tensor([-0.0504, 0.5636, -0.1729, -0.6507, -0.3949] )
     elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_large_22k_384_ema.pt":
          __lowercase					=torch.tensor([0.3560, 0.9486, 0.3149, -0.2667, -0.5138] )
     elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_huge_22k_384_ema.pt":
          __lowercase					=torch.tensor([-0.2469, -0.4550, -0.5853, -0.0810, 0.0309] )
     elif checkpoint_url == "https://dl.fbaipublicfiles.com/convnext/convnextv2/im22k/convnextv2_huge_22k_512_ema.pt":
          __lowercase					=torch.tensor([-0.3090, 0.0802, -0.0682, -0.1979, -0.2826] )
     else:
          raise ValueError(F'''Unknown URL: {checkpoint_url}''' )

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

          model.save_pretrained(lowercase__ )
          preprocessor.save_pretrained(lowercase__ )

     __lowercase					='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(lowercase__ )
          preprocessor.push_to_hub(lowercase__ )


if __name__ == "__main__":
       UpperCAmelCase				   =  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''')

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





'''simple docstring'''

import os

import requests
from bsa import BeautifulSoup
from fake_useragent import UserAgent

UpperCAmelCase				   =  {'''UserAgent''': UserAgent().random}
UpperCAmelCase				   =  '''https://www.mywaifulist.moe/random'''

def 				__UpperCamelCase							(	lowercase__						:  str,					lowercase__						:  str ):






     '''simple docstring'''





     __lowercase					=requests.get(lowercase__,					headers=lowercase__ )
     with open(lowercase__,					'wb' ) as file:
          file.write(image.content )

def 				__UpperCamelCase							(	):






     '''simple docstring'''





     __lowercase					=BeautifulSoup(requests.get(lowercase__,					headers=lowercase__ ).text,					'html.parser' )
     __lowercase					=soup.find('meta',					attrs={'property': 'og:title'} ).attrs['content']
     __lowercase					=soup.find('meta',					attrs={'property': 'og:image'} ).attrs['content']
     __lowercase					=soup.find('p',					id='description' ).get_text()
     __lowercase		,     __lowercase					=os.path.splitext(os.path.basename(lowercase__ ) )
     __lowercase					=title.strip().replace(' ',					'_' )
     __lowercase					=F'''{image_title}{image_extension}'''
     save_image(lowercase__,					lowercase__ )
     return (title, description, image_title)


if __name__ == "__main__":
       UpperCAmelCase   ,			UpperCAmelCase   ,			UpperCAmelCase				   =  random_anime_character()
       print(F'''{title}\n\n{desc}\n\nImage saved : {image_title}''')


