Source code for tonic.functional.to_bina_rep

import numpy as np


[docs]def to_bina_rep_numpy( event_frames: np.ndarray, n_frames: int = 1, n_bits: int = 8, ): """Representation that takes T*B binary event frames to produce a sequence of T frames of N-bit numbers. To do so, N binary frames are interpreted as a single frame of N-bit representation. Taken from the paper Barchid et al. 2022, Bina-Rep Event Frames: a Simple and Effective Representation for Event-based cameras https://arxiv.org/pdf/2202.13662.pdf. Parameters: event_frames: numpy.ndarray of shape (T*BxPxHxW). The sequence of event frames. n_frames (int): the number T of bina-rep frames. n_bits (int): the number N of bits used in the N-bit representation. Returns: (numpy.ndarray) the sequence of bina-rep event frames with dimensions (TxPxHxW). """ assert type(event_frames) == np.ndarray and len(event_frames.shape) == 4 assert n_frames >= 1 assert n_bits >= 2 if event_frames.shape[0] != n_bits * n_frames: raise ValueError( "the input event_frames must have the right number of frames to the targeted" f"sequence of {n_frames} bina-rep event frames of {n_bits}-bit representation." f"Got: {event_frames.shape[0]} frames. Expected: {n_frames}x{n_bits}={n_bits * n_frames} frames." ) event_frames = (event_frames > 0).astype(np.float32) # get binary event_frames bina_rep_seq = np.zeros((n_frames, *event_frames.shape[1:]), dtype=np.float32) for i in range(n_frames): frames = event_frames[i * n_bits : (i + 1) * n_bits] bina_rep_frame = bina_rep(frames) bina_rep_seq[i] = bina_rep_frame return bina_rep_seq
[docs]def bina_rep(frames: np.ndarray) -> np.ndarray: """Computes one Bina-Rep frame from the sequence of N binary event-frames in parameter. Args: frames (numpy.ndarray): the sequence of N binary event frames used to compute the bina-rep frame. Shape=(NxPxHxW) Returns: numpy.ndarray: the resulting bina-rep event frame. Shape=(PxHxW) """ mask = 2 ** np.arange(frames.shape[0] - 1, -1, -1, dtype=np.float32) arr_mask = [ mask for _ in range(frames.shape[1] * frames.shape[2] * frames.shape[3]) ] mask = np.stack(arr_mask, axis=-1) mask = np.reshape(mask, frames.shape) return np.sum(mask * frames, 0) / (2 ** mask.shape[0] - 1)