Source code for wormpose.images.scoring.scoring_data_manager

from abc import ABC
from contextlib import AbstractContextManager
from typing import Sequence

import numpy as np

from wormpose import BaseFramesDataset


[docs]class BaseScoringDataManager(AbstractContextManager, Sequence, ABC): """ Accessor for the data necessary to perform the scoring, including: - The image that needs to be scored - The image that will be used as a template for scoring, plus relevant infos: skeleton and measurements """ pass
[docs]class ScoringDataManager(BaseScoringDataManager): """ Implementation of the BaseScoringDataManager for scoring videos: it finds the closest template in time for a frame in a video """ def __init__(self, frames_dataset: BaseFramesDataset, features, video_name: str): self.features = features self.video_name = video_name self._frames_dataset = frames_dataset self._frames_reader = None self._frames = None def __enter__(self): self._frames_reader = self._frames_dataset.open(self.video_name) self._frames = self._frames_reader.__enter__() return self def __exit__(self, exc_type, exc_value, traceback): self._frames_reader.__exit__(exc_type, exc_value, traceback) self._frames_reader = None self._frames = None def __getitem__(self, frame_index: int): template_indexes = self.features.labelled_indexes # find the template image the most closely in time to the frame to score template_index = template_indexes[np.abs(template_indexes - frame_index).argmin()] return ( self._frames[template_index], self.features.skeletons[template_index], self.features.measurements, self._frames[frame_index], ) def __len__(self): return len(self._frames)