Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

evlab

Inspect, clean, convert, and benchmark event-camera data from the command line.

Event-based vision has a preprocessing problem: every sensor and dataset ships a different container (AEDAT, ROS bags, CSV, NPZ, proprietary .dat), every paper wants a different representation (voxel grids, time surfaces, frames), and every pipeline reimplements the same denoising filters. evlab is the small, boring tool that handles that mess so you can get to the actual work.

pip install evlab[viz]

evlab info recording.npz                 # what is this file?
evlab convert events.aedat4 events.npz   # normalize the container
evlab convert drive.dat events.npz       # Prophesee .dat works too
evlab convert flight.bag events.npz      # ...and ROS bags (dvs_msgs)
evlab denoise events.npz clean.npz --filter baf --window 5000
evlab voxel clean.npz voxels.npy --bins 10
evlab visualize clean.npz preview.gif --mode gif
evlab benchmark events.npz clean.npz     # what did the filter do?
evlab corrupt clean.npz bad.npz --emit-recipe r.json   # benchmark generator
evlab corrupt-bench bad.npz --filter baf # per-type scores + detection AUROC
evlab features events.npz feats.csv      # 12 per-window monitor statistics

How good is a denoising filter, really? Generate a labeled stream and score it:

evlab synth labeled.npz --signal-rate 20000 --noise-rate 8000
evlab denoise-bench labeled.npz --filter baf --window 3000
#   precision     : 99.2%
#   recall        : 37.8%
#   f1            : 0.548
#   noise removed : 99.2%

Need a robustness benchmark instead of a clean one? evlab corrupt injects six physically modeled sensor failure modes (leak-event hot pixels, mains flicker, background-activity bursts, dead regions, readout congestion, polarity faults) as timed episodes with per-event ground-truth labels, at two documented severities. Injected timestamps are snapped to the recording's detected clock quantum, so detectors find the corruption, not the injection. --emit-recipe/--recipe make a corrupted benchmark exactly reproducible from the source recording:

evlab corrupt drive.npz drive_c.npz --types flicker,burst --severity low \
    --seed 3 --emit-recipe drive_c.recipe.json
evlab corrupt drive.npz drive_c_again.npz --recipe drive_c.recipe.json  # identical

evlab corrupt-bench then scores any denoising filter on the corrupted stream: precision/recall against the per-event labels, removal rate broken out per corruption type, clean-signal retention, and (using the embedded episode schedule) the filter's per-window removal rate as a corruption detector, reported as windowed AUROC and median time-to-detection at 5% false-positive rate:

evlab corrupt-bench drive_c.npz --filter baf --window 3000
#   precision       : 87.5%
#   recall          : 96.1%
#   clean retention : 45.7%
#   burst           : 94.6% of 224,508 removed
#   hot-pixels      : 96.5% of 881,946 removed
#   as detector     : AUROC 1.000, 2/2 episodes, median TTD 72 ms

Web UI

For quick one-off runs on a clip — sensor-agnostic, any supported format:

pip install 'evlab[ui]'
evlab serve            # open http://127.0.0.1:8000

Drop an event file, pick denoise or corrupt, and get before/after renders, summary stats, and a downloadable .npz. The same UI ships as a container:

docker build -t evlab .
docker run --rm -p 8000:8000 evlab

Status

Early alpha. Works and is tested: the canonical representation; loading NPZ/CSV/TXT, AEDAT4 ([aedat] extra), Prophesee legacy .dat (with timestamp-wrap handling), and ROS1/ROS2 bags with EventArray topics ([ros] extra); BAF/refractory denoising; voxel grids, time surfaces, accumulate frames; synthetic labeled streams and precision/recall filter scoring; six-type corruption injection with reproducible recipes and per-type filter scoring with detection AUROC / time-to-detection; 12 causal per-window monitoring features (evlab features); the local web UI (evlab serve, [ui] extra) with a Dockerfile; and the CLI commands above. Planned next: Prophesee EVT3 .raw, dataset-aware loaders (via Tonic), streaming via Faery, and more filters (STCF, IE/YNoise) under denoise-bench.

Python API

import evlab

data = evlab.load("recording.npz")          # EventData: (x, y, t, p) + sensor size
print(data.event_rate)

from evlab.filters import background_activity_filter
clean = background_activity_filter(data, time_window_us=5000)

from evlab.representations import voxel_grid
grid = voxel_grid(clean, bins=10)            # (10, H, W) float32, ready for torch

Design notes

  • One canonical in-memory format: a t-sorted structured numpy array (x: u2, y: u2, t: i8 (µs), p: i1) plus sensor geometry. Every loader normalizes into it; every filter/representation consumes it.
  • Zero heavy dependencies in the core (numpy + click). Visualization, AEDAT support, and dataset loaders are opt-in extras.
  • Filters return copies; nothing mutates your data behind your back.

Development

pip install -e .[dev]
pytest
ruff check src tests

License

MIT

Metadata

Release files for evlab 0.3.0a1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for evlab 0.3.0a1
File Size Uploaded Provenance
evlab-0.3.0a1.tar.gz 34.5 kB With provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for evlab 0.3.0a1
File Interpreter ABI Platform
evlab-0.3.0a1-py3-none-any.whl Python 3 none any Details

Total release size: 66.7 kB

Release files / evlab-0.3.0a1.tar.gz

Download URL evlab-0.3.0a1.tar.gz
Size 34.5 kB
Tags Source
SHA-256 checksum
How to use checksums
96940b0dc2c9c863b94efcfd4ee749ac6d54c4d29983aa366b55db441878f7d1
BLAKE2b-256 checksum
How to use checksums
cfac940f1be756c372f1211f7db0fb7b4853d2a622541871eae367d5111898ce
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 15, 2026.

Transparency log

Release files / evlab-0.3.0a1-py3-none-any.whl

Download URL evlab-0.3.0a1-py3-none-any.whl
Size 32.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
e3a56c0d294c6ca839d772efa35d78410c02535859cb598ce06348b90d1e3799
BLAKE2b-256 checksum
How to use checksums
cf843ab9c799d20de29f1ddc3df0588f11a33aee4f981eba9a5d739d69865ebe
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 15, 2026.

Transparency log

Security for evlab 0.3.0a1

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for evlab-0.3.0a1.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 15, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page