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.txt3. 为什么又有 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 h11. 最后给小白记住 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 数据格式会有区别。
