Per-pixel instance masks
Masks ship as instance_masks in the annotations group, uint16 [T, 480, 848], so two identical objects stay separate rather than sharing one class label.
Segmentation mask collection

What a mask delivery includes
Masks ship as instance_masks in the annotations group, uint16 [T, 480, 848], so two identical objects stay separate rather than sharing one class label.
The stream list describes manipulated objects and target surfaces with tracked IDs across the episode, linked to an objects list and to contact events.
Masks are stored at the depth resolution and annotated against the synchronized depth stream, so they can be lifted into 3D beside hand joints in metres.
The episode schema is the canonical layout, with HDF5 and zarr mirroring it; where masks sit in other formats is agreed in the spec.
Definition
Egocentric video with segmentation masks is first-person task footage delivered together with per-pixel masks that say which object each pixel belongs to. Instance masks keep two identical objects apart, and tracking gives the same object the same ID from one frame to the next. On Firsthand’s rig the masks are the instance_masks field in the annotations group of the episode schema, on the same timeline as the video, depth and hand pose.
This page sells the collection: fast, on-demand, custom collection scoped to your skill spec, with masks delivered beside the video. It is not the definition and it is not a general annotation service. The instance segmentation glossary entry defines the term, and the egocentric video annotation and image and video annotation pages cover labeling. On those pages the annotation applies to footage captured on Firsthand’s synchronized hardware to your spec, not to footage you already own.
Why it matters
The site’s glossary states the case: manipulation is about a particular object, and instance masks let a model attend to the manipulated item through clutter and occlusion and tie contact events to a specific object ID. Tracked across frames, a mask gives a policy a persistent handle on which object is being manipulated.
A mask also says where the hand ends and the object begins, which a bounding box cannot express. The site also notes that clothing, bedding and bags do not track well with propagated masks, so household episodes ship per-frame instance masks for them. The site states these dependencies but does not quantify how much masks change model performance, and this page does not either.
Mask fields
Masks are delivered as instance_masks in the annotations group, listed beside hand_joints, hand_visible, body_joints, contact_events, objects, action_segments and gaze_target. The schema gives the shape as uint16 [T, 480, 848]: one integer instance ID per pixel on the depth grid. The stream list describes the segmentation stream as instance masks over manipulated objects and target surfaces, with tracked IDs across the episode.
The glossary adds that instance_masks are tracked object IDs per frame, linked to an objects list and to contact events. The format pages say whether a given delivery includes masks is a spec decision, so name them in the skill spec and confirm them on the Spec Pilot batch. The first table lists each field and what the site states about it.
Masks and other labels
They answer different questions. A mask says which pixels belong to which object instance. A bounding box is the smallest rectangle around an object; on this site boxes are used in the detect-track-blur pass that removes faces, plates and screens, while segmentation is delivered as per-pixel masks rather than boxes alone. Hand pose is 21 joints per hand in metres, and action segments are start and end timestamps with a verb and a noun.
The site delivers these together and keeps them distinct. This page claims for masks only what the site states for masks. The 21-joint count and the visibility flag belong to hand pose, and the verb and noun belong to action segments. The site also says a polygon outline can be traced from a delivered mask, while a mask cannot be recovered from a box without re-labeling. The second table sets the four side by side.
What masks cover
The stream list says manipulated objects and target surfaces. The annotation pages add that object, hand and body masks are annotated where the program spec calls for them, so a policy can separate the hand, the task object and the background as distinct masks.
Which classes are in scope is your decision. The skill spec names the object classes, grasp families and environments before capture, so labels use the terms your training stack expects rather than a generic taxonomy. The site does not publish a class list, and it describes instance masks rather than semantic ones: whether a delivery adds class-only semantic masks is not stated and is set per program.
Alignment
Masks are annotated against the synchronized depth stream and stored at the depth resolution, 848×480, which is what lets a mask be lifted into 3D alongside hand joints expressed in metres in the head-camera frame. The head camera records at 3840×2160 and 60 fps; how a mask on the depth grid maps onto the 4K head frame is not stated and is confirmed in the spec.
Every label carries the same PTP-domain timestamp as the frame it belongs to. The capture page describes one PTP clock domain across the head-mounted stereo pair, both wrist cameras, the depth sensor and the IMUs, with a 1.12 ms median and 1.94 ms p99 against a 2.0 ms ceiling. The IMUs run at 200 Hz on the head and both wrists on that clock; the site does not describe masks being derived from them. The third table lists the streams.
Formats
The episode schema is the canonical layout and its annotations group lists instance_masks as uint16 [T, 480, 848]; HDF5 and zarr mirror that layout. In the WebDataset shards, masks and the other episode-schema fields are not itemised, and which fields appear inside a shard’s annotation file is set in the skill spec.
The site does not state how masks are laid out in the LeRobot v2.1 export, in RLDS, or in Rerun .rrd, so name your loader in the spec. A mask stored as an image array is a different object from a LeRobot observation vector, so confirm the shape you load. The fourth table summarizes this.
Quality and consent
An episode is validated on the checks the site defines for every episode: sync within the ceiling, calibration solved and within drift tolerance, coverage cells filled and consent documented. For annotation, a second reviewer covers a sampled or full pass depending on density and stakes, failed items are rejected and recaptured at no extra cost, and the reject log with reasons is visible to you. The site publishes no mask accuracy or overlap figure, so none is claimed here.
On consent, the contributor agreement the site describes covers derivative representations, including segmentation masks, and those layers sit under the same consent as the video. Delivered data ships under a perpetual, buyer-owned license, and billing is per validated hour, so footage that fails QA is not billed.
Agreed per spec
Several mask details are not fixed on this site and are agreed in the skill spec. The last table separates what the site states from what is set per program, so you know what to put in writing before the quote.
Getting started
Send the tasks, the environments and regions, and the delivery format you need, and name instance masks in the streams and labels list along with the object classes in scope. The site lists RGB as the baseline and the other streams as added where the spec calls for them, and says each added label adds equipment, QA passes and cost, so order what the model consumes. If you have no written spec yet, the skill spec is the document that names the tasks, the labels and the acceptance test.
The order flow is spec, quote, Spec Pilot, then production. Where coverage for your tasks and regions is deep, the median time from signed spec to first validated batch is 48 hours; where it is thin, turnaround runs three to four weeks. There is no list price.
At a glance
Every collection runs through the same seven-stage end-to-end custom collection pipeline. End-to-end custom data collection is a managed service that takes an AI data need from problem to owned dataset in a single accountable pipeline.
Mask fields
| Field | What the site states | What it is used for |
|---|---|---|
| instance_masks | annotations/; uint16 [T, 480, 848], per-pixel instance IDs, tracked across the episode | Separating objects through clutter and occlusion |
| objects | annotations/; object labels for the classes named in the spec | Naming which instance is which |
| contact_events | annotations/; hand-object contact onsets, against the depth stream | Tying contact to a specific object ID |
| depth_mm | streams/; uint16 [T, 480, 848] at 30 Hz, metric millimetres | The grid the masks are stored on |
| hand_joints, hand_visible | float32 [T, 2, 21, 3], metres, head-camera frame; per-joint visibility flag | Hand geometry beside the masks |
| *_timestamp_ns | int64 nanoseconds per stream, shared PTP domain | Aligning masks to video from the data |
Masks and other labels
| Signal | What the site states | What it tells a model | Not stated |
|---|---|---|---|
| Segmentation mask | Per-pixel instance IDs, uint16 [T, 480, 848], tracked | Which pixels are which object | Class list, accuracy, frame rate |
| Bounding box | Used in the detect-track-blur pass for faces, plates and screens | Rough location only | Box labels as a delivered object field |
| Hand pose | 21 joints per hand, metres, per-joint visibility flag | Hand geometry | Accuracy figure |
| Action label | action_segments with start_ns, end_ns, verb, noun | What happens and when | Vocabulary, set in the spec |
Rig streams
| Stream | What the site states | Relation to the masks |
|---|---|---|
| Head camera | Global-shutter, 3840×2160 at 60 fps, 120° HFOV | The view the masks describe |
| Wrist cameras | Two, 1920×1080 at 60 fps | Hand-level views beside the head view |
| Depth | 848×480 at 30 fps, metric millimetres plus confidence | Masks are stored at this resolution |
| IMUs | 6-DoF, 200 Hz, head and both wrists | Motion record on the same clock |
| Clock | One PTP domain, hardware-triggered | Labels aligned under the 2.0 ms ceiling |
Formats
| Format | What the site states | Set per program |
|---|---|---|
| Episode schema | annotations/instance_masks, uint16 [T, 480, 848] | Whether a delivery includes masks |
| HDF5 / zarr | Mirrors the episode schema layout | Anything beyond the format page |
| WebDataset | Masks not itemised for shards; included only if the spec orders them | Which fields appear in the annotation file |
| LeRobot v2.1 | Mask layout not stated | Where and how masks are stored |
| RLDS | Mask layout not stated | Where and how masks are stored |
| Rerun .rrd | Listed as a delivery format | Mask layout |
Agreed per spec
| Detail | What the site states | Where it is set |
|---|---|---|
| Mask type | Per-pixel instance masks with tracked IDs | Stated; confirmed in the spec |
| Object classes and vocabulary | Named in the skill spec before capture | Set per program in the skill spec |
| Semantic (class-only) masks | Not stated as delivered | Set per program in the skill spec |
| Mask accuracy or overlap score | Not stated; no figure published | Set per program in the skill spec |
| Mask frame rate and mapping to the 4K head frame | Not stated | Set per program in the skill spec |
| Annotation tooling and throughput | Not stated; reviewer pass is sampled or full | Set per program in the skill spec |
| Hours, price and turnaround | No list price; median 48 h where deep, three to four weeks where thin | The quote and the Spec Pilot |
FAQ
Sources
Tell us the tasks, environments, the object classes and mask fields your model needs, and the format you load from. A first validated batch arrives in a median of 48 hours where coverage is deep.