YOLO11 标签文件检查清单

873 字
4 分钟
YOLO11 标签文件检查清单

YOLO11 标签文件检查清单#

训练 YOLO11 时,如果数据集目录已经整理好了,下一步最容易忽略的就是标签文件。标签看起来只是一些 txt 文件,但只要类别编号错了、坐标超出范围、图片和标签没有对应上,训练结果就会很差。

这篇记录一份训练前的标签检查清单,重点放在能快速发现问题的几个地方。

1、确认图片和标签一一对应#

YOLO 数据集一般会有这样的结构:

dataset/
images/
train/
001.jpg
002.jpg
labels/
train/
001.txt
002.txt

图片名和标签名需要一一对应,只是扩展名不同。可以用 Python 做一个简单检查:

from pathlib import Path
image_dir = Path("dataset/images/train")
label_dir = Path("dataset/labels/train")
images = {p.stem for p in image_dir.glob("*") if p.suffix.lower() in [".jpg", ".png", ".jpeg"]}
labels = {p.stem for p in label_dir.glob("*.txt")}
print("缺少标签的图片:", sorted(images - labels)[:20])
print("没有图片的标签:", sorted(labels - images)[:20])

如果输出不为空,就要先修正文件名或移动路径。

2、检查每一行的字段数量#

YOLO 检测标签每一行通常是:

class_id x_center y_center width height

也就是 5 个字段。可以扫描所有标签文件:

from pathlib import Path
for txt in Path("dataset/labels/train").glob("*.txt"):
for i, line in enumerate(txt.read_text().splitlines(), start=1):
if not line.strip():
continue
parts = line.split()
if len(parts) != 5:
print("字段数量异常:", txt, "line", i, line)

有时候标注工具导出的文件里会有空格、空行或额外字段,训练前最好先发现。

3、检查类别编号范围#

如果 data.yaml 中写了 3 个类别:

names:
0: person
1: helmet
2: vest

那么标签里的类别编号只能是 0、1、2。可以这样检查:

num_classes = 3
for txt in Path("dataset/labels/train").glob("*.txt"):
for i, line in enumerate(txt.read_text().splitlines(), start=1):
if not line.strip():
continue
class_id = int(float(line.split()[0]))
if class_id < 0 or class_id >= num_classes:
print("类别编号越界:", txt, "line", i, class_id)

类别编号越界会直接影响训练,尤其是从多个数据集拼接时,很容易忘记重新映射类别。

4、检查坐标是否在 0 到 1 之间#

YOLO 标签中的坐标是归一化后的值,理论上都应该在 0 到 1 之间:

for txt in Path("dataset/labels/train").glob("*.txt"):
for i, line in enumerate(txt.read_text().splitlines(), start=1):
if not line.strip():
continue
values = [float(x) for x in line.split()[1:]]
if any(v < 0 or v > 1 for v in values):
print("坐标越界:", txt, "line", i, values)

如果发现大量坐标大于 1,可能是导出的不是 YOLO 格式,而是像素坐标格式。

5、抽样可视化标签#

脚本检查只能发现格式问题,不能判断框的位置是否真的正确。训练前最好抽几张图画出来看:

import cv2
from pathlib import Path
img_path = Path("dataset/images/train/001.jpg")
txt_path = Path("dataset/labels/train/001.txt")
img = cv2.imread(str(img_path))
h, w = img.shape[:2]
for line in txt_path.read_text().splitlines():
cls, x, y, bw, bh = map(float, line.split())
x1 = int((x - bw / 2) * w)
y1 = int((y - bh / 2) * h)
x2 = int((x + bw / 2) * w)
y2 = int((y + bh / 2) * h)
cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2)
cv2.imwrite("label_check.jpg", img)

打开 label_check.jpg 看一下框是否贴合目标。这个步骤很简单,但能避免很多后续训练时间浪费。

小结#

训练 YOLO11 前,我会至少检查这几项:

  • 图片和标签是否一一对应。
  • 每行标签是否正好 5 个字段。
  • 类别编号是否在 data.yaml 范围内。
  • 坐标是否都在 0 到 1 之间。
  • 随机抽样可视化标注框。

模型效果不好时,不一定是模型结构或参数的问题。很多时候,先把标签质量检查清楚,比盲目调学习率更有效。

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

YOLO11 标签文件检查清单
https://blog.tjcheng.cn/posts/daily/2026-07-02/yolo11-label-checklist/
作者
TengJinCheng
发布于
2026-07-02
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
TengJinCheng
Hello, I'm Teng.
公告
欢迎来到TengJinCheng工作铺!
音乐
封面

音乐

暂未播放

0:000:00
暂无歌词
分类
标签
站点统计
文章
157
分类
7
标签
114
总字数
109,939
运行时长
0 天
最后活动
0 天前
站点信息
构建平台
Local
博客版本
Firefly v6.13.4
文章许可
CC BY-NC-SA 4.0

文章目录