Source code for tonic.functional.to_timesurface

from typing import Tuple

import numpy as np
from numpy.lib import recfunctions as rfn

from tonic.slicers import slice_events_by_time


[docs]def to_timesurface_numpy( events, sensor_size: Tuple[int, int, int], dt: float, tau: float, overlap: int = 0, include_incomplete: bool = False, ): """Representation that creates timesurfaces for each event in the recording. Modeled after the paper Lagorce et al. 2016, Hots: a hierarchy of event-based time-surfaces for pattern recognition https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7508476. Unlike the paper, surfaces are always generated across the whole sensor, not just around the event. Parameters: sensor_size: x/y/p dimensions of the sensor dt: time interval at which the time-surfaces are accumulated tau (float): time constant to decay events around occuring event with. Returns: array of timesurfaces with dimensions (n_events//dt, p, h , w) """ assert dt >= 0, print("Parameter delta_t cannot be negative.") event_slices = slice_events_by_time( events, time_window=dt, overlap=overlap, include_incomplete=include_incomplete ) memory = np.zeros((sensor_size[::-1]), dtype=int) all_surfaces = [] x_index = event_slices[0].dtype.names.index("x") y_index = event_slices[0].dtype.names.index("y") p_index = event_slices[0].dtype.names.index("p") t_index = event_slices[0].dtype.names.index("t") start_t = event_slices[0][0][t_index] for i, slice in enumerate(event_slices): # structured to unstructured in order to access the indices slice = rfn.structured_to_unstructured(slice, dtype=int) indices = slice[:, [p_index, y_index, x_index]].T timestamps = slice[:, t_index] memory[tuple(indices)] = timestamps diff = -((i + 1) * dt + start_t - memory) surf = np.exp(diff / tau) all_surfaces.append(surf) return np.array(all_surfaces)