This is the official PyTorch implementation of the RSS 2026 paper Motion-aware Event Suppression for Event Cameras.
Visit the project page for more details.
Watch the video.
If you use any part of this code or datasets accompanying the paper please consider citing the following:
@inproceedings{Pellerito2026Suppression,
title={Motion-aware Event Suppression for Event Cameras},
author={Pellerito, Roberto and Messikommer, Nico and Cioffi, Giovanni and Cannici, Marco and Scaramuzza, Davide},
booktitle={Robotics: Science and Systems 2026},
year={2026}
}This repository contains the essential training and validation code for dynamic object mask prediction from event-camera data. The public release focuses on:
- training on DSEC;
- training on EVIMO v1;
- validation on EVIMO v1 at the current instant
t0and future instantt1; - validation entry point for EED at
t0andt1.
Data loading is delegated to the external repository checked out at ev-loader/. The current ev-loader copy contains DSEC and EVIMO loaders. It does not currently expose an EED loader, so EED validation raises an explicit error until an evloader.EED_dataloader.EEDSequence implementation is added.
This repository expects ev-loader/ at the repository root. It is tracked as a Git submodule from senecobis/ev-loader and is pinned to commit b0d86a00bf35883b5ead089e3ca01bb7442e4379.
When cloning this repository, fetch the pinned loader checkout with:
git clone --recurse-submodules <event_suppression_repo_url>
cd event_suppressionIf the repository was already cloned without submodules, run:
git submodule update --init --recursiveTo recreate the same ev-loader/ checkout manually:
git clone https://github.com/senecobis/ev-loader.git ev-loader
git -C ev-loader checkout b0d86a00bf35883b5ead089e3ca01bb7442e4379Create a minimal conda environment and install the Python packages with pip:
conda create -n evsup python=3.10 -y
conda activate evsup
export PYTHONNOUSERSITE=1Install PyTorch. NVIDIA drivers are backward-compatible with older CUDA runtimes, so a machine reporting CUDA 13.x through nvidia-smi can run the CUDA 12.1 PyTorch wheels. For CUDA-capable machines:
python -m pip install --no-cache-dir \
torch==2.5.1 torchvision==0.20.1 \
--index-url https://download.pytorch.org/whl/cu121 \
--extra-index-url https://pypi.org/simpleFor CPU-only machines:
python -m pip install --no-cache-dir \
torch==2.5.1 torchvision==0.20.1 \
--index-url https://download.pytorch.org/whl/cpu \
--extra-index-url https://pypi.org/simpleThen install Event Suppressor:
python -m pip install -r requirements.txt
python -m pip install -e .
python -m pip install pytestPyTorch is intentionally not listed in requirements.txt because the correct wheel depends on your CUDA/CPU setup.
If importing PyTorch fails with ImportError: libcudnn.so.9, user-site packages are likely leaking into the conda environment. Keep PYTHONNOUSERSITE=1 set and repair the PyTorch stack with:
python -m pip install --force-reinstall --no-cache-dir \
torch==2.5.1 torchvision==0.20.1 \
--index-url https://download.pytorch.org/whl/cu121 \
--extra-index-url https://pypi.org/simple
python -m pip show torch nvidia-cudnn-cu12 | grep -E 'Name|Version|Location'The Location lines should point inside $CONDA_PREFIX/lib/python3.10/site-packages, not ~/.local/lib/python3.10/site-packages.
Do not install ev-loader with pip install -e ./ev-loader unless you also want all of its optional loader and visualization dependencies. This repository imports ev-loader directly from the checked-out ./ev-loader folder.
After installation, run:
python -m pytest -q
python train.py --help
python validate.py --helpevsup/
configs/
train_dsec.json # DSEC training config
train_evimo.json # EVIMO training config
validate_evimo.json # EVIMO t0/t1 validation config
validate_eed.json # EED t0/t1 validation config
models/ # Event Suppressor / Hydra recurrent U-Net
loss/ # Mask and event-warping losses
data.py # Dataset builders backed by ev-loader
training.py # Training loop
validation.py # Validation loop
ev-loader/ # External event-data loader repository
train.py # CLI wrapper
validate.py # CLI wrapper
tests/ # Public smoke/unit tests
Set data.path in the JSON configs to the dataset root.
DSEC:
DSEC/
train/
zurich_city_00_a/
...
test/ or validation/
...
EVIMO v1 after conversion to HDF5:
EVIMO1/
train/
box/
seq_00.h5
...
test/
box/
seq_00.h5
...
EED expected structure:
EED/
test/
<sequence directories or files expected by the EED loader>
The EED structure depends on the missing ev-loader EED loader. Add that loader to ev-loader/evloader/EED_dataloader and keep the public validation command unchanged.
Edit the dataset path in the config first:
"data": {
"dataset": "evimo",
"path": "/path/to/EVIMO1"
}Train on EVIMO:
python train.py --config evsup/configs/train_evimo.jsonTrain on DSEC:
python train.py --config evsup/configs/train_dsec.jsonResume or fine-tune from a checkpoint:
python train.py \
--config evsup/configs/train_evimo.json \
--checkpoint checkpoints/EventSuppressor_EVIMO_<timestamp>/model_epoch_10.pthCheckpoints are written under loader.checkpoints_path.
Validate EVIMO at current and future instants:
python validate.py \
--config evsup/configs/validate_evimo.json \
--checkpoint checkpoints/EventSuppressor_EVIMO_<timestamp>/model_epoch_49.pth \
--output results/evimo_model_epoch_49Validate EED after adding the EED loader to ev-loader:
python validate.py \
--config evsup/configs/validate_eed.json \
--checkpoint checkpoints/EventSuppressor_EVIMO_<timestamp>/model_epoch_49.pth \
--output results/eed_model_epoch_49Validation writes results.json with per-sequence and aggregate metrics:
IoU/t0,mIoU/t0,pIoU/t0,SR@0.5/t0;IoU/t1,mIoU/t1,pIoU/t1,SR@0.5/t1.
For short smoke runs, configs may include:
loader.max_batches: stop training after this many batches per epoch;eval.max_sequences: validate only the first N sequences;eval.max_samples: validate only the first N pairs per sequence.
python -m pytest -qThe tests cover public config loading, metric computation, public module imports, and the explicit EED-loader error.