deepnoodletracker teaches a computer-vision model to find and trace elongated, line-like animal body parts it calls noodles — a sea-star arm, an octopus arm, a hydra tentacle, or any similar appendage. You trace a handful of examples by hand, and the model learns to trace the rest for you, including across long videos. You can also mark single-point pose keypoints and outline whole mask regions.
The cards below are ordered the way you actually work — Config, then Data, then Annotate, then Train, with Network and Hotkeys as helpers along the way. Open Quick steps on any card for a short checklist, or In detail for the full story.
index.csv, then train the model from the command line.Network and Hotkeys are optional helpers you can visit any time: Network shows a picture of the model your schema builds; Hotkeys lets you change the keyboard shortcuts.
Open an existing project, or create a new one and choose what it will label.
A project bundles a schema, your data, and your annotations. The tab has two cards:
When authoring a schema, give it a name and click + Add class for each body part. Every class has a colour, a name, and a kind:
Two more settings: Embedding dim (default 8) controls how well the model can tell apart overlapping individuals of the same noodle class, and Images per task (default 20) is just how many images are grouped into each labelling batch — it doesn’t change the model. Click Create project to finish.
Add the pictures and videos you want to label in two steps: upload, then extract frames.
Upload (step 1): drag and drop, or choose files. You can mix images
and videos freely. Large files are sent in 25 MB chunks and stored under the
project’s uploads/ folder. Uploading works the same whether the
browser is on the server or a remote machine, and nothing is processed yet —
each file is listed under Uploaded data as Pending. You can remove a
pending file before extracting it.
Extract frames (step 2): click Extract frames to ingest every file that is still pending. Extracted files stay listed for reference so you can see what has already been processed.
Why videos get sampled: a video has thousands of nearly identical frames, so the app picks a small, varied subset to label. It samples frames, describes each one with a frozen DINOv3 model, and selects the most different-looking frames so rare moments stay represented. Under Video sampling options you can set Images to annotate (default 100), Max frames extracted (default 5000), and Stride (auto). The Inventory card shows what’s currently in the project.
Trace your animals to build the labelled examples the model learns from.
The workspace has three panels; the two side panels can be collapsed (the ◀/▶ tabs) and resized (drag their inner edge).
Drawing:
Editing (with Select / edit): click a shape to select it, drag a point to move it, click an edge to insert a point, Ctrl-click a point to delete it, r reverses a noodle’s base↔tip, Del removes the shape, and Ctrl+Z undoes.
See a picture of the model your schema builds — just for understanding.
This tab is read-only — there’s nothing to fill in. The diagram is built from your current schema and updates as you change it (it shows “Add a noodle class to preview the network” until one exists).
It walks left to right through the model: a pretrained backbone that reads the image, a neck that fuses detail with context, small heads that predict one set of maps per body part, and decoders that turn those maps back into traced lines and points. It’s purely to help you understand what training will produce.
Change the keyboard shortcuts to suit you.
There are two groups. Tool hotkeys activate each class tool (these default to the number keys 1–9 in schema order). Drawing functions are the editing actions — select/edit, start/finish drawing, cancel, delete, reverse base↔tip, fit view, and previous/next image.
Each key can only do one thing, so assigning a key that’s already in use moves it from the old action. Your choices are saved in this browser (per browser), so they stick between sessions on this machine.
When you’ve labelled enough images, request a training run right here — an administrator approves it and the server runs it for you.
Submitting snapshots the project’s currently annotated images into a training index, so later annotation edits won’t change a run that’s already queued. Hyperparameters are clamped to safe ranges on the server, and runs execute as isolated processes (one at a time) so a heavy job can’t destabilize the app or collide on the GPU.
Training works with any project schema — the project’s body plan is snapshotted and drives the model’s channels automatically. You only need a small minimum of annotated images; the tab tells you if that isn’t met yet. Full training finetunes the DINOv3 backbone and can take hours. Administrators see an Approval queue of everyone’s pending requests.
Open an existing project (schema + data + annotations).
Create a new project and choose its body plan (schema).
A config binds an organism schema — a DeepLabCut-style declarative body plan [1] — to your data and annotations. The schema is the single source of truth for what the network predicts: it is compiled into an ordered set of dense output channels that the model, target rasterizer, loss, and decoders all read from. Each field below changes that channel contract:
[1] Mathis et al. (2018), DeepLabCut: markerless pose estimation of user-defined body parts with deep learning, Nature Neuroscience.
[2] Newell et al. (2016), Stacked Hourglass Networks for Human Pose Estimation, ECCV (arXiv:1603.06937).
[3] Cao et al. (2017), Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields, CVPR (arXiv:1611.08050).
[4] De Brabandere et al. (2017), Semantic Instance Segmentation with a Discriminative Loss Function, arXiv:1708.02551.
[5] Ravi et al. (2024), SAM 2: Segment Anything in Images and Videos, arXiv:2408.00714.
DeepNoodleTracker uses a single fully-convolutional hydra model: a frozen vision-foundation backbone extracts features, a shared FPN neck fuses them into one high-resolution map, and several lightweight heads each predict a stack of per-pixel maps. Those maps are concatenated into the exact channel contract your schema defines (the diagram above), then decoders turn them into traced appendages and keypoints. The components, left to right:
--freeze-backbone
to keep it frozen for very small datasets or faster/cheaper training. (The separate,
always-frozen DINOv3 pass used to pick diverse video frames during ingestion is a
different, inference-only use described in the Data tab.)
[1] Siméoni et al. (2025), DINOv3, arXiv:2508.10104.
[2] Liu et al. (2022), A ConvNet for the 2020s, CVPR (arXiv:2201.03545).
[3] Lin et al. (2017), Feature Pyramid Networks for Object Detection, CVPR (arXiv:1612.03144).
[4] Mathis et al. (2018), DeepLabCut, Nature Neuroscience.
[5] Newell et al. (2016), Stacked Hourglass Networks for Human Pose Estimation, ECCV (arXiv:1603.06937).
[6] Cao et al. (2017), Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields, CVPR (arXiv:1611.08050).
[7] De Brabandere et al. (2017), Semantic Instance Segmentation with a Discriminative Loss Function, arXiv:1708.02551.
[8] Wu & He (2018), Group Normalization, ECCV (arXiv:1803.08494).
[9] Elfwing et al. (2018) / Ramachandran et al. (2017), SiLU/Swish activation, arXiv:1710.05941.
[10] Dijkstra (1959), A note on two problems in connexion with graphs, Numerische Mathematik.
Add a noodle class to preview the network.
Add images and/or videos from your computer. Files are uploaded to the project first; nothing is processed until you extract frames in step 2. This works the same whether the browser is on the server or a remote machine.
Drag & drop images or videos here, or .
Large files are sent in 25 MB chunks (so they pass the Cloudflare
tunnel's body limit) and stored under the project's uploads/ folder.
Files you have uploaded to this project. Pending files are extracted in step 2; extracted files stay listed for reference.
Process every uploaded file not yet extracted. Images are added to the annotation queue as-is; videos are sampled, DINOv3-embedded, and a diverse subset of frames is selected to annotate.
Each path you enter is resolved recursively. Image files are queued for annotation as-is. Video files go through a four-stage diversity pipeline so you label a small, representative set instead of thousands of near-duplicate frames:
ceil(total_frames / max_frames) so that no more than
Max frames extracted (default 5000) frames are pulled across all videos
combined; you can override it with the Stride option.The selected frames are re-decoded at full resolution, saved as JPEGs, and added to the annotation queue. Selection is deterministic for a fixed seed.
[1] Siméoni et al. (2025), DINOv3, arXiv:2508.10104.
[2] Liu et al. (2022), A ConvNet for the 2020s, CVPR (arXiv:2201.03545).
[3] Arthur & Vassilvitskii (2007), k-means++: The Advantages of Careful Seeding, ACM-SIAM SODA.
[4] Eldar et al. (1997), The Farthest Point Strategy for Progressive Image Sampling, IEEE Trans. Image Processing.
Images + annotations for the open project, as a single zip streamed straight to your computer.
Keys to activate each class tool. Click a key, then press the desired key (Esc to cancel capture). Keys are unique and saved in this browser.
Keys for the drawing/editing actions.
Active annotation time across all projects. Time counts only while you are interacting on the Annotate tab.
Configure a training run for the open project and submit it to the queue. An administrator reviews and approves pending runs; approved runs execute one at a time on the server's GPU.
When you submit, the server snapshots the project's currently annotated images into a training index (so later edits won't change this run) and adds a Pending request to a shared queue. An admin then approves or rejects it. Approved runs are executed one at a time as isolated processes on the server so a heavy run can't destabilize the web app or collide on the GPU.
Full training finetunes the DINOv3 backbone and can take hours. You can watch progress and the live log below, and cancel your own run at any time. Hyperparameters are clamped to safe ranges on the server.