'''simple docstring'''

import gc
import random
import unittest

import numpy as np
import torch
from transformers import CLIPTextConfig, CLIPTextModel, CLIPTextModelWithProjection, CLIPTokenizer

from diffusers import (
    AutoencoderKL,
    DiffusionPipeline,
    EulerDiscreteScheduler,
    StableDiffusionXLImgaImgPipeline,
    UNetaDConditionModel,
)
from diffusers.utils import floats_tensor, slow, torch_device
from diffusers.utils.testing_utils import enable_full_determinism, require_torch_gpu

from ..pipeline_params import (
    IMAGE_TO_IMAGE_IMAGE_PARAMS,
    TEXT_GUIDED_IMAGE_VARIATION_BATCH_PARAMS,
    TEXT_GUIDED_IMAGE_VARIATION_PARAMS,
)
from ..test_pipelines_common import PipelineLatentTesterMixin, PipelineTesterMixin


enable_full_determinism()


class 				_lowercase	(      lowerCAmelCase		,lowerCAmelCase		,unittest.TestCase   ):
      '''simple docstring'''


      UpperCAmelCase_      :      int      							=   StableDiffusionXLImgaImgPipeline
      UpperCAmelCase_      :      Any      							=   TEXT_GUIDED_IMAGE_VARIATION_PARAMS - {'''height''', '''width'''}
      UpperCAmelCase_      :      Optional[Any]      							=   PipelineTesterMixin.required_optional_params - {'''latents'''}
      UpperCAmelCase_      :      List[str]      							=   TEXT_GUIDED_IMAGE_VARIATION_BATCH_PARAMS
      UpperCAmelCase_      :      int      							=   IMAGE_TO_IMAGE_IMAGE_PARAMS
      UpperCAmelCase_      :      int      							=   IMAGE_TO_IMAGE_IMAGE_PARAMS




      def 		lowerCAmelCase__					(				self							)			->			int:



         '''simple docstring'''



         torch.manual_seed(0							)
         UpperCAmelCase__							:				Union[str, Any]   				=  UNetaDConditionModel(
             block_out_channels=(32, 64)					,layers_per_block=2					,sample_size=32					,in_channels=4					,out_channels=4					,down_block_types=('''DownBlock2D''', '''CrossAttnDownBlock2D''')					,up_block_types=('''CrossAttnUpBlock2D''', '''UpBlock2D''')					,attention_head_dim=(2, 4)					,use_linear_projection=lowerCamelCase_					,addition_embed_type='''text_time'''					,addition_time_embed_dim=8					,transformer_layers_per_block=(1, 2)					,projection_class_embeddings_input_dim=80					,cross_attention_dim=64					,)
         UpperCAmelCase__							:				Optional[int]   				=  EulerDiscreteScheduler(
             beta_start=0.0_0085					,beta_end=0.012					,steps_offset=1					,beta_schedule='''scaled_linear'''					,timestep_spacing='''leading'''					,)
         torch.manual_seed(0							)
         UpperCAmelCase__							:				Union[str, Any]   				=  AutoencoderKL(
             block_out_channels=[32, 64]					,in_channels=3					,out_channels=3					,down_block_types=['''DownEncoderBlock2D''', '''DownEncoderBlock2D''']					,up_block_types=['''UpDecoderBlock2D''', '''UpDecoderBlock2D''']					,latent_channels=4					,sample_size=128					,)
         torch.manual_seed(0							)
         UpperCAmelCase__							:				Tuple   				=  CLIPTextConfig(
             bos_token_id=0					,eos_token_id=2					,hidden_size=32					,intermediate_size=37					,layer_norm_eps=1e-05					,num_attention_heads=4					,num_hidden_layers=5					,pad_token_id=1					,vocab_size=1000					,hidden_act='''gelu'''					,projection_dim=32					,)
         UpperCAmelCase__							:				str   				=  CLIPTextModel(lowerCamelCase_							)
         UpperCAmelCase__							:				List[str]   				=  CLIPTokenizer.from_pretrained('''hf-internal-testing/tiny-random-clip'''					,local_files_only=lowerCamelCase_							)

         UpperCAmelCase__							:				List[Any]   				=  CLIPTextModelWithProjection(lowerCamelCase_							)
         UpperCAmelCase__							:				Tuple   				=  CLIPTokenizer.from_pretrained('''hf-internal-testing/tiny-random-clip'''					,local_files_only=lowerCamelCase_							)

         UpperCAmelCase__							:				List[Any]   				=  {
             '''unet''': unet,
             '''scheduler''': scheduler,
             '''vae''': vae,
             '''text_encoder''': text_encoder,
             '''tokenizer''': tokenizer,
             '''text_encoder_2''': text_encoder_a,
             '''tokenizer_2''': tokenizer_a,
             # "safety_checker": None,
             # "feature_extractor": None,
         }
         return components




      def 		lowerCAmelCase__					(				self					,lowerCamelCase_					,lowerCamelCase_=0							)			->			Any:



         '''simple docstring'''



         UpperCAmelCase__							:				str   				=  floats_tensor((1, 3, 32, 32)					,rng=random.Random(lowerCamelCase_							)							).to(lowerCamelCase_							)
         UpperCAmelCase__							:				str   				=  image / 2 + 0.5
         if str(lowerCamelCase_							).startswith('''mps'''							):
            UpperCAmelCase__							:				Dict   				=  torch.manual_seed(lowerCamelCase_							)
         else:
            UpperCAmelCase__							:				Optional[int]   				=  torch.Generator(device=lowerCamelCase_							).manual_seed(lowerCamelCase_							)
         UpperCAmelCase__							:				Optional[int]   				=  {
             '''prompt''': '''A painting of a squirrel eating a burger''',
             '''image''': image,
             '''generator''': generator,
             '''num_inference_steps''': 2,
             '''guidance_scale''': 5.0,
             '''output_type''': '''numpy''',
             '''strength''': 0.75,
         }
         return inputs




      def 		lowerCAmelCase__					(				self							)			->			str:



         '''simple docstring'''



         UpperCAmelCase__							:				Dict   				=  '''cpu'''  # ensure determinism for the device-dependent torch.Generator
         UpperCAmelCase__							:				int   				=  self.get_dummy_components()
         UpperCAmelCase__							:				Any   				=  StableDiffusionXLImgaImgPipeline(**lowerCamelCase_							)
         UpperCAmelCase__							:				List[Any]   				=  sd_pipe.to(lowerCamelCase_							)
         sd_pipe.set_progress_bar_config(disable=lowerCamelCase_							)

         UpperCAmelCase__							:				Dict   				=  self.get_dummy_inputs(lowerCamelCase_							)
         UpperCAmelCase__							:				str   				=  sd_pipe(**lowerCamelCase_							).images
         UpperCAmelCase__							:				Dict   				=  image[0, -3:, -3:, -1]

         assert image.shape == (1, 32, 32, 3)

         UpperCAmelCase__							:				Optional[int]   				=  np.array([0.4656, 0.4840, 0.4439, 0.6698, 0.5574, 0.4524, 0.5799, 0.5943, 0.5165]							)

         assert np.abs(image_slice.flatten() - expected_slice							).max() < 1e-2




      def 		lowerCAmelCase__					(				self							)			->			List[str]:



         '''simple docstring'''



         super().test_attention_slicing_forward_pass(expected_max_diff=3e-3							)




      def 		lowerCAmelCase__					(				self							)			->			Tuple:



         '''simple docstring'''



         super().test_inference_batch_single_identical(expected_max_diff=3e-3							)




      def 		lowerCAmelCase__					(				self							)			->			Optional[int]:



         '''simple docstring'''



         pass




      def 		lowerCAmelCase__					(				self							)			->			Optional[int]:



         '''simple docstring'''



         UpperCAmelCase__							:				str   				=  self.get_dummy_components()
         UpperCAmelCase__							:				Optional[int]   				=  StableDiffusionXLImgaImgPipeline(**lowerCamelCase_							)
         UpperCAmelCase__							:				Optional[Any]   				=  sd_pipe.to(lowerCamelCase_							)
         UpperCAmelCase__							:				Any   				=  sd_pipe.to(lowerCamelCase_							)
         sd_pipe.set_progress_bar_config(disable=lowerCamelCase_							)

         # forward without prompt embeds
         UpperCAmelCase__							:				str   				=  self.get_dummy_inputs(lowerCamelCase_							)
         UpperCAmelCase__							:				Dict   				=  3 * ['''this is a negative prompt''']
         UpperCAmelCase__							:				Dict   				=  negative_prompt
         UpperCAmelCase__							:				Tuple   				=  3 * [inputs['''prompt''']]

         UpperCAmelCase__							:				Optional[int]   				=  sd_pipe(**lowerCamelCase_							)
         UpperCAmelCase__							:				Any   				=  output.images[0, -3:, -3:, -1]

         # forward with prompt embeds
         UpperCAmelCase__							:				Union[str, Any]   				=  self.get_dummy_inputs(lowerCamelCase_							)
         UpperCAmelCase__							:				Union[str, Any]   				=  3 * ['''this is a negative prompt''']
         UpperCAmelCase__							:				Dict   				=  3 * [inputs.pop('''prompt'''							)]

         (
             (
             UpperCAmelCase__
         )				,      (
             UpperCAmelCase__
         )				,      (
             UpperCAmelCase__
         )				,      (
             UpperCAmelCase__
         )				,      
         )							:				Optional[int]   				=  sd_pipe.encode_prompt(lowerCamelCase_					,negative_prompt=lowerCamelCase_							)

         UpperCAmelCase__							:				List[Any]   				=  sd_pipe(
             **lowerCamelCase_					,prompt_embeds=lowerCamelCase_					,negative_prompt_embeds=lowerCamelCase_					,pooled_prompt_embeds=lowerCamelCase_					,negative_pooled_prompt_embeds=lowerCamelCase_					,)
         UpperCAmelCase__							:				Dict   				=  output.images[0, -3:, -3:, -1]

         # make sure that it's equal
         assert np.abs(image_slice_a.flatten() - image_slice_a.flatten()							).max() < 1e-4




@slow
@require_torch_gpu
class 				_lowercase	(      unittest.TestCase   ):
      '''simple docstring'''


      def 		lowerCAmelCase__					(				self							)			->			Union[str, Any]:



         '''simple docstring'''



         super().tearDown()
         gc.collect()
         torch.cuda.empty_cache()




      def 		lowerCAmelCase__					(				self					,lowerCamelCase_					,lowerCamelCase_="cpu"					,lowerCamelCase_=torch.floataa					,lowerCamelCase_=0							)			->			str:



         '''simple docstring'''



         UpperCAmelCase__							:				Optional[int]   				=  torch.Generator(device=lowerCamelCase_							).manual_seed(lowerCamelCase_							)
         UpperCAmelCase__							:				str   				=  np.random.RandomState(lowerCamelCase_							).standard_normal((1, 4, 64, 64)							)
         UpperCAmelCase__							:				Tuple   				=  torch.from_numpy(lowerCamelCase_							).to(device=lowerCamelCase_					,dtype=lowerCamelCase_							)
         UpperCAmelCase__							:				Optional[int]   				=  {
             '''prompt''': '''a photograph of an astronaut riding a horse''',
             '''latents''': latents,
             '''generator''': generator,
             '''num_inference_steps''': 3,
             '''guidance_scale''': 7.5,
             '''output_type''': '''numpy''',
         }
         return inputs




      def 		lowerCAmelCase__					(				self							)			->			str:



         '''simple docstring'''



         UpperCAmelCase__							:				List[Any]   				=  DiffusionPipeline.from_pretrained('''stabilityai/stable-diffusion-2-base'''							)
         pipe.to(lowerCamelCase_							)
         pipe.set_progress_bar_config(disable=lowerCamelCase_							)

         UpperCAmelCase__							:				Tuple   				=  self.get_inputs(lowerCamelCase_							)
         UpperCAmelCase__							:				int   				=  pipe(**lowerCamelCase_							).images
         UpperCAmelCase__							:				Optional[int]   				=  image[0, -3:, -3:, -1].flatten()

         assert image.shape == (1, 512, 512, 3)
         UpperCAmelCase__							:				Optional[int]   				=  np.array([0.4_9493, 0.4_7896, 0.4_0798, 0.5_4214, 0.5_3212, 0.4_8202, 0.4_7656, 0.4_6329, 0.4_8506]							)
         assert np.abs(image_slice - expected_slice							).max() < 7e-3





'''simple docstring'''

import argparse
import json
import os

import numpy as np
import PIL
import requests
import tensorflow.keras.applications.efficientnet as efficientnet
import torch
from huggingface_hub import hf_hub_download
from PIL import Image
from tensorflow.keras.preprocessing import image

from transformers import (
    EfficientNetConfig,
    EfficientNetForImageClassification,
    EfficientNetImageProcessor,
)
from transformers.utils import logging


logging.set_verbosity_info()
UpperCamelCase__     :	Optional[Any]				=			logging.get_logger(__name__)

UpperCamelCase__     :	Tuple				=			{
    'b0': efficientnet.EfficientNetBa,
    'b1': efficientnet.EfficientNetBa,
    'b2': efficientnet.EfficientNetBa,
    'b3': efficientnet.EfficientNetBa,
    'b4': efficientnet.EfficientNetBa,
    'b5': efficientnet.EfficientNetBa,
    'b6': efficientnet.EfficientNetBa,
    'b7': efficientnet.EfficientNetBa,
}

UpperCamelCase__     :	int				=			{
    'b0': {
        'hidden_dim': 1_280,
        'width_coef': 1.0,
        'depth_coef': 1.0,
        'image_size': 224,
        'dropout_rate': 0.2,
        'dw_padding': [],
    },
    'b1': {
        'hidden_dim': 1_280,
        'width_coef': 1.0,
        'depth_coef': 1.1,
        'image_size': 240,
        'dropout_rate': 0.2,
        'dw_padding': [16],
    },
    'b2': {
        'hidden_dim': 1_408,
        'width_coef': 1.1,
        'depth_coef': 1.2,
        'image_size': 260,
        'dropout_rate': 0.3,
        'dw_padding': [5, 8, 16],
    },
    'b3': {
        'hidden_dim': 1_536,
        'width_coef': 1.2,
        'depth_coef': 1.4,
        'image_size': 300,
        'dropout_rate': 0.3,
        'dw_padding': [5, 18],
    },
    'b4': {
        'hidden_dim': 1_792,
        'width_coef': 1.4,
        'depth_coef': 1.8,
        'image_size': 380,
        'dropout_rate': 0.4,
        'dw_padding': [6],
    },
    'b5': {
        'hidden_dim': 2_048,
        'width_coef': 1.6,
        'depth_coef': 2.2,
        'image_size': 456,
        'dropout_rate': 0.4,
        'dw_padding': [13, 27],
    },
    'b6': {
        'hidden_dim': 2_304,
        'width_coef': 1.8,
        'depth_coef': 2.6,
        'image_size': 528,
        'dropout_rate': 0.5,
        'dw_padding': [31],
    },
    'b7': {
        'hidden_dim': 2_560,
        'width_coef': 2.0,
        'depth_coef': 3.1,
        'image_size': 600,
        'dropout_rate': 0.5,
        'dw_padding': [18],
    },
}







def __UpperCamelCase(   _A					:				List[Any]    ):
   '''simple docstring'''
   UpperCAmelCase__							:				Dict   				=  EfficientNetConfig()
   UpperCAmelCase__							:				int   				=  CONFIG_MAP[model_name]['''hidden_dim''']
   UpperCAmelCase__							:				Optional[Any]   				=  CONFIG_MAP[model_name]['''width_coef''']
   UpperCAmelCase__							:				int   				=  CONFIG_MAP[model_name]['''depth_coef''']
   UpperCAmelCase__							:				Optional[int]   				=  CONFIG_MAP[model_name]['''image_size''']
   UpperCAmelCase__							:				int   				=  CONFIG_MAP[model_name]['''dropout_rate''']
   UpperCAmelCase__							:				Any   				=  CONFIG_MAP[model_name]['''dw_padding''']

   UpperCAmelCase__							:				Tuple   				=  '''huggingface/label-files'''
   UpperCAmelCase__							:				Dict   				=  '''imagenet-1k-id2label.json'''
   UpperCAmelCase__							:				List[Any]   				=  10_00
   UpperCAmelCase__							:				Union[str, Any]   				=  json.load(open(hf_hub_download(_A  ,			_A  ,			repo_type='''dataset'''    )  ,			'''r'''    )    )
   UpperCAmelCase__							:				Union[str, Any]   				=  {int(_A    ): v for k, v in idalabel.items()}

   UpperCAmelCase__							:				Dict   				=  idalabel
   UpperCAmelCase__							:				Tuple   				=  {v: k for k, v in idalabel.items()}
   return config







def __UpperCamelCase(   ):
   '''simple docstring'''
   UpperCAmelCase__							:				Union[str, Any]   				=  '''http://images.cocodataset.org/val2017/000000039769.jpg'''
   UpperCAmelCase__							:				List[str]   				=  Image.open(requests.get(_A  ,			stream=_A    ).raw    )
   return im







def __UpperCamelCase(   _A					:				Tuple    ):
   '''simple docstring'''
   UpperCAmelCase__							:				Tuple   				=  CONFIG_MAP[model_name]['''image_size''']
   UpperCAmelCase__							:				Tuple   				=  EfficientNetImageProcessor(
       size={'''height''': size, '''width''': size}  ,			image_mean=[0.4_8_5, 0.4_5_6, 0.4_0_6]  ,			image_std=[0.4_7_8_5_3_9_4_4, 0.4_7_3_2_8_6_4, 0.4_7_4_3_4_1_6_3]  ,			do_center_crop=_A  ,			)
   return preprocessor







def __UpperCamelCase(   _A					:				str    ):
   '''simple docstring'''
   UpperCAmelCase__							:				Optional[int]   				=  [v.split('''_'''    )[0].split('''block'''    )[1] for v in original_param_names if v.startswith('''block'''    )]
   UpperCAmelCase__							:				List[str]   				=  sorted(set(_A    )    )
   UpperCAmelCase__							:				Optional[Any]   				=  len(_A    )
   UpperCAmelCase__							:				int   				=  {b: str(_A    ) for b, i in zip(_A  ,			range(_A    )    )}

   UpperCAmelCase__							:				int   				=  []
   rename_keys.append(('''stem_conv/kernel:0''', '''embeddings.convolution.weight''')    )
   rename_keys.append(('''stem_bn/gamma:0''', '''embeddings.batchnorm.weight''')    )
   rename_keys.append(('''stem_bn/beta:0''', '''embeddings.batchnorm.bias''')    )
   rename_keys.append(('''stem_bn/moving_mean:0''', '''embeddings.batchnorm.running_mean''')    )
   rename_keys.append(('''stem_bn/moving_variance:0''', '''embeddings.batchnorm.running_var''')    )

   for b in block_names:
      UpperCAmelCase__							:				Tuple   				=  block_name_mapping[b]
      rename_keys.append((F'''block{b}_expand_conv/kernel:0''', F'''encoder.blocks.{hf_b}.expansion.expand_conv.weight''')    )
      rename_keys.append((F'''block{b}_expand_bn/gamma:0''', F'''encoder.blocks.{hf_b}.expansion.expand_bn.weight''')    )
      rename_keys.append((F'''block{b}_expand_bn/beta:0''', F'''encoder.blocks.{hf_b}.expansion.expand_bn.bias''')    )
      rename_keys.append(
          (F'''block{b}_expand_bn/moving_mean:0''', F'''encoder.blocks.{hf_b}.expansion.expand_bn.running_mean''')    )
      rename_keys.append(
          (F'''block{b}_expand_bn/moving_variance:0''', F'''encoder.blocks.{hf_b}.expansion.expand_bn.running_var''')    )
      rename_keys.append(
          (F'''block{b}_dwconv/depthwise_kernel:0''', F'''encoder.blocks.{hf_b}.depthwise_conv.depthwise_conv.weight''')    )
      rename_keys.append((F'''block{b}_bn/gamma:0''', F'''encoder.blocks.{hf_b}.depthwise_conv.depthwise_norm.weight''')    )
      rename_keys.append((F'''block{b}_bn/beta:0''', F'''encoder.blocks.{hf_b}.depthwise_conv.depthwise_norm.bias''')    )
      rename_keys.append(
          (F'''block{b}_bn/moving_mean:0''', F'''encoder.blocks.{hf_b}.depthwise_conv.depthwise_norm.running_mean''')    )
      rename_keys.append(
          (F'''block{b}_bn/moving_variance:0''', F'''encoder.blocks.{hf_b}.depthwise_conv.depthwise_norm.running_var''')    )

      rename_keys.append((F'''block{b}_se_reduce/kernel:0''', F'''encoder.blocks.{hf_b}.squeeze_excite.reduce.weight''')    )
      rename_keys.append((F'''block{b}_se_reduce/bias:0''', F'''encoder.blocks.{hf_b}.squeeze_excite.reduce.bias''')    )
      rename_keys.append((F'''block{b}_se_expand/kernel:0''', F'''encoder.blocks.{hf_b}.squeeze_excite.expand.weight''')    )
      rename_keys.append((F'''block{b}_se_expand/bias:0''', F'''encoder.blocks.{hf_b}.squeeze_excite.expand.bias''')    )
      rename_keys.append(
          (F'''block{b}_project_conv/kernel:0''', F'''encoder.blocks.{hf_b}.projection.project_conv.weight''')    )
      rename_keys.append((F'''block{b}_project_bn/gamma:0''', F'''encoder.blocks.{hf_b}.projection.project_bn.weight''')    )
      rename_keys.append((F'''block{b}_project_bn/beta:0''', F'''encoder.blocks.{hf_b}.projection.project_bn.bias''')    )
      rename_keys.append(
          (F'''block{b}_project_bn/moving_mean:0''', F'''encoder.blocks.{hf_b}.projection.project_bn.running_mean''')    )
      rename_keys.append(
          (F'''block{b}_project_bn/moving_variance:0''', F'''encoder.blocks.{hf_b}.projection.project_bn.running_var''')    )

   rename_keys.append(('''top_conv/kernel:0''', '''encoder.top_conv.weight''')    )
   rename_keys.append(('''top_bn/gamma:0''', '''encoder.top_bn.weight''')    )
   rename_keys.append(('''top_bn/beta:0''', '''encoder.top_bn.bias''')    )
   rename_keys.append(('''top_bn/moving_mean:0''', '''encoder.top_bn.running_mean''')    )
   rename_keys.append(('''top_bn/moving_variance:0''', '''encoder.top_bn.running_var''')    )

   UpperCAmelCase__							:				List[str]   				=  {}
   for item in rename_keys:
      if item[0] in original_param_names:
         UpperCAmelCase__							:				str   				=  '''efficientnet.''' + item[1]

   UpperCAmelCase__							:				List[str]   				=  '''classifier.weight'''
   UpperCAmelCase__							:				Union[str, Any]   				=  '''classifier.bias'''
   return key_mapping







def __UpperCamelCase(   _A					:				Optional[Any]  ,			_A					:				List[Any]  ,			_A					:				Optional[Any]    ):
   '''simple docstring'''
   for key, value in tf_params.items():
      if "normalization" in key:
         continue

      UpperCAmelCase__							:				Tuple   				=  key_mapping[key]
      if "_conv" in key and "kernel" in key:
         UpperCAmelCase__							:				List[str]   				=  torch.from_numpy(_A    ).permute(3  ,			2  ,			0  ,			1    )
      elif "depthwise_kernel" in key:
         UpperCAmelCase__							:				Dict   				=  torch.from_numpy(_A    ).permute(2  ,			3  ,			0  ,			1    )
      elif "kernel" in key:
         UpperCAmelCase__							:				Optional[int]   				=  torch.from_numpy(np.transpose(_A    )    )
      else:
         UpperCAmelCase__							:				str   				=  torch.from_numpy(_A    )

      # Replace HF parameters with original TF model parameters
      assert hf_params[hf_key].shape == new_hf_value.shape
      hf_params[hf_key].copy_(_A    )







@torch.no_grad()
def __UpperCamelCase(   _A					:				Tuple  ,			_A					:				str  ,			_A					:				Union[str, Any]  ,			_A					:				List[str]    ):
   '''simple docstring'''
   UpperCAmelCase__							:				int   				=  model_classes[model_name](
       include_top=_A  ,			weights='''imagenet'''  ,			input_tensor=_A  ,			input_shape=_A  ,			pooling=_A  ,			classes=10_00  ,			classifier_activation='''softmax'''  ,			)

   UpperCAmelCase__							:				Dict   				=  original_model.trainable_variables
   UpperCAmelCase__							:				Optional[Any]   				=  original_model.non_trainable_variables
   UpperCAmelCase__							:				List[str]   				=  {param.name: param.numpy() for param in tf_params}
   for param in tf_non_train_params:
      UpperCAmelCase__							:				Union[str, Any]   				=  param.numpy()
   UpperCAmelCase__							:				Optional[Any]   				=  list(tf_params.keys()    )

   # Load HuggingFace model
   UpperCAmelCase__							:				Union[str, Any]   				=  get_efficientnet_config(_A    )
   UpperCAmelCase__							:				Any   				=  EfficientNetForImageClassification(_A    ).eval()
   UpperCAmelCase__							:				Tuple   				=  hf_model.state_dict()

   # Create src-to-dst parameter name mapping dictionary
   print('''Converting parameters...'''    )
   UpperCAmelCase__							:				Tuple   				=  rename_keys(_A    )
   replace_params(_A  ,			_A  ,			_A    )

   # Initialize preprocessor and preprocess input image
   UpperCAmelCase__							:				List[Any]   				=  convert_image_processor(_A    )
   UpperCAmelCase__							:				List[Any]   				=  preprocessor(images=prepare_img()  ,			return_tensors='''pt'''    )

   # HF model inference
   hf_model.eval()
   with torch.no_grad():
      UpperCAmelCase__							:				Optional[Any]   				=  hf_model(**_A    )
   UpperCAmelCase__							:				Union[str, Any]   				=  outputs.logits.detach().numpy()

   # Original model inference
   UpperCAmelCase__							:				str   				=  False
   UpperCAmelCase__							:				int   				=  CONFIG_MAP[model_name]['''image_size''']
   UpperCAmelCase__							:				List[str]   				=  prepare_img().resize((image_size, image_size)  ,			resample=PIL.Image.NEAREST    )
   UpperCAmelCase__							:				List[Any]   				=  image.img_to_array(_A    )
   UpperCAmelCase__							:				List[Any]   				=  np.expand_dims(_A  ,			axis=0    )
   UpperCAmelCase__							:				List[Any]   				=  original_model.predict(_A    )

   # Check whether original and HF model outputs match  -> np.allclose
   assert np.allclose(_A  ,			_A  ,			atol=1e-3    ), "The predicted logits are not the same."
   print('''Model outputs match!'''    )

   if save_model:
      # Create folder to save model
      if not os.path.isdir(_A    ):
         os.mkdir(_A    )
      # Save converted model and image processor
      hf_model.save_pretrained(_A    )
      preprocessor.save_pretrained(_A    )

   if push_to_hub:
      # Push model and image processor to hub
      print(F'''Pushing converted {model_name} to the hub...'''    )
      UpperCAmelCase__							:				Any   				=  F'''efficientnet-{model_name}'''
      preprocessor.push_to_hub(_A    )
      hf_model.push_to_hub(_A    )


if __name__ == "__main__":
  UpperCamelCase__     :	int				=			argparse.ArgumentParser()
  # Required parameters
  parser.add_argument(
      '--model_name',
      default='b0',
      type=str,
      help='Version name of the EfficientNet model you want to convert, select from [b0, b1, b2, b3, b4, b5, b6, b7].',
  )
  parser.add_argument(
      '--pytorch_dump_folder_path',
      default='hf_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 processor to the hub')

  UpperCamelCase__     :	Union[str, Any]				=			parser.parse_args()
  convert_efficientnet_checkpoint(args.model_name, args.pytorch_dump_folder_path, args.save_model, args.push_to_hub)




