3、数据集准备:从零搭建你的YOLO训练数据
说实话,数据集准备这一步,是整条YOLO流水线里最枯燥、但也最关键的环节。我见过太多同学模型调了半天效果不好,最后发现是标注数据出了问题。嗯,咱们今天就把这块彻底讲透。
3.1 LabelImg标注工具:安装与使用
先聊聊标注工具。市面上工具不少,但LabelImg是我个人用得最顺手的。它轻量、开源,支持PascalVOC和YOLO两种格式,对新手特别友好。
安装方式
我建议直接用pip安装,省心:
pip install labelImg
labelImg
如果你在Windows上遇到问题,也可以从GitHub下载打包好的exe版本。我在项目里遇到过Python环境冲突的情况,后来直接用exe版本,稳得很。
使用流程
- 打开LabelImg,点击「Open Dir」选择图片文件夹
- 按
w键开始画框(或者点左侧的Create RectBox) - 画完框后输入类别名称,比如
person、car - 按
Ctrl+S保存标注文件 - 按
d切换到下一张图片
标注格式选择
LabelImg默认保存为PascalVOC格式(XML文件)。但YOLO需要的是TXT格式。你可以在界面左侧把「YOLO」勾上,这样保存的就是YOLO格式了。
YOLO格式长这样:
class_id x_center y_center width height
注意,这里的坐标都是归一化后的值(0~1之间)。举个例子:
0 0.5 0.5 0.3 0.4
这表示类别0的物体,中心点在图片的(50%, 50%)位置,宽占图片的30%,高占40%。
3.2 COCO数据集格式解析
COCO数据集是目标检测领域的「标准答案」。很多预训练模型都是在COCO上训的。理解它的格式,对你后续做迁移学习很有帮助。
COCO使用JSON格式存储标注信息。核心结构如下:
{
"images": [
{
"id": 1,
"file_name": "000001.jpg",
"width": 640,
"height": 480
}
],
"annotations": [
{
"id": 1,
"image_id": 1,
"category_id": 1,
"bbox": [100, 150, 200, 300],
"area": 60000,
"iscrowd": 0
}
],
"categories": [
{
"id": 1,
"name": "person"
}
]
}
这里有个细节要注意:COCO的bbox格式是 [x, y, width, height],其中x和y是左上角坐标。而YOLO用的是中心点坐标。两者转换时别搞混了。
我个人的做法是:写一个转换脚本,把COCO格式转成YOLO格式。这样既可以用COCO的预训练权重,又能用自己标注的数据。
3.3 自定义数据集制作
实际项目中,你很少能直接用现成的数据集。大部分时候得自己动手。我总结了一套流程:
第一步:收集图片
图片数量建议至少1000张以上(每个类别至少100张)。来源可以是:
- 自己拍摄(最靠谱,但成本高)
- 从视频中抽帧(我常用,用OpenCV每隔几帧保存一张)
- 网络爬虫(注意版权问题)
第二步:统一图片格式
把所有图片统一成JPG格式,分辨率建议在640x640以上。YOLO对输入尺寸有要求,但训练时会自动resize,所以原始图片大一点没关系。
第三步:标注
用LabelImg一张一张标。这里有个经验:
- 遮挡严重的物体可以不标
- 边界模糊的物体尽量标得紧贴边缘
- 同一类别的标注风格要一致
3.4 数据集划分
标注完数据后,得把数据集分成三份:训练集、验证集、测试集。我常用的比例是:
| 数据集 | 比例 | 用途 |
|---|---|---|
| 训练集 | 70% | 训练模型参数 |
| 验证集 | 15% | 调参、选模型 |
| 测试集 | 15% | 最终评估 |
划分时要注意:
- 随机打乱:别让同一场景的图片都跑到一个集里
- 类别均衡:每个类别在三个集中的比例要差不多
- 不要泄露:测试集在训练过程中绝对不能碰
我写了个简单的Python脚本做划分:
import os
import random
import shutil
# 假设图片和标注文件都在data目录下
files = os.listdir('data/images')
random.shuffle(files)
total = len(files)
train_end = int(total * 0.7)
val_end = int(total * 0.85)
train_files = files[:train_end]
val_files = files[train_end:val_end]
test_files = files[val_end:]
# 然后分别复制到对应目录
# 记得同时复制图片和标注文件
好了,数据集准备这块就讲到这里。下一章咱们开始搭建YOLO训练环境,到时候你会感谢今天认真标注的自己的。