Source code for tonic.datasets.dvsgesture

import os
from typing import Callable, Optional

import numpy as np

from tonic.dataset import Dataset


[docs]class DVSGesture(Dataset): """`IBM DVS Gestures <http://research.ibm.com/dvsgesture/>`_ .. note:: This is (exceptionally) a preprocessed version of the original dataset, where recordings that originally contained multiple labels have already been cut into respective samples. Also temporal precision is reduced to ms. :: @inproceedings{amir2017low, title={A low power, fully event-based gesture recognition system}, author={Amir, Arnon and Taba, Brian and Berg, David and Melano, Timothy and McKinstry, Jeffrey and Di Nolfo, Carmelo and Nayak, Tapan and Andreopoulos, Alexander and Garreau, Guillaume and Mendoza, Marcela and others}, booktitle={Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition}, pages={7243--7252}, year={2017} } Parameters: save_to (string): Location to save files to on disk. train (bool): If True, uses training subset, otherwise testing subset. transform (callable, optional): A callable of transforms to apply to the data. target_transform (callable, optional): A callable of transforms to apply to the targets/labels. transforms (callable, optional): A callable of transforms that is applied to both data and labels at the same time. """ test_url = "https://figshare.com/ndownloader/files/38020584" train_url = "https://figshare.com/ndownloader/files/38022171" test_md5 = "56070e45dadaa85fff82e0fbfbc06de5" train_md5 = "3a8f0d4120a166bac7591f77409cb105" test_filename = "ibmGestureTest.tar.gz" train_filename = "ibmGestureTrain.tar.gz" classes = [ "Hand clapping", "Right hand wave", "Left hand wave", "Right arm cw", # clockwise "Right arm ccw", # counter-clockwise "Left arm cw", "Left arm ccw", "Arm roll", "Air drums", "Air guitar", "Other gestures", ] sensor_size = (128, 128, 2) dtype = np.dtype([("x", np.int16), ("y", np.int16), ("p", bool), ("t", np.int64)]) ordering = dtype.names def __init__( self, save_to: str, train: bool = True, transform: Optional[Callable] = None, target_transform: Optional[Callable] = None, transforms: Optional[Callable] = None, ): super().__init__( save_to, transform=transform, target_transform=target_transform, transforms=transforms, ) self.train = train if train: self.url = self.train_url self.file_md5 = self.train_md5 self.filename = self.train_filename self.folder_name = "ibmGestureTrain" else: self.url = self.test_url self.file_md5 = self.test_md5 self.filename = self.test_filename self.folder_name = "ibmGestureTest" if not self._check_exists(): self.download() file_path = os.path.join(self.location_on_system, self.folder_name) for path, dirs, files in os.walk(file_path): dirs.sort() for file in files: if file.endswith("npy"): self.data.append(path + "/" + file) self.targets.append(int(file[:-4]))
[docs] def __getitem__(self, index): """ Returns: a tuple of (events, target) where target is the index of the target class. """ events = np.load(self.data[index]) events[:, 3] *= 1000 # convert from ms to us events = np.lib.recfunctions.unstructured_to_structured(events, self.dtype) target = self.targets[index] if self.transform is not None: events = self.transform(events) if self.target_transform is not None: target = self.target_transform(target) if self.transforms is not None: events, target = self.transforms(events, target) return events, target
[docs] def __len__(self): return len(self.data)
def _check_exists(self): return ( self._is_file_present() and self._folder_contains_at_least_n_files_of_type(100, ".npy") )