


'''simple docstring'''
import unittest

from transformers import MODEL_FOR_ZERO_SHOT_OBJECT_DETECTION_MAPPING, is_vision_available, pipeline
from transformers.testing_utils import (
    is_pipeline_test,
    nested_simplify,
    require_tf,
    require_torch,
    require_vision,
    slow,
)

from .test_pipelines_common import ANY


if is_vision_available():
							from PIL import Image
else:






							class 					__lowerCAmelCase   :

													"""simple docstring"""






													@staticmethod
													def 				_UpperCAmelCase       (  *lowerCAmelCase							:      Any ,  **lowerCAmelCase							:      Dict	):
																				pass






@is_pipeline_test
@require_vision
@require_torch
class 					__lowerCAmelCase   (   unittest.TestCase						):

						"""simple docstring"""






						_UpperCAmelCase		:       Any   						=MODEL_FOR_ZERO_SHOT_OBJECT_DETECTION_MAPPING






						def 				_UpperCAmelCase       (  self							:      List[Any] ,  lowerCAmelCase							:      Any ,  lowerCAmelCase							:      List[str] ,  lowerCAmelCase							:      int	):
													A_			    =		pipeline(
													    "zero-shot-object-detection" ,  model="hf-internal-testing/tiny-random-owlvit-object-detection"	)

													A_			    =		[
													    {
													        "image": "./tests/fixtures/tests_samples/COCO/000000039769.png",
													        "candidate_labels": ["cat", "remote", "couch"],
													    }
													]
													return object_detector, examples






						def 				_UpperCAmelCase       (  self							:      Optional[Any] ,  lowerCAmelCase							:      Dict ,  lowerCAmelCase							:      str	):
													A_			    =		object_detector(examples[0] ,  threshold=0.0	)

													A_			    =		len(lowerCAmelCase	)
													self.assertGreater(lowerCAmelCase ,  0	)
													self.assertEqual(
													    lowerCAmelCase ,  [
													        {
													            "score": ANY(lowerCAmelCase	),
													            "label": ANY(lowerCAmelCase	),
													            "box": {"xmin": ANY(lowerCAmelCase	), "ymin": ANY(lowerCAmelCase	), "xmax": ANY(lowerCAmelCase	), "ymax": ANY(lowerCAmelCase	)},
													        }
													        for i in range(lowerCAmelCase	)
													    ] ,  )






						@require_tf
						@unittest.skip("Zero Shot Object Detection not implemented in TF"	)
						def 				_UpperCAmelCase       (  self							:      int	):
													pass






						@require_torch
						def 				_UpperCAmelCase       (  self							:      Union[str, Any]	):
													A_			    =		pipeline(
													    "zero-shot-object-detection" ,  model="hf-internal-testing/tiny-random-owlvit-object-detection"	)

													A_			    =		object_detector(
													    "./tests/fixtures/tests_samples/COCO/000000039769.png" ,  candidate_labels=["cat", "remote", "couch"] ,  threshold=0.6_4 ,  )

													self.assertEqual(
													    nested_simplify(lowerCAmelCase ,  decimals=4	) ,  [
													        {"score": 0.7_2_3_5, "label": "cat", "box": {"xmin": 2_04, "ymin": 1_67, "xmax": 2_32, "ymax": 1_90}},
													        {"score": 0.7_2_1_8, "label": "remote", "box": {"xmin": 2_04, "ymin": 1_67, "xmax": 2_32, "ymax": 1_90}},
													        {"score": 0.7_1_8_4, "label": "couch", "box": {"xmin": 2_04, "ymin": 1_67, "xmax": 2_32, "ymax": 1_90}},
													        {"score": 0.6_7_4_8, "label": "remote", "box": {"xmin": 5_71, "ymin": 83, "xmax": 5_98, "ymax": 1_03}},
													        {"score": 0.6_6_5_6, "label": "cat", "box": {"xmin": 5_71, "ymin": 83, "xmax": 5_98, "ymax": 1_03}},
													        {"score": 0.6_6_1_4, "label": "couch", "box": {"xmin": 5_71, "ymin": 83, "xmax": 5_98, "ymax": 1_03}},
													        {"score": 0.6_4_5_6, "label": "remote", "box": {"xmin": 4_94, "ymin": 1_05, "xmax": 5_21, "ymax": 1_27}},
													        {"score": 0.6_4_2, "label": "remote", "box": {"xmin": 67, "ymin": 2_74, "xmax": 93, "ymax": 2_97}},
													        {"score": 0.6_4_1_9, "label": "cat", "box": {"xmin": 4_94, "ymin": 1_05, "xmax": 5_21, "ymax": 1_27}},
													    ] ,  )

													A_			    =		object_detector(
													    [
													        {
													            "image": "./tests/fixtures/tests_samples/COCO/000000039769.png",
													            "candidate_labels": ["cat", "remote", "couch"],
													        }
													    ] ,  threshold=0.6_4 ,  )

													self.assertEqual(
													    nested_simplify(lowerCAmelCase ,  decimals=4	) ,  [
													        [
													            {"score": 0.7_2_3_5, "label": "cat", "box": {"xmin": 2_04, "ymin": 1_67, "xmax": 2_32, "ymax": 1_90}},
													            {"score": 0.7_2_1_8, "label": "remote", "box": {"xmin": 2_04, "ymin": 1_67, "xmax": 2_32, "ymax": 1_90}},
													            {"score": 0.7_1_8_4, "label": "couch", "box": {"xmin": 2_04, "ymin": 1_67, "xmax": 2_32, "ymax": 1_90}},
													            {"score": 0.6_7_4_8, "label": "remote", "box": {"xmin": 5_71, "ymin": 83, "xmax": 5_98, "ymax": 1_03}},
													            {"score": 0.6_6_5_6, "label": "cat", "box": {"xmin": 5_71, "ymin": 83, "xmax": 5_98, "ymax": 1_03}},
													            {"score": 0.6_6_1_4, "label": "couch", "box": {"xmin": 5_71, "ymin": 83, "xmax": 5_98, "ymax": 1_03}},
													            {"score": 0.6_4_5_6, "label": "remote", "box": {"xmin": 4_94, "ymin": 1_05, "xmax": 5_21, "ymax": 1_27}},
													            {"score": 0.6_4_2, "label": "remote", "box": {"xmin": 67, "ymin": 2_74, "xmax": 93, "ymax": 2_97}},
													            {"score": 0.6_4_1_9, "label": "cat", "box": {"xmin": 4_94, "ymin": 1_05, "xmax": 5_21, "ymax": 1_27}},
													        ]
													    ] ,  )






						@require_torch
						@slow
						def 				_UpperCAmelCase       (  self							:      Dict	):
													A_			    =		pipeline("zero-shot-object-detection"	)

													A_			    =		object_detector(
													    "http://images.cocodataset.org/val2017/000000039769.jpg" ,  candidate_labels=["cat", "remote", "couch"] ,  )
													self.assertEqual(
													    nested_simplify(lowerCAmelCase ,  decimals=4	) ,  [
													        {"score": 0.2_8_6_8, "label": "cat", "box": {"xmin": 3_24, "ymin": 20, "xmax": 6_40, "ymax": 3_73}},
													        {"score": 0.2_7_7, "label": "remote", "box": {"xmin": 40, "ymin": 72, "xmax": 1_77, "ymax": 1_15}},
													        {"score": 0.2_5_3_7, "label": "cat", "box": {"xmin": 1, "ymin": 55, "xmax": 3_15, "ymax": 4_72}},
													        {"score": 0.1_4_7_4, "label": "remote", "box": {"xmin": 3_35, "ymin": 74, "xmax": 3_71, "ymax": 1_87}},
													        {"score": 0.1_2_0_8, "label": "couch", "box": {"xmin": 4, "ymin": 0, "xmax": 6_42, "ymax": 4_76}},
													    ] ,  )

													A_			    =		object_detector(
													    [
													        {
													            "image": "http://images.cocodataset.org/val2017/000000039769.jpg",
													            "candidate_labels": ["cat", "remote", "couch"],
													        },
													        {
													            "image": "http://images.cocodataset.org/val2017/000000039769.jpg",
													            "candidate_labels": ["cat", "remote", "couch"],
													        },
													    ] ,  )
													self.assertEqual(
													    nested_simplify(lowerCAmelCase ,  decimals=4	) ,  [
													        [
													            {"score": 0.2_8_6_8, "label": "cat", "box": {"xmin": 3_24, "ymin": 20, "xmax": 6_40, "ymax": 3_73}},
													            {"score": 0.2_7_7, "label": "remote", "box": {"xmin": 40, "ymin": 72, "xmax": 1_77, "ymax": 1_15}},
													            {"score": 0.2_5_3_7, "label": "cat", "box": {"xmin": 1, "ymin": 55, "xmax": 3_15, "ymax": 4_72}},
													            {"score": 0.1_4_7_4, "label": "remote", "box": {"xmin": 3_35, "ymin": 74, "xmax": 3_71, "ymax": 1_87}},
													            {"score": 0.1_2_0_8, "label": "couch", "box": {"xmin": 4, "ymin": 0, "xmax": 6_42, "ymax": 4_76}},
													        ],
													        [
													            {"score": 0.2_8_6_8, "label": "cat", "box": {"xmin": 3_24, "ymin": 20, "xmax": 6_40, "ymax": 3_73}},
													            {"score": 0.2_7_7, "label": "remote", "box": {"xmin": 40, "ymin": 72, "xmax": 1_77, "ymax": 1_15}},
													            {"score": 0.2_5_3_7, "label": "cat", "box": {"xmin": 1, "ymin": 55, "xmax": 3_15, "ymax": 4_72}},
													            {"score": 0.1_4_7_4, "label": "remote", "box": {"xmin": 3_35, "ymin": 74, "xmax": 3_71, "ymax": 1_87}},
													            {"score": 0.1_2_0_8, "label": "couch", "box": {"xmin": 4, "ymin": 0, "xmax": 6_42, "ymax": 4_76}},
													        ],
													    ] ,  )






						@require_tf
						@unittest.skip("Zero Shot Object Detection not implemented in TF"	)
						def 				_UpperCAmelCase       (  self							:      List[Any]	):
													pass






						@require_torch
						@slow
						def 				_UpperCAmelCase       (  self							:      Dict	):
													A_			    =		0.2
													A_			    =		pipeline("zero-shot-object-detection"	)

													A_			    =		object_detector(
													    "http://images.cocodataset.org/val2017/000000039769.jpg" ,  candidate_labels=["cat", "remote", "couch"] ,  threshold=lowerCAmelCase ,  )
													self.assertEqual(
													    nested_simplify(lowerCAmelCase ,  decimals=4	) ,  [
													        {"score": 0.2_8_6_8, "label": "cat", "box": {"xmin": 3_24, "ymin": 20, "xmax": 6_40, "ymax": 3_73}},
													        {"score": 0.2_7_7, "label": "remote", "box": {"xmin": 40, "ymin": 72, "xmax": 1_77, "ymax": 1_15}},
													        {"score": 0.2_5_3_7, "label": "cat", "box": {"xmin": 1, "ymin": 55, "xmax": 3_15, "ymax": 4_72}},
													    ] ,  )






						@require_torch
						@slow
						def 				_UpperCAmelCase       (  self							:      Optional[int]	):
													A_			    =		2
													A_			    =		pipeline("zero-shot-object-detection"	)

													A_			    =		object_detector(
													    "http://images.cocodataset.org/val2017/000000039769.jpg" ,  candidate_labels=["cat", "remote", "couch"] ,  top_k=lowerCAmelCase ,  )
													self.assertEqual(
													    nested_simplify(lowerCAmelCase ,  decimals=4	) ,  [
													        {"score": 0.2_8_6_8, "label": "cat", "box": {"xmin": 3_24, "ymin": 20, "xmax": 6_40, "ymax": 3_73}},
													        {"score": 0.2_7_7, "label": "remote", "box": {"xmin": 40, "ymin": 72, "xmax": 1_77, "ymax": 1_15}},
													    ] ,  )









'''simple docstring'''
import argparse
import json
import re
from pathlib import Path

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

from transformers import (
    MobileNetVaConfig,
    MobileNetVaForImageClassification,
    MobileNetVaImageProcessor,
    load_tf_weights_in_mobilenet_va,
)
from transformers.utils import logging


logging.set_verbosity_info()
__SCREAMING_SNAKE_CASE					:				List[Any]									=		logging.get_logger(__name__)







def       a_				(	UpperCamelCase_ ):
							A_			    =		MobileNetVaConfig(layer_norm_eps=0.001 )

							if "_quant" in model_name:
														raise ValueError("Quantized models are not supported." )

							A_			    =		re.match(R"^mobilenet_v1_([^_]*)_([^_]*)$"						,  UpperCamelCase_ )
							if matches:
														A_			    =		float(matches[1] )
														A_			    =		int(matches[2] )

							# The TensorFlow version of MobileNetV1 predicts 1001 classes instead of
							# the usual 1000. The first class (index 0) is "background".
							A_			    =		1_0_0_1
							A_			    =		"imagenet-1k-id2label.json"
							A_			    =		"huggingface/label-files"
							A_			    =		json.load(open(hf_hub_download(UpperCamelCase_						,  UpperCamelCase_						,  repo_type="dataset" )						,  "r" ) )
							A_			    =		{int(UpperCamelCase_ ) + 1: v for k, v in idalabel.items()}
							A_			    =		"background"
							A_			    =		idalabel
							A_			    =		{v: k for k, v in idalabel.items()}

							return config







def       a_				(	):
							A_			    =		"http://images.cocodataset.org/val2017/000000039769.jpg"
							A_			    =		Image.open(requests.get(UpperCamelCase_						,  stream=UpperCamelCase_ ).raw )
							return im







@torch.no_grad()
def       a_				(	UpperCamelCase_						,  UpperCamelCase_						,  UpperCamelCase_						,  UpperCamelCase_=False ):
							A_			    =		get_mobilenet_va_config(UpperCamelCase_ )

							# Load 🤗 model
							A_			    =		MobileNetVaForImageClassification(UpperCamelCase_ ).eval()

							# Load weights from TensorFlow checkpoint
							load_tf_weights_in_mobilenet_va(UpperCamelCase_						,  UpperCamelCase_						,  UpperCamelCase_ )

							# Check outputs on an image, prepared by MobileNetV1ImageProcessor
							A_			    =		MobileNetVaImageProcessor(
							    crop_size={"width": config.image_size, "height": config.image_size}						,  size={"shortest_edge": config.image_size + 3_2}						,  )
							A_			    =		image_processor(images=prepare_img()						,  return_tensors="pt" )
							A_			    =		model(**UpperCamelCase_ )
							A_			    =		outputs.logits

							assert logits.shape == (1, 1_0_0_1)

							if model_name == "mobilenet_v1_1.0_224":
														A_			    =		torch.tensor([-4.1739, -1.1233, 3.1205] )
							elif model_name == "mobilenet_v1_0.75_192":
														A_			    =		torch.tensor([-3.9440, -2.3141, -0.3333] )
							else:
														A_			    =		None

							if expected_logits is not None:
														assert torch.allclose(logits[0, :3]						,  UpperCamelCase_						,  atol=1e-4 )

							Path(UpperCamelCase_ ).mkdir(exist_ok=UpperCamelCase_ )
							print(f"Saving model {model_name} 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 push_to_hub:
														print("Pushing to the hub..." )
														A_			    =		"google/" + model_name
														image_processor.push_to_hub(UpperCamelCase_ )
														model.push_to_hub(UpperCamelCase_ )


if __name__ == "__main__":
							__SCREAMING_SNAKE_CASE					:				int									=		argparse.ArgumentParser()
							# Required parameters
							parser.add_argument(
							    '''--model_name''',
							    default='''mobilenet_v1_1.0_224''',
							    type=str,
							    help='''Name of the MobileNetV1 model you\'d like to convert. Should in the form \'mobilenet_v1_<depth>_<size>\'.''',
							)
							parser.add_argument(
							    '''--checkpoint_path''', required=True, type=str, help='''Path to the original TensorFlow checkpoint (.ckpt file).'''
							)
							parser.add_argument(
							    '''--pytorch_dump_folder_path''', required=True, type=str, help='''Path to the output PyTorch model directory.'''
							)
							parser.add_argument(
							    '''--push_to_hub''', action='''store_true''', help='''Whether or not to push the converted model to the 🤗 hub.'''
							)

							__SCREAMING_SNAKE_CASE					:				Dict									=		parser.parse_args()
							convert_movilevit_checkpoint(
							    args.model_name, args.checkpoint_path, args.pytorch_dump_folder_path, args.push_to_hub
							)





