tuliq
Runs in your browser

YOLO Dataset Splitter

Splits a YOLO dataset into train/validation/test sets โ€” not a random file shuffle, but one that understands the dataset: image-label pairs always move together, the split is seeded so the exact same result is reproducible later, and it's checked before export rather than just produced. Automatically flags classes with zero or very few examples in validation/test, and exact duplicate images that leak across the train/val/test boundary (genuine data leakage, not a bug in the split). An optional, slower perceptual check also catches near-duplicates โ€” a resize, a recompression, a light crop of the same photo โ€” that a byte-exact hash would miss. Always builds a brand new split from the dataset's whole image pool; any existing train/val/test folder structure is disregarded. Only ever produces a new downloadable .zip; your original dataset is read, never modified.

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.

About this tool

This tool splits a YOLO dataset into train/validation/test sets โ€” not just a random file shuffle, but one that understands the dataset: image-label pairs always move together, the split is seeded so the exact same result is reproducible later, and the result is checked before you export it. Two things get checked automatically: per-class balance across the three splits (a class with zero or very few examples in validation or test is flagged, since that's a real problem for evaluating a model even though it's not a bug), and exact duplicate images โ€” a photo that ends up copied into both train and validation, whether from messy source data or an earlier mistake, is genuine data leakage that inflates validation accuracy without meaning anything. A slower, optional perceptual check can also catch near-duplicates a byte-exact hash would miss โ€” a resize, a recompression, a light crop of the same photo. Splitting always starts from the dataset's whole pool of images and produces a brand new split; whatever folder an image originally lived in (including an existing train/val/test structure) is disregarded. This only ever produces a new, downloadable .zip โ€” your original dataset is never modified.

What you can do

  • Seeded, reproducible train/validation/test splits โ€” image-label pairs always stay together
  • Per-class balance across splits, plus exact and optional near-duplicate leakage checks
  • Preview every warning before exporting โ€” nothing is decided silently
  • Nothing is uploaded โ€” splitting and every check run entirely in your browser

How to use

Step 1

Load your dataset

Same folder/.zip/files picker as the other CV Workbench tools.

Step 2

Set ratios and a seed

70/20/10 by default โ€” the seed makes the exact same split reproducible later, or shareable with a teammate.

Step 3

Review, then export

Per-class balance, and duplicate images that would otherwise leak between train and val/test, before you download anything.

Example

A split result looks like this:

Split preview

Train 7,000 ยท Validation 2,000 ยท Test 1,000

Warnings
โ€ข "helmet" has only 2 examples in test
โ€ข 3 exact duplicate images cross train/validation

Both warnings are worth a look before training โ€” a rare class barely represented in test makes evaluation unreliable, and a duplicate crossing the train/validation boundary means validation accuracy is partly measuring memorization, not generalization.

How your data is handled

This tool is labeled ๐ŸŸข Browser: every file you pick (folder, .zip, or individual files) is read directly via your browser's File API, and the split โ€” including every duplicate/leakage check โ€” runs entirely client-side. Nothing is uploaded, and there's no server involved anywhere in this tool. No AI model is used; the perceptual near-duplicate check uses the same deterministic hashing math as the Duplicate Image Finder, not a model.

Frequently asked questions

Does this modify my original dataset?+

No โ€” it only ever produces a new .zip download with the split files. Every original file is read, never written to, moved, or deleted.

What does the seed actually do?+

It makes the split reproducible โ€” the same dataset, ratios, and seed always produce exactly the same train/val/test assignment. Change the seed to get a different random split; keep it the same to reproduce a split you (or a teammate) already used.

What happens if my dataset already has train/val/test folders?+

They're disregarded โ€” every image in the dataset is pooled together and reassigned into a brand new split according to the ratios and seed you set. This tool always builds a fresh split rather than respecting or adjusting an existing one.

Why is the near-duplicate check optional and separate from the exact duplicate check?+

Exact duplicates (byte-identical files) are cheap to detect and run automatically. The perceptual check that also catches resized, recompressed, or lightly cropped near-duplicates is a much more expensive comparison โ€” it scales roughly with the square of your image count, the same cost profile as the Duplicate Image Finder's hash pass โ€” so it's an explicit, opt-in step rather than something that runs on every dataset by default.

Why is a class with few examples in validation/test flagged as a warning, not an error?+

It's not necessarily wrong โ€” a naturally rare class in a small dataset can legitimately end up under-represented in val/test no matter how you split it. It's flagged because it's worth knowing before you trust a model's reported accuracy on that class, not because the split did anything incorrect.

Related tools