



"""simple docstring"""

import argparse
import re

import numpy as np
import requests
import torch
from huggingface_hub import hf_hub_download
from PIL import Image

from transformers import (
    SamConfig,
    SamImageProcessor,
    SamModel,
    SamProcessor,
    SamVisionConfig,
)


lowercase__			   =  {
    "iou_prediction_head.layers.0": "iou_prediction_head.proj_in",
    "iou_prediction_head.layers.1": "iou_prediction_head.layers.0",
    "iou_prediction_head.layers.2": "iou_prediction_head.proj_out",
    "mask_decoder.output_upscaling.0": "mask_decoder.upscale_conv1",
    "mask_decoder.output_upscaling.1": "mask_decoder.upscale_layer_norm",
    "mask_decoder.output_upscaling.3": "mask_decoder.upscale_conv2",
    "mask_downscaling.0": "mask_embed.conv1",
    "mask_downscaling.1": "mask_embed.layer_norm1",
    "mask_downscaling.3": "mask_embed.conv2",
    "mask_downscaling.4": "mask_embed.layer_norm2",
    "mask_downscaling.6": "mask_embed.conv3",
    "point_embeddings": "point_embed",
    "pe_layer.positional_encoding_gaussian_matrix": "shared_embedding.positional_embedding",
    "image_encoder": "vision_encoder",
    "neck.0": "neck.conv1",
    "neck.1": "neck.layer_norm1",
    "neck.2": "neck.conv2",
    "neck.3": "neck.layer_norm2",
    "patch_embed.proj": "patch_embed.projection",
    ".norm": ".layer_norm",
    "blocks": "layers",
}





def       __magic_name__    (   _lowerCamelCase				: Any					):
							__a		:		List[str]									=       {}
							state_dict.pop("""pixel_mean"""  ,       _lowerCamelCase					)
							state_dict.pop("""pixel_std"""  ,       _lowerCamelCase					)

							__a		:		Any									=       r""".*.output_hypernetworks_mlps.(\d+).layers.(\d+).*"""

							for key, value in state_dict.items():
														for key_to_modify, new_key in KEYS_TO_MODIFY_MAPPING.items():
																					if key_to_modify in key:
																												__a		:		str									=       key.replace(_lowerCamelCase  ,       _lowerCamelCase					)

														if re.match(_lowerCamelCase  ,       _lowerCamelCase					):
																					__a		:		List[Any]									=       int(re.match(_lowerCamelCase  ,       _lowerCamelCase					).group(2					)					)
																					if layer_nb == 0:
																												__a		:		int									=       key.replace("""layers.0"""  ,       """proj_in"""					)
																					elif layer_nb == 1:
																												__a		:		Union[str, Any]									=       key.replace("""layers.1"""  ,       """layers.0"""					)
																					elif layer_nb == 2:
																												__a		:		Optional[int]									=       key.replace("""layers.2"""  ,       """proj_out"""					)

														__a		:		Dict									=       value

							__a		:		Optional[int]									=       model_state_dict[
							    """prompt_encoder.shared_embedding.positional_embedding"""
							]

							return model_state_dict





def       __magic_name__    (   _lowerCamelCase				: str  ,       _lowerCamelCase				: Dict  ,       _lowerCamelCase				: Dict  ,       _lowerCamelCase				: int="ybelkada/segment-anything"					):
							__a		:		int									=       hf_hub_download(_lowerCamelCase  ,       F'''checkpoints/{model_name}.pth'''					)

							if "sam_vit_b" in model_name:
														__a		:		Optional[int]									=       SamConfig()
							elif "sam_vit_l" in model_name:
														__a		:		Union[str, Any]									=       SamVisionConfig(
														    hidden_size=1_0_2_4  ,       num_hidden_layers=2_4  ,       num_attention_heads=1_6  ,       global_attn_indexes=[5, 1_1, 1_7, 2_3]  ,       )

														__a		:		Optional[Any]									=       SamConfig(
														    vision_config=_lowerCamelCase  ,       )
							elif "sam_vit_h" in model_name:
														__a		:		Optional[int]									=       SamVisionConfig(
														    hidden_size=1_2_8_0  ,       num_hidden_layers=3_2  ,       num_attention_heads=1_6  ,       global_attn_indexes=[7, 1_5, 2_3, 3_1]  ,       )

														__a		:		Optional[int]									=       SamConfig(
														    vision_config=_lowerCamelCase  ,       )

							__a		:		str									=       torch.load(_lowerCamelCase  ,       map_location="""cpu"""					)
							__a		:		Dict									=       replace_keys(_lowerCamelCase					)

							__a		:		Any									=       SamImageProcessor()

							__a		:		Union[str, Any]									=       SamProcessor(image_processor=_lowerCamelCase					)
							__a		:		int									=       SamModel(_lowerCamelCase					)

							hf_model.load_state_dict(_lowerCamelCase					)
							__a		:		List[Any]									=       hf_model.to("""cuda"""					)

							__a		:		Tuple									=       """https://huggingface.co/ybelkada/segment-anything/resolve/main/assets/car.png"""
							__a		:		str									=       Image.open(requests.get(_lowerCamelCase  ,       stream=_lowerCamelCase					).raw					).convert("""RGB"""					)

							__a		:		str									=       [[[4_0_0, 6_5_0]]]
							__a		:		Any									=       [[1]]

							__a		:		Optional[int]									=       processor(images=np.array(_lowerCamelCase					)  ,       return_tensors="""pt"""					).to("""cuda"""					)

							with torch.no_grad():
														__a		:		Optional[Any]									=       hf_model(**_lowerCamelCase					)
							__a		:		Any									=       output.iou_scores.squeeze()

							if model_name == "sam_vit_h_4b8939":
														assert scores[-1].item() == 0.5_79_89_02_51_15_96_68

														__a		:		Tuple									=       processor(
														    images=np.array(_lowerCamelCase					)  ,       input_points=_lowerCamelCase  ,       input_labels=_lowerCamelCase  ,       return_tensors="""pt"""					).to("""cuda"""					)

														with torch.no_grad():
																					__a		:		int									=       hf_model(**_lowerCamelCase					)
														__a		:		Any									=       output.iou_scores.squeeze()

														assert scores[-1].item() == 0.97_12_60_30_92_19_36_04

														__a		:		Union[str, Any]									=       ((7_5, 2_7_5, 1_7_2_5, 8_5_0),)

														__a		:		Optional[int]									=       processor(images=np.array(_lowerCamelCase					)  ,       input_boxes=_lowerCamelCase  ,       return_tensors="""pt"""					).to("""cuda"""					)

														with torch.no_grad():
																					__a		:		Optional[int]									=       hf_model(**_lowerCamelCase					)
														__a		:		Optional[int]									=       output.iou_scores.squeeze()

														assert scores[-1].item() == 0.86_86_01_56_05_92_65_14

														# Test with 2 points and 1 image.
														__a		:		int									=       [[[4_0_0, 6_5_0], [8_0_0, 6_5_0]]]
														__a		:		str									=       [[1, 1]]

														__a		:		Dict									=       processor(
														    images=np.array(_lowerCamelCase					)  ,       input_points=_lowerCamelCase  ,       input_labels=_lowerCamelCase  ,       return_tensors="""pt"""					).to("""cuda"""					)

														with torch.no_grad():
																					__a		:		Optional[int]									=       hf_model(**_lowerCamelCase					)
														__a		:		int									=       output.iou_scores.squeeze()

														assert scores[-1].item() == 0.99_36_04_77_92_43_46_92


if __name__ == "__main__":
	lowercase__			   =  argparse.ArgumentParser()
	lowercase__			   =  ["sam_vit_b_01ec64", "sam_vit_h_4b8939", "sam_vit_l_0b3195"]
	parser.add_argument(
	    "--model_name",
	    default="sam_vit_h_4b8939",
	    choices=choices,
	    type=str,
	    help="Path to hf config.json of model to convert",
	)
	parser.add_argument("--pytorch_dump_folder_path", default=None, type=str, help="Path to the output PyTorch model.")
	parser.add_argument(
	    "--push_to_hub",
	    action="store_true",
	    help="Whether to push the model and processor to the hub after converting",
	)
	parser.add_argument(
	    "--model_hub_id",
	    default="ybelkada/segment-anything",
	    choices=choices,
	    type=str,
	    help="Path to hf config.json of model to convert",
	)

	lowercase__			   =  parser.parse_args()

	convert_sam_checkpoint(args.model_name, args.pytorch_dump_folder_path, args.push_to_hub, args.model_hub_id)











"""simple docstring"""

import unittest

from transformers import (
    MODEL_FOR_SEQUENCE_CLASSIFICATION_MAPPING,
    TF_MODEL_FOR_SEQUENCE_CLASSIFICATION_MAPPING,
    TextClassificationPipeline,
    pipeline,
)
from transformers.testing_utils import is_pipeline_test, nested_simplify, require_tf, require_torch, slow

from .test_pipelines_common import ANY


# These 2 model types require different inputs than those of the usual text models.
lowercase__			   =  {"LayoutLMv2Config", "LayoutLMv3Config"}




@is_pipeline_test
class SCREAMING_SNAKE_CASE__					(		unittest.TestCase      ):
						_lowerCAmelCase							=					MODEL_FOR_SEQUENCE_CLASSIFICATION_MAPPING
						_lowerCAmelCase							=					TF_MODEL_FOR_SEQUENCE_CLASSIFICATION_MAPPING

						if model_mapping is not None:
												_lowerCAmelCase							=					{config: model for config, model in model_mapping.items() if config.__name__ not in _TO_SKIP}
						if tf_model_mapping is not None:
												_lowerCAmelCase							=					{
												    config: model for config, model in tf_model_mapping.items() if config.__name__ not in _TO_SKIP
												}



						@require_torch
						def     lowerCAmelCase__(self							):





													'''simple docstring'''

													__a		:		int									=       pipeline(
													    task="""text-classification"""						,     model="""hf-internal-testing/tiny-random-distilbert"""						,     framework="""pt"""							)

													__a		:		Tuple									=       text_classifier("""This is great !"""							)
													self.assertEqual(nested_simplify(_lowercase							)						,     [{"""label""": """LABEL_0""", """score""": 0.504}]							)

													__a		:		Optional[Any]									=       text_classifier("""This is great !"""						,     top_k=2							)
													self.assertEqual(
													    nested_simplify(_lowercase							)						,     [{"""label""": """LABEL_0""", """score""": 0.504}, {"""label""": """LABEL_1""", """score""": 0.496}]							)

													__a		:		int									=       text_classifier(["""This is great !""", """This is bad"""]						,     top_k=2							)
													self.assertEqual(
													    nested_simplify(_lowercase							)						,     [
													        [{"""label""": """LABEL_0""", """score""": 0.504}, {"""label""": """LABEL_1""", """score""": 0.496}],
													        [{"""label""": """LABEL_0""", """score""": 0.504}, {"""label""": """LABEL_1""", """score""": 0.496}],
													    ]						,     )

													__a		:		List[str]									=       text_classifier("""This is great !"""						,     top_k=1							)
													self.assertEqual(nested_simplify(_lowercase							)						,     [{"""label""": """LABEL_0""", """score""": 0.504}]							)

													# Legacy behavior
													__a		:		Optional[int]									=       text_classifier("""This is great !"""						,     return_all_scores=_lowercase							)
													self.assertEqual(nested_simplify(_lowercase							)						,     [{"""label""": """LABEL_0""", """score""": 0.504}]							)

													__a		:		Tuple									=       text_classifier("""This is great !"""						,     return_all_scores=_lowercase							)
													self.assertEqual(
													    nested_simplify(_lowercase							)						,     [[{"""label""": """LABEL_0""", """score""": 0.504}, {"""label""": """LABEL_1""", """score""": 0.496}]]							)

													__a		:		Any									=       text_classifier(["""This is great !""", """Something else"""]						,     return_all_scores=_lowercase							)
													self.assertEqual(
													    nested_simplify(_lowercase							)						,     [
													        [{"""label""": """LABEL_0""", """score""": 0.504}, {"""label""": """LABEL_1""", """score""": 0.496}],
													        [{"""label""": """LABEL_0""", """score""": 0.504}, {"""label""": """LABEL_1""", """score""": 0.496}],
													    ]						,     )

													__a		:		Union[str, Any]									=       text_classifier(["""This is great !""", """Something else"""]						,     return_all_scores=_lowercase							)
													self.assertEqual(
													    nested_simplify(_lowercase							)						,     [
													        {"""label""": """LABEL_0""", """score""": 0.504},
													        {"""label""": """LABEL_0""", """score""": 0.504},
													    ]						,     )



						@require_torch
						def     lowerCAmelCase__(self							):





													'''simple docstring'''

													import torch

													__a		:		Any									=       pipeline(
													    task="""text-classification"""						,     model="""hf-internal-testing/tiny-random-distilbert"""						,     framework="""pt"""						,     device=torch.device("""cpu"""							)						,     )

													__a		:		Optional[int]									=       text_classifier("""This is great !"""							)
													self.assertEqual(nested_simplify(_lowercase							)						,     [{"""label""": """LABEL_0""", """score""": 0.504}]							)



						@require_tf
						def     lowerCAmelCase__(self							):





													'''simple docstring'''

													__a		:		List[Any]									=       pipeline(
													    task="""text-classification"""						,     model="""hf-internal-testing/tiny-random-distilbert"""						,     framework="""tf"""							)

													__a		:		List[str]									=       text_classifier("""This is great !"""							)
													self.assertEqual(nested_simplify(_lowercase							)						,     [{"""label""": """LABEL_0""", """score""": 0.504}]							)



						@slow
						@require_torch
						def     lowerCAmelCase__(self							):





													'''simple docstring'''

													__a		:		Tuple									=       pipeline("""text-classification"""							)

													__a		:		Tuple									=       text_classifier("""This is great !"""							)
													self.assertEqual(nested_simplify(_lowercase							)						,     [{"""label""": """POSITIVE""", """score""": 1.0}]							)
													__a		:		Optional[int]									=       text_classifier("""This is bad !"""							)
													self.assertEqual(nested_simplify(_lowercase							)						,     [{"""label""": """NEGATIVE""", """score""": 1.0}]							)
													__a		:		Union[str, Any]									=       text_classifier("""Birds are a type of animal"""							)
													self.assertEqual(nested_simplify(_lowercase							)						,     [{"""label""": """POSITIVE""", """score""": 0.988}]							)



						@slow
						@require_tf
						def     lowerCAmelCase__(self							):





													'''simple docstring'''

													__a		:		List[str]									=       pipeline("""text-classification"""						,     framework="""tf"""							)

													__a		:		str									=       text_classifier("""This is great !"""							)
													self.assertEqual(nested_simplify(_lowercase							)						,     [{"""label""": """POSITIVE""", """score""": 1.0}]							)
													__a		:		Tuple									=       text_classifier("""This is bad !"""							)
													self.assertEqual(nested_simplify(_lowercase							)						,     [{"""label""": """NEGATIVE""", """score""": 1.0}]							)
													__a		:		str									=       text_classifier("""Birds are a type of animal"""							)
													self.assertEqual(nested_simplify(_lowercase							)						,     [{"""label""": """POSITIVE""", """score""": 0.988}]							)



						def     lowerCAmelCase__(self						,     _lowercase						,     _lowercase						,     _lowercase							):





													'''simple docstring'''

													__a		:		Dict									=       TextClassificationPipeline(model=_lowercase						,     tokenizer=_lowercase							)
													return text_classifier, ["HuggingFace is in", "This is another test"]





						def     lowerCAmelCase__(self						,     _lowercase						,     _lowercase							):





													'''simple docstring'''

													__a		:		List[str]									=       text_classifier.model
													# Small inputs because BartTokenizer tiny has maximum position embeddings = 22
													__a		:		Union[str, Any]									=       """HuggingFace is in"""
													__a		:		List[str]									=       text_classifier(_lowercase							)

													self.assertEqual(nested_simplify(_lowercase							)						,     [{"""label""": ANY(_lowercase							), """score""": ANY(_lowercase							)}]							)
													self.assertTrue(outputs[0]["""label"""] in model.config.idalabel.values()							)

													__a		:		Optional[int]									=       ["""HuggingFace is in """, """Paris is in France"""]
													__a		:		Dict									=       text_classifier(_lowercase							)
													self.assertEqual(
													    nested_simplify(_lowercase							)						,     [{"""label""": ANY(_lowercase							), """score""": ANY(_lowercase							)}, {"""label""": ANY(_lowercase							), """score""": ANY(_lowercase							)}]						,     )
													self.assertTrue(outputs[0]["""label"""] in model.config.idalabel.values()							)
													self.assertTrue(outputs[1]["""label"""] in model.config.idalabel.values()							)

													# Forcing to get all results with `top_k=None`
													# This is NOT the legacy format
													__a		:		Dict									=       text_classifier(_lowercase						,     top_k=_lowercase							)
													__a		:		Dict									=       len(model.config.idalabel.values()							)
													self.assertEqual(
													    nested_simplify(_lowercase							)						,     [[{"""label""": ANY(_lowercase							), """score""": ANY(_lowercase							)}] * N, [{"""label""": ANY(_lowercase							), """score""": ANY(_lowercase							)}] * N]						,     )

													__a		:		Dict									=       {"""text""": """HuggingFace is in """, """text_pair""": """Paris is in France"""}
													__a		:		Any									=       text_classifier(_lowercase							)
													self.assertEqual(
													    nested_simplify(_lowercase							)						,     {"""label""": ANY(_lowercase							), """score""": ANY(_lowercase							)}						,     )
													self.assertTrue(outputs["""label"""] in model.config.idalabel.values()							)

													# This might be used a text pair, but tokenizer + pipe interaction
													# makes it hard to understand that it's not using the pair properly
													# https://github.com/huggingface/transformers/issues/17305
													# We disabled this usage instead as it was outputting wrong outputs.
													__a		:		Dict									=       [["""HuggingFace is in """, """Paris is in France"""]]
													with self.assertRaises(_lowercase							):
																				text_classifier(_lowercase							)

													# This used to be valid for doing text pairs
													# We're keeping it working because of backward compatibility
													__a		:		Optional[int]									=       text_classifier([[["""HuggingFace is in """, """Paris is in France"""]]]							)
													self.assertEqual(
													    nested_simplify(_lowercase							)						,     [{"""label""": ANY(_lowercase							), """score""": ANY(_lowercase							)}]						,     )
													self.assertTrue(outputs[0]["""label"""] in model.config.idalabel.values()							)

