The Review-First AI Annotation Workflow: Draft, Judge, Done
Auto-annotation has a dirty secret: clicking "AI label everything" is the easy part. The time goes to fixing what the model produced — deleting hallucinated boxes, nudging sloppy ones, re-drawing the misses. If reviewing costs as much as drawing, the AI bought you nothing. The fix is not a better model; it is a workflow where judging is strictly cheaper than drawing.
The loop
| Step | Key | What happens |
|---|---|---|
| 1. Open the folder | — | Thumbnails scan in; filters show unlabeled / pending / done |
| 2. Draft | ⚡ | The local model pre-annotates the current image or the whole folder |
| 3. Judge next draft | A / D | Walk forward and backward through pending items |
| 4. Accept | Enter | Pending box becomes a confirmed annotation |
| 5. Reject | Esc | Draft discarded; next pending item is focused |
| 6. Next image | ← / → | Progress and pending counts update live |
The critical property: AI results are never written silently. They land in a pending layer, visually distinct, until you judge them. Your confirmed labels are untouchable by the model — which is what makes it safe to re-run AI on half-finished work.
Thresholds: recall beats precision for drafts
For drafting, set the confidence threshold lower than you would for production inference. A missed box costs you a manual draw; a false draft costs one Esc. In FlyLabelImg's auto-label dialog, start around 0.35–0.45 and let the judge's fingers do the precision work. The exception is folder-wide batch runs: if the model floods a 10,000-image folder with garbage, the threshold is too low — tune on 50 images before committing the batch.
Re-runs and dedup
Six months later you will have a better model and an old dataset. Re-annotating from scratch throws away human judgment; merging raw output duplicates everything. The sane middle: drafts that overlap a confirmed box of the same class with IoU above ~0.7 are dropped automatically, so the model only adds what is genuinely new (missed objects, new classes). Everything else arrives as pending for the same judging loop.
Class prompts
Vision-language models do not need 5,000 fine-tuned samples to be useful as drafters: you describe the classes in text ("person, helmet, forklift") and the model labels what it sees. FlyLabelImg lets you reuse the project's class list as prompts or type a custom hint per run — useful when you want only one class drafted ("just the helmets") and the rest drawn by hand.
Where the workflow hits its limits
- Tiny or densely packed objects — general-purpose VLMs draft them poorly; expect more Esc than Enter and consider a specialized fine-tuned detector endpoint (FlyLabelImg accepts any OpenAI-compatible endpoint).
- First-time classes with unusual appearance — draft quality starts low; your confirmed judgments are still the ground truth, and re-running with a fine-tuned model later is cheap thanks to dedup.
- Pixel-perfect masks — polygon drafting is supported, but this is a boxes-and-polygons tool, not an interactive segmentation suite.
Judge, don't draw
FlyLabelImg runs this loop end to end: local model drafts, pending queue, keyboard-only judging, dedup on re-runs. 30-day trial, all features.
FAQ
How good is the bundled model, really?
For common classes (people, vehicles, everyday objects) on normal photos, expect the majority of drafts to be acceptable with at most a nudge. For domain-specific imagery, treat it as a starter: confirm what is right, draw what is missing, and re-run later — dedup keeps your work.
Can I use my own detection model instead of the bundled one?
Yes. FlyLabelImg can point at any OpenAI-compatible inference endpoint in the model settings, so a fine-tuned detector or a GPU server in your rack works the same way.
Does AI overwrite my manual boxes?
No. Drafts land in a pending layer until judged, confirmed boxes are never modified by the model, and same-class drafts overlapping confirmed boxes (IoU > 0.7) are dropped on re-runs.