tuliq
Runs in your browser

YOLO Annotation Diff

Compares two versions of a YOLO dataset and shows exactly what changed — a correction pass, a re-run of auto-labeling, or dataset-v1 vs dataset-v2. Images are matched by filename (folder structure can differ between versions); boxes within a matched image are matched to each other by geometric overlap, not file order, so a moved or resized box is recognized as one changed annotation rather than counted as a removal plus an unrelated addition, and a box that kept its position but got relabeled is recognized specifically as a class change. The comparison stays entirely in YOLO's normalized coordinate space — no image decoding needed for the numbers, unlike the Dataset Converter — with images only decoded on demand, one at a time, for the visual Before/After/Overlay review of a specific changed image. Reports images compared, added/removed/changed annotation counts, and a class-changed/moved/resized breakdown. Nothing is uploaded; both datasets are read and compared entirely in your browser.

Before

Nothing is uploaded — every file is read directly in your browser. Pick a .zip and it's unzipped automatically; pick image/label files directly and they're used as-is. Folder selection can't be combined into the same picker — your browser shows a genuinely different, folder-only dialog for it.

After

Nothing is uploaded — every file is read directly in your browser. Pick a .zip and it's unzipped automatically; pick image/label files directly and they're used as-is. Folder selection can't be combined into the same picker — your browser shows a genuinely different, folder-only dialog for it.

Load both a "Before" and an "After" dataset to see what changed.

About this tool

This tool compares two versions of a YOLO dataset and shows exactly what changed between them — a real correction pass, a re-run of an auto-labeling step, or simply "dataset-v1" vs "dataset-v2". Images are matched between the two by filename (not full path, since a reorganized folder structure between versions is common), and boxes within each matched image are matched to each other by geometric overlap, not by position in the file — a box that moved or resized is recognized as the same annotation changed, not counted as one removed and one added, and a box that's the same box but got its class relabeled is recognized specifically as a class change. Everything else — a box present in one version but nowhere plausible in the other — is a genuine addition or removal. The comparison works entirely in YOLO's own normalized coordinate space, so unlike the Dataset Converter, this tool never needs to decode an image just to compute the diff; images are only decoded on demand, one at a time, when you actually expand a specific image to look at it. That review view draws the real boxes on the real image — Before shows the old annotations, After shows the new ones, and Overlay shows both at once (the old position dashed, the new one solid) so a moved or resized box is visible as a single glance, not something you have to infer from two separate screenshots.

What you can do

  • Compare two YOLO dataset versions — a correction, a re-run, a second annotator's pass
  • Added, removed, and changed annotations broken down by class-changed, moved, and resized
  • Before / After / Overlay visual review for any changed image, not just numbers
  • Nothing is uploaded — both datasets are read and compared entirely in your browser

How to use

Step 1

Load Before and After

Two independent pickers — the same folder/.zip/files intake as the rest of the CV Workbench.

Step 2

Review the summary

Images compared, plus added/removed/changed annotation counts and a class-changed/moved/resized breakdown.

Step 3

Inspect individual images

Expand any changed image to see it rendered — Before, After, or both overlaid — not just a number.

Example

A comparison summary looks like this:

Diff summary

2,841 images compared
+143 added   -82 removed   ~211 changed   =7,202 unchanged

Class changed: 37   Box moved: 91   Box resized: 83

Every number in the "changed" breakdown is independently clickable through to the actual images and boxes involved, not just a static count.

How your data is handled

This tool is labeled 🟢 Browser: both datasets (folder, .zip, or individual files) are read directly via your browser's File API, and every comparison — including the visual Before/After/Overlay rendering — runs entirely client-side. Nothing is uploaded, and there's no server involved anywhere in this tool. No AI model is used; box matching is a deterministic geometric overlap (IoU) calculation, not a prediction.

Frequently asked questions

How are images matched between the two datasets?+

By filename alone, not the full path — the two versions being compared very plausibly live in different folder structures (different splits, a reorganized dataset), so matching on the complete relative path would miss real matches that should be compared. Two images that happen to share a filename in different subfolders of the *same* dataset will get an arbitrary but deterministic pairing — a known limitation worth being aware of if your dataset has duplicate filenames.

How are individual boxes matched within an image?+

By geometric overlap (IoU), not by their order in the label file. Same-class boxes are matched first, highest-overlap pairs prioritized; whatever's left is checked for a very high-overlap match across different classes, which is what a genuine class relabel looks like — the box barely moved, only its class changed. Anything still unmatched after both passes is a real removal or addition, not a change.

What counts as "moved" vs "resized" vs unchanged?+

A matched pair is "unchanged" only if its class, center position, and size are all effectively identical — small floating-point differences (well under 1% of the image) don't count. Beyond that, a center shift counts as "moved" and a width/height change beyond about 5% counts as "resized" — a box can be both at once, and is counted in both breakdown rows if so.

Does this need to decode every image, like the Dataset Converter does?+

No — the diff itself stays entirely in YOLO's normalized 0-1 coordinate space, so "did this box move" is answerable without ever knowing the image's real pixel size. Images are only decoded when you actually expand one to look at it in the visual review, one at a time, never upfront for the whole dataset.

Can I compare a YOLO dataset against a COCO or Pascal VOC one?+

Not yet — both sides need to be YOLO datasets for now. Comparing across formats (say, verifying a Dataset Converter export against its source) is a reasonable future addition, not something this first version handles.

Related tools