





import tempfile
import unittest

import numpy as np
import torch

from diffusers import DiffusionPipeline
from diffusers.models.attention_processor import Attention, AttnAddedKVProcessor


class 			__lowerCAmelCase				(					unittest.TestCase			):


	'''simple docstring'''





	def       snake_case__(	self:	Optional[int],				lowerCamelCase_:	bool = False ):
			lowercase__				:			Tuple            =		10

			if only_cross_attention:
					lowercase__				:			List[str]            =		12
			else:
					# when only cross attention is not set, the cross attention dim must be the same as the query dim
					lowercase__				:			Optional[Any]            =		query_dim

			return {
			    "query_dim": query_dim,
			    "cross_attention_dim": cross_attention_dim,
			    "heads": 2,
			    "dim_head": 4,
			    "added_kv_proj_dim": 6,
			    "norm_num_groups": 1,
			    "only_cross_attention": only_cross_attention,
			    "processor": AttnAddedKVProcessor(),
			}

	def       snake_case__(	self:	Any,				lowerCamelCase_:	str,				lowerCamelCase_:	Union[str, Any] ):
			lowercase__				:			Any            =		2

			lowercase__				:			Tuple            =		torch.rand(lowerCamelCase_,				lowerCamelCase_,				3,				2 )
			lowercase__				:			List[Any]            =		torch.rand(lowerCamelCase_,				4,				lowerCamelCase_ )
			lowercase__				:			Any            =		None

			return {
			    "hidden_states": hidden_states,
			    "encoder_hidden_states": encoder_hidden_states,
			    "attention_mask": attention_mask,
			}





	def       snake_case__(	self:	Tuple ):
			# self and cross attention

			torch.manual_seed(0 )

			lowercase__				:			Optional[Any]            =		self.get_constructor_arguments(only_cross_attention=lowerCamelCase_ )
			lowercase__				:			str            =		Attention(**lowerCamelCase_ )

			self.assertTrue(attn.to_k is not None )
			self.assertTrue(attn.to_v is not None )

			lowercase__				:			Tuple            =		self.get_forward_arguments(
			    query_dim=constructor_args['query_dim'],				added_kv_proj_dim=constructor_args['added_kv_proj_dim'] )

			lowercase__				:			Any            =		attn(**lowerCamelCase_ )

			# only self attention

			torch.manual_seed(0 )

			lowercase__				:			int            =		self.get_constructor_arguments(only_cross_attention=lowerCamelCase_ )
			lowercase__				:			Optional[int]            =		Attention(**lowerCamelCase_ )

			self.assertTrue(attn.to_k is None )
			self.assertTrue(attn.to_v is None )

			lowercase__				:			str            =		self.get_forward_arguments(
			    query_dim=constructor_args['query_dim'],				added_kv_proj_dim=constructor_args['added_kv_proj_dim'] )

			lowercase__				:			int            =		attn(**lowerCamelCase_ )

			self.assertTrue((only_cross_attn_out != self_and_cross_attn_out).all() )


class 			__lowerCAmelCase				(					unittest.TestCase			):


	'''simple docstring'''





	def       snake_case__(	self:	List[str] ):
			lowercase__				:			Tuple            =		DiffusionPipeline.from_pretrained('hf-internal-testing/tiny-stable-diffusion-pipe',				safety_checker=lowerCamelCase_ )

			lowercase__				:			List[Any]            =		pipe(
			    'foo',				num_inference_steps=2,				generator=torch.Generator('cpu' ).manual_seed(0 ),				output_type='np',				).images

			# the initial conversion succeeds
			lowercase__				:			Optional[Any]            =		DiffusionPipeline.from_pretrained(
			    'hf-internal-testing/tiny-stable-diffusion-pipe',				device_map='sequential',				safety_checker=lowerCamelCase_ )

			lowercase__				:			int            =		pipe(
			    'foo',				num_inference_steps=2,				generator=torch.Generator('cpu' ).manual_seed(0 ),				output_type='np',				).images

			with tempfile.TemporaryDirectory() as tmpdir:
					# save the converted model
					pipe.save_pretrained(lowerCamelCase_ )

					# can also load the converted weights
					lowercase__				:			Dict            =		DiffusionPipeline.from_pretrained(lowerCamelCase_,				device_map='sequential',				safety_checker=lowerCamelCase_ )

			lowercase__				:			Union[str, Any]            =		pipe(
			    'foo',				num_inference_steps=2,				generator=torch.Generator('cpu' ).manual_seed(0 ),				output_type='np',				).images

			self.assertTrue(np.allclose(lowerCamelCase_,				lowerCamelCase_,				atol=1E-5 ) )
			self.assertTrue(np.allclose(lowerCamelCase_,				lowerCamelCase_,				atol=1E-5 ) )









import argparse
import json
from pathlib import Path

import requests
import torch
from huggingface_hub import cached_download, hf_hub_url
from PIL import Image

from transformers import DeformableDetrConfig, DeformableDetrForObjectDetection, DeformableDetrImageProcessor
from transformers.utils import logging


logging.set_verbosity_info()
__UpperCamelCase:  Tuple   =   logging.get_logger(__name__)


def 			SCREAMING_SNAKE_CASE__     (					_lowercase    :   str )      ->       List[Any]:




		'''simple docstring'''
		if "backbone.0.body" in orig_key:
				lowercase__				:			Optional[int]            =		orig_key.replace('backbone.0.body'      ,						'backbone.conv_encoder.model' )
		if "transformer" in orig_key:
				lowercase__				:			Any            =		orig_key.replace('transformer.'      ,						'' )
		if "norm1" in orig_key:
				if "encoder" in orig_key:
						lowercase__				:			str            =		orig_key.replace('norm1'      ,						'self_attn_layer_norm' )
				else:
						lowercase__				:			int            =		orig_key.replace('norm1'      ,						'encoder_attn_layer_norm' )
		if "norm2" in orig_key:
				if "encoder" in orig_key:
						lowercase__				:			Any            =		orig_key.replace('norm2'      ,						'final_layer_norm' )
				else:
						lowercase__				:			Optional[int]            =		orig_key.replace('norm2'      ,						'self_attn_layer_norm' )
		if "norm3" in orig_key:
				lowercase__				:			Union[str, Any]            =		orig_key.replace('norm3'      ,						'final_layer_norm' )
		if "linear1" in orig_key:
				lowercase__				:			List[str]            =		orig_key.replace('linear1'      ,						'fc1' )
		if "linear2" in orig_key:
				lowercase__				:			int            =		orig_key.replace('linear2'      ,						'fc2' )
		if "query_embed" in orig_key:
				lowercase__				:			str            =		orig_key.replace('query_embed'      ,						'query_position_embeddings' )
		if "cross_attn" in orig_key:
				lowercase__				:			int            =		orig_key.replace('cross_attn'      ,						'encoder_attn' )

		return orig_key


def 			SCREAMING_SNAKE_CASE__     (					_lowercase    :   Tuple )      ->       Optional[int]:




		'''simple docstring'''
		# transformer decoder self-attention layers
		for i in range(6 ):
				# read in weights + bias of input projection layer of self-attention
				lowercase__				:			int            =		state_dict.pop(f"""decoder.layers.{i}.self_attn.in_proj_weight""" )
				lowercase__				:			List[Any]            =		state_dict.pop(f"""decoder.layers.{i}.self_attn.in_proj_bias""" )
				# next, add query, keys and values (in that order) to the state dict
				lowercase__				:			str            =		in_proj_weight[:256, :]
				lowercase__				:			Tuple            =		in_proj_bias[:256]
				lowercase__				:			List[str]            =		in_proj_weight[256:512, :]
				lowercase__				:			str            =		in_proj_bias[256:512]
				lowercase__				:			Optional[int]            =		in_proj_weight[-256:, :]
				lowercase__				:			str            =		in_proj_bias[-256:]


def 			SCREAMING_SNAKE_CASE__     (					)      ->       Tuple:




		'''simple docstring'''
		lowercase__				:			str            =		'http://images.cocodataset.org/val2017/000000039769.jpg'
		lowercase__				:			Optional[int]            =		Image.open(requests.get(_lowercase      ,						stream=_lowercase ).raw )

		return im


@torch.no_grad()
def 			SCREAMING_SNAKE_CASE__     (					_lowercase    :   Dict      ,						_lowercase    :   Tuple      ,						_lowercase    :   List[Any]      ,						_lowercase    :   Optional[Any]      ,						_lowercase    :   List[str]      ,						_lowercase    :   List[str]      ,						_lowercase    :   Union[str, Any]      ,						)      ->       List[str]:




		'''simple docstring'''
		lowercase__				:			List[str]            =		DeformableDetrConfig()
		# set config attributes
		if single_scale:
				lowercase__				:			List[str]            =		1
		lowercase__				:			Dict            =		dilation
		lowercase__				:			int            =		with_box_refine
		lowercase__				:			Optional[int]            =		two_stage
		# set labels
		lowercase__				:			Optional[Any]            =		91
		lowercase__				:			Any            =		'huggingface/label-files'
		lowercase__				:			List[Any]            =		'coco-detection-id2label.json'
		lowercase__				:			Any            =		json.load(open(cached_download(hf_hub_url(_lowercase      ,						_lowercase      ,						repo_type='dataset' ) )      ,						'r' ) )
		lowercase__				:			Union[str, Any]            =		{int(_lowercase ): v for k, v in idalabel.items()}
		lowercase__				:			Tuple            =		idalabel
		lowercase__				:			Optional[int]            =		{v: k for k, v in idalabel.items()}

		# load image processor
		lowercase__				:			Tuple            =		DeformableDetrImageProcessor(format='coco_detection' )

		# prepare image
		lowercase__				:			List[Any]            =		prepare_img()
		lowercase__				:			Optional[int]            =		image_processor(images=_lowercase      ,						return_tensors='pt' )
		lowercase__				:			int            =		encoding['pixel_values']

		logger.info('Converting model...' )

		# load original state dict
		lowercase__				:			Dict            =		torch.load(_lowercase      ,						map_location='cpu' )['model']
		# rename keys
		for key in state_dict.copy().keys():
				lowercase__				:			int            =		state_dict.pop(_lowercase )
				lowercase__				:			Optional[Any]            =		val
		# query, key and value matrices need special treatment
		read_in_q_k_v(_lowercase )
		# important: we need to prepend a prefix to each of the base model keys as the head models use different attributes for them
		lowercase__				:			List[str]            =		'model.'
		for key in state_dict.copy().keys():
				if not key.startswith('class_embed' ) and not key.startswith('bbox_embed' ):
						lowercase__				:			Optional[Any]            =		state_dict.pop(_lowercase )
						lowercase__				:			Dict            =		val
    # finally, create HuggingFace model and load state dict
		lowercase__				:			Tuple            =		DeformableDetrForObjectDetection(_lowercase )
		model.load_state_dict(_lowercase )
		model.eval()

		lowercase__				:			str            =		'cuda' if torch.cuda.is_available() else 'cpu'
		model.to(_lowercase )
		# verify our conversion
		lowercase__				:			Dict            =		model(pixel_values.to(_lowercase ) )

		lowercase__				:			List[Any]            =		torch.tensor(
		    [[-9.6_645, -4.3_449, -5.8_705], [-9.7_035, -3.8_504, -5.0_724], [-10.5_634, -5.3_379, -7.5_116]] )
		lowercase__				:			str            =		torch.tensor([[0.8_693, 0.2_289, 0.2_492], [0.3_150, 0.5_489, 0.5_845], [0.5_563, 0.7_580, 0.8_518]] )

		if single_scale:
				lowercase__				:			Any            =		torch.tensor(
				    [[-9.9_051, -4.2_541, -6.4_852], [-9.6_947, -4.0_854, -6.8_033], [-10.0_665, -5.8_470, -7.7_003]] )
				lowercase__				:			Any            =		torch.tensor([[0.7_292, 0.4_991, 0.5_532], [0.7_959, 0.2_426, 0.4_236], [0.7_582, 0.3_518, 0.4_451]] )

		if single_scale and dilation:
				lowercase__				:			Optional[int]            =		torch.tensor(
				    [[-8.9_652, -4.1_074, -5.6_635], [-9.0_596, -4.9_447, -6.6_075], [-10.1_178, -4.5_275, -6.2_671]] )
				lowercase__				:			Dict            =		torch.tensor([[0.7_665, 0.4_130, 0.4_769], [0.8_364, 0.1_841, 0.3_391], [0.6_261, 0.3_895, 0.7_978]] )

		if with_box_refine:
				lowercase__				:			List[Any]            =		torch.tensor(
				    [[-8.8_895, -5.4_187, -6.8_153], [-8.4_706, -6.1_668, -7.6_184], [-9.0_042, -5.5_359, -6.9_141]] )
				lowercase__				:			int            =		torch.tensor([[0.7_828, 0.2_208, 0.4_323], [0.0_892, 0.5_996, 0.1_319], [0.5_524, 0.6_389, 0.8_914]] )

		if with_box_refine and two_stage:
				lowercase__				:			Union[str, Any]            =		torch.tensor(
				    [[-6.7_108, -4.3_213, -6.3_777], [-8.9_014, -6.1_799, -6.7_240], [-6.9_315, -4.4_735, -6.2_298]] )
				lowercase__				:			List[Any]            =		torch.tensor([[0.2_583, 0.5_499, 0.4_683], [0.7_652, 0.9_068, 0.4_882], [0.5_490, 0.2_763, 0.0_564]] )

		print('Logits:'      ,						outputs.logits[0, :3, :3] )

		assert torch.allclose(outputs.logits[0, :3, :3]      ,						expected_logits.to(_lowercase )      ,						atol=1e-4 )
		assert torch.allclose(outputs.pred_boxes[0, :3, :3]      ,						expected_boxes.to(_lowercase )      ,						atol=1e-4 )

		print('Everything ok!' )

		# Save model and image processor
		logger.info(f"""Saving PyTorch model and image processor to {pytorch_dump_folder_path}...""" )
		Path(_lowercase ).mkdir(exist_ok=_lowercase )
		model.save_pretrained(_lowercase )
		image_processor.save_pretrained(_lowercase )

		# Push to hub
		if push_to_hub:
				lowercase__				:			Any            =		'deformable-detr'
				model_name += "-single-scale" if single_scale else ""
				model_name += "-dc5" if dilation else ""
				model_name += "-with-box-refine" if with_box_refine else ""
				model_name += "-two-stage" if two_stage else ""
				print('Pushing model to hub...' )
				model.push_to_hub(repo_path_or_name=_lowercase      ,						organization='nielsr'      ,						commit_message='Add model' )


if __name__ == "__main__":
			__UpperCamelCase:  List[str]   =   argparse.ArgumentParser()

			parser.add_argument(
			    """--checkpoint_path""",
			    type=str,
			    default="""/home/niels/checkpoints/deformable_detr/r50_deformable_detr-checkpoint.pth""",
			    help="""Path to Pytorch checkpoint (.pth file) you'd like to convert.""",
			)
			parser.add_argument("""--single_scale""", action="""store_true""", help="""Whether to set config.num_features_levels = 1.""")
			parser.add_argument("""--dilation""", action="""store_true""", help="""Whether to set config.dilation=True.""")
			parser.add_argument("""--with_box_refine""", action="""store_true""", help="""Whether to set config.with_box_refine=True.""")
			parser.add_argument("""--two_stage""", action="""store_true""", help="""Whether to set config.two_stage=True.""")
			parser.add_argument(
			    """--pytorch_dump_folder_path""",
			    default=None,
			    type=str,
			    required=True,
			    help="""Path to the folder to output PyTorch model.""",
			)
			parser.add_argument(
			    """--push_to_hub""", action="""store_true""", help="""Whether or not to push the converted model to the 🤗 hub."""
			)
			__UpperCamelCase:  List[str]   =   parser.parse_args()
			convert_deformable_detr_checkpoint(
			    args.checkpoint_path,
			    args.single_scale,
			    args.dilation,
			    args.with_box_refine,
			    args.two_stage,
			    args.pytorch_dump_folder_path,
			    args.push_to_hub,
			)


