
yolov8 训练失败提示“no labels found”通常源于数据集目录结构或 yaml 配置错误;本文详解符合 ultralytics 规范的目录组织方式、yaml 正确写法及常见陷阱,助你快速解决标签不可见问题。
yolov8 训练失败提示“no labels found”通常源于数据集目录结构或 yaml 配置错误;本文详解符合 ultralytics 规范的目录组织方式、yaml 正确写法及常见陷阱,助你快速解决标签不可见问题。
在 YOLOv8 中,模型不会自动推断标签路径——它严格依据 dataset.yaml 中定义的 train 和 val 子目录,在其内部相对路径下查找名为 labels 的子文件夹。你当前的配置:
path: -CENCORED-/Masaüstü/CustomObjectDetection/data train: img val: img
意味着 YOLOv8 将在 -CENCORED-/Masaüstü/CustomObjectDetection/data/img/ 目录下寻找 labels/ 文件夹(即 data/img/labels/),但你的实际标签很可能存放在独立的 labels/ 目录中(如 data/labels/),导致系统完全无法定位,从而触发警告 WARNING ⚠️ no labels found in detect set。
✅ 正确的数据集结构必须遵循 Ultralytics 官方约定(适用于检测任务):
dataset/ ├── train/ │ ├── images/ # 必须存在,存放训练图像(.jpg/.png等) │ └── labels/ # 必须存在,存放对应 .txt 标签文件(同名、同级) ├── val/ │ ├── images/ │ └── labels/ └── dataset.yaml # 指向该根目录,并声明 train/val 子目录名
? 关键规则:train: 和 val: 字段指定的是 path 下的子目录名(不是完整路径),YOLOv8 会自动在其内部查找 images/ 和 labels/ 两个固定名称的子文件夹。
因此,请按以下步骤修正:
1. 重构本地目录结构
假设原始数据位于 C:/Users/.../CustomObjectDetection/data/,请将其重组织为:
C:/Users/.../CustomObjectDetection/dataset/
├── train/
│ ├── images/
│ │ ├── fire_001.jpg
│ │ ├── smoke_042.jpg
│ │ └── ...
│ └── labels/
│ ├── fire_001.txt # 内容示例:0 0.35 0.62 0.21 0.18 (cls x_center y_center w h,归一化)
│ ├── smoke_042.txt
│ └── ...
└── val/
├── images/
└── labels/
确保每张 .jpg 图像在 labels/ 中有同名 .txt 文件(如 fire_001.jpg ↔ fire_001.txt),且 .txt 文件格式符合 YOLO 标注规范(单行一个目标,class_id center_x center_y width height,全部归一化到 [0,1] 区间)。
2. 更新 dataset.yaml 配置
将 trainer.yaml(建议重命名为 dataset.yaml 以符合惯例)内容更新为:
# dataset.yaml path: ./dataset # 相对路径(推荐)或绝对路径,指向 dataset/ 根目录 train: train # → 解析为 ./dataset/train/ val: val # → 解析为 ./dataset/val/ names: 0: fire 1: smoke
⚠️ 注意事项:
- path 值末尾不要加斜杠(./dataset/ ❌,./dataset ✅);
- train: 和 val: 后不能带 / 或子路径(train/images ❌,train ✅);
- Windows 路径若用绝对路径,建议使用正斜杠 / 或双反斜杠 \,避免转义问题,例如:
path: C:/Users/Name/CustomObjectDetection/dataset ✅
path: C:\Users\Name\CustomObjectDetection\dataset ✅
3. 验证与训练
运行前可快速验证路径是否可读:
from pathlib import Path
dataset_root = Path("./dataset")
print("Train images:", len(list((dataset_root / "train" / "images").glob("*.*"))))
print("Train labels:", len(list((dataset_root / "train" / "labels").glob("*.txt"))))
print("Val images: ", len(list((dataset_root / "val" / "images").glob("*.*"))))
print("Val labels: ", len(list((dataset_root / "val" / "labels").glob("*.txt"))))
确认输出数字匹配后,再执行训练:
from ultralytics import YOLO
model = YOLO("yolov8n.pt")
results = model.train(data="dataset.yaml", epochs=100, imgsz=640)
✅ 成功标志:日志中不再出现 no labels found,且 metrics/mAP50-95(B) 等评估指标开始正常计算。
? 总结:YOLOv8 的数据加载是“约定优于配置”的典型设计——它不猜测你的意图,只严格执行 path + train/val + labels/ 的三级路径拼接逻辑。一次规范的结构调整,即可永久规避此类路径类报错。务必检查三要素:目录层级命名一致、YAML 中 train/val 值仅为子目录名、所有 .txt 标签与图像严格同名。










