EgoEMG
A multimodal egocentric dataset with bilateral surface EMG and vision for hand pose estimation
EMG-to-pose·vision-to-pose·EMG+vision fusion
01Abstract
Surface electromyography (sEMG) captures muscle activity during hand movement, while egocentric vision observes global hand configuration. These complementary signals are promising for robust hand-pose estimation, but no existing dataset jointly provides synchronized bilateral wrist EMG, egocentric vision, and bimanual pose labels. EgoEMG contains bilateral wristband EMG sampled at 2 kHz, 120 Hz IMU signals, egocentric video, external RGB-D video, and motion-capture-derived wrist and finger joint angles — over 18 hours from 53 participants performing 60 gesture classes. We establish benchmarks for EMG-to-pose, vision-to-pose, and EMG+vision fusion under shared joint-angle targets and Gesture / User / Both generalization splits. Across seven visual backbones, residual fusion reduces average error relative to the corresponding vision-only baseline.
RGB-D · motion capture
02Dataset
Each recording synchronizes five sensing modalities: bilateral wristband sEMG at 2 kHz, a 120 Hz IMU on each wrist, a head-mounted egocentric RGB camera, an external RGB-D camera, and a 26-camera optical motion-capture rig providing wrist and finger joint-angle labels for both hands.


Shared generalization splits
- Gesture
- Unseen gestures from training participants — tests generalization to new articulations.
- User
- Unseen participants performing training gestures — tests cross-user generalization.
- Both
- Unseen participants and unseen gestures — the hardest setting.
All three benchmark tasks are evaluated on identical splits, so EMG, vision, and fusion results are directly comparable.
03Method & Benchmarks
All three tasks share the same 22-DoF joint-angle prediction target per hand and the Gesture / User / Both generalization splits.



04Headline Results
| Task | Split | Ours | Best baseline |
|---|---|---|---|
| EMG-to-pose on EgoEMG | Avg (Gesture/User/Both) | 13.8° (EMGFormer-M) * | 15.8° (emg2pose) |
| EMG-to-pose on EMG2Pose | User+Stage | 12.3° (EMGFormer-S) | 14.6° (Position/Velocity MT) |
| Vision-to-pose on EgoEMG | Avg (Gesture/User/Both) | 5.85° (ResNet-18) * | — |
| EMG+vision fusion on EgoEMG | Avg (Gesture/User/Both) | 5.41° (ResNet-18) * | 5.85° (vision-only) |
MAE in degrees. * = released-checkpoint values; unstarred values are paper-reported. Avg is the average over the Gesture/User/Both test splits (per-sample-weighted for EMG-to-pose, unweighted split mean for vision and fusion); the EMG2Pose row follows the benchmark's User+Stage protocol. Full per-method and per-split tables are in the repository README.
05Qualitative Results
Pyrender-shaded MANO mesh overlays on the egocentric stream, across nine episodes spanning the train / user / gesture / both splits.
episode_000001 · train / gestureepisode_000003 · train / gestureepisode_000005 · train / userepisode_000008 · zbk · user / bothepisode_000013 · train / gestureepisode_000017 · user / bothepisode_000020 · wmh · train / user / gesture / bothepisode_000028 · wsj · train / gestureepisode_000033 · train / gesture06Get the Data & Code
8059), download the dataset_egoemg_preview
folder, and place it at $EGOEMG_ROOT/data/. Full assets (memmap, videos,
checkpoints) are documented in
docs/ASSET_SETUP.md.
Setup
git clone https://github.com/zhenqis123/EgoEMG.git
cd EgoEMG
conda env create -f environment.yml && conda activate egoemg
pip install -e '.[viz]'
export EGOEMG_ROOT=/absolute/path/to/egoemg_assets
Evaluate a released checkpoint
python -m egoemg.test_analysis \
experiment=emgformer/egoemg_emgformer_middle \
'checkpoint=checkpoints/egoemg_emgformer_middle.ckpt'
07Citation
The paper is under review. Until a public version is available, cite this repository and the exact commit.
@misc{egoemg2026,
title = {EgoEMG: A multimodal egocentric dataset with bilateral surface
EMG and vision for hand pose estimation},
author = {Zhenqi Shi and others},
howpublished = {GitHub repository},
note = {https://github.com/zhenqis123/EgoEMG},
year = {2026},
}