No original frames loaded
or to enable Frame View
The app reviews the detections of one clustering run at a time. Nothing leaves your computer: the files are read in the browser.
*_annotation.zip written by the pipeline on the setup screen (or pick the CSVs one by one under "upload files individually"). detections.csv is all it needs; mosaic_annotations.csv (the pipeline's order) and run_parameters.json are used when present, and the mosaic pages are not needed. A YOLO dataset (one labels/*.txt per image, with the class names in classes.txt or a data.yaml; the app's own export included) is accepted too. Its boxes are taken as finished labels, so it exports without padding.cluster_*.png mosaic pages too. A frame name found twice (the raw frames and the pipeline's copies with the boxes drawn in) keeps the file nearest the folder chosen, and the status says so.When a previous session is found in this browser, a dialog offers to restore it before anything is loaded. It names the ZIP the session belongs to. To continue another day, see Saving your work.
The Clusters / Frames toggle in the top bar switches between them; the ← Clusters button in the frame toolbar goes back. The numbers in the top bar are the whole run: detections, confirmed, rejected, open, plus flagged and deleted when there are any. The theme button at the right end (☀︎ or ☾) switches between the light and the dark theme; it follows the system until you choose.
run_parameters.json, with a count and a progress bar each; the selected group's thumbnails fill the middle, and the inspector on the right shows the focused particle. Show all groups at the bottom of the list stacks every group on one page instead; the same button, now One group at a time, goes back. Hide empty clusters (classes), under the switch at the top, leaves out the groups with no thumbnail left, all relabeled to another class or deleted; the number next to it says how many there are. This is where a run is triaged quickly.The two stay in step. Select a thumbnail and press F (or Show on frame in the inspector) to open its frame zoomed on that box; select a box on a frame and press F to find its thumbnail. Any decision made in one view shows in the other at once.
The inspector on the right shows the focused particle in its original frame, centred on its box, with its cluster, class and status. The Zoom slider goes from the wide surroundings to the box alone. Drag the box to move it, or drag a corner or an edge to resize it; the thumbnail is recut and marked as edited, and Ctrl/Cmd+Z undoes it. Double-click the picture to open Frame View there. Without frames, the inspector shows the thumbnail instead.
Frame View needs the original frames. The toolbar holds three tools:
With a box selected, C X U W confirm, reject, reset and flag it, a right-click or R relabels it, a click on a chip of the bottom class strip relabels it too, and Delete removes a drawn box, or takes a model detection out of the dataset (Deleted filter, U restores). Esc cancels a drag or a drawing in progress and returns to Select. Ctrl/Cmd+Z undoes moves, resizes, drawings, deletions and relabels.
The border colour of a box is its class; the fill tint is its status. Class labels appear once a box is large enough on screen, and always on hover. The frame list on the left shows per-frame progress and follows the active filter, as do the boxes on the image. Above it, choose a class (only the frames that have it; its boxes stand out) and the order: by name, most detections or most open first. A box you moved or resized carries a ✎ badge on its thumbnail, which is then cut from the frame with the new geometry.
Wrong boxes. X rejects a detection: it leaves the training export but stays in the CSV as "rejected", so the record shows what was reviewed (tick Leave rejected detections out of the CSV exports for a clean CSV). Delete removes it from the dataset altogether: out of every view and export, kept in the record, found again with the Deleted filter and restored with U. Boxes you drew yourself are removed by Delete. Boxes that are too tight around fine appendages are padded on export (10 % per side by default, see Exporting) or resized here.
class_N; the pipeline's reject cluster, where it puts poor detections (marked in run_parameters.json), is low_quality. These names become the YOLO class names, so rename them.attributes.csv. The filter offers them next to the class.Continuing another day (same computer, same browser): nothing to save before leaving. Open the page, choose Restore Session in the dialog that names your run, then choose the results ZIP again (a browser never keeps files between visits). The frames are asked for again only if the thumbnails were not all cut last time; otherwise they serve Frame View only. Load, and you are where you stopped. On another computer or in another browser, or after clearing the browser's data, pick your last saved session file in the session file box instead. A saved file is a snapshot: what you did after saving it is only in the browser until you save again (or use Also write to a file on disk).
Files the app downloads by itself. Whenever work could be lost, the app first downloads it, named after the run it belongs to (which may be another run than the one open: an old copy left in this browser, for instance). One you do not need can be deleted.
…_session_<date>.json: Session ▸ Save session…, and each tab's work when a second tab starts annotating.…_browser-copy_<time>.json: the browser's copy before it is dropped (Start Fresh, Cancel when another run's ZIP is chosen).…_session_before-transfer.json: the previous run's session, before its decisions are transferred to a new run.A new run of the pipeline. A session belongs to one run, because decisions are attached to the detection numbers of that run. When you load a session with another ZIP, the app offers to transfer it: each decision goes to the particle found again on the same image at the same place, classes travel by name, boxes you drew are re-created, and a report lists what could not be matched (particles the new run did not find, images no longer in it), which simply stay open. Decisions already made in the new run are never changed, and the previous session is left untouched (a browser copy is downloaded as a file first). Sessions saved by older versions do not record positions: the report then asks for the previous run's ZIP.
Everything is under Export ▾ in the top bar; Export options… opens the padding, the CSV option and the preview:
user_drawn flag and a column per attribute set in use. Preview shows it in the page; the ZIP variant writes one CSV per image.classes.txt and data.yaml. Only confirmed detections are written, drawn boxes included. Coordinates are normalised with each frame's own size and clipped to the image. To train, copy the frames into an images/ folder beside labels/; data.yaml finds it from any working directory. A frame that still has open detections would teach those particles as background, so finish a frame before training on it (the preview and data.yaml count such frames). With attributes in use, attributes.csv gives each label line its attributes (training ignores it).The padding slider (Export dialog, or Pad in the frame toolbar) grows every exported box by a percentage of its own size without changing the data, 10 % per side by default because the pipeline's boxes often cut fine antennae (0 % for a YOLO dataset loaded as input); Frame View previews it with the original as a dashed outline. The export section also says how many decisions changed since the last export.
Also available at any time behind the ? button or the ? key. Tab and Shift+Tab move from group to group in the list.
| ←→↑↓ | Navigate detections (Frame View: ↑↓ or Shift+←→ change frame) |
| Shift+arrows | Extend the selection (Cluster View) |
| Tab / Shift+Tab | Next / prev cluster (or frame) |
| C / X | Confirm / Reject, then step to the next |
| Space | Cycle state of the focused thumbnail (like clicking it once selected) |
| R / U | Relabel / Reset |
| W | Flag for review (find them with the Flagged filter) |
| Ctrl/Cmd+Z | Undo the last action (also batch ones) |
| F | Show in Frame View ⇄ show in Cluster View |
| N | Next detection without a decision |
| 1–9 | Assign class |
| Shift+drag | Rectangle select (Cluster View) |
| Ctrl/Cmd+A | Select all visible (Cluster View) |
| V / B / H | Select / Draw / Pan tool (Frame View) |
| + / - / 0 | Zoom in / out / fit (Frame View); Ctrl/Cmd+wheel zooms at the cursor |
| Delete / Backspace | Delete: a drawn box is removed, a detection leaves the dataset (Deleted filter, Reset restores) |
| I / ? | Toggle the inspector (Cluster View) / this legend |
| Esc | Close popups / cancel drag |
Review, correct, and export particle annotations for YOLO training
Choose the original frames of this run: the thumbnails are cut from them.
This run's thumbnails are already in this browser: the frames are only needed for Frame View.
Your work is kept in this browser and offered back automatically. If that copy is gone (cache cleared, other computer), pick the session JSON you saved with Session ▸ Save session; it is applied once the ZIP is loaded.
No original frames loaded
or to enable Frame View
Decisions were carried over to the particles found again on the same images. Everything below is now part of this run; what could not be matched is open again.
A previous annotation session was found. Would you like to restore it? Start Fresh downloads it as a file first: this browser keeps one copy for all runs.