






from typing import TYPE_CHECKING

from ...utils import (
    OptionalDependencyNotAvailable,
    _LazyModule,
    is_flax_available,
    is_tf_available,
    is_tokenizers_available,
    is_torch_available,
)


a_		:						Any             =    {
    'configuration_electra': ['ELECTRA_PRETRAINED_CONFIG_ARCHIVE_MAP', 'ElectraConfig', 'ElectraOnnxConfig'],
    'tokenization_electra': ['ElectraTokenizer'],
}

try:
				if not is_tokenizers_available():
								raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
				pass
else:
				a_		:						str             =    ['ElectraTokenizerFast']

try:
				if not is_torch_available():
								raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
				pass
else:
				a_		:						Optional[Any]             =    [
				    'ELECTRA_PRETRAINED_MODEL_ARCHIVE_LIST',
				    'ElectraForCausalLM',
				    'ElectraForMaskedLM',
				    'ElectraForMultipleChoice',
				    'ElectraForPreTraining',
				    'ElectraForQuestionAnswering',
				    'ElectraForSequenceClassification',
				    'ElectraForTokenClassification',
				    'ElectraModel',
				    'ElectraPreTrainedModel',
				    'load_tf_weights_in_electra',
				]

try:
				if not is_tf_available():
								raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
				pass
else:
				a_		:						Dict             =    [
				    'TF_ELECTRA_PRETRAINED_MODEL_ARCHIVE_LIST',
				    'TFElectraForMaskedLM',
				    'TFElectraForMultipleChoice',
				    'TFElectraForPreTraining',
				    'TFElectraForQuestionAnswering',
				    'TFElectraForSequenceClassification',
				    'TFElectraForTokenClassification',
				    'TFElectraModel',
				    'TFElectraPreTrainedModel',
				]

try:
				if not is_flax_available():
								raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
				pass
else:
				a_		:						Optional[Any]             =    [
				    'FlaxElectraForCausalLM',
				    'FlaxElectraForMaskedLM',
				    'FlaxElectraForMultipleChoice',
				    'FlaxElectraForPreTraining',
				    'FlaxElectraForQuestionAnswering',
				    'FlaxElectraForSequenceClassification',
				    'FlaxElectraForTokenClassification',
				    'FlaxElectraModel',
				    'FlaxElectraPreTrainedModel',
				]


if TYPE_CHECKING:
				from .configuration_electra import ELECTRA_PRETRAINED_CONFIG_ARCHIVE_MAP, ElectraConfig, ElectraOnnxConfig
				from .tokenization_electra import ElectraTokenizer

				try:
								if not is_tokenizers_available():
												raise OptionalDependencyNotAvailable()
				except OptionalDependencyNotAvailable:
								pass
				else:
								from .tokenization_electra_fast import ElectraTokenizerFast

				try:
								if not is_torch_available():
												raise OptionalDependencyNotAvailable()
				except OptionalDependencyNotAvailable:
								pass
				else:
								from .modeling_electra import (
								    ELECTRA_PRETRAINED_MODEL_ARCHIVE_LIST,
								    ElectraForCausalLM,
								    ElectraForMaskedLM,
								    ElectraForMultipleChoice,
								    ElectraForPreTraining,
								    ElectraForQuestionAnswering,
								    ElectraForSequenceClassification,
								    ElectraForTokenClassification,
								    ElectraModel,
								    ElectraPreTrainedModel,
								    load_tf_weights_in_electra,
								)

				try:
								if not is_tf_available():
												raise OptionalDependencyNotAvailable()
				except OptionalDependencyNotAvailable:
								pass
				else:
								from .modeling_tf_electra import (
								    TF_ELECTRA_PRETRAINED_MODEL_ARCHIVE_LIST,
								    TFElectraForMaskedLM,
								    TFElectraForMultipleChoice,
								    TFElectraForPreTraining,
								    TFElectraForQuestionAnswering,
								    TFElectraForSequenceClassification,
								    TFElectraForTokenClassification,
								    TFElectraModel,
								    TFElectraPreTrainedModel,
								)

				try:
								if not is_flax_available():
												raise OptionalDependencyNotAvailable()
				except OptionalDependencyNotAvailable:
								pass
				else:
								from .modeling_flax_electra import (
								    FlaxElectraForCausalLM,
								    FlaxElectraForMaskedLM,
								    FlaxElectraForMultipleChoice,
								    FlaxElectraForPreTraining,
								    FlaxElectraForQuestionAnswering,
								    FlaxElectraForSequenceClassification,
								    FlaxElectraForTokenClassification,
								    FlaxElectraModel,
								    FlaxElectraPreTrainedModel,
								)

else:
				import sys

				a_		:						int             =    _LazyModule(__name__, globals()['__file__'], _import_structure, module_spec=__spec__)












from typing import Any, Dict, List, Union

from ..utils import add_end_docstrings, is_torch_available, is_vision_available, logging, requires_backends
from .base import PIPELINE_INIT_ARGS, Pipeline


if is_vision_available():
				from ..image_utils import load_image


if is_torch_available():
				import torch

				from ..models.auto.modeling_auto import MODEL_FOR_OBJECT_DETECTION_MAPPING, MODEL_FOR_TOKEN_CLASSIFICATION_MAPPING

a_		:						str             =    logging.get_logger(__name__)


a_		:						List[Any]             =    Dict[str, Any]
a_		:						Optional[int]             =    List[Prediction]

@add_end_docstrings(A__					)
class 		_snake_case  (  A__					):






			def __init__(       self		,					*a		,					**a)      ->       int:
						super().__init__(*a		,					**a)

						if self.framework == "tf":
									raise ValueError(f'''The {self.__class__} is only available in PyTorch.''')

						requires_backends(self		,					'vision')
						self.check_model_type(
						    dict(MODEL_FOR_OBJECT_DETECTION_MAPPING.items() + MODEL_FOR_TOKEN_CLASSIFICATION_MAPPING.items()))






			def    SCREAMING_SNAKE_CASE__    (       self		,					**a)      ->       int:
						SCREAMING_SNAKE_CASE						= {}
						if "threshold" in kwargs:
									SCREAMING_SNAKE_CASE						= kwargs['threshold']
						return {}, {}, postprocess_kwargs






			def __call__(       self		,					*a		,					**a)      ->       Union[Predictions, List[Prediction]]:
						return super().__call__(*a		,					**a)






			def    SCREAMING_SNAKE_CASE__    (       self		,					a)      ->       List[str]:
						SCREAMING_SNAKE_CASE						= load_image(a)
						SCREAMING_SNAKE_CASE						= torch.IntTensor([[image.height, image.width]])
						SCREAMING_SNAKE_CASE						= self.image_processor(images=[image]		,					return_tensors='pt')
						if self.tokenizer is not None:
									SCREAMING_SNAKE_CASE						= self.tokenizer(text=inputs['words']		,					boxes=inputs['boxes']		,					return_tensors='pt')
						SCREAMING_SNAKE_CASE						= target_size
						return inputs






			def    SCREAMING_SNAKE_CASE__    (       self		,					a)      ->       int:
						SCREAMING_SNAKE_CASE						= model_inputs.pop('target_size')
						SCREAMING_SNAKE_CASE						= self.model(**a)
						SCREAMING_SNAKE_CASE						= outputs.__class__({'target_size': target_size, **outputs})
						if self.tokenizer is not None:
									SCREAMING_SNAKE_CASE						= model_inputs['bbox']
						return model_outputs






			def    SCREAMING_SNAKE_CASE__    (       self		,					a		,					a=0.9)      ->       Dict:
						SCREAMING_SNAKE_CASE						= model_outputs['target_size']
						if self.tokenizer is not None:
									# This is a LayoutLMForTokenClassification variant.
									# The OCR got the boxes and the model classified the words.
									SCREAMING_SNAKE_CASE				,						SCREAMING_SNAKE_CASE						= target_size[0].tolist()

									def unnormalize(a):
												return self._get_bounding_box(
												    torch.Tensor(
												        [
												            (width * bbox[0] / 1000),
												            (height * bbox[1] / 1000),
												            (width * bbox[2] / 1000),
												            (height * bbox[3] / 1000),
												        ]))

									SCREAMING_SNAKE_CASE				,						SCREAMING_SNAKE_CASE						= model_outputs['logits'].squeeze(0).softmax(dim=-1).max(dim=-1)
									SCREAMING_SNAKE_CASE						= [self.model.config.idalabel[prediction] for prediction in classes.tolist()]
									SCREAMING_SNAKE_CASE						= [unnormalize(a) for bbox in model_outputs['bbox'].squeeze(0)]
									SCREAMING_SNAKE_CASE						= ['score', 'label', 'box']
									SCREAMING_SNAKE_CASE						= [dict(zip(a		,					a)) for vals in zip(scores.tolist()		,					a		,					a) if vals[0] > threshold]
						else:
									# This is a regular ForObjectDetectionModel
									SCREAMING_SNAKE_CASE						= self.image_processor.post_process_object_detection(a		,					a		,					a)
									SCREAMING_SNAKE_CASE						= raw_annotations[0]
									SCREAMING_SNAKE_CASE						= raw_annotation['scores']
									SCREAMING_SNAKE_CASE						= raw_annotation['labels']
									SCREAMING_SNAKE_CASE						= raw_annotation['boxes']

									SCREAMING_SNAKE_CASE						= scores.tolist()
									SCREAMING_SNAKE_CASE						= [self.model.config.idalabel[label.item()] for label in labels]
									SCREAMING_SNAKE_CASE						= [self._get_bounding_box(a) for box in boxes]

									# {"scores": [...], ...} --> [{"score":x, ...}, ...]
									SCREAMING_SNAKE_CASE						= ['score', 'label', 'box']
									SCREAMING_SNAKE_CASE						= [
									    dict(zip(a		,					a))
									    for vals in zip(raw_annotation['scores']		,					raw_annotation['labels']		,					raw_annotation['boxes'])
									]

						return annotation







			def    SCREAMING_SNAKE_CASE__    (       self		,					a)      ->       Dict[str, int]:
						if self.framework != "pt":
									raise ValueError('The ObjectDetectionPipeline is only available in PyTorch.')
						SCREAMING_SNAKE_CASE				,						SCREAMING_SNAKE_CASE				,						SCREAMING_SNAKE_CASE				,						SCREAMING_SNAKE_CASE						= box.int().tolist()
						SCREAMING_SNAKE_CASE						= {
						    'xmin': xmin,
						    'ymin': ymin,
						    'xmax': xmax,
						    'ymax': ymax,
						}
						return bbox




