yolo-datasets · git:20260811.47343d9 · 2026-08-11 · sha256 b30e833a52f1153b

yolo-datasets git:20260811.47343d9A

Immutable. This exact content is served forever at /api/v1/blob/b30e833a52f1153b.

---
name: yolo-datasets
description: >
  Use when building, converting, analyzing, or debugging datasets for Ultralytics YOLO —
  writing data.yaml, YOLO label .txt formats, converting from COCO/DOTA/masks,
  auto-labeling raw images, train/val splitting, dataset validation, or errors like
  "no labels found", "dataset not found", or mAP near 0 after training. Covers detect,
  segment, semantic, depth, classify, pose, and OBB dataset formats.
---

# Ultralytics YOLO datasets

The #1 cause of silent training failure is a malformed dataset — validate before training.

## The `images` → `labels` mirror rule

Ultralytics finds a label file by replacing the **last** `/images/` path segment with
`/labels/` and the image extension with `.txt`:

```
dataset/
├── data.yaml
├── images/train/  img001.jpg ...     ├── images/val/  ...
└── labels/train/  img001.txt ...     └── labels/val/  ...
```

- Labels next to images, or in a dir not named `labels`, are **not found** → silent
  all-background training.
- Filenames must match stems exactly (case-sensitive on Linux).
- An image with no/empty label file trains as a **background image**. A few percent of
  true backgrounds reduce false positives; accidentally missing labels destroy recall.

## data.yaml anatomy

```yaml
path: /abs/dataset/root # relative paths resolve against `yolo settings` datasets_dir — prefer absolute
train: images/train # dir, .txt file of image paths, or list of dirs
val: images/val
test: images/test # optional
names: # 0-based, contiguous indices
  0: person
  1: helmet
# pose only:
kpt_shape: [17, 3] # [num_keypoints, dims]; dims 2 (x,y) or 3 (x,y,visibility)
flip_idx: [0, 2, 1, ...] # L/R keypoint swap map — without it, flip augs are auto-disabled
# semantic only (optional — polygon labels/ also work):
masks_dir: masks # per-pixel PNG mask images
# depth only: paired depth/{train,val}/*.npy float32 depth maps, nc: 1
```

- Classification datasets use **no yaml**: folder structure is the label
  (`dataset/train/<class>/*.jpg`, `dataset/val/<class>/*.jpg`); train with
  `data=path/to/dataset`.
- Per-task label line formats and their gotchas: read `label-formats.md` (this folder)
  whenever writing or debugging label files.

## Converting from other formats — use built-ins first

```python
from ultralytics.data.converter import convert_coco

convert_coco(labels_dir="coco/annotations/", use_segments=True)  # COCO → detect/segment
convert_coco(labels_dir="coco/annotations/", use_keypoints=True)  # COCO → pose
```

Also in `ultralytics.data.converter`: `convert_dota_to_yolo_obb(root)` (DOTA → OBB),
`convert_segment_masks_to_yolo_seg(masks_dir, output_dir, classes)` (index PNGs →
polygons), `yolo_bbox2segment(im_dir)` (upgrade detect labels to segment via SAM),
`convert_to_multispectral(path, n_channels)`.

Auto-label a raw image folder (detector proposes boxes, SAM refines masks):

```python
from ultralytics.data.annotator import auto_annotate

auto_annotate(data="path/to/images", det_model="yolo26x.pt", sam_model="sam_b.pt")
```

For VOC XML/CSV there is no converter — write a small script emitting the per-task line
format (normalize coords, center-based boxes).

## Splitting

```python
from ultralytics.data.split import autosplit

autosplit(path="dataset/images", weights=(0.9, 0.1, 0.0))  # writes autosplit_*.txt lists
```

Point `train:`/`val:` at the generated `.txt` files. Keep frames from the same
video/scene in ONE split — per-image random splits of video frames leak near-duplicates
into val and inflate mAP. For classify: `split_classify_dataset(source_dir, 0.8)`.

## Validate before training (do this, in order)

1. **Structural check** — loads, resolves paths, counts images/labels, auto-downloads
   known datasets:

   ```python
   from ultralytics.data.utils import check_det_dataset

   check_det_dataset("data.yaml")  # detect/segment/pose/obb/semantic/depth
   ```

2. **Visual check of one image** — labels drawn on the image; wrong normalization or
   swapped x/y is instantly visible:

   ```python
   from ultralytics.data.utils import visualize_image_annotations

   visualize_image_annotations("images/train/img001.jpg", "labels/train/img001.txt", label_map={0: "person", 1: "helmet"})
   ```

3. **1-epoch smoke test**, then eyeball the mosaic:
   ```bash
   yolo detect train data=data.yaml model=yolo26n.pt epochs=1 fraction=0.1
   # inspect runs/detect/train/train_batch0.jpg — boxes/masks must sit on objects
   ```
4. **Distribution sanity** (quick script over label files): instances per class
   (heavy imbalance → collect more or weigh expectations), boxes < ~8 px at train
   `imgsz` (undetectable — raise imgsz or tile), % background images, duplicate
   stems across splits (leakage).

Known-good tiny datasets for pipeline smoke tests (auto-download): `coco8.yaml`,
`coco8-seg.yaml`, `coco8-pose.yaml`, `dota8.yaml`, `cityscapes8.yaml`, `depth8.yaml`,
`imagenet10`.

## Related pages

- `label-formats.md` — exact per-task label line formats + symptom→cause table. Read
  when writing labels, converting formats, or any label-related error.

If the installed version rejects an argument or format here, trust its error message and
`yolo checks` over this file.