Skip to content
Euler Docs

Annotation layers

A layer is one class of annotation output: object labels, hand pose, dense text, depth, and so on. Euler catalogs twelve, and eleven of them are servable today. Each one is a row that records what the layer produces, which models back it, which data kinds can carry it, how it is QA’d, which export formats carry it, and which knobs a team can set before a run.

The catalog is the single source of truth. The settings screen renders it, the run worker and the job queue consult the resolved per-project modes before spending on a lane, the coverage report reports against the same rows, and GET /v1/projects/{id}/annotation/settings serves it resolved for your project. Adding a layer is a catalog edit plus its lane, not a new code branch.

Two gates decide whether a layer runs. Applicability comes first and always wins: a layer whose data kind cannot carry it is reported as inapplicable whatever you set. The mode you choose in Pipeline settings decides the rest.

The catalog at a glance

Cost is the platform’s own per-episode estimate, used for the pre-run cost preview and the pre-flight budget guard. It is an estimate, not an invoice: the measured cost is metered on completion.

LayerIdGroupServableRuns as a jobDefault modeEst. cost / episode
Scene captionscaptionslanguageyesnoin-run$0.002
Object detection and masksobject_labelsperceptionyesnoon demand$0.015
Semantic segmentationsemantic_segmentationperceptionyesyesoff$0.04
Monocular depthdepthgeometryyesyesoff$0.03
Optical flowoptical_flowgeometryyesyesoff$0.03
Hand posehand_poseposeyesyesin-run$0.03
Full body posebody_poseposeyesyesoff$0.035
Object trackstrackingperceptionyesyeson demand$0.02
Action segmentssubtaskslanguageyesyeson demand$0.005
Dense descriptiondense_textlanguageyesyesin-run$0.02
Structured metadatametadatalanguageyesyesoff$0.003
3D representationthreedgeometrynoyesoff$0.02

“Default mode” is the catalog fallback. The mode actually in force for your project is resolved from the use case and target profile as well; see settings resolution.

One layer is catalogued and held back. The 3D representation lane is not deployed, so it is listed here and cannot be run. It is pinned off whatever your settings say, and enqueuing it returns 422 naming the reason. Eleven layers work today.

It stays in the catalog rather than being hidden because a shorter list would not tell you it exists. When the lane ships, it becomes runnable with no change to your settings.

Which data kinds carry which layer

A data kind is derived automatically from what an episode actually contains. Two layers are gated on a capability the data must physically have; the rest apply everywhere except the kinds listed against them.

LayerApplies toDoes not apply to
captionsteleop, egocentric, drive-log, aerial-flight, vision-assetstate-only
object_labelsteleop, egocentric, drive-log, aerial-flight, vision-assetstate-only
semantic_segmentationteleop, egocentric, drive-log, aerial-flight, vision-assetstate-only
depthteleop, egocentric, drive-log, aerial-flight, vision-assetstate-only
optical_flowteleop, egocentric, drive-log, aerial-flightstate-only, vision-asset
hand_poseegocentricevery other kind (needs human hands in frame)
body_poseegocentricevery other kind (same capability gate)
trackingteleop, egocentric, drive-log, aerial-flightstate-only, vision-asset
subtasksteleop, egocentric, drive-log, aerial-flightstate-only, vision-asset
dense_textteleop, egocentric, drive-log, aerial-flightvision-asset, state-only
metadataevery kind
threedteleop, egocentric, drive-log, aerial-flightstate-only, vision-asset

Two layers also depend on another layer having run: tracking needs object_labels, and threed needs depth. The settings tile shows the dependency rather than failing at run time.

The layers one by one

Scene captions

One clear sentence per clip, plus object hints and failure notes, from the approved language lane.

Object detection and masks

Grounded boxes and instance masks against your workspace vocabulary, with confidence routing and per-class quality floors.

Semantic segmentation

Per-pixel class masks over the organized ontology, exported as indexed masks that training loaders read directly.

Monocular depth

Per-frame relative depth, checked against the recording’s own depth stream where one exists.

Optical flow

Dense motion fields between frames, with forward-backward consistency as the built-in check.

Flow fields are large. Preview density keeps storage sane and still shows the motion profile.

Hand pose

Twenty one keypoints per hand, left and right, with handedness locked at the track level.

handedness_lock decides handedness once per track, so a hand cannot flip sides mid clip. The lane’s adoption evidence, including the left/right integrity numbers, is recorded in benchmarks/t471.

Full body pose

Whole body keypoints for every person in frame, with the same tracking and overlay treatment as hands.

Object tracks

Objects followed across the clip with stable identities, from keyframe detection plus mask propagation.

Track quality does not yet have a published benchmark; the measurement task is tracked as T-480.

Action segments

The clip split into labelled action spans, with a verb and a noun per span.

Boundary quality does not yet have a published benchmark; the measurement task is tracked as T-480.

Dense description

A moment-by-moment account of the whole clip, governed by the engagement’s written SOP.

Chronological is the safest style for training data. include_hands names the acting hand on episodes where hand pose ran.

Structured metadata

Filterable facts about every clip rather than free text.

3D representation

Not servable yet. The point-cloud derivation lane is not deployed, so this layer cannot be run today. What follows is what it will produce.

Point clouds and camera path summaries derived from depth and the recording’s own spatial evidence.

A monocular-depth-derived cloud is categorically weaker evidence than multi-sensor SLAM fusion. Euler reports it as derived geometry, not as ground truth.

How a layer is QA’d

Every layer carries QA check ids in the catalog, and those ids are what appear as evidence chips on the episode and in the coverage report. They are identifiers, not formulas: the report shows what was checked and what it found, and a check that could not run reports not_assessable with the reason rather than a made-up number.

Read the result with:

curl -fsS -H "Authorization: Bearer $EULER_TOKEN" \
  "$EULER_BASE_URL/v1/projects/$PROJECT/annotation/coverage"

For every layer that returns: how many episodes carry it, how many could, the quality signal the layer itself measured, the QA check ids behind it, and the last run that produced it. Narrow with ?layer= or ?kind=.

Models behind the layers

Layers resolve their model through the registry (GET /v1/models), which records the active model per surface, its adoption evidence, its cost note, and the vetted alternatives you may switch to. Perception surfaces run self-hosted models only: customer frames never leave the platform boundary.

Model selection is license-gated as well as accuracy-gated, and the registry records why a higher-scoring model was not adopted. Four examples, quoted from the registry rows:

The registry names what actually runs, not what we would prefer to run. Optical flow serves torchvision/raft_large. SEA-RAFT scores higher and carries the same permissive license, but publishes no redistributable checkpoint, so the deployed lane serves RAFT and reports that it did. A registry that reports an aspiration is worse than no registry.

The full mapping, including the benchmark reference behind each adoption, is served live:

curl -fsS -H "Authorization: Bearer $EULER_TOKEN" "$EULER_BASE_URL/v1/models"

How a layer is briefed

Every layer backed by a language or vision model is briefed before it runs, and the briefing is specific rather than generic: it carries what this class of data physically is, what your workspace exists to do, what the output is ultimately being trained on, and your own vocabulary.

Every briefing also carries the same guardrails. Describe only what is present. Never invent objects, people, counts, times, distances, measurements or outcomes. When you cannot tell, say “not assessable” and why. Do not carry anything over from another recording.

That is the whole reason a Euler annotation is worth reviewing: a missing annotation is recoverable, a confidently invented one is not, because you cannot tell it apart from a correct one.

Next