Image & video annotation

Image and video annotation for robotics training data.

Bounding boxes, polygons and segmentation masks only help a robot policy if they line up with the geometry and timing the footage was captured on. We annotate the egocentric video we collect — per-pixel instance masks, object labels and instances tracked across frames — against the synchronized depth stream and hardware clock, then deliver it in the format your training stack reads.
Masks
Per-pixel instance masks
Alignment
Depth-aligned, PTP timestamps
Formats
RLDS · LeRobot · WebDataset
License
Buyer-owned
An annotator at a dual-monitor workstation reviews a grid of first-person video frames alongside synchronized signal timelines.
Every label is reviewed against the synchronized capture it belongs to, not a loose frame export.

What gets labeled

What image and video annotation covers on a Firsthand collection.

01

Per-pixel instance segmentation

Object, hand and body masks are annotated where the program spec calls for them, stored as an instance_masks array aligned to the depth stream, so a policy can separate the hand, the task object and the background.

02

Object labels from your vocabulary

The skill spec sets which object classes are in scope before capture, so object labels use the terms your training stack expects rather than a generic taxonomy.

03

Instances tracked across frames

An object instance tracked across frames gives a policy a persistent handle on which object is being manipulated, rather than an unrelated set of per-frame detections.

04

Detect-track-blur for anything identifying

Faces, licence plates and legible screens are detected as bounding boxes, linked into tracks across frames and irreversibly blurred into the pixels, with a reviewer confirming the result.

Label types

What types of image annotation do robotics datasets use?

Robotics perception work draws on a small, well-understood family of spatial labels. A bounding box is the smallest axis-aligned rectangle that encloses an object, stored as pixel coordinates �� most often (x, y, width, height) or two corners. It is cheap to produce and good enough for detection, but it says nothing about the object’s actual outline, so a box around a mug also contains the table behind it.

A polygon traces the outline of an object as a list of vertices. It is tighter than a box and is a common interchange format for segmentation labels. A per-pixel segmentation mask goes one step further and assigns every pixel to an object instance or to the background. Instance segmentation distinguishes two identical objects from each other; semantic segmentation only says which class each pixel belongs to.

For manipulation, the difference matters. A grasp policy needs to know where the hand ends and the object begins, and a box cannot express that boundary. That is why Firsthand delivers segmentation as per-pixel instance masks rather than boxes alone. A polygon outline can always be traced from a mask when a pipeline expects polygons, but a mask cannot be recovered from a box without re-labeling.

Egocentric footage

Why is annotating egocentric video different from annotating static images?

Most image annotation tooling was built for single photographs: one frame, one set of labels, no relationship to the frame before or after. Egocentric robotics footage is different. The camera is on a moving head or wrist, the hands occlude the object at exactly the moment of contact, and the same object has to be recognised as the same instance from one frame to the next.

Labeling frames in isolation produces masks that flicker, instance identities that swap when a hand passes in front of an object, and boundaries that disagree with the depth geometry. Firsthand annotates against the synchronized depth stream and the hardware clock the video was recorded on, so masks agree with the captured geometry and every label carries the same PTP-domain timestamp as the frame it belongs to.

The head camera records at 3840×2160 and 60 Hz, the two wrist cameras at 1920×1080 and 60 Hz, and depth at 848×480 and 30 Hz. Instance masks are stored at the depth resolution, which is what lets a mask be lifted into 3D alongside hand joints that are expressed in metres in the head-camera frame.

Tracking & classification

How are object tracking and classification handled?

Classification starts before capture, not after. The skill spec names which object classes are in scope, which grasp families and which environments, and that vocabulary is what annotators label against. This keeps labels consistent across contributors and sites, and it means the delivered classes already match what your loader expects.

Tracking links the same instance across frames. In the delivered episode, instance masks and the objects annotation group describe which object is which over time, and an object tracked across frames gives a policy a persistent handle on which object is being manipulated. The same detect-then-track pattern is what the de-identification pass uses on faces and plates: a detector returns a bounding box and a confidence score per frame, and a track id links the same box across frames so coverage does not flicker as a subject moves.

Contact and grasp events are annotated against the depth stream alongside the masks, so a tracked object carries the moment of physical interaction as well as its outline.

Quality

How is annotation quality checked?

A second reviewer covers a sampled or full pass depending on the annotation’s density and stakes. Items that miss are rejected and recaptured at no extra cost, and the reject log — with reasons, not just pass counts — is visible to the buyer.

Because a skill spec names the acceptance test up front, a reviewer can accept or reject a batch against a written rule rather than personal judgment. Billing is per validated hour, so footage that fails QA is not billed. See the data labeling and quality verification page for the full review workflow.

Scope

Can you annotate video we already have?

This program annotates video captured to your spec on Firsthand’s synchronized hardware. That is a deliberate constraint rather than a limitation of the tooling: depth-aligned masks, 3D hand pose and contact events are grounded in the same clock and calibration the footage was recorded on, and those do not exist for footage shot on unsynchronized cameras.

If your goal is a fast, on-demand custom collection with segmentation and object labels built in, the skill spec is where you define the class vocabulary and which label types each episode needs. First validated batches arrive in a median of 48 hours where coverage is deep and three to four weeks where it is thin.

Label types

Annotation types and what a robot policy gets from each

Common spatial label types, and how each is handled on a Firsthand collection.
Label typeOn a Firsthand collection
Bounding boxUsed in the detect-track-blur pass for faces, plates and screens; boxes linked by track id across frames
Polygon outlineTraceable from delivered per-pixel masks when a pipeline expects polygons
Instance segmentation maskDelivered as instance_masks, uint16 [T, 480, 848], aligned to depth
Object classesVocabulary fixed in the skill spec before capture
Tracked instancesObjects annotation group links the same instance across frames
Contact & grasp eventscontact_events, annotated against the depth stream

Every collection runs through the same seven-stage end-to-end custom collection pipeline.

Delivery

Where image and video labels live in the delivered episode

Fields from the Firsthand episode schema that carry spatial annotation.
FieldGroupWhat it holds
head_rgbstreams/uint8 [T, 2160, 3840, 3] at 60 Hz
wrist_l / wrist_rstreams/uint8 [T, 1080, 1920, 3] at 60 Hz
depth_mmstreams/uint16 [T, 480, 848] at 30 Hz, metric millimetres
instance_masksannotations/uint16 [T, 480, 848], per-pixel instance IDs
objectsannotations/Object labels for the classes named in the spec
contact_eventsannotations/Hand-object contact onsets
*_timestamp_nsstreams/int64 per stream, PTP domain

Comparison

Frame-by-frame image labeling vs. capture-aligned annotation

How annotation changes when labels are tied to the synchronized capture.
QuestionFrame-by-frame labelingCapture-aligned annotation
Do masks agree with 3D geometry?Not checkedAnnotated against the depth stream
Do instances persist across frames?Often re-labeled per frameInstances tracked across frames
Are labels time-aligned to other streams?Frame index onlyPTP-domain timestamps per stream
Who defines the classes?Generic taxonomyYour skill spec
What happens to failed items?VariesRejected and recaptured at no extra cost

FAQ

Image and video annotation, answered.

Do you deliver bounding boxes or segmentation masks?
Segmentation is delivered as per-pixel instance masks, which are tighter than boxes and can be converted to polygon outlines. Bounding boxes are used in the detect-track-blur pass that removes faces, plates and screens.
Can you label polygons?
Masks are the delivered form. A polygon outline can be traced from a per-pixel mask whenever your pipeline expects polygons, while a box alone cannot be turned back into an accurate mask.
How do you keep the same object labeled consistently across frames?
Objects are tracked across frames, so the same instance carries the same identity through occlusion and camera motion rather than being re-labeled independently in each frame.
Who decides the object classes?
You do, in the skill spec. It names the object classes, grasp families and environments in scope before capture, so labels match your training vocabulary.
Are masks aligned to depth?
Yes. Instance masks are stored at the depth resolution, 848×480, and annotated against the synchronized depth stream, so they can be lifted into 3D.
How is annotation quality verified?
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.
What format is annotated data delivered in?
RLDS, LeRobot, WebDataset, HDF5 or JSONL, under a perpetual, buyer-owned license.

Sources

Where are the delivery formats documented?

Brief the gap. Get data back fast.

Tell us what your model is missing. We will quote reach, timeline, and price against a written spec, with a first validated batch in a median of 48 hours where coverage is deep.