Source code for otx.api.entities.metadata
"""This module defines classes representing metadata information."""
# Copyright (C) 2021-2022 Intel Corporation
# SPDX-License-Identifier: Apache-2.0
#
import abc
from enum import Enum, auto
from typing import Any, Optional
from otx.api.entities.model import ModelEntity
[docs]
class IMetadata(metaclass=abc.ABCMeta):
"""This interface represents any additional metadata information which can be connected to an IMedia."""
__name = Optional[str]
@property
def name(self):
"""Gets or sets the name of the Metadata item."""
return self.__name
@name.setter
def name(self, value):
self.__name = value
[docs]
class FloatType(Enum):
"""Represents the use of the FloatMetadata."""
FLOAT = auto() # Regular float, without particular context
EMBEDDING_VALUE = auto()
ACTIVE_SCORE = auto()
def __str__(self):
"""Return the name of FloatType enum."""
return str(self.name)
[docs]
class FloatMetadata(IMetadata):
"""This class represents metadata of type float.
Args:
name (str): Name of the metadata.
value (float): Value of the metadata.
float_type (FloatType): Type of the metadata.
"""
def __init__(self, name: str, value: float, float_type: FloatType = FloatType.FLOAT):
self.name = name
self.value = value
self.float_type = float_type
def __repr__(self):
"""Prints the model, data and type of the MetadataItemEntity."""
return f"FloatMetadata({self.name}, {self.value}, {self.float_type})"
def __eq__(self, other):
"""Checks if two FloatMetadata have the same name, value and type."""
return self.name == other.name and self.value == other.value and self.float_type == other.float_type
[docs]
class VideoMetadata(IMetadata):
"""This class represents metadata of video.
Args:
video_id (str): id(name) for video.
frame_idx (int): Index for frame.
is_empty_frame(bool): whether this is empty frame(for action detection)
"""
def __init__(self, video_id: str, frame_idx: int, is_empty_frame: bool):
self.video_id = video_id
self.frame_idx = frame_idx
self.is_empty_frame = is_empty_frame
self.metadata = {"video_id": video_id, "frame_idx": frame_idx, "is_empty_frame": is_empty_frame}
def __repr__(self):
"""Prints the video_id, frame_id and type of the MetadataItemEntity."""
out_string = "VideoMetadata"
out_string += f"({self.metadata})"
return out_string
def __eq__(self, other):
"""Checks if two VideoMetadata have the same name, value and type."""
return self.metadata == other.metadata
[docs]
def update(self, key: str, value: Any):
"""Update metadata infomation."""
setattr(self, key, value)
self.metadata[key] = value
[docs]
class MetadataItemEntity:
"""This class is a wrapper class which connects the metadata value to model, which was used to generate it.
Args:
data (IMetadata): The metadata value.
model (Optional[ModelEntity]): The model which was used to generate the metadata. Defaults to None.
"""
def __init__(
self,
data: Any,
model: Optional[ModelEntity] = None,
):
self.data = data
self.model = model
def __repr__(self):
"""Prints the model and data of the MetadataItemEntity."""
return f"MetadataItemEntity(model={self.model})"
def __eq__(self, other):
"""Returns true if the model and the data match the other MetadataItemEntity."""
return self.model == other.model and self.data == other.data