Source code for otx.api.entities.resultset
"""This module implements the ResultSet entity."""
# Copyright (C) 2021-2022 Intel Corporation
# SPDX-License-Identifier: Apache-2.0
#
import abc
import datetime
from enum import Enum
from typing import Optional
from otx.api.entities.datasets import DatasetEntity
from otx.api.entities.id import ID
from otx.api.entities.metrics import NullPerformance, Performance
from otx.api.entities.model import ModelEntity
from otx.api.utils.time_utils import now
[docs]
class ResultsetPurpose(Enum):
"""This defines the purpose of the resultset.
EVALUATION denotes resultsets generated at Evaluation stage on validation subset.
TEST denotes resultsets generated at Evaluation stage on test subset.
PREEVALUATION denotes resultsets generated at Preevaluation stage (e.g., train from
scratch) onn validation subset.
"""
EVALUATION = 0
TEST = 1
PREEVALUATION = 2
def __repr__(self):
"""Returns ResultsetPurpose as a string."""
return str(self.name)
def __str__(self):
"""Returns a user friendly representation of the ResultSetPurpose.
This that can be used for instance in a progress reporting message.
"""
user_friendly_names = {0: "Validation", 1: "Test", 2: "Pre-validation"}
return user_friendly_names[self.value]
[docs]
class ResultSetEntity(metaclass=abc.ABCMeta):
"""ResultsetEntity.
It aggregates:
- the dataset containing ground truth (based on user annotations)
- the dataset containing predictions for the above ground truth dataset
In addition, it links to the model which computed the predictions, as well as the performance of this model on the
ground truth dataset.
Args:
model: the model using which the prediction_dataset has been
generated
ground_truth_dataset: the dataset containing ground truth
annotation
prediction_dataset: the dataset containing prediction
purpose: see :class:`ResultsetPurpose`
performance: the performance of the model on the ground truth
dataset
creation_date: the date time which the resultset is created. Set
to None to set this to
id: the id of the resultset. Set to ID() so that a new unique ID
will be assigned upon saving. If the argument is None, it
will be set to ID()
datetime.now(datetime.timezone.utc)
"""
# pylint: disable=redefined-builtin, too-many-arguments; Requires refactor
def __init__(
self,
model: ModelEntity,
ground_truth_dataset: DatasetEntity,
prediction_dataset: DatasetEntity,
purpose: ResultsetPurpose = ResultsetPurpose.EVALUATION,
performance: Optional[Performance] = None,
creation_date: Optional[datetime.datetime] = None,
id: Optional[ID] = None,
):
id = ID() if id is None else id
performance = NullPerformance() if performance is None else performance
creation_date = now() if creation_date is None else creation_date
self.__id_ = id
self.__model = model
self.__prediction_dataset = prediction_dataset
self.__ground_truth_dataset = ground_truth_dataset
self.__performance = performance
self.__purpose = purpose
self.__creation_date = creation_date
@property
def id_(self) -> ID:
"""Returns the id of the ResultSet."""
return self.__id_
@id_.setter
def id_(self, value: ID) -> None:
self.__id_ = value
@property
def id(self) -> ID:
"""DEPRECATED."""
return self.__id_
@id.setter
def id(self, value: ID):
"""DEPRECATED."""
self.__id_ = value
@property
def model(self) -> ModelEntity:
"""Returns the model that is used for the ResultSet."""
return self.__model
@model.setter
def model(self, value: ModelEntity) -> None:
self.__model = value
@property
def prediction_dataset(self) -> DatasetEntity:
"""Returns the prediction dataset that is used in the ResultSet."""
return self.__prediction_dataset
@prediction_dataset.setter
def prediction_dataset(self, value: DatasetEntity) -> None:
self.__prediction_dataset = value
@property
def ground_truth_dataset(self) -> DatasetEntity:
"""Returns the ground truth dataset that is used in the ResultSet."""
return self.__ground_truth_dataset
@ground_truth_dataset.setter
def ground_truth_dataset(self, value: DatasetEntity) -> None:
self.__ground_truth_dataset = value
@property
def performance(self) -> Performance:
"""Returns the performance of the model on the ground truth dataset."""
return self.__performance
@performance.setter
def performance(self, value: Performance) -> None:
self.__performance = value
@property
def purpose(self) -> ResultsetPurpose:
"""Returns the purpose of the ResultSet, for example ResultSetPurpose.EVALUATION."""
return self.__purpose
@purpose.setter
def purpose(self, value: ResultsetPurpose) -> None:
self.__purpose = value
@property
def creation_date(self) -> datetime.datetime:
"""Returns the creation date of the ResultSet."""
return self.__creation_date
@creation_date.setter
def creation_date(self, value: datetime.datetime) -> None:
self.__creation_date = value
[docs]
def has_score_metric(self) -> bool:
"""Returns True if the resultset contains non-null performance and score value."""
return not isinstance(self.performance, NullPerformance)
def __repr__(self):
"""String representation of the resultset."""
return (
f"{type(self).__name__}("
f"model={self.model}, "
f"ground_truth_dataset={self.ground_truth_dataset}, "
f"prediction_dataset={self.prediction_dataset}, "
f"purpose={self.purpose}, "
f"performance={self.performance}, "
f"creation_date={self.creation_date}, "
f"id={self.id_})"
)