数据集制作基础:从采集到标注,一个都不能少
说实话,很多同学一上来就急着调模型参数,觉得数据集制作是体力活,随便搞搞就行。我刚开始做YOLO项目时也这么想,结果模型训练出来,检测效果惨不忍睹。后来花了整整两周排查,才发现问题出在数据集上——标注框歪了、图像模糊、类别搞混……嗯,从那以后我再也不敢轻视数据准备了。
这一章,我们就来聊聊数据集制作的三个核心环节:图像怎么拍、用什么工具标、标完存成什么格式。说白了,这就是你模型能力的“地基”,地基不稳,楼盖得再高也得塌。
图像采集规范:别让数据输在起跑线上
你可能觉得,拍照谁不会啊?但训练用的图像和日常拍照完全是两码事。我在项目中遇到过好几次,客户拿手机随便拍了几百张图,结果模型训练出来,换个光线环境就完全失效了。
这里我总结了几条硬性规范,你照着做,能省掉后面80%的麻烦:
| 规范项 | 具体要求 | 为什么重要 |
|---|---|---|
| 分辨率 | 不低于640×640,建议1920×1080以上 | YOLO会缩放图像,低分辨率会丢失细节 |
| 光照条件 | 覆盖白天、黄昏、夜晚、逆光等多种场景 | 模型需要适应真实世界的多变光照 |
| 拍摄角度 | 俯视、平视、侧视都要有 | 目标可能从任何角度出现 |
| 背景多样性 | 至少5种以上不同背景 | 避免模型只记住背景而非目标本身 |
| 目标尺度 | 包含大、中、小三种尺度的目标 | YOLO对不同尺度的检测能力需要均衡训练 |
| 遮挡程度 | 0%、25%、50%、75%遮挡都要有 | 真实场景中目标经常被部分遮挡 |
另外,我建议每类目标至少采集1500-2000张原始图像。别嫌多,后面做数据增强、划分训练验证集时,数量不够会很被动。
数据标注工具:选对工具,事半功倍
标注工具我前后用过七八种,最后常驻在电脑里的就两个:LabelImg 和 CVAT。它们各有各的强项,我分别说说。
LabelImg:轻量级首选,个人项目利器
LabelImg 是我最早接触的标注工具,纯Python写的,界面简洁到有点“简陋”。但你别小看它,该有的功能一个不少:
- 支持格式:YOLO txt、Pascal VOC xml、CreateML json
- 标注方式:矩形框,按住鼠标拖拽就行
- 快捷键:W(创建框)、D(下一张)、A(上一张)、Ctrl+S(保存)
- 自动保存:切换图片时自动保存,不怕丢数据
安装也很简单:
# 方式一:pip安装
pip install labelimg
# 方式二:从GitHub克隆
git clone https://github.com/tzutalin/labelImg
cd labelImg
python labelImg.py
CVAT:团队协作神器,功能全面
CVAT(Computer Vision Annotation Tool)是Intel开源的在线标注平台。如果你做的是团队项目,或者需要标注视频、分割掩码、关键点,CVAT 是更好的选择。
| 特性 | LabelImg | CVAT |
|---|---|---|
| 部署方式 | 本地单机 | Web服务(可本地部署) |
| 多人协作 | ❌ 不支持 | ✅ 支持,有任务分配和审核 |
| 标注类型 | 矩形框 | 矩形框、多边形、关键点、线条 |
| 视频标注 | ❌ 不支持 | ✅ 支持插帧标注 |
| AI辅助 | ❌ 无 | ✅ 内置自动追踪和半自动标注 |
| 学习成本 | 低,10分钟上手 | 中等,需要熟悉界面 |
我个人习惯是:小项目(少于5000张图)用LabelImg,大项目或团队项目用CVAT。别在工具选择上纠结太久,关键是赶紧把数据标出来。
YOLO标注格式详解:txt文件里的秘密
YOLO用的标注格式是纯文本txt文件,每张图片对应一个同名的txt文件。比如 image_001.jpg 的标注文件就是 image_001.txt。
打开一个txt文件,你会看到这样的内容:
0 0.516406 0.504167 0.278125 0.475000
1 0.750000 0.520833 0.165625 0.441667
2 0.256250 0.487500 0.140625 0.383333
每一行代表一个标注框,格式是:
<class_id> <x_center> <y_center> <width> <height>
这里有几个关键点,我当年可是在这上面吃过亏的:
- 坐标都是归一化的:所有数值都在0到1之间
- 归一化公式:x_center = 框中心x坐标 / 图片宽度;y_center = 框中心y坐标 / 图片高度;width = 框宽度 / 图片宽度;height = 框高度 / 图片高度
- class_id从0开始:第一类就是0,第二类是1,以此类推
- 每个txt文件可以有多行:一张图里有多少个目标,就写多少行
举个例子,假设图片是1000×800像素,有一个框的左上角在(200, 150),右下角在(500, 450):
框中心x = (200 + 500) / 2 = 350
框中心y = (150 + 450) / 2 = 300
框宽度 = 500 - 200 = 300
框高度 = 450 - 150 = 300
归一化后:
x_center = 350 / 1000 = 0.35
y_center = 300 / 800 = 0.375
width = 300 / 1000 = 0.3
height = 300 / 800 = 0.375
最终txt内容:0 0.35 0.375 0.3 0.375
数据集目录结构:规范管理,避免混乱
标注完数据后,目录结构要清晰。我推荐这样的组织方式:
dataset/
├── images/
│ ├── train/ # 训练集图片
│ ├── val/ # 验证集图片
│ └── test/ # 测试集图片
├── labels/
│ ├── train/ # 训练集标注
│ ├── val/ # 验证集标注
│ └── test/ # 测试集标注
├── data.yaml # 数据集配置文件
└── classes.txt # 类别列表
data.yaml 文件内容示例:
train: ./dataset/images/train
val: ./dataset/images/val
test: ./dataset/images/test
nc: 3
names: ['person', 'car', 'bicycle']
这里 nc 是类别数量,names 是类别名称列表,顺序必须和标注文件中的class_id一一对应。
本章知识体系总览
下面这张图帮你理清数据集制作的完整流程:
好了,数据集制作的基础就聊到这里。记住:好的数据集 = 规范的采集 + 准确的标注 + 正确的格式。这三样都做到位了,你的YOLO模型训练就已经成功了一半。