一、YOLO数据格式核心规则
1. 标注文件规范
-
文件命名:每个图像对应一个
.txt
文件,与图像同名(如image_001.jpg
→image_001.txt
)。 -
标注格式:每行表示一个目标,格式为:
<class_id> <x_center> <y_center> <width> <height>
- 参数说明:
class_id
:类别索引(从0开始,与data.yaml
中的类别顺序一致)。x_center
,y_center
:边界框中心点坐标(归一化到图像尺寸的比例值,范围0~1
)。width
,height
:边界框的宽高(归一化比例值,范围0~1
)。
- 参数说明:
-
示例:
若图像尺寸为640x480
,标注某目标中心点坐标为(320, 240)
,宽高为100x80
,则归一化后:0 0.5 0.5 0.15625 0.166667
2. 目录结构要求
my_dataset/
├── images/ # 存放所有图像
│ ├── train/ # 训练集图像(如:0001.jpg, 0002.jpg)
│ └── val/ # 验证集图像
└── labels/ # 存放所有标注文件
├── train/ # 训练集标签(如:0001.txt, 0002.txt)
└── val/ # 验证集标签
- 强制规则:
images
和labels
的文件夹名称必须一致(如train
、val
)。- 图像与标注文件必须一一对应(文件名相同,扩展名不同)。
二、数据配置文件 data.yaml
1. 文件内容示例
path: ../my_dataset # 数据集根目录
train: images/train # 训练集路径(相对path)
val: images/val # 验证集路径
test: images/test # 测试集路径(可选)
nc: 3 # 类别总数
names: ['cat', 'dog', 'bird'] # 类别名称列表(顺序与class_id对应)
2. 关键字段说明
- **
nc
**:必须与names
列表长度一致。 - **
names
**:类别名称区分大小写,需与标注文件中的class_id
严格对应。
三、标注文件生成与验证
1. 从VOC/COCO格式转换
- VOC转YOLO:
import xml.etree.ElementTree as ET def convert_voc_to_yolo(xml_path, output_txt_path, classes): tree = ET.parse(xml_path) root = tree.getroot() size = root.find('size') width = int(size.find('width').text) height = int(size.find('height').text) with open(output_txt_path, 'w') as f: for obj in root.findall('object'): cls_name = obj.find('name').text if cls_name not in classes: continue cls_id = classes.index(cls_name) bbox = obj.find('bndbox') xmin = float(bbox.find('xmin').text) ymin = float(bbox.find('ymin').text) xmax = float(bbox.find('xmax').text) ymax = float(bbox.find('ymax').text) x_center = (xmin + xmax) / (2 * width) y_center = (ymin + ymax) / (2 * height) w = (xmax - xmin) / width h = (ymax - ymin) / height f.write(f"{cls_id} {x_center:.6f} {y_center:.6f} {w:.6f} {h:.6f}\n")
2. 标注验证脚本
检查标注文件是否合法:
import os
def validate_yolo_labels(label_dir, image_dir, classes):
for label_file in os.listdir(label_dir):
label_path = os.path.join(label_dir, label_file)
image_path = os.path.join(image_dir, label_file.replace('.txt', '.jpg'))
# 检查图像是否存在
if not os.path.exists(image_path):
print(f"错误:图像 {image_path} 缺失!")
continue
# 检查标注格式
with open(label_path, 'r') as f:
lines = f.readlines()
for line in lines:
parts = line.strip().split()
if len(parts) != 5:
print(f"错误:{label_path} 格式错误!")
cls_id, x, y, w, h = map(float, parts)
if not (0 <= cls_id < len(classes)):
print(f"错误:{label_path} 类别ID {cls_id} 越界!")
if any(val < 0 or val > 1 for val in [x, y, w, h]):
print(f"警告:{label_path} 坐标值超出0~1范围!")
四、实战技巧与常见问题
1. 数据增强与标注同步
- 翻转/旋转:若对图像做水平翻转,需同步调整
x_center
为1 - x_center
。 - 裁剪:裁剪后需重新计算归一化坐标(基于新图像尺寸)。
2. 处理小目标
- 标注要求:确保边界框至少占据图像的
2%
(如640x480
图像,框宽高需 ≥ 12 像素)。 - 增强策略:使用马赛克增强(YOLOv5/v8默认支持),提升小目标检测效果。
3. 常见错误排查
-
错误1:
RuntimeError: No labels found in *.txt files
原因:标注文件未正确生成或路径配置错误。
解决:检查data.yaml
中的路径是否指向正确的labels
文件夹。 -
错误2:
Class label mismatch
原因:data.yaml
中的names
列表与标注文件的class_id
不一致。
解决:统一类别名称顺序,确保class_id
从0开始连续。
五、工具推荐
-
标注工具:
- LabelImg(支持YOLO格式导出)
- CVAT(在线协作,支持自动化脚本)
-
数据可视化:
- 使用YOLOv8自带的可视化命令:
yolo detect train data=data.yaml model=yolov8s.pt --show-labels
- 使用YOLOv8自带的可视化命令:
-
数据集划分:
- 使用Python脚本随机划分:
import splitfolders splitfolders.ratio("raw_data", output="my_dataset", seed=42, ratio=(0.7, 0.2, 0.1))
- 使用Python脚本随机划分:
六、总结
- 核心原则:确保标注文件与图像严格对应,坐标归一化正确。
- 高效流程:
原始数据 → 标注工具 → 生成YOLO格式 → 验证 → 训练模型 - 进阶优化:结合数据增强和困难样本挖掘,提升模型鲁棒性。
YOLO数据格式规范要求每个图像对应一个同名的.txt标注文件,标注格式为<class_id> <x_center> <y_center> <width> <height>,所有坐标值需归一化到0~1范围。数据集目录需包含images和labels文件夹,且保持文件名一致。数据配置文件data.yaml需定义路径、类别数和名称列表。标注验证需检查格式合法性,数据增强时需同步调整标注坐标。常见错误包括路径配置错误和类别标签不匹配。推荐使用LabelImg等工具进行标注,并通过可视化命令验证数据质量。遵循这些规范可构建高质量数据集,为模型训练奠定基础。