


import argparse
import json

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

from transformers import ViTImageProcessor, ViTMSNConfig, ViTMSNModel
from transformers.image_utils import IMAGENET_DEFAULT_MEAN, IMAGENET_DEFAULT_STD


torch.set_grad_enabled(False)
def 			_a (      SCREAMING_SNAKE_CASE						,				SCREAMING_SNAKE_CASE=False     ):


		"""simple docstring"""




		lowercase__            =      []
		for i in range(config.num_hidden_layers     ):
				# encoder layers: output projection, 2 feedforward neural networks and 2 layernorms
				rename_keys.append((f'module.blocks.{i}.norm1.weight', f'vit.encoder.layer.{i}.layernorm_before.weight')     )
				rename_keys.append((f'module.blocks.{i}.norm1.bias', f'vit.encoder.layer.{i}.layernorm_before.bias')     )
				rename_keys.append(
				    (f'module.blocks.{i}.attn.proj.weight', f'vit.encoder.layer.{i}.attention.output.dense.weight')     )
				rename_keys.append((f'module.blocks.{i}.attn.proj.bias', f'vit.encoder.layer.{i}.attention.output.dense.bias')     )
				rename_keys.append((f'module.blocks.{i}.norm2.weight', f'vit.encoder.layer.{i}.layernorm_after.weight')     )
				rename_keys.append((f'module.blocks.{i}.norm2.bias', f'vit.encoder.layer.{i}.layernorm_after.bias')     )
				rename_keys.append((f'module.blocks.{i}.mlp.fc1.weight', f'vit.encoder.layer.{i}.intermediate.dense.weight')     )
				rename_keys.append((f'module.blocks.{i}.mlp.fc1.bias', f'vit.encoder.layer.{i}.intermediate.dense.bias')     )
				rename_keys.append((f'module.blocks.{i}.mlp.fc2.weight', f'vit.encoder.layer.{i}.output.dense.weight')     )
				rename_keys.append((f'module.blocks.{i}.mlp.fc2.bias', f'vit.encoder.layer.{i}.output.dense.bias')     )

		# projection layer + position embeddings
		rename_keys.extend(
		    [
		        ('''module.cls_token''', '''vit.embeddings.cls_token'''),
		        ('''module.patch_embed.proj.weight''', '''vit.embeddings.patch_embeddings.projection.weight'''),
		        ('''module.patch_embed.proj.bias''', '''vit.embeddings.patch_embeddings.projection.bias'''),
		        ('''module.pos_embed''', '''vit.embeddings.position_embeddings'''),
		    ]     )

		if base_model:
				# layernorm + pooler
				rename_keys.extend(
				    [
				        ('''module.norm.weight''', '''layernorm.weight'''),
				        ('''module.norm.bias''', '''layernorm.bias'''),
				    ]     )

				# if just the base model, we should remove "vit" from all keys that start with "vit"
				lowercase__            =      [(pair[0], pair[1][4:]) if pair[1].startswith('''vit'''     ) else pair for pair in rename_keys]
		else:
				# layernorm + classification head
				rename_keys.extend(
				    [
				        ('''norm.weight''', '''vit.layernorm.weight'''),
				        ('''norm.bias''', '''vit.layernorm.bias'''),
				        ('''head.weight''', '''classifier.weight'''),
				        ('''head.bias''', '''classifier.bias'''),
				    ]     )

		return rename_keys
def 			_a (      SCREAMING_SNAKE_CASE						,				SCREAMING_SNAKE_CASE						,				SCREAMING_SNAKE_CASE=False     ):


		"""simple docstring"""




		for i in range(config.num_hidden_layers     ):
				if base_model:
						lowercase__            =      ''''''
				else:
						lowercase__            =      '''vit.'''
				# read in weights + bias of input projection layer (in timm, this is a single matrix + bias)
				lowercase__            =      state_dict.pop(f'module.blocks.{i}.attn.qkv.weight'     )
				lowercase__            =      state_dict.pop(f'module.blocks.{i}.attn.qkv.bias'     )
				# next, add query, keys and values (in that order) to the state dict
				lowercase__            =      in_proj_weight[
				    : config.hidden_size, :
				]
				lowercase__            =      in_proj_bias[: config.hidden_size]
				lowercase__            =      in_proj_weight[
				    config.hidden_size : config.hidden_size * 2, :
				]
				lowercase__            =      in_proj_bias[
				    config.hidden_size : config.hidden_size * 2
				]
				lowercase__            =      in_proj_weight[
				    -config.hidden_size :, :
				]
				lowercase__            =      in_proj_bias[-config.hidden_size :]
def 			_a (      SCREAMING_SNAKE_CASE     ):


		"""simple docstring"""




		lowercase__            =      ['''head.weight''', '''head.bias''']
		for k in ignore_keys:
				state_dict.pop(__UpperCAmelCase						,				__UpperCAmelCase     )
def 			_a (      SCREAMING_SNAKE_CASE     ):


		"""simple docstring"""




		lowercase__            =      [
		    '''module.fc.fc1.weight''',
		    '''module.fc.fc1.bias''',
		    '''module.fc.bn1.weight''',
		    '''module.fc.bn1.bias''',
		    '''module.fc.bn1.running_mean''',
		    '''module.fc.bn1.running_var''',
		    '''module.fc.bn1.num_batches_tracked''',
		    '''module.fc.fc2.weight''',
		    '''module.fc.fc2.bias''',
		    '''module.fc.bn2.weight''',
		    '''module.fc.bn2.bias''',
		    '''module.fc.bn2.running_mean''',
		    '''module.fc.bn2.running_var''',
		    '''module.fc.bn2.num_batches_tracked''',
		    '''module.fc.fc3.weight''',
		    '''module.fc.fc3.bias''',
		]
		for k in ignore_keys:
				state_dict.pop(__UpperCAmelCase						,				__UpperCAmelCase     )
def 			_a (      SCREAMING_SNAKE_CASE						,				SCREAMING_SNAKE_CASE						,				SCREAMING_SNAKE_CASE     ):


		"""simple docstring"""




		lowercase__            =      dct.pop(__UpperCAmelCase     )
		lowercase__            =      val
def 			_a (      SCREAMING_SNAKE_CASE						,				SCREAMING_SNAKE_CASE     ):


		"""simple docstring"""




		lowercase__            =      ViTMSNConfig()
		lowercase__            =      10_00

		lowercase__            =      '''datasets/huggingface/label-files'''
		lowercase__            =      '''imagenet-1k-id2label.json'''
		lowercase__            =      json.load(open(hf_hub_download(__UpperCAmelCase						,				__UpperCAmelCase     )						,				'''r'''     )     )
		lowercase__            =      {int(__UpperCAmelCase     ): v for k, v in idalabel.items()}
		lowercase__            =      idalabel
		lowercase__            =      {v: k for k, v in idalabel.items()}

		if "s16" in checkpoint_url:
				lowercase__            =      3_84
				lowercase__            =      15_36
				lowercase__            =      6
		elif "l16" in checkpoint_url:
				lowercase__            =      10_24
				lowercase__            =      40_96
				lowercase__            =      24
				lowercase__            =      16
				lowercase__            =      0.1
		elif "b4" in checkpoint_url:
				lowercase__            =      4
		elif "l7" in checkpoint_url:
				lowercase__            =      7
				lowercase__            =      10_24
				lowercase__            =      40_96
				lowercase__            =      24
				lowercase__            =      16
				lowercase__            =      0.1

		lowercase__            =      ViTMSNModel(__UpperCAmelCase     )

		lowercase__            =      torch.hub.load_state_dict_from_url(__UpperCAmelCase						,				map_location='''cpu'''     )['''target_encoder''']

		lowercase__            =      ViTImageProcessor(size=config.image_size     )

		remove_projection_head(__UpperCAmelCase     )
		lowercase__            =      create_rename_keys(__UpperCAmelCase						,				base_model=__UpperCAmelCase     )

		for src, dest in rename_keys:
				rename_key(__UpperCAmelCase						,				__UpperCAmelCase						,				__UpperCAmelCase     )
		read_in_q_k_v(__UpperCAmelCase						,				__UpperCAmelCase						,				base_model=__UpperCAmelCase     )

		model.load_state_dict(__UpperCAmelCase     )
		model.eval()

		lowercase__            =      '''http://images.cocodataset.org/val2017/000000039769.jpg'''

		lowercase__            =      Image.open(requests.get(__UpperCAmelCase						,				stream=__UpperCAmelCase     ).raw     )
		lowercase__            =      ViTImageProcessor(
		    size=config.image_size						,				image_mean=__UpperCAmelCase						,				image_std=__UpperCAmelCase     )
		lowercase__            =      image_processor(images=__UpperCAmelCase						,				return_tensors='''pt'''     )

		# forward pass
		torch.manual_seed(2     )
		lowercase__            =      model(**__UpperCAmelCase     )
		lowercase__            =      outputs.last_hidden_state

		# The following Colab Notebook was used to generate these outputs:
		# https://colab.research.google.com/gist/sayakpaul/3672419a04f5997827503fd84079bdd1/scratchpad.ipynb
		if "s16" in checkpoint_url:
				lowercase__            =      torch.tensor([[-1.0_915, -1.4_876, -1.1_809]]     )
		elif "b16" in checkpoint_url:
				lowercase__            =      torch.tensor([[14.28_89, -18.90_45, 11.72_81]]     )
		elif "l16" in checkpoint_url:
				lowercase__            =      torch.tensor([[41.50_28, -22.86_81, 45.64_75]]     )
		elif "b4" in checkpoint_url:
				lowercase__            =      torch.tensor([[-4.3_868, 5.2_932, -0.4_137]]     )
		else:
				lowercase__            =      torch.tensor([[-0.1_792, -0.6_465, 2.4_263]]     )

		# verify logits
		assert torch.allclose(last_hidden_state[:, 0, :3]						,				__UpperCAmelCase						,				atol=1E-4     )

		print(f'Saving model to {pytorch_dump_folder_path}'     )
		model.save_pretrained(__UpperCAmelCase     )

		print(f'Saving image processor to {pytorch_dump_folder_path}'     )
		image_processor.save_pretrained(__UpperCAmelCase     )


if __name__ == "__main__":
			lowerCAmelCase       =							argparse.ArgumentParser()
			# Required parameters
			parser.add_argument(
			    '--checkpoint_url',
			    default='https://dl.fbaipublicfiles.com/msn/vits16_800ep.pth.tar',
			    type=str,
			    help='URL of the checkpoint you\'d like to convert.',
			)
			parser.add_argument(
			    '--pytorch_dump_folder_path', default=None, type=str, help='Path to the output PyTorch model directory.'
			)

			lowerCAmelCase       =							parser.parse_args()
			convert_vit_msn_checkpoint(args.checkpoint_url, args.pytorch_dump_folder_path)








import json
import sys
import tempfile
import unittest
from pathlib import Path

import transformers
from transformers import (
    CONFIG_MAPPING,
    IMAGE_PROCESSOR_MAPPING,
    AutoConfig,
    AutoImageProcessor,
    CLIPConfig,
    CLIPImageProcessor,
)
from transformers.testing_utils import DUMMY_UNKNOWN_IDENTIFIER


sys.path.append(str(Path(__file__).parent.parent.parent.parent / 'utils'))

from test_module.custom_configuration import CustomConfig  # noqa E402
from test_module.custom_image_processing import CustomImageProcessor  # noqa E402





class        lowerCamelCase_							(      unittest.TestCase					):


 '''simple docstring'''







 def       lowerCAmelCase_  (							self  :		Any						):
       SCREAMING_SNAKE_CASE_							=			0



 def       lowerCAmelCase_  (							self  :		int						):
       SCREAMING_SNAKE_CASE_							=			AutoImageProcessor.from_pretrained('openai/clip-vit-base-patch32'						)
       self.assertIsInstance(_lowerCAmelCase				,				_lowerCAmelCase						)



 def       lowerCAmelCase_  (							self  :		Optional[int]						):
       with tempfile.TemporaryDirectory() as tmpdirname:
             SCREAMING_SNAKE_CASE_							=			Path(_lowerCAmelCase						) / 'preprocessor_config.json'
             SCREAMING_SNAKE_CASE_							=			Path(_lowerCAmelCase						) / 'config.json'
             json.dump(
                 {'image_processor_type': 'CLIPImageProcessor', 'processor_class': 'CLIPProcessor'}				,				open(_lowerCAmelCase				,				'w'						)				,				)
             json.dump({'model_type': 'clip'}				,				open(_lowerCAmelCase				,				'w'						)						)

             SCREAMING_SNAKE_CASE_							=			AutoImageProcessor.from_pretrained(_lowerCAmelCase						)
             self.assertIsInstance(_lowerCAmelCase				,				_lowerCAmelCase						)



 def       lowerCAmelCase_  (							self  :		str						):
       # Ensure we can load the image processor from the feature extractor config
       with tempfile.TemporaryDirectory() as tmpdirname:
             SCREAMING_SNAKE_CASE_							=			Path(_lowerCAmelCase						) / 'preprocessor_config.json'
             SCREAMING_SNAKE_CASE_							=			Path(_lowerCAmelCase						) / 'config.json'
             json.dump(
                 {'feature_extractor_type': 'CLIPFeatureExtractor', 'processor_class': 'CLIPProcessor'}				,				open(_lowerCAmelCase				,				'w'						)				,				)
             json.dump({'model_type': 'clip'}				,				open(_lowerCAmelCase				,				'w'						)						)

             SCREAMING_SNAKE_CASE_							=			AutoImageProcessor.from_pretrained(_lowerCAmelCase						)
             self.assertIsInstance(_lowerCAmelCase				,				_lowerCAmelCase						)



 def       lowerCAmelCase_  (							self  :		Union[str, Any]						):
       with tempfile.TemporaryDirectory() as tmpdirname:
             SCREAMING_SNAKE_CASE_							=			CLIPConfig()

             # Create a dummy config file with image_proceesor_type
             SCREAMING_SNAKE_CASE_							=			Path(_lowerCAmelCase						) / 'preprocessor_config.json'
             SCREAMING_SNAKE_CASE_							=			Path(_lowerCAmelCase						) / 'config.json'
             json.dump(
                 {'image_processor_type': 'CLIPImageProcessor', 'processor_class': 'CLIPProcessor'}				,				open(_lowerCAmelCase				,				'w'						)				,				)
             json.dump({'model_type': 'clip'}				,				open(_lowerCAmelCase				,				'w'						)						)

             # remove image_processor_type to make sure config.json alone is enough to load image processor locally
             SCREAMING_SNAKE_CASE_							=			AutoImageProcessor.from_pretrained(_lowerCAmelCase						).to_dict()

             config_dict.pop('image_processor_type'						)
             SCREAMING_SNAKE_CASE_							=			CLIPImageProcessor(**_lowerCAmelCase						)

             # save in new folder
             model_config.save_pretrained(_lowerCAmelCase						)
             config.save_pretrained(_lowerCAmelCase						)

             SCREAMING_SNAKE_CASE_							=			AutoImageProcessor.from_pretrained(_lowerCAmelCase						)

             # make sure private variable is not incorrectly saved
             SCREAMING_SNAKE_CASE_							=			json.loads(config.to_json_string()						)
             self.assertTrue('_processor_class' not in dict_as_saved						)

       self.assertIsInstance(_lowerCAmelCase				,				_lowerCAmelCase						)



 def       lowerCAmelCase_  (							self  :		str						):
       with tempfile.TemporaryDirectory() as tmpdirname:
             SCREAMING_SNAKE_CASE_							=			Path(_lowerCAmelCase						) / 'preprocessor_config.json'
             json.dump(
                 {'image_processor_type': 'CLIPImageProcessor', 'processor_class': 'CLIPProcessor'}				,				open(_lowerCAmelCase				,				'w'						)				,				)

             SCREAMING_SNAKE_CASE_							=			AutoImageProcessor.from_pretrained(_lowerCAmelCase						)
             self.assertIsInstance(_lowerCAmelCase				,				_lowerCAmelCase						)



 def       lowerCAmelCase_  (							self  :		List[Any]						):
       with self.assertRaisesRegex(
           _lowerCAmelCase				,				'clip-base is not a local folder and is not a valid model identifier'						):
             SCREAMING_SNAKE_CASE_							=			AutoImageProcessor.from_pretrained('clip-base'						)



 def       lowerCAmelCase_  (							self  :		List[Any]						):
       with self.assertRaisesRegex(
           _lowerCAmelCase				,				R'aaaaaa is not a valid git identifier \(branch name, tag name or commit id\)'						):
             SCREAMING_SNAKE_CASE_							=			AutoImageProcessor.from_pretrained(_lowerCAmelCase				,				revision='aaaaaa'						)



 def       lowerCAmelCase_  (							self  :		str						):
       with self.assertRaisesRegex(
           _lowerCAmelCase				,				'hf-internal-testing/config-no-model does not appear to have a file named preprocessor_config.json.'				,				):
             SCREAMING_SNAKE_CASE_							=			AutoImageProcessor.from_pretrained('hf-internal-testing/config-no-model'						)



 def       lowerCAmelCase_  (							self  :		Tuple						):
       # If remote code is not set, we will time out when asking whether to load the model.
       with self.assertRaises(_lowerCAmelCase						):
             SCREAMING_SNAKE_CASE_							=			AutoImageProcessor.from_pretrained('hf-internal-testing/test_dynamic_image_processor'						)
       # If remote code is disabled, we can't load this config.
       with self.assertRaises(_lowerCAmelCase						):
             SCREAMING_SNAKE_CASE_							=			AutoImageProcessor.from_pretrained(
                 'hf-internal-testing/test_dynamic_image_processor'				,				trust_remote_code=_lowerCAmelCase						)

       SCREAMING_SNAKE_CASE_							=			AutoImageProcessor.from_pretrained(
           'hf-internal-testing/test_dynamic_image_processor'				,				trust_remote_code=_lowerCAmelCase						)
       self.assertEqual(image_processor.__class__.__name__				,				'NewImageProcessor'						)

       # Test image processor can be reloaded.
       with tempfile.TemporaryDirectory() as tmp_dir:
             image_processor.save_pretrained(_lowerCAmelCase						)
             SCREAMING_SNAKE_CASE_							=			AutoImageProcessor.from_pretrained(_lowerCAmelCase				,				trust_remote_code=_lowerCAmelCase						)
       self.assertEqual(reloaded_image_processor.__class__.__name__				,				'NewImageProcessor'						)



 def       lowerCAmelCase_  (							self  :		Optional[Any]						):
       try:
             AutoConfig.register('custom'				,				_lowerCAmelCase						)
             AutoImageProcessor.register(_lowerCAmelCase				,				_lowerCAmelCase						)
             # Trying to register something existing in the Transformers library will raise an error
             with self.assertRaises(_lowerCAmelCase						):
                   AutoImageProcessor.register(_lowerCAmelCase				,				_lowerCAmelCase						)

             with tempfile.TemporaryDirectory() as tmpdirname:
                   SCREAMING_SNAKE_CASE_							=			Path(_lowerCAmelCase						) / 'preprocessor_config.json'
                   SCREAMING_SNAKE_CASE_							=			Path(_lowerCAmelCase						) / 'config.json'
                   json.dump(
                       {'feature_extractor_type': 'CLIPFeatureExtractor', 'processor_class': 'CLIPProcessor'}				,				open(_lowerCAmelCase				,				'w'						)				,				)
                   json.dump({'model_type': 'clip'}				,				open(_lowerCAmelCase				,				'w'						)						)

                   SCREAMING_SNAKE_CASE_							=			CustomImageProcessor.from_pretrained(_lowerCAmelCase						)

             # Now that the config is registered, it can be used as any other config with the auto-API
             with tempfile.TemporaryDirectory() as tmp_dir:
                   image_processor.save_pretrained(_lowerCAmelCase						)
                   SCREAMING_SNAKE_CASE_							=			AutoImageProcessor.from_pretrained(_lowerCAmelCase						)
                   self.assertIsInstance(_lowerCAmelCase				,				_lowerCAmelCase						)

       finally:
             if "custom" in CONFIG_MAPPING._extra_content:
                   del CONFIG_MAPPING._extra_content["custom"]
             if CustomConfig in IMAGE_PROCESSOR_MAPPING._extra_content:
                   del IMAGE_PROCESSOR_MAPPING._extra_content[CustomConfig]




 def       lowerCAmelCase_  (							self  :		Union[str, Any]						):





       class        lowerCamelCase_							(      _SCREAMING_SNAKE_CASE					):


        '''simple docstring'''







        lowercase_				    =    True

       try:
             AutoConfig.register('custom'				,				_lowerCAmelCase						)
             AutoImageProcessor.register(_lowerCAmelCase				,				_lowerCAmelCase						)
             # If remote code is not set, the default is to use local
             SCREAMING_SNAKE_CASE_							=			AutoImageProcessor.from_pretrained('hf-internal-testing/test_dynamic_image_processor'						)
             self.assertEqual(image_processor.__class__.__name__				,				'NewImageProcessor'						)
             self.assertTrue(image_processor.is_local						)

             # If remote code is disabled, we load the local one.
             SCREAMING_SNAKE_CASE_							=			AutoImageProcessor.from_pretrained(
                 'hf-internal-testing/test_dynamic_image_processor'				,				trust_remote_code=_lowerCAmelCase						)
             self.assertEqual(image_processor.__class__.__name__				,				'NewImageProcessor'						)
             self.assertTrue(image_processor.is_local						)

             # If remote is enabled, we load from the Hub
             SCREAMING_SNAKE_CASE_							=			AutoImageProcessor.from_pretrained(
                 'hf-internal-testing/test_dynamic_image_processor'				,				trust_remote_code=_lowerCAmelCase						)
             self.assertEqual(image_processor.__class__.__name__				,				'NewImageProcessor'						)
             self.assertTrue(not hasattr(_lowerCAmelCase				,				'is_local'						)						)

       finally:
             if "custom" in CONFIG_MAPPING._extra_content:
                   del CONFIG_MAPPING._extra_content["custom"]
             if CustomConfig in IMAGE_PROCESSOR_MAPPING._extra_content:
                   del IMAGE_PROCESSOR_MAPPING._extra_content[CustomConfig]