3、数据集准备:从零搭建你的YOLO训练数据

说实话,数据集准备这一步,是整条YOLO流水线里最枯燥、但也最关键的环节。我见过太多同学模型调了半天效果不好,最后发现是标注数据出了问题。嗯,咱们今天就把这块彻底讲透。

3.1 LabelImg标注工具:安装与使用

先聊聊标注工具。市面上工具不少,但LabelImg是我个人用得最顺手的。它轻量、开源,支持PascalVOC和YOLO两种格式,对新手特别友好。

安装方式

我建议直接用pip安装,省心:

pip install labelImg
labelImg

如果你在Windows上遇到问题,也可以从GitHub下载打包好的exe版本。我在项目里遇到过Python环境冲突的情况,后来直接用exe版本,稳得很。

使用流程

  1. 打开LabelImg,点击「Open Dir」选择图片文件夹
  2. w 键开始画框(或者点左侧的Create RectBox)
  3. 画完框后输入类别名称,比如 personcar
  4. Ctrl+S 保存标注文件
  5. d 切换到下一张图片
小技巧: 我习惯把「Auto Save」勾上(View → Auto Save),这样每标注完一张自动保存,省得手滑丢数据。

标注格式选择

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%。

避坑指南: 我曾经犯过一个低级错误——标注时类别ID从1开始编号,但YOLO要求从0开始。结果训练出来的模型,预测的类别永远错一位。排查了半天才发现是标注文件的问题。

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一张一张标。这里有个经验:

  • 遮挡严重的物体可以不标
  • 边界模糊的物体尽量标得紧贴边缘
  • 同一类别的标注风格要一致
核心原则: 标注质量 > 标注数量。1000张高质量标注数据,效果可能比5000张粗标数据还好。

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训练环境,到时候你会感谢今天认真标注的自己的。