eidon-ai/tracker-pov

Dataset

Eidon Tracker POV

8

291 commits

updated Sep 20, 2026

See the code
activities-of-daily-living
egocentric
embodied-ai
manipulation
motion-capture

README

Eidon Tracker POV

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:

ContentsSize
this repo (tracker-pov)the 13,451 MP4s and metadata.parquet9.05 TB
tracker-pov-imuthe IMU streams for these same recordings, 779M rows9.5 GB
egocentric-povextra video with no sensor data. A bucket, so load_dataset does 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.

Recordings13,451
Duration1,273.8 hours
Contributors27
Size9.05 TB
VideoMP4, 1080p to 4K, mostly 30 fps
Sensors7 Γ— 9-axis IMU @ 24 Hz

Structure

The release is split across two repos and a bucket.

WhereWhatSize
this repo13,451 MP4s + metadata.parquet9.05 TB
eidon-ai/tracker-pov-imu24 Hz IMU streams, long-form Parquet~6.6 GB
eidon-ai/egocentric-pov306 hrs of video-only footage, no sensors. Storage Bucket, not a dataset1.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

ColumnDescription
file_namepath to the MP4, relative to recordings/ (see note below)
recording_idinteger id; joins to the imu subset and matches the filename prefix
contributor_idjoins to users.parquet
duration_secondsrecording length
task_typeactivity label (see below)
recorded_atISO 8601 timestamp
sensor_schema_version1 or 2 (see Raw motion data)
qc_statusvalid, flagged, or invalid
video_width, video_height, video_fps, video_duration_secondsfrom ffprobe
video_bytes, sensor_bytesfile sizes
n_slotshow many of the 7 body slots actually streamed
has_chestwhether the chest reference sensor is present
has_raw_motionwhether accel/gyro/mag are populated for this recording
n_snapshotsIMU sample count
good_frame_percent, hand_presence_ratio, stability_score, lighting_score, average_brightness, average_optical_flow, good_duration_seconds, frames_sampledQC metrics
reject_reasons, flag_reasonswhy a recording was marked invalid / flagged
objects_detected, valid_reasonsVLM-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")

Sensor data

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:

SlotPositionSlotPosition
0left_hand4right_forearm
1left_forearm5right_shoulder
2left_shoulder6chest
3right_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.

Video and IMU synchronisation

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|

Activity types

TaskRecordingsHoursShare
folding_laundry8,747860.267.5%
cleaning2,384276.321.7%
doing_the_dishes98452.14.1%
cooking79539.53.1%
drawing16618.21.4%
knitting15914.81.2%
making_the_bed1308.50.7%
watering_plants672.30.2%
organizing192.10.2%

Quality control

Every recording was scored by an automated pipeline before inclusion. Nothing unreviewed is present.

CheckMethodRejectFlag
Hand presenceMediaPipe HandLandmarker over sampled frames<20% of frames20-30%
Lightingmean HSV brightness<2020-40
BlurLaplacian variancenone<25
StabilityLucas-Kanade optical flow magnitudenone>500
StatusRecordingsHours
valid11,8411,160.0
flagged1,13898.2
invalid47215.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.

Limitations

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.

Companion: video-only footage

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.

Citation

@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}
}

Licence

CC-BY-4.0. Use it for anything, including commercially. Attribution required.

Contributors

sampadilla

291 commits

eidon-ai/tracker-pov

Dataset

Eidon Tracker POV

8

291 commits

updated Sep 20, 2026

See the code
activities-of-daily-living
egocentric
embodied-ai
manipulation
motion-capture

README

Eidon Tracker POV

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:

ContentsSize
this repo (tracker-pov)the 13,451 MP4s and metadata.parquet9.05 TB
tracker-pov-imuthe IMU streams for these same recordings, 779M rows9.5 GB
egocentric-povextra video with no sensor data. A bucket, so load_dataset does 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.

Recordings13,451
Duration1,273.8 hours
Contributors27
Size9.05 TB
VideoMP4, 1080p to 4K, mostly 30 fps
Sensors7 Γ— 9-axis IMU @ 24 Hz

Structure

The release is split across two repos and a bucket.

WhereWhatSize
this repo13,451 MP4s + metadata.parquet9.05 TB
eidon-ai/tracker-pov-imu24 Hz IMU streams, long-form Parquet~6.6 GB
eidon-ai/egocentric-pov306 hrs of video-only footage, no sensors. Storage Bucket, not a dataset1.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

ColumnDescription
file_namepath to the MP4, relative to recordings/ (see note below)
recording_idinteger id; joins to the imu subset and matches the filename prefix
contributor_idjoins to users.parquet
duration_secondsrecording length
task_typeactivity label (see below)
recorded_atISO 8601 timestamp
sensor_schema_version1 or 2 (see Raw motion data)
qc_statusvalid, flagged, or invalid
video_width, video_height, video_fps, video_duration_secondsfrom ffprobe
video_bytes, sensor_bytesfile sizes
n_slotshow many of the 7 body slots actually streamed
has_chestwhether the chest reference sensor is present
has_raw_motionwhether accel/gyro/mag are populated for this recording
n_snapshotsIMU sample count
good_frame_percent, hand_presence_ratio, stability_score, lighting_score, average_brightness, average_optical_flow, good_duration_seconds, frames_sampledQC metrics
reject_reasons, flag_reasonswhy a recording was marked invalid / flagged
objects_detected, valid_reasonsVLM-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")

Sensor data

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:

SlotPositionSlotPosition
0left_hand4right_forearm
1left_forearm5right_shoulder
2left_shoulder6chest
3right_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.

Video and IMU synchronisation

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|

Activity types

TaskRecordingsHoursShare
folding_laundry8,747860.267.5%
cleaning2,384276.321.7%
doing_the_dishes98452.14.1%
cooking79539.53.1%
drawing16618.21.4%
knitting15914.81.2%
making_the_bed1308.50.7%
watering_plants672.30.2%
organizing192.10.2%

Quality control

Every recording was scored by an automated pipeline before inclusion. Nothing unreviewed is present.

CheckMethodRejectFlag
Hand presenceMediaPipe HandLandmarker over sampled frames<20% of frames20-30%
Lightingmean HSV brightness<2020-40
BlurLaplacian variancenone<25
StabilityLucas-Kanade optical flow magnitudenone>500
StatusRecordingsHours
valid11,8411,160.0
flagged1,13898.2
invalid47215.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.

Limitations

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.

Companion: video-only footage

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.

Citation

@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}
}

Licence

CC-BY-4.0. Use it for anything, including commercially. Attribution required.

Contributors

sampadilla

291 commits