Eidon Tracker POV
8
291 commits
updated Sep 20, 2026
1,274 hours of egocentric video paired with 7-point IMU arm tracking, recorded during ordinary household work.
Contributors wore a head-mounted camera and a seven-sensor IMU harness while doing real chores in their own homes: laundry, cleaning, dishes, cooking. Each recording pairs first-person video with 24 Hz orientation data for both hands, both forearms, both upper arms, and the chest.
This is a complete, final release. Eidon AI (Solidic Labs Inc) has wound down; the dataset is published under CC-BY-4.0 so it outlives the company.
This repo holds the video. The sensor data is next door.
The release sits in three places:
Contents Size this repo ( tracker-pov)the 13,451 MP4s and metadata.parquet9.05 TB tracker-pov-imuthe IMU streams for these same recordings, 779M rows 9.5 GB egocentric-povextra video with no sensor data. A bucket, so load_datasetdoes not reach it1.55 TB The first two are one dataset in two pieces, covering the same 13,451 recordings and joined on
recording_id. For paired video and motion you want both. The organization page has the overview.
| Recordings | 13,451 |
| Duration | 1,273.8 hours |
| Contributors | 27 |
| Size | 9.05 TB |
| Video | MP4, 1080p to 4K, mostly 30 fps |
| Sensors | 7 Γ 9-axis IMU @ 24 Hz |
The release is split across two repos and a bucket.
| Where | What | Size |
|---|---|---|
| this repo | 13,451 MP4s + metadata.parquet | 9.05 TB |
eidon-ai/tracker-pov-imu | 24 Hz IMU streams, long-form Parquet | ~6.6 GB |
eidon-ai/egocentric-pov | 306 hrs of video-only footage, no sensors. Storage Bucket, not a dataset | 1.55 TB |
βββ README.md
βββ recordings/
β βββ metadata.parquet # one row per recording
β βββ data/000 β¦ 013/ # 13,451 MP4s, 1,000 per directory
The data/NNN/ split exists only to keep directories manageable; the grouping carries no
meaning.
from datasets import load_dataset
recs = load_dataset("eidon-ai/tracker-pov", split="train")
imu = load_dataset("eidon-ai/tracker-pov-imu", split="train", streaming=True)
Both are keyed by recording_id. Filter the metadata first, then pull only the IMU you need:
import pandas as pd
meta = pd.read_parquet("hf://datasets/eidon-ai/tracker-pov/recordings/metadata.parquet")
cooking = meta[(meta.task_type == "cooking") & (meta.qc_status == "valid")]
imu = pd.read_parquet("hf://datasets/eidon-ai/tracker-pov-imu/imu-0000.parquet",
filters=[("recording_id", "in", cooking.recording_id.tolist())])
metadata.parquet| Column | Description |
|---|---|
file_name | path to the MP4, relative to recordings/ (see note below) |
recording_id | integer id; joins to the imu subset and matches the filename prefix |
contributor_id | joins to users.parquet |
duration_seconds | recording length |
task_type | activity label (see below) |
recorded_at | ISO 8601 timestamp |
sensor_schema_version | 1 or 2 (see Raw motion data) |
qc_status | valid, flagged, or invalid |
video_width, video_height, video_fps, video_duration_seconds | from ffprobe |
video_bytes, sensor_bytes | file sizes |
n_slots | how many of the 7 body slots actually streamed |
has_chest | whether the chest reference sensor is present |
has_raw_motion | whether accel/gyro/mag are populated for this recording |
n_snapshots | IMU sample count |
good_frame_percent, hand_presence_ratio, stability_score, lighting_score, average_brightness, average_optical_flow, good_duration_seconds, frames_sampled | QC metrics |
reject_reasons, flag_reasons | why a recording was marked invalid / flagged |
objects_detected, valid_reasons | VLM-derived tags, present on a subset |
file_name is relative to the directory holding metadata.parquet, which is the convention the
datasets library expects. load_dataset resolves it for you. If you are fetching files
directly instead, prepend recordings/:
from huggingface_hub import hf_hub_download
path = hf_hub_download("eidon-ai/tracker-pov",
"recordings/" + row.file_name, # note the prefix
repo_type="dataset")
The IMU streams live in eidon-ai/tracker-pov-imu
It holds one row per (recording, timestamp, body slot), around 780M rows, joined to this repo
on recording_id. Full schema is documented on that card.
Body slots, in fixed order:
| Slot | Position | Slot | Position |
|---|---|---|---|
| 0 | left_hand | 4 | right_forearm |
| 1 | left_forearm | 5 | right_shoulder |
| 2 | left_shoulder | 6 | chest |
| 3 | right_hand |
The chest sensor is the natural reference frame: composing chestβ»ΒΉ Β· limb gives torso-relative
arm pose, which is invariant to which way the wearer is facing.
Camera and IMU capture were started back to back in the same app, with no hardware sync. The offset is a few milliseconds of sequential code execution. Align by timestamp:
frame N -> t_ms = (N / video_fps) * 1000
-> nearest row = argmin |time_ms - t_ms|
| Task | Recordings | Hours | Share |
|---|---|---|---|
folding_laundry | 8,747 | 860.2 | 67.5% |
cleaning | 2,384 | 276.3 | 21.7% |
doing_the_dishes | 984 | 52.1 | 4.1% |
cooking | 795 | 39.5 | 3.1% |
drawing | 166 | 18.2 | 1.4% |
knitting | 159 | 14.8 | 1.2% |
making_the_bed | 130 | 8.5 | 0.7% |
watering_plants | 67 | 2.3 | 0.2% |
organizing | 19 | 2.1 | 0.2% |
Every recording was scored by an automated pipeline before inclusion. Nothing unreviewed is present.
| Check | Method | Reject | Flag |
|---|---|---|---|
| Hand presence | MediaPipe HandLandmarker over sampled frames | <20% of frames | 20-30% |
| Lighting | mean HSV brightness | <20 | 20-40 |
| Blur | Laplacian variance | none | <25 |
| Stability | Lucas-Kanade optical flow magnitude | none | >500 |
| Status | Recordings | Hours |
|---|---|---|
valid | 11,841 | 1,160.0 |
flagged | 1,138 | 98.2 |
invalid | 472 | 15.7 |
invalid recordings are included on purpose. They carry their status, and negative examples are useful. Filter on qc_status for a clean training set.
Read this section before training on the data.
The task distribution is severely skewed. Folding laundry is 67.5% of all hours. Treating this as a balanced nine-class activity dataset will not work, because the tail classes have under three hours each.
Contributors are few and unevenly weighted. There are 27 people; the largest contributes 16.1% of
all hours and the top five contribute 57.2%. Split by contributor_id rather than randomly. A
random split leaks the same person, home and camera rig across train and test, and will flatter
your numbers.
Demographics are sparse and unrepresentative. 16 of 27 reported age (18 to 63, median 26) and 17 reported gender, of whom 15 are male. This is not a population sample.
Raw motion data covers a minority of recordings. Accelerometer, gyroscope and magnetometer
readings follow a per-contributor opt-in rather than sensor_schema_version. Exactly 2,841 of
13,451 recordings (21.1%) carry them: no v1 recording does, and only some v2 recordings do.
Filter on has_raw_motion in metadata.parquet instead of inferring it from the version field.
Orientation quaternions are present throughout.
A small number of recordings have an incomplete rig. 13,322 of 13,451 (99.0%) stream all seven
slots. The remaining 129 stream fewer, sometimes missing the chest sensor that torso-relative
pose depends on. Filter on n_slots == 7 and has_chest if you need the full rig.
Some devices are hub-relayed. Sensors may connect through another tracker acting as a BLE hub instead of directly to the phone. Those streams are independently measured rather than interpolated or copied, so this is a detail of connection topology and does not affect data quality.
The video is unprocessed. See Provenance and consent below.
Another 306 hours of QC'd egocentric video without sensor data is published as a Storage Bucket
at eidon-ai/egocentric-pov, about
1.55 TB across 1,370 recordings. It comes from 37 contributors, 14 of whom also appear here and
keep the same contributor_id. Same rig and same QC pipeline, without the IMU harness.
It is a Storage Bucket rather than a dataset repo, which changes how you get at it. Buckets have
no dataset viewer and no version history, they do not appear in the Datasets list on the
organization page, and load_dataset cannot read them. Fetch it with the bucket tools instead:
hf buckets list eidon-ai/egocentric-pov -R
hf buckets sync hf://buckets/eidon-ai/egocentric-pov ./egocentric-pov
Buckets also expose an S3-compatible API if you would rather use aws s3, boto3 or s5cmd.
The paired video and motion data is here in this repo.
Contributors were adult volunteers who gave written, informed consent covering research, commercial use, and redistribution in public datasets, with explicit acknowledgement that egocentric video may constitute biometric data under BIPA and GDPR (processed on the basis of GDPR Art. 9(2)(a) explicit consent). Only recordings from contributors who affirmatively accepted those terms are included.
Personal identifiers have been removed from the metadata and the sensor streams: contributors appear only as integer ids, device MAC addresses and connection names have been replaced by body-slot names, and absolute timestamps have been converted to offsets from the start of each recording.
The video itself has not been altered. It was recorded in private homes, and although contributors were instructed not to record other people, incidental capture of faces, documents, screens, or interiors cannot be ruled out. No face blurring or region redaction has been applied. Anyone deploying models trained on this data should weigh that.
To request removal of specific recordings, contact padilla.samuelk@gmail.com.
@misc{eidon2026trackerpov,
title = {Eidon Tracker POV: Egocentric Video with Seven-Point IMU Arm Tracking},
author = {{Solidic Labs Inc (Eidon AI)}},
year = {2026},
url = {https://huggingface.co/datasets/eidon-ai/tracker-pov}
}
CC-BY-4.0. Use it for anything, including commercially. Attribution required.
291 commits
Eidon Tracker POV
8
291 commits
updated Sep 20, 2026
1,274 hours of egocentric video paired with 7-point IMU arm tracking, recorded during ordinary household work.
Contributors wore a head-mounted camera and a seven-sensor IMU harness while doing real chores in their own homes: laundry, cleaning, dishes, cooking. Each recording pairs first-person video with 24 Hz orientation data for both hands, both forearms, both upper arms, and the chest.
This is a complete, final release. Eidon AI (Solidic Labs Inc) has wound down; the dataset is published under CC-BY-4.0 so it outlives the company.
This repo holds the video. The sensor data is next door.
The release sits in three places:
Contents Size this repo ( tracker-pov)the 13,451 MP4s and metadata.parquet9.05 TB tracker-pov-imuthe IMU streams for these same recordings, 779M rows 9.5 GB egocentric-povextra video with no sensor data. A bucket, so load_datasetdoes not reach it1.55 TB The first two are one dataset in two pieces, covering the same 13,451 recordings and joined on
recording_id. For paired video and motion you want both. The organization page has the overview.
| Recordings | 13,451 |
| Duration | 1,273.8 hours |
| Contributors | 27 |
| Size | 9.05 TB |
| Video | MP4, 1080p to 4K, mostly 30 fps |
| Sensors | 7 Γ 9-axis IMU @ 24 Hz |
The release is split across two repos and a bucket.
| Where | What | Size |
|---|---|---|
| this repo | 13,451 MP4s + metadata.parquet | 9.05 TB |
eidon-ai/tracker-pov-imu | 24 Hz IMU streams, long-form Parquet | ~6.6 GB |
eidon-ai/egocentric-pov | 306 hrs of video-only footage, no sensors. Storage Bucket, not a dataset | 1.55 TB |
βββ README.md
βββ recordings/
β βββ metadata.parquet # one row per recording
β βββ data/000 β¦ 013/ # 13,451 MP4s, 1,000 per directory
The data/NNN/ split exists only to keep directories manageable; the grouping carries no
meaning.
from datasets import load_dataset
recs = load_dataset("eidon-ai/tracker-pov", split="train")
imu = load_dataset("eidon-ai/tracker-pov-imu", split="train", streaming=True)
Both are keyed by recording_id. Filter the metadata first, then pull only the IMU you need:
import pandas as pd
meta = pd.read_parquet("hf://datasets/eidon-ai/tracker-pov/recordings/metadata.parquet")
cooking = meta[(meta.task_type == "cooking") & (meta.qc_status == "valid")]
imu = pd.read_parquet("hf://datasets/eidon-ai/tracker-pov-imu/imu-0000.parquet",
filters=[("recording_id", "in", cooking.recording_id.tolist())])
metadata.parquet| Column | Description |
|---|---|
file_name | path to the MP4, relative to recordings/ (see note below) |
recording_id | integer id; joins to the imu subset and matches the filename prefix |
contributor_id | joins to users.parquet |
duration_seconds | recording length |
task_type | activity label (see below) |
recorded_at | ISO 8601 timestamp |
sensor_schema_version | 1 or 2 (see Raw motion data) |
qc_status | valid, flagged, or invalid |
video_width, video_height, video_fps, video_duration_seconds | from ffprobe |
video_bytes, sensor_bytes | file sizes |
n_slots | how many of the 7 body slots actually streamed |
has_chest | whether the chest reference sensor is present |
has_raw_motion | whether accel/gyro/mag are populated for this recording |
n_snapshots | IMU sample count |
good_frame_percent, hand_presence_ratio, stability_score, lighting_score, average_brightness, average_optical_flow, good_duration_seconds, frames_sampled | QC metrics |
reject_reasons, flag_reasons | why a recording was marked invalid / flagged |
objects_detected, valid_reasons | VLM-derived tags, present on a subset |
file_name is relative to the directory holding metadata.parquet, which is the convention the
datasets library expects. load_dataset resolves it for you. If you are fetching files
directly instead, prepend recordings/:
from huggingface_hub import hf_hub_download
path = hf_hub_download("eidon-ai/tracker-pov",
"recordings/" + row.file_name, # note the prefix
repo_type="dataset")
The IMU streams live in eidon-ai/tracker-pov-imu
It holds one row per (recording, timestamp, body slot), around 780M rows, joined to this repo
on recording_id. Full schema is documented on that card.
Body slots, in fixed order:
| Slot | Position | Slot | Position |
|---|---|---|---|
| 0 | left_hand | 4 | right_forearm |
| 1 | left_forearm | 5 | right_shoulder |
| 2 | left_shoulder | 6 | chest |
| 3 | right_hand |
The chest sensor is the natural reference frame: composing chestβ»ΒΉ Β· limb gives torso-relative
arm pose, which is invariant to which way the wearer is facing.
Camera and IMU capture were started back to back in the same app, with no hardware sync. The offset is a few milliseconds of sequential code execution. Align by timestamp:
frame N -> t_ms = (N / video_fps) * 1000
-> nearest row = argmin |time_ms - t_ms|
| Task | Recordings | Hours | Share |
|---|---|---|---|
folding_laundry | 8,747 | 860.2 | 67.5% |
cleaning | 2,384 | 276.3 | 21.7% |
doing_the_dishes | 984 | 52.1 | 4.1% |
cooking | 795 | 39.5 | 3.1% |
drawing | 166 | 18.2 | 1.4% |
knitting | 159 | 14.8 | 1.2% |
making_the_bed | 130 | 8.5 | 0.7% |
watering_plants | 67 | 2.3 | 0.2% |
organizing | 19 | 2.1 | 0.2% |
Every recording was scored by an automated pipeline before inclusion. Nothing unreviewed is present.
| Check | Method | Reject | Flag |
|---|---|---|---|
| Hand presence | MediaPipe HandLandmarker over sampled frames | <20% of frames | 20-30% |
| Lighting | mean HSV brightness | <20 | 20-40 |
| Blur | Laplacian variance | none | <25 |
| Stability | Lucas-Kanade optical flow magnitude | none | >500 |
| Status | Recordings | Hours |
|---|---|---|
valid | 11,841 | 1,160.0 |
flagged | 1,138 | 98.2 |
invalid | 472 | 15.7 |
invalid recordings are included on purpose. They carry their status, and negative examples are useful. Filter on qc_status for a clean training set.
Read this section before training on the data.
The task distribution is severely skewed. Folding laundry is 67.5% of all hours. Treating this as a balanced nine-class activity dataset will not work, because the tail classes have under three hours each.
Contributors are few and unevenly weighted. There are 27 people; the largest contributes 16.1% of
all hours and the top five contribute 57.2%. Split by contributor_id rather than randomly. A
random split leaks the same person, home and camera rig across train and test, and will flatter
your numbers.
Demographics are sparse and unrepresentative. 16 of 27 reported age (18 to 63, median 26) and 17 reported gender, of whom 15 are male. This is not a population sample.
Raw motion data covers a minority of recordings. Accelerometer, gyroscope and magnetometer
readings follow a per-contributor opt-in rather than sensor_schema_version. Exactly 2,841 of
13,451 recordings (21.1%) carry them: no v1 recording does, and only some v2 recordings do.
Filter on has_raw_motion in metadata.parquet instead of inferring it from the version field.
Orientation quaternions are present throughout.
A small number of recordings have an incomplete rig. 13,322 of 13,451 (99.0%) stream all seven
slots. The remaining 129 stream fewer, sometimes missing the chest sensor that torso-relative
pose depends on. Filter on n_slots == 7 and has_chest if you need the full rig.
Some devices are hub-relayed. Sensors may connect through another tracker acting as a BLE hub instead of directly to the phone. Those streams are independently measured rather than interpolated or copied, so this is a detail of connection topology and does not affect data quality.
The video is unprocessed. See Provenance and consent below.
Another 306 hours of QC'd egocentric video without sensor data is published as a Storage Bucket
at eidon-ai/egocentric-pov, about
1.55 TB across 1,370 recordings. It comes from 37 contributors, 14 of whom also appear here and
keep the same contributor_id. Same rig and same QC pipeline, without the IMU harness.
It is a Storage Bucket rather than a dataset repo, which changes how you get at it. Buckets have
no dataset viewer and no version history, they do not appear in the Datasets list on the
organization page, and load_dataset cannot read them. Fetch it with the bucket tools instead:
hf buckets list eidon-ai/egocentric-pov -R
hf buckets sync hf://buckets/eidon-ai/egocentric-pov ./egocentric-pov
Buckets also expose an S3-compatible API if you would rather use aws s3, boto3 or s5cmd.
The paired video and motion data is here in this repo.
Contributors were adult volunteers who gave written, informed consent covering research, commercial use, and redistribution in public datasets, with explicit acknowledgement that egocentric video may constitute biometric data under BIPA and GDPR (processed on the basis of GDPR Art. 9(2)(a) explicit consent). Only recordings from contributors who affirmatively accepted those terms are included.
Personal identifiers have been removed from the metadata and the sensor streams: contributors appear only as integer ids, device MAC addresses and connection names have been replaced by body-slot names, and absolute timestamps have been converted to offsets from the start of each recording.
The video itself has not been altered. It was recorded in private homes, and although contributors were instructed not to record other people, incidental capture of faces, documents, screens, or interiors cannot be ruled out. No face blurring or region redaction has been applied. Anyone deploying models trained on this data should weigh that.
To request removal of specific recordings, contact padilla.samuelk@gmail.com.
@misc{eidon2026trackerpov,
title = {Eidon Tracker POV: Egocentric Video with Seven-Point IMU Arm Tracking},
author = {{Solidic Labs Inc (Eidon AI)}},
year = {2026},
url = {https://huggingface.co/datasets/eidon-ai/tracker-pov}
}
CC-BY-4.0. Use it for anything, including commercially. Attribution required.
291 commits