Skip to content

yolov8的数据集格式 ​

YOLO 的数据集,本质上就是:图片 + 图片对应的答案。

以最常见的 YOLOv8 目标检测为例。


1. YOLOv8 的数据集到底是什么? ​

假设我们想训练一个模型,让它认识:

  • 人
  • 猫
  • 狗

那么我们首先需要很多图片。

例如:

0001.jpg
0002.jpg
0003.jpg
...

但是光给 YOLO 图片没用。

因为 YOLO 不知道:

“这张图片里面哪个是猫?哪个是狗?猫在哪里?”

所以我们还要给每张图片准备一份标准答案。

例如:

0001.jpg
0001.txt

可以把它理解成:

0001.jpg    → 考试题目
0001.txt    → 标准答案

所以 YOLO 数据集最核心的东西就是:

图片
+
标签文件

2. 一个最简单的数据集长这样 ​

例如:

dataset/
├── images/
│   ├── train/
│   │   ├── 001.jpg
│   │   ├── 002.jpg
│   │   └── 003.jpg
│   │
│   └── val/
│       ├── 101.jpg
│       └── 102.jpg
│
└── labels/
    ├── train/
    │   ├── 001.txt
    │   ├── 002.txt
    │   └── 003.txt
    │
    └── val/
        ├── 101.txt
        └── 102.txt

你会发现一个规律。

图片:

images/train/001.jpg

它对应的答案就是:

labels/train/001.txt

也就是:

图片名字和标签名字必须对应。

例如:

cat001.jpg
cat001.txt

3. 为什么又有 train,又有 val? ​

这个也可以用考试来理解。

train:训练集 ​

就是:

平时给 YOLO 做的练习题。

例如:

images/train/
labels/train/

模型会看这些图片和答案,然后学习:

“哦,原来长这样的东西叫猫。”


val:验证集 ​

就是:

模拟考试。

训练的时候模型没有拿这些图片直接“背答案”,我们拿它们检查:

“你到底是真学会了,还是把训练图片背下来了?”

所以:

train = 用来学习
val   = 用来考试

有些数据集还有:

test

也就是最终测试集。


4. 最关键的 .txt 文件里面到底写了什么? ​

比如有这么一张图片:

001.jpg

里面有一只狗。

我们给狗画了一个框:

+-----------------------------+
|                             |
|       +-----------+         |
|       |    狗     |         |
|       |           |         |
|       +-----------+         |
|                             |
+-----------------------------+

那么:

001.txt

里面可能写:

2 0.50 0.45 0.30 0.40

很多小白第一次看到:

2 0.50 0.45 0.30 0.40

会觉得这是什么鬼。

其实特别简单。

这五个数字分别代表:

类别    中心X    中心Y    宽度    高度
 ↓        ↓        ↓       ↓       ↓
 2      0.50     0.45    0.30    0.40

所以 YOLO 每一个框都用:

class x_center y_center width height

表示。

简称:

类别 + 框的位置

5. 第一个数字:类别 ​

例如我们规定:

0 = 人
1 = 猫
2 = 狗

那么:

2 0.50 0.45 0.30 0.40

最前面的:

2

就是告诉 YOLO:

这个框里面是第 2 类,也就是狗。

注意一个很容易搞错的地方:

YOLO 的类别编号从 0 开始。

不是:

1 人
2 猫
3 狗

而是:

0 人
1 猫
2 狗

6. 后面四个数字是什么意思? ​

后面:

0.50 0.45 0.30 0.40

描述的是这个框。

YOLO 不使用:

左上角X
左上角Y
右下角X
右下角Y

而使用:

框中心点X
框中心点Y
框的宽度
框的高度

也就是:

x_center
y_center
width
height

画出来就是:

              width
         <------------>
         +------------+
         |            |
         |      ●     | ↑
         |   中心点   | | height
         |            | ↓
         +------------+

所以一句话记忆:

YOLO 用“这个框的中心在哪里 + 这个框有多大”来描述一个目标。


7. 为什么坐标都是 0.x? ​

这里是 YOLO 数据格式非常重要的一点。

例如:

0.50
0.45
0.30
0.40

为什么不直接写:

320
200
150
300

因为 YOLO 把坐标进行了归一化。

“归一化”这个词听起来很唬人。

大白话就是:

不要告诉我多少像素,告诉我它占整张图片的百分之多少。


比如图片宽度:

640 像素

一个目标中心在:

320 像素

那么:

320 ÷ 640 = 0.5

所以 YOLO 里面写:

x_center = 0.5

意思就是:

框的中心在图片水平方向正中间。


如果框的宽度是:

192 像素

图片宽度:

640 像素

那么:

192 ÷ 640 = 0.3

所以:

width = 0.3

意思就是:

这个框占整张图片宽度的 30%。


因此:

2 0.50 0.45 0.30 0.40

可以翻译成一句人话:

这里有一只狗,它的框中心大约在图片中央附近,框宽占整张图片的 30%,框高占整张图片的 40%。

这样是不是就没那么神秘了。


8. 一张图片有两个目标怎么办? ​

比如一张图片里面有:

1个人
1只狗

那怎么办?

很简单:

一个目标写一行。

例如:

0 0.30 0.50 0.20 0.60
2 0.70 0.55 0.25 0.35

第一行:

0 0.30 0.50 0.20 0.60

表示一个人。

第二行:

2 0.70 0.55 0.25 0.35

表示一只狗。

所以:

一个框 = txt里面的一行

一张图片有 10 个目标:

txt 就有 10 行

9. 那 YOLO 怎么知道 0、1、2 分别是什么? ​

这就要用到另外一个文件:

data.yaml

例如:

path: /home/user/dataset

train: images/train
val: images/val

names:
  0: person
  1: cat
  2: dog

这个文件就相当于整个数据集的:

说明书。

它告诉 YOLO:

训练图片在哪里?
验证图片在哪里?
一共有哪几个类别?
0是谁?
1是谁?
2是谁?

10. 所以一个完整 YOLOv8 数据集可以这样理解 ​

dataset/
│
├── images/          ← 题目
│   ├── train/       ← 平时练习题
│   └── val/         ← 模拟考试题
│
├── labels/          ← 标准答案
│   ├── train/
│   └── val/
│
└── data.yaml        ← 数据集说明书

整个关系就是:

                YOLO数据集
                    │
          ┌─────────┼─────────┐
          ↓         ↓         ↓
       images     labels   data.yaml
          │         │         │
         图片      答案      说明书
                    │
                    ↓
          class x y w h

11. 最后给小白记住 4 句话就够了 ​

你讲完之后,可以让大家只记这四句话:

第一:

YOLO 数据集就是图片 + 图片对应的标注答案。

第二:

一张 xxx.jpg 对应一个 xxx.txt。

第三:

txt 每一行代表一个目标:

类别 中心X 中心Y 宽度 高度

第四:

后面四个坐标不是像素,而是除以图片尺寸之后的比例,所以通常在 0~1 之间。

例如:

2 0.5 0.5 0.3 0.4

翻译成人话就是:

第2类目标,它的框中心在图片中间附近,宽约占图片30%,高约占图片40%。

这基本就把 YOLOv8 目标检测数据集格式的核心讲清楚了。

另外要注意,以上讲的是最常见的 YOLOv8 Detection(目标检测)。YOLOv8 的分割 Segmentation、姿态估计 Pose、分类 Classification 数据格式会有区别。

最近更新