Source code for otx.api.entities.result_media
"""This module implements the ResultMediaEntity."""
# Copyright (C) 2022 Intel Corporation
# SPDX-License-Identifier: Apache-2.0
#
from typing import Optional
import numpy as np
from otx.api.entities.annotation import Annotation, AnnotationSceneEntity
from otx.api.entities.label import LabelEntity
from otx.api.entities.metadata import IMetadata
from otx.api.entities.shapes.rectangle import Rectangle
# pylint: disable=too-many-instance-attributes; Requires refactor
[docs]
class ResultMediaEntity(IMetadata):
"""Represents a media (e.g. an image which was generated by a task).
For instance, a `ResultMediaEntity` could be an attention map generated by a classification task.
The result media contains media data, which is associated with a
`otx.api.entities.annotation.AnnotationSceneEntity` and related to an optional
`otx.api.entities.label.LabelEntity`.
Example:
>>> from otx.api.entities.annotation import (
Annotation,
AnnotationSceneEntity,
AnnotationSceneKind,
)
>>> from otx.api.entities.id import ID
>>> from otx.api.entities.label import Domain, LabelEntity
>>> from otx.api.entities.result_media import ResultMediaEntity
>>> from otx.api.entities.scored_label import LabelSource, ScoredLabel
>>> from otx.api.entities.shapes.rectangle import Rectangle
>>> source = LabelSource(
user_id="user_entity", model_id=ID("efficientnet"), model_storage_id=ID("efficientnet-storage")
)
>>> falcon_label = LabelEntity(name="Falcon", domain=Domain.DETECTION)
>>> eagle_label = LabelEntity(name="Eagle", domain=Domain.DETECTION)
>>> falcon_bb = Rectangle(x1=0.0, y1=0.0, x2=0.5, y2=0.5)
>>> falcon_scored_label = ScoredLabel(label=falcon_label, probability=0.9, label_source=source)
>>> eagle_bb = Rectangle(x1=0.2, y1=0.2, x2=0.8, y2=0.8)
>>> eagle_scored_label = ScoredLabel(label=eagle_label, probability=0.6, label_source=source)
>>> annotation_scene = AnnotationSceneEntity(
annotations=[
Annotation(shape=falcon_bb, labels=[falcon_scored_label]),
Annotation(shape=eagle_bb, labels=[eagle_scored_label]),
], kind=AnnotationSceneKind.PREDICTION
)
>>> ResultMediaEntity(
name="Model Predictions",
type="Bounding Box Annotations",
annotation_scene=annotation_scene,
numpy=image_array
)
Args:
name (str): Name.
type (str): The type of data (e.g. Attention map). This type is descriptive.
annotation_scene (AnnotationScene Entity): Associated annotation which was generated by the task
alongside this media.
numpy (np.ndarray): The data as a numpy array.
roi (Optional[Annotation]): The ROI covered by this media. If null, assume the entire image. Defaults to None.
label (Optional[LabelEntity]): A label associated with this media. Defaults to None.
"""
# pylint: disable=redefined-builtin, too-many-arguments;
def __init__(
self,
name: str,
type: str,
annotation_scene: AnnotationSceneEntity,
numpy: np.ndarray,
roi: Optional[Annotation] = None,
label: Optional[LabelEntity] = None,
):
self.name = name
self.type = type
self.annotation_scene = annotation_scene
self.roi = Annotation(Rectangle.generate_full_box(), labels=[]) if roi is None else roi
self.label = label
self._numpy = np.copy(numpy)
def __repr__(self):
"""Returns a string with all the attributes of the ResultMediaEntity."""
return (
"ResultMediaEntity("
f"name={self.name}, "
f"type={self.type}, "
f"annotation_scene={self.annotation_scene}, "
f"roi={self.roi}, "
f"label={self.label})"
)
@property
def width(self) -> int:
"""Returns the width of the result media."""
return self.numpy.shape[1]
@property
def height(self) -> int:
"""Returns the height of the result media."""
return self.numpy.shape[0]
@property
def numpy(self) -> np.ndarray:
"""Returns the data."""
return self._numpy
@numpy.setter
def numpy(self, value):
self._numpy = value
def __eq__(self, other):
"""Checks if the annotation_scene and roi matches with the other ResultMediaEntity."""
if isinstance(other, ResultMediaEntity):
return self.annotation_scene == other.annotation_scene and self.roi == other.roi
return False