

import inspect
import unittest

from huggingface_hub import hf_hub_download

from transformers import ConvNextConfig, UperNetConfig
from transformers.testing_utils import require_torch, require_torch_multi_gpu, require_vision, slow, torch_device
from transformers.utils import is_torch_available, is_vision_available

from ...test_configuration_common import ConfigTester
from ...test_modeling_common import ModelTesterMixin, _config_zero_init, floats_tensor, ids_tensor
from ...test_pipeline_mixin import PipelineTesterMixin


if is_torch_available():
			import torch

			from transformers import UperNetForSemanticSegmentation
			from transformers.models.upernet.modeling_upernet import UPERNET_PRETRAINED_MODEL_ARCHIVE_LIST


if is_vision_available():
			from PIL import Image

			from transformers import AutoImageProcessor

class 							UpperCAmelCase_						:
							"""simple docstring"""







							def __init__(     self			,				_a			,				_a=1_3			,				_a=3_2			,				_a=3			,				_a=4			,				_a=[1_0, 2_0, 3_0, 4_0]			,				_a=[2, 2, 3, 2]			,				_a=True			,				_a=True			,				_a=3_7			,				_a="gelu"			,				_a=1_0			,				_a=0.02			,				_a=["stage2", "stage3", "stage4"]			,				_a=3			,				_a=None			,				)       ->       Any:
												_a      :       Dict   =						parent
												_a      :       List[str]   =						batch_size
												_a      :       Any   =						image_size
												_a      :       Optional[int]   =						num_channels
												_a      :       List[Any]   =						num_stages
												_a      :       List[str]   =						hidden_sizes
												_a      :       Tuple   =						depths
												_a      :       Any   =						is_training
												_a      :       Optional[int]   =						use_labels
												_a      :       Optional[Any]   =						intermediate_size
												_a      :       Optional[int]   =						hidden_act
												_a      :       Dict   =						type_sequence_label_size
												_a      :       str   =						initializer_range
												_a      :       Optional[int]   =						out_features
												_a      :       List[str]   =						num_labels
												_a      :       Optional[Any]   =						scope
												_a      :       Optional[int]   =						num_stages


							def 							__lowercase							(     self			)       ->       List[Any]:
												_a      :       Any   =						floats_tensor([self.batch_size, self.num_channels, self.image_size, self.image_size]			)

												_a      :       Tuple   =						None
												if self.use_labels:
																	_a      :       Optional[int]   =						ids_tensor([self.batch_size]			,				self.type_sequence_label_size			)

												_a      :       Any   =						self.get_config()

												return config, pixel_values, labels


							def 							__lowercase							(     self			)       ->       Dict:
												return ConvNextConfig(
												    num_channels=self.num_channels			,				num_stages=self.num_stages			,				hidden_sizes=self.hidden_sizes			,				depths=self.depths			,				is_training=self.is_training			,				intermediate_size=self.intermediate_size			,				hidden_act=self.hidden_act			,				out_features=self.out_features			,				)


							def 							__lowercase							(     self			)       ->       Union[str, Any]:
												return UperNetConfig(
												    backbone_config=self.get_backbone_config()			,				hidden_size=5_1_2			,				pool_scales=[1, 2, 3, 6]			,				use_auxiliary_head=_a			,				auxiliary_loss_weight=0.4			,				auxiliary_in_channels=4_0			,				auxiliary_channels=2_5_6			,				auxiliary_num_convs=1			,				auxiliary_concat_input=_a			,				loss_ignore_index=2_5_5			,				num_labels=self.num_labels			,				)


							def 							__lowercase							(     self			,				_a			,				_a			,				_a			)       ->       Any:
												_a      :       Dict   =						UperNetForSemanticSegmentation(config=_a			)
												model.to(_a			)
												model.eval()
												_a      :       List[str]   =						model(_a			)
												self.parent.assertEqual(
												    result.logits.shape			,				(self.batch_size, self.num_labels, self.image_size, self.image_size)			)




							def 							__lowercase							(     self			)       ->       Optional[Any]:
												_a      :       Tuple   =						self.prepare_config_and_inputs()
												(
												    (
												    _a
												) ,   (
												    _a
												) ,   (
												    _a
												) ,   
												)      :       Dict   =						config_and_inputs
												_a      :       Union[str, Any]   =						{'''pixel_values''': pixel_values}
												return config, inputs_dict



@require_torch
class 							UpperCAmelCase_						(     __lowercase							,			__lowercase							,			unittest.TestCase  ):
							"""simple docstring"""







							UpperCAmelCase__			:		Tuple             =       (UperNetForSemanticSegmentation,) if is_torch_available() else ()
							UpperCAmelCase__			:		Union[str, Any]             =       {"image-segmentation": UperNetForSemanticSegmentation} if is_torch_available() else {}
							UpperCAmelCase__			:		Tuple             =       False
							UpperCAmelCase__			:		int             =       False
							UpperCAmelCase__			:		List[Any]             =       False
							UpperCAmelCase__			:		List[Any]             =       False
							UpperCAmelCase__			:		Tuple             =       False
							UpperCAmelCase__			:		Tuple             =       False


							def 							__lowercase							(     self			)       ->       str:
												_a      :       Dict   =						UperNetModelTester(self			)
												_a      :       Tuple   =						ConfigTester(self			,				config_class=_a			,				has_text_modality=_a			,				hidden_size=3_7			)


							def 							__lowercase							(     self			)       ->       int:
												self.create_and_test_config_common_properties()
												self.config_tester.create_and_test_config_to_json_string()
												self.config_tester.create_and_test_config_to_json_file()
												self.config_tester.create_and_test_config_from_and_save_pretrained()
												self.config_tester.create_and_test_config_with_num_labels()
												self.config_tester.check_config_can_be_init_without_params()
												self.config_tester.check_config_arguments_init()


							def 							__lowercase							(     self			)       ->       Optional[int]:
												return


							def 							__lowercase							(     self			)       ->       Tuple:
												_a ,   _a      :       int   =						self.model_tester.prepare_config_and_inputs_for_common()

												for model_class in self.all_model_classes:
																	_a      :       Tuple   =						model_class(_a			)
																	_a      :       int   =						inspect.signature(model.forward			)
																	# signature.parameters is an OrderedDict => so arg_names order is deterministic
																	_a      :       Any   =						[*signature.parameters.keys()]

																	_a      :       Any   =						['''pixel_values''']
																	self.assertListEqual(arg_names[:1]			,				_a			)


							def 							__lowercase							(     self			)       ->       Tuple:
												_a      :       Dict   =						self.model_tester.prepare_config_and_inputs()
												self.model_tester.create_and_check_for_semantic_segmentation(*_a			)


							@unittest.skip(reason='''UperNet does not use inputs_embeds'''			)
							def 							__lowercase							(     self			)       ->       Optional[int]:
												pass


							@unittest.skip(reason='''UperNet does not support input and output embeddings'''			)
							def 							__lowercase							(     self			)       ->       Dict:
												pass


							@unittest.skip(reason='''UperNet does not have a base model'''			)
							def 							__lowercase							(     self			)       ->       Dict:
												pass


							@unittest.skip(reason='''UperNet does not have a base model'''			)
							def 							__lowercase							(     self			)       ->       int:
												pass


							@require_torch_multi_gpu
							@unittest.skip(reason='''UperNet has some layers using `add_module` which doesn\'t work well with `nn.DataParallel`'''			)
							def 							__lowercase							(     self			)       ->       Any:
												pass


							@unittest.skip('''Will be fixed soon by reducing the size of the model used for common tests.'''			)
							def 							__lowercase							(     self			)       ->       List[str]:
												pass


							def 							__lowercase							(     self			)       ->       int:
												def check_hidden_states_output(_a			,				_a			,				_a			):
																	_a      :       Union[str, Any]   =						model_class(_a			)
																	model.to(_a			)
																	model.eval()

																	with torch.no_grad():
																						_a      :       Any   =						model(**self._prepare_for_class(_a			,				_a			)			)

																	_a      :       Optional[Any]   =						outputs.encoder_hidden_states if config.is_encoder_decoder else outputs.hidden_states

																	_a      :       Optional[int]   =						self.model_tester.num_stages
																	self.assertEqual(len(_a			)			,				expected_num_stages + 1			)

																	# ConvNext's feature maps are of shape (batch_size, num_channels, height, width)
																	self.assertListEqual(
																	    list(hidden_states[0].shape[-2:]			)			,				[self.model_tester.image_size // 4, self.model_tester.image_size // 4]			,				)

												_a ,   _a      :       Optional[Any]   =						self.model_tester.prepare_config_and_inputs_for_common()

												for model_class in self.all_model_classes:
																	_a      :       int   =						True
																	check_hidden_states_output(_a			,				_a			,				_a			)

																	# check that output_hidden_states also work using config
																	del inputs_dict["output_hidden_states"]
																	_a      :       int   =						True

																	check_hidden_states_output(_a			,				_a			,				_a			)


							def 							__lowercase							(     self			)       ->       int:
												_a ,   _a      :       int   =						self.model_tester.prepare_config_and_inputs_for_common()

												_a      :       List[str]   =						_config_zero_init(_a			)
												_a      :       Tuple   =						_config_zero_init(configs_no_init.backbone_config			)
												for model_class in self.all_model_classes:
																	_a      :       Dict   =						model_class(config=_a			)
																	for name, param in model.named_parameters():
																						if param.requires_grad:
																											self.assertIn(
																											    ((param.data.mean() * 1e9).round() / 1e9).item()			,				[0.0, 1.0]			,				msg=F"""Parameter {name} of model {model_class} seems not properly initialized"""			,				)


							@unittest.skip(reason='''UperNet does not have tied weights'''			)
							def 							__lowercase							(     self			)       ->       List[Any]:
												pass




							@slow
							def 							__lowercase							(     self			)       ->       Union[str, Any]:
												for model_name in UPERNET_PRETRAINED_MODEL_ARCHIVE_LIST[:1]:
																	_a      :       Tuple   =						UperNetForSemanticSegmentation.from_pretrained(_a			)
																	self.assertIsNotNone(_a			)



def   __UpperCAmelCase					(      )     ->	Dict:

					"""simple docstring"""

					_a      :       str   =						hf_hub_download(
					    repo_id='''hf-internal-testing/fixtures_ade20k'''						,repo_type='''dataset'''						,filename='''ADE_val_00000001.jpg'''      )
					_a      :       Optional[int]   =						Image.open(__a      ).convert('''RGB'''      )
					return image







@require_torch
@require_vision
@slow
class 							UpperCAmelCase_						(     unittest.TestCase  ):
							"""simple docstring"""







							def 							__lowercase							(     self			)       ->       int:
												_a      :       List[str]   =						AutoImageProcessor.from_pretrained('''openmmlab/upernet-swin-tiny'''			)
												_a      :       List[str]   =						UperNetForSemanticSegmentation.from_pretrained('''openmmlab/upernet-swin-tiny'''			).to(_a			)

												_a      :       List[str]   =						prepare_img()
												_a      :       Union[str, Any]   =						processor(images=_a			,				return_tensors='''pt'''			).to(_a			)

												with torch.no_grad():
																	_a      :       Union[str, Any]   =						model(**_a			)

												_a      :       str   =						torch.Size((1, model.config.num_labels, 5_1_2, 5_1_2)			)
												self.assertEqual(outputs.logits.shape			,				_a			)

												_a      :       Tuple   =						torch.tensor(
												    [[-7.5958, -7.5958, -7.4302], [-7.5958, -7.5958, -7.4302], [-7.4797, -7.4797, -7.3068]]			).to(_a			)
												self.assertTrue(torch.allclose(outputs.logits[0, 0, :3, :3]			,				_a			,				atol=1e-4			)			)




							def 							__lowercase							(     self			)       ->       str:
												_a      :       Tuple   =						AutoImageProcessor.from_pretrained('''openmmlab/upernet-convnext-tiny'''			)
												_a      :       Union[str, Any]   =						UperNetForSemanticSegmentation.from_pretrained('''openmmlab/upernet-convnext-tiny'''			).to(_a			)

												_a      :       Dict   =						prepare_img()
												_a      :       Union[str, Any]   =						processor(images=_a			,				return_tensors='''pt'''			).to(_a			)

												with torch.no_grad():
																	_a      :       Dict   =						model(**_a			)

												_a      :       int   =						torch.Size((1, model.config.num_labels, 5_1_2, 5_1_2)			)
												self.assertEqual(outputs.logits.shape			,				_a			)

												_a      :       Any   =						torch.tensor(
												    [[-8.8110, -8.8110, -8.6521], [-8.8110, -8.8110, -8.6521], [-8.7746, -8.7746, -8.6130]]			).to(_a			)
												self.assertTrue(torch.allclose(outputs.logits[0, 0, :3, :3]			,				_a			,				atol=1e-4			)			)








from typing import Dict, List, Optional, Union

import numpy as np

from .feature_extraction_utils import BatchFeature, FeatureExtractionMixin
from .utils import PaddingStrategy, TensorType, is_tf_tensor, is_torch_tensor, logging, to_numpy


a_      :      Optional[int]    =     logging.get_logger(__name__)
class    __UpperCamelCase			(       _lowercase				):

 """simple docstring"""



 def __init__(	self		,				SCREAMING_SNAKE_CASE		,				SCREAMING_SNAKE_CASE		,				SCREAMING_SNAKE_CASE		,				**SCREAMING_SNAKE_CASE      ) ->			int:
  a__												= feature_size
  a__												= sampling_rate
  a__												= padding_value

  a__												= kwargs.pop('''padding_side'''		,				'''right'''      )
  a__												= kwargs.pop('''return_attention_mask'''		,				SCREAMING_SNAKE_CASE      )

  super().__init__(**SCREAMING_SNAKE_CASE      )

 def 						_UpperCAmelCase       (	self		,				SCREAMING_SNAKE_CASE		,				SCREAMING_SNAKE_CASE = True		,				SCREAMING_SNAKE_CASE = None		,				SCREAMING_SNAKE_CASE = False		,				SCREAMING_SNAKE_CASE = None		,				SCREAMING_SNAKE_CASE = None		,				SCREAMING_SNAKE_CASE = None		,				) ->			BatchFeature:
  # If we have a list of dicts, let's convert it in a dict of lists
  # We do this to allow using this method as a collate_fn function in PyTorch Dataloader
  if isinstance(SCREAMING_SNAKE_CASE		,				(list, tuple)      ) and isinstance(processed_features[0]		,				(dict, BatchFeature)      ):
   a__												= {
       key: [example[key] for example in processed_features] for key in processed_features[0].keys()
   }

  # The model's main input name, usually `input_values`, has be passed for padding
  if self.model_input_names[0] not in processed_features:
   raise ValueError(
       '''You should supply an instance of `transformers.BatchFeature` or list of `transformers.BatchFeature`'''
       f" to this method that includes {self.model_input_names[0]}, but you provided"
       f" {list(processed_features.keys()      )}"      )

  a__												= processed_features[self.model_input_names[0]]
  a__												= (
      return_attention_mask if return_attention_mask is not None else self.return_attention_mask
  )

  if len(SCREAMING_SNAKE_CASE      ) == 0:
   if return_attention_mask:
    a__												= []
   return processed_features

  # If we have PyTorch/TF tensors or lists as inputs, we cast them as Numpy arrays
  # and rebuild them afterwards if no return_tensors is specified
  # Note that we lose the specific device the tensor may be on for PyTorch

  a__												= required_input[0]
  if isinstance(SCREAMING_SNAKE_CASE		,				(list, tuple)      ):
   # first_element might be an empty list/tuple in some edge cases so we grab the first non empty element.
   a__												= 0
   while len(required_input[index]      ) == 0:
    index += 1
   if index < len(SCREAMING_SNAKE_CASE      ):
    a__												= required_input[index][0]

  if return_tensors is None:
   if is_tf_tensor(SCREAMING_SNAKE_CASE      ):
    a__												= '''tf'''
   elif is_torch_tensor(SCREAMING_SNAKE_CASE      ):
    a__												= '''pt'''
   elif isinstance(SCREAMING_SNAKE_CASE		,				(int, float, list, tuple, np.ndarray)      ):
    a__												= '''np'''
   else:
    raise ValueError(
        f"type of {first_element} unknown: {type(SCREAMING_SNAKE_CASE      )}. "
        '''Should be one of a python, numpy, pytorch or tensorflow object.'''      )

  for key, value in processed_features.items():
   if isinstance(value[0]		,				(int, float)      ):
    a__												= to_numpy(SCREAMING_SNAKE_CASE      )
   else:
    a__												= [to_numpy(SCREAMING_SNAKE_CASE      ) for v in value]

        # Convert padding_strategy in PaddingStrategy
  a__												= self._get_padding_strategies(padding=SCREAMING_SNAKE_CASE		,				max_length=SCREAMING_SNAKE_CASE      )

  a__												= processed_features[self.model_input_names[0]]

  a__												= len(SCREAMING_SNAKE_CASE      )
  if not all(len(SCREAMING_SNAKE_CASE      ) == batch_size for v in processed_features.values()      ):
   raise ValueError('''Some items in the output dictionary have a different batch size than others.'''      )

  a__												= []
  for i in range(SCREAMING_SNAKE_CASE      ):
   a__												= {k: v[i] for k, v in processed_features.items()}
   # truncation
   a__												= self._truncate(
       SCREAMING_SNAKE_CASE		,				max_length=SCREAMING_SNAKE_CASE		,				pad_to_multiple_of=SCREAMING_SNAKE_CASE		,				truncation=SCREAMING_SNAKE_CASE		,				)
   truncated_inputs.append(SCREAMING_SNAKE_CASE      )

  if padding_strategy == PaddingStrategy.LONGEST:
   # make sure that `max_length` cannot be longer than the longest truncated length
   a__												= max(len(input_slice[self.model_input_names[0]]      ) for input_slice in truncated_inputs      )
   a__												= PaddingStrategy.MAX_LENGTH

  a__												= {}
  for i in range(SCREAMING_SNAKE_CASE      ):
   # padding
   a__												= self._pad(
       truncated_inputs[i]		,				max_length=SCREAMING_SNAKE_CASE		,				padding_strategy=SCREAMING_SNAKE_CASE		,				pad_to_multiple_of=SCREAMING_SNAKE_CASE		,				return_attention_mask=SCREAMING_SNAKE_CASE		,				)

   for key, value in outputs.items():
    if key not in batch_outputs:
     a__												= []
    if value.dtype is np.dtype(np.floataa      ):
     a__												= value.astype(np.floataa      )
    batch_outputs[key].append(SCREAMING_SNAKE_CASE      )

  return BatchFeature(SCREAMING_SNAKE_CASE		,				tensor_type=SCREAMING_SNAKE_CASE      )

 def 						_UpperCAmelCase       (	self		,				SCREAMING_SNAKE_CASE		,				SCREAMING_SNAKE_CASE = None		,				SCREAMING_SNAKE_CASE = PaddingStrategy.DO_NOT_PAD		,				SCREAMING_SNAKE_CASE = None		,				SCREAMING_SNAKE_CASE = None		,				) ->			dict:
  a__												= processed_features[self.model_input_names[0]]

  if padding_strategy == PaddingStrategy.LONGEST:
   a__												= len(SCREAMING_SNAKE_CASE      )

  if max_length is not None and pad_to_multiple_of is not None and (max_length % pad_to_multiple_of != 0):
   a__												= ((max_length // pad_to_multiple_of) + 1) * pad_to_multiple_of

  a__												= padding_strategy != PaddingStrategy.DO_NOT_PAD and len(SCREAMING_SNAKE_CASE      ) < max_length

  if return_attention_mask and "attention_mask" not in processed_features:
   a__												= np.ones(len(SCREAMING_SNAKE_CASE      )		,				dtype=np.intaa      )

  if needs_to_be_padded:
   a__												= max_length - len(SCREAMING_SNAKE_CASE      )
   if self.padding_side == "right":
    if return_attention_mask:
     a__												= np.pad(
         processed_features['''attention_mask''']		,				(0, difference)      )
    a__												= ((0, difference), (0, 0)) if self.feature_size > 1 else (0, difference)
    a__												= np.pad(
        SCREAMING_SNAKE_CASE		,				SCREAMING_SNAKE_CASE		,				'''constant'''		,				constant_values=self.padding_value      )
   elif self.padding_side == "left":
    if return_attention_mask:
     a__												= np.pad(
         processed_features['''attention_mask''']		,				(difference, 0)      )
    a__												= ((difference, 0), (0, 0)) if self.feature_size > 1 else (difference, 0)
    a__												= np.pad(
        SCREAMING_SNAKE_CASE		,				SCREAMING_SNAKE_CASE		,				'''constant'''		,				constant_values=self.padding_value      )
   else:
    raise ValueError('''Invalid padding strategy:''' + str(self.padding_side      )      )

  return processed_features

 def 						_UpperCAmelCase       (	self		,				SCREAMING_SNAKE_CASE		,				SCREAMING_SNAKE_CASE = None		,				SCREAMING_SNAKE_CASE = None		,				SCREAMING_SNAKE_CASE = None		,				) ->			Optional[Any]:
  if not truncation:
   return processed_features
  elif truncation and max_length is None:
   raise ValueError('''When setting ``truncation=True``, make sure that ``max_length`` is defined.'''      )

  a__												= processed_features[self.model_input_names[0]]

  # find `max_length` that fits `pad_to_multiple_of`
  if max_length is not None and pad_to_multiple_of is not None and (max_length % pad_to_multiple_of != 0):
   a__												= ((max_length // pad_to_multiple_of) + 1) * pad_to_multiple_of

  a__												= len(SCREAMING_SNAKE_CASE      ) > max_length

  if needs_to_be_truncated:
   a__												= processed_features[self.model_input_names[0]][:max_length]
   if "attention_mask" in processed_features:
    a__												= processed_features['''attention_mask'''][:max_length]

  return processed_features



 def 						_UpperCAmelCase       (	self		,				SCREAMING_SNAKE_CASE=False		,				SCREAMING_SNAKE_CASE=None      ) ->			Optional[Any]:

  # Get padding strategy
  if padding is not False:
   if padding is True:
    a__												= PaddingStrategy.LONGEST  # Default to pad to the longest sequence in the batch
   elif not isinstance(SCREAMING_SNAKE_CASE		,				SCREAMING_SNAKE_CASE      ):
    a__												= PaddingStrategy(SCREAMING_SNAKE_CASE      )
   elif isinstance(SCREAMING_SNAKE_CASE		,				SCREAMING_SNAKE_CASE      ):
    a__												= padding
  else:
   a__												= PaddingStrategy.DO_NOT_PAD

  # Set max length if needed
  if max_length is None:
   if padding_strategy == PaddingStrategy.MAX_LENGTH:
    raise ValueError(
        f"When setting ``padding={PaddingStrategy.MAX_LENGTH}``, make sure that max_length is defined"      )

        # Test if we have a padding value
  if padding_strategy != PaddingStrategy.DO_NOT_PAD and (self.padding_value is None):
   raise ValueError(
       '''Asking to pad but the feature_extractor does not have a padding value. Please select a value to use'''
       ''' as `padding_value`. For example: `feature_extractor.padding_value = 0.0`.'''      )

  return padding_strategy





