Source code for tonic.datasets.ncaltech101
import os
from typing import Callable, Optional
import numpy as np
from tonic.dataset import Dataset
from tonic.io import read_mnist_file
[docs]class NCALTECH101(Dataset):
"""`N-CALTECH101 <https://www.garrickorchard.com/datasets/n-caltech101>`_
Events have (xytp) ordering.
::
@article{orchard2015converting,
title={Converting static image datasets to spiking neuromorphic datasets using saccades},
author={Orchard, Garrick and Jayawant, Ajinkya and Cohen, Gregory K and Thakor, Nitish},
journal={Frontiers in neuroscience},
volume={9},
pages={437},
year={2015},
publisher={Frontiers}
}
Parameters:
save_to (string): Location to save files to on disk.
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.
"""
url = "https://data.mendeley.com/public-files/datasets/cy6cvx3ryv/files/36b5c52a-b49d-4853-addb-a836a8883e49/file_downloaded"
filename = "N-Caltech101-archive.zip"
file_md5 = "66201824eabb0239c7ab992480b50ba3"
data_filename = "Caltech101.zip"
folder_name = "Caltech101"
sensor_size = None # all recordings are of different size
dtype = np.dtype([("x", int), ("y", int), ("t", int), ("p", int)])
ordering = dtype.names
def __init__(
self,
save_to: str,
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,
)
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("bin"):
self.data.append(path + "/" + file)
label_number = os.path.basename(path)
self.targets.append(label_number)
[docs] def __getitem__(self, index):
"""
Returns:
a tuple of (events, target) where target is the index of the target class.
"""
events = read_mnist_file(self.data[index], dtype=self.dtype)
target = self.targets[index]
events["x"] -= events["x"].min()
events["y"] -= events["y"].min()
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(8709, ".bin")
)