使用Ultralytics YOLOv8训练自定义数据集时触发无标签错误
问题描述
使用Ultralytics YOLOv8进行自定义数据集实例分割训练时,触发错误提示labels.cache中所有标签为空,无法启动训练,推测是标签未被正确检测导致。
报错信息
ValueError: All labels empty in F:\Miscellaneous Datasets\DACL10K_v2\dacl10k_v2_devphase\datasets\dacl10k\train\labels.cache,
can not start training without labels. See
https://github.com/ultralytics/yolov5/wiki/Train-Custom-Data
训练代码
model = YOLO("yolov8n-seg.pt") results = model.train( batch=8, device="cpu", data="./data.yaml", epochs=7 )
工作目录结构
root | |--datasets | | | |--dacl10k | | | |--test | | |--images | | |--<test images> | |--train | | | | | |--images | | | |--<train images> | | | | | |--labels | | |--<train labels> | | | |--val | | | |--images | | |--<validation images> | | | |--labels | |--<validation labels> | |--data.yaml | |--yolo_train.ipynb
标签格式说明
标签文件名与对应图像文件名一致(图像为.jpg,标签为.txt),每个标签文件每行格式为:
<class index> <x1> <y1> <x2> <y2> .... <x> <y>
其中<class index>为类别索引,x、y为目标多边形顶点坐标。
data.yaml配置
# Train/val/test sets path: F:/Miscellaneous Datasets/DACL10K_v2/dacl10k_v2_devphase/datasets/dacl10k # dataset root dir train: F:/Miscellaneous Datasets/DACL10K_v2/dacl10k_v2_devphase/datasets/dacl10k/train/images val: F:/Miscellaneous Datasets/DACL10K_v2/dacl10k_v2_devphase/datasets/dacl10k/val/images test: F:/Miscellaneous Datasets/DACL10K_v2/dacl10k_v2_devphase/datasets/dacl10k/test/images # Directories train_label_dir: F:/Miscellaneous Datasets/DACL10K_v2/dacl10k_v2_devphase/datasets/dacl10k/train/labels val_label_dir: F:/Miscellaneous Datasets/DACL10K_v2/dacl10k_v2_devphase/datasets/dacl10k/val/trains # Classes (19) nc: 19 # number of classes names: ['Graffiti',' Drainage', 'Wetspot', 'Weathering', 'Crack', 'Rockpocket', 'Spalling', 'WConccor', 'Cavity', 'Efflorescence', 'Rust', 'PEquipment', 'ExposedRebars', 'Bearing', 'Hollowareas', 'JTape', 'Restformwork', 'ACrack', 'EJoint'] # class names
已尝试使用相对路径替代绝对路径,问题仍未解决。
修复data.yaml路径笔误:
val_label_dir配置错误,写成了val/trains,实际应为val/labels,修正后如下:val_label_dir: F:/Miscellaneous Datasets/DACL10K_v2/dacl10k_v2_devphase/datasets/dacl10k/val/labels验证标签坐标是否归一化:YOLO要求分割标签的x、y坐标必须是相对于图像宽高的归一化值(范围0-1),如果是原始像素值,模型会判定为空标签。可通过图像宽高计算验证,例如图像宽度为1920,某点x像素值为960,归一化后应为0.5,若标签中是原始像素值,需批量转换为归一化值。
删除旧缓存文件:删除
train/labels.cache和val/labels.cache,重新启动训练,让模型重新读取标签生成正确的缓存文件。简化数据集路径:当前路径包含空格(如
Miscellaneous Datasets),可能存在兼容性问题,建议将数据集移至无空格、无特殊字符的路径(如F:/Datasets/DACL10K),并同步修改data.yaml中的所有路径。检查标签文件合法性:随机打开几个标签文件,确认:
- 无空行或无效字符
- 类别索引在0-18之间(因
nc=19,索引从0开始) - 每个目标的多边形顶点数量不少于3个(至少3个点才能构成有效区域)
内容的提问来源于stack exchange,提问作者Chinmay

