|
|
| from typing import Callable, List, Optional, Union
|
|
|
| import mmengine
|
| from mmengine.fileio import exists
|
|
|
| from mmaction.registry import DATASETS
|
| from mmaction.utils import ConfigType
|
| from .base import BaseActionDataset
|
|
|
|
|
| @DATASETS.register_module()
|
| class ActivityNetDataset(BaseActionDataset):
|
| """ActivityNet dataset for temporal action localization. The dataset loads
|
| raw features and apply specified transforms to return a dict containing the
|
| frame tensors and other information. The ann_file is a json file with
|
| multiple objects, and each object has a key of the name of a video, and
|
| value of total frames of the video, total seconds of the video, annotations
|
| of a video, feature frames (frames covered by features) of the video, fps
|
| and rfps. Example of a annotation file:
|
|
|
| .. code-block:: JSON
|
| {
|
| "v_--1DO2V4K74": {
|
| "duration_second": 211.53,
|
| "duration_frame": 6337,
|
| "annotations": [
|
| {
|
| "segment": [
|
| 30.025882995319815,
|
| 205.2318595943838
|
| ],
|
| "label": "Rock climbing"
|
| }
|
| ],
|
| "feature_frame": 6336,
|
| "fps": 30.0,
|
| "rfps": 29.9579255898
|
| },
|
| "v_--6bJUbfpnQ": {
|
| "duration_second": 26.75,
|
| "duration_frame": 647,
|
| "annotations": [
|
| {
|
| "segment": [
|
| 2.578755070202808,
|
| 24.914101404056165
|
| ],
|
| "label": "Drinking beer"
|
| }
|
| ],
|
| "feature_frame": 624,
|
| "fps": 24.0,
|
| "rfps": 24.1869158879
|
| },
|
| ...
|
| }
|
| Args:
|
| ann_file (str): Path to the annotation file.
|
| pipeline (list[dict | callable]): A sequence of data transforms.
|
| data_prefix (dict or ConfigDict): Path to a directory where videos are
|
| held. Defaults to ``dict(video='')``.
|
| test_mode (bool): Store True when building test or validation dataset.
|
| Default: False.
|
| """
|
|
|
| def __init__(self,
|
| ann_file: str,
|
| pipeline: List[Union[dict, Callable]],
|
| data_prefix: Optional[ConfigType] = dict(video=''),
|
| test_mode: bool = False,
|
| **kwargs):
|
|
|
| super().__init__(
|
| ann_file,
|
| pipeline=pipeline,
|
| data_prefix=data_prefix,
|
| test_mode=test_mode,
|
| **kwargs)
|
|
|
| def load_data_list(self) -> List[dict]:
|
| """Load annotation file to get video information."""
|
| exists(self.ann_file)
|
| data_list = []
|
| anno_database = mmengine.load(self.ann_file)
|
| for video_name in anno_database:
|
| video_info = anno_database[video_name]
|
| feature_path = video_name + '.csv'
|
| feature_path = '%s/%s' % (self.data_prefix['video'], feature_path)
|
| video_info['feature_path'] = feature_path
|
| video_info['video_name'] = video_name
|
| data_list.append(video_info)
|
| return data_list
|
|
|