数据集制作基础:从采集到标注,一个都不能少

说实话,很多同学一上来就急着调模型参数,觉得数据集制作是体力活,随便搞搞就行。我刚开始做YOLO项目时也这么想,结果模型训练出来,检测效果惨不忍睹。后来花了整整两周排查,才发现问题出在数据集上——标注框歪了、图像模糊、类别搞混……嗯,从那以后我再也不敢轻视数据准备了。

这一章,我们就来聊聊数据集制作的三个核心环节:图像怎么拍、用什么工具标、标完存成什么格式。说白了,这就是你模型能力的“地基”,地基不稳,楼盖得再高也得塌。

图像采集规范:别让数据输在起跑线上

你可能觉得,拍照谁不会啊?但训练用的图像和日常拍照完全是两码事。我在项目中遇到过好几次,客户拿手机随便拍了几百张图,结果模型训练出来,换个光线环境就完全失效了。

这里我总结了几条硬性规范,你照着做,能省掉后面80%的麻烦:

规范项 具体要求 为什么重要
分辨率 不低于640×640,建议1920×1080以上 YOLO会缩放图像,低分辨率会丢失细节
光照条件 覆盖白天、黄昏、夜晚、逆光等多种场景 模型需要适应真实世界的多变光照
拍摄角度 俯视、平视、侧视都要有 目标可能从任何角度出现
背景多样性 至少5种以上不同背景 避免模型只记住背景而非目标本身
目标尺度 包含大、中、小三种尺度的目标 YOLO对不同尺度的检测能力需要均衡训练
遮挡程度 0%、25%、50%、75%遮挡都要有 真实场景中目标经常被部分遮挡
⚠️ 我曾经踩过的坑: 有一次做行人检测,所有训练图像都是晴天正午拍的。模型在测试集上表现很好,结果一部署到傍晚的监控画面,检测率直接掉到30%。后来我补拍了阴天、雨天、黄昏的数据,模型才真正“活”过来。记住:数据多样性比数据量更重要。

另外,我建议每类目标至少采集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
💡 我的使用习惯: 标注前先把所有图片放到一个文件夹,然后在LabelImg里设置“自动保存”和“显示下一张”。这样你只需要左手按快捷键,右手握鼠标,效率能提升一倍。我最快的时候,一小时标了300张图。

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
⚠️ 我曾经犯过的错: 刚开始做标注时,我直接用像素坐标写进了txt文件,没做归一化。结果YOLO训练时loss死活不降,我还以为是模型有问题。查了两天才发现,YOLO要求所有坐标必须在0-1之间,像素坐标会让训练直接崩掉。所以,一定要确认你的标注工具输出的是归一化坐标。

数据集目录结构:规范管理,避免混乱

标注完数据后,目录结构要清晰。我推荐这样的组织方式:

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一一对应。

本章知识体系总览

下面这张图帮你理清数据集制作的完整流程:

数据集制作流程总览 数据集制作核心流程 阶段一:图像采集 分辨率 ≥ 640×640 多光照 / 多角度 / 多背景 阶段二:数据标注 工具:LabelImg / CVAT 输出:YOLO txt格式 阶段三:格式整理 归一化坐标检查 目录结构搭建 💡 关键原则:数据多样性 > 数据量;归一化坐标必须正确;目录结构要规范 YOLO txt 格式详解 每行格式: <class_id> <x_center> <y_center> <width> <height> class_id:从0开始 坐标:归一化到 [0, 1] 每张图片对应一个同名txt文件 工具选择建议 LabelImg:个人项目、小规模 CVAT:团队协作、视频标注 目录结构: images/{train,val,test} labels/{train,val,test}
💡 我的建议: 第一次做数据集,别追求完美。先拿100张图走完整个流程——采集、标注、格式转换、目录搭建——确保每个环节都通了,再大规模铺开。这样能避免做到一半发现方向错了,返工成本太高。

好了,数据集制作的基础就聊到这里。记住:好的数据集 = 规范的采集 + 准确的标注 + 正确的格式。这三样都做到位了,你的YOLO模型训练就已经成功了一半。