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 cv2from 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 之间。
- 随机抽样可视化标注框。
模型效果不好时,不一定是模型结构或参数的问题。很多时候,先把标签质量检查清楚,比盲目调学习率更有效。
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!













