Skeletons¶
A skeleton defines the parts you label. It is a set of nodes (body parts) and edges (connections between them), shared by every instance in the project. Everything downstream — training, the quality checks, the rendering — is defined in terms of it.
Starting from a template¶
File ▸ New Project… and the Skeleton panel's Load template offer the skeletons legacy SLEAP ships, one per SLEAP reference dataset, plus a human one:
| Template | Nodes | Animals |
|---|---|---|
| Bees | 21 | Bumblebees in a petri dish |
| Flies 13 | 13 | Pairs of fruit flies |
| Fly | 32 | A single fruit fly, animal-centered |
| Gerbils | 14 | Gerbils in a home cage |
| Mice, home cage | 5 | Pairs of mice, from above |
| Mice, open field | 11 | Mice in an open field, from below |
| Human, COCO | 17 | People: the COCO body keypoints most human pose models use |
| Empty — define later | none yet |
Picking one in Load template previews it before anything changes: a labeled
example image, its nodes, and Example, which opens a larger frame from the
reference dataset with the skeleton drawn on each animal. Load applies it.
The human template isn't from a SLEAP reference dataset, so it has no
Example. Its node names are COCO's own (left_shoulder, right_knee, …).
Pick the closest one and edit it, or start empty.
Drawing a skeleton on the frame¶
Often the fastest route, because you can see the animal while you do it:
- Open the Skeleton panel and click Draw skeleton on frame.
- 1 · Place nodes — click to place each node where that body part sits. Drag a placed node to move it, and double-click it to rename it.
- Click Next: Connect edges →.
- 2 · Connect edges — drag a stroke through the nodes you want connected; the stroke becomes edges along the path. Clear edges starts the edges over, and ← Back returns to placing nodes.
- Click Done. The app asks whether to create an instance on this frame from your layout: Create instance or Not now.
Nodes come out named node_0, node_1, … Rename them on the frame while
placing, or later by double-clicking a name in the Skeleton panel.
If the project already has a skeleton, Draw skeleton on frame first asks whether to Edit existing (add to it) or Delete & start new.
Rename before you label
Node names are how you'll read every quality-check finding, every metrics
table, and every exported column. head / torso / tailbase beats
node_0 / node_1 / node_2 immediately and forever.
Editing in the panel¶
The Skeleton panel has three tabs, each with its own buttons:
| Tab | Buttons |
|---|---|
| Nodes | New Node, Delete Node, Delete Skeleton (clear it and start again) |
| Edges | New Edge (pick a source and destination node), Delete Edge |
| Symmetries | New Symmetry (declare a left/right pair), Delete Symmetry |
Symmetries¶
A symmetry marks two nodes as mirror images of each other — left_ear and
right_ear, left_hind_paw and right_hind_paw.
Declaring them is worth the thirty seconds: the
Label Quality Check uses symmetries to detect chirality
errors, where an instance has left and right systematically swapped. That is
one of the most common labeling mistakes and one of the hardest to spot by eye.
If you haven't declared symmetries, the check falls back to inferring pairs from
node names that start or end with left/right or L/R, such as
left_ear or ear_R.
Loading and saving skeletons¶
Load From File… in the Skeleton panel reads a skeleton out of:
- a
.slpproject - a skeleton JSON file (the legacy SLEAP format)
- a skeleton YAML file
and Save As writes YAML. This is how you reuse one lab-standard skeleton across many projects.
When you load a skeleton into a project that already has labels, the app compares the two and remaps existing instance points onto the new node set by name, so labels survive a skeleton swap wherever the names still line up.
Designing a skeleton¶
A good skeleton makes labeling faster and models more accurate. Settle it before you label much: every change later means revisiting labeled frames.
Choose landmarks you can find every time¶
A node should sit on a spot you can place in the same place on every frame, on every animal: the tip of the snout, the base of the tail, a joint. Avoid vague spots like "middle of the back" unless you'll place them consistently.
How many nodes?¶
Fewer than you want. Every node is a point you must place on every instance on every labeled frame, forever. Three to five well-chosen, reliably visible parts get you a working model far faster than a 30-node rig you'll label sloppily. Start small: you can add nodes later.
Adding a node later gives every existing instance an empty, non-visible point for it, so you'll need to go back and place it on your labeled frames.
For top-down models you also need one node that is central and almost always visible, to serve as the anchor part the model crops around. Design the skeleton so such a node exists.
Edges¶
What edges do depends on the model type:
- Top-Down and Single Animal: edges are for display. They make poses easier to read and help you spot mistakes, but the model doesn't use them.
- Bottom-Up: edges are how the model groups detected parts into animals, so every node must be connected. The Training panel disables Bottom-Up when the skeleton has no edges, and warns when it isn't fully connected.
For Bottom-Up, keep the tree shallow: connect parts to a central node rather
than in one long chain. Grouping follows the edges, so in a chain like
head → neck → torso → hip → tail, missing one node in the middle cuts off
everything after it.
Name left and right consistently¶
Use one pattern for paired parts, such as left_ear / right_ear or
ear_L / ear_R, and declare them as symmetries. Consistent
names keep exported columns readable and let the
Label Quality Check find the pairs.
Common mistakes¶
| Mistake | Why it hurts | Instead |
|---|---|---|
| Too many nodes | Slow labeling, and sloppy labels | Start with fewer; you can add nodes later |
| Landmarks you can't place consistently | The model learns your inconsistency | Pick sharp, visible features |
| No central, reliably visible node | Top-down crops have nothing stable to center on | Include a node like torso or thorax |
| Long chains of edges (Bottom-Up) | One missing node breaks the animal apart | Connect parts to a central node |
| Mixed left/right naming | Unreadable exports, and missed symmetry checks | One pattern, plus declared symmetries |