☰
车牌检测数据集实战:1019张YOLO格式带标签数据,快速跑通训练流程
2026/10/5 6:02:33 网站建设 项目流程

简介:本资源为面向YOLO系列目标检测算法的车牌检测数据集,适合正在学习或落地车牌识别项目的开发者、学生及算法工程师使用,可直接用于模型训练与验证测试。数据集已预先划分好训练与验证集,并附带data.yaml配置文件,兼容YOLOv5、YOLOv8、YOLOv9、YOLOv7、YOLOv10及YOLO11等主流版本,省去自行整理与划分数据的繁琐工作。压缩包共约2000个文件,包含1019个xml标注文件、980个txt标注文件及1个yaml配置文件,整体约47.28MB;其中txt为YOLO格式标注,xml为VOC格式标注,分别存放于两个文件夹,便于按需选用。YOLO格式采用类别索引与归一化中心点、宽高比例,符合标准训练输入要求。目前已有154人学习下载,可作为车牌检测任务的即用型数据基础,帮助读者快速搭建训练流程、验证模型效果并推进项目迭代。

1. 车牌检测数据集怎么选:1019 张带标签的 YOLO 实战包能省掉哪些事

做车牌检测项目,最耗时的往往不是调模型,而是把数据整理成能直接喂给训练脚本的格式。这份 1019 张图像带标签的数据集,核心价值就在于省掉了「找图—标注—划分—写配置」这条链路。它同时提供 YOLO 格式的 txt 标签和 VOC 格式的 xml 标签,两个文件夹分开存放,并且已经划分好训练集与验证集,附带data.yaml配置文件。换句话说,下载解压后改一下路径就能跑yolov8 train,不用再写转换脚本。适合两类人:一是刚入门 yolo 系列算法、想先跑通车牌检测全流程的新手;二是手头有业务场景、需要快速验证检测方案可行性的从业者。1019 张的规模不算大,但作为基线验证和迁移学习的起点足够用,尤其是车牌这种目标特征相对固定的场景,小数据集也能看出模型收敛趋势。

2. 数据集结构与标签格式:txt 和 xml 到底怎么对应

拿到压缩包后别急着训练,先把目录结构和标签含义搞清楚。这份数据集的设计思路是「一份图像、两套标签」,YOLO 训练用 txt,需要转 COCO 或做可视化校验时用 xml。理解两种格式的坐标差异,是后面排查标签错位问题的前提。

2.1 目录组织与 data.yaml 的字段含义

解压后典型结构是图像文件夹、labels 文件夹(YOLO txt)、annotations 文件夹(VOC xml),以及根目录的data.yaml。从项目正文给出的文件名看,图像和标签采用同名不同后缀的配对方式,比如img_0201_2.txt对应img_0201_2.jpg或.png。这种命名规则的好处是配对逻辑简单,坏处是一旦某张图缺标签,训练时不会报错,只会静默跳过,所以第一步必须做配对校验。

data.yaml一般包含这几个字段:

字段含义常见取值
path数据集根目录相对或绝对路径
train训练集图像路径images/train
val验证集图像路径images/val
nc类别数车牌场景通常为 1
names类别名称列表['plate'] 或 ['license_plate']

需要留意的是,nc和names的长度必须一致,且names的顺序就是标签里 class 索引的顺序。如果标签里 class 写的是 0,而 names 里第一个是别的类别,训练不会报错,但检测结果会张冠李戴。这是新手最容易翻车的地方之一。

2.2 YOLO txt 与 VOC xml 的坐标换算

YOLO 格式每行是<class> <x_center> <y_center> <width> <height>,五个值空格分隔,后四个都是归一化到 0 到 1 的比例值。VOC xml 则是绝对像素坐标,记录xmin, ymin, xmax, ymax。两者换算关系如下:

# YOLO 归一化坐标转 VOC 绝对坐标 # img_w, img_h 为图像宽高,cls 为类别索引 def yolo_to_voc(x_center, y_center, w, h, img_w, img_h): x_center *= img_w y_center *= img_h w *= img_w h *= img_h xmin = int(x_center - w / 2) ymin = int(y_center - h / 2) xmax = int(x_center + w / 2) ymax = int(y_center + h / 2) # 边界裁剪,防止越界导致可视化或评估报错 xmin = max(0, xmin) ymin = max(0, ymin) xmax = min(img_w, xmax) ymax = min(img_h, ymax) return xmin, ymin, xmax, ymax

这段代码的关键在于先反归一化再算角点,最后做边界裁剪。参数说明:x_center、y_center是中心点比例值,w、h是宽高比例值,img_w、img_h从图像读取。常见错误是直接用比例值去乘而不先还原,导致框全部挤在左上角。反过来 VOC 转 YOLO 时,要先算中心点和宽高,再除以图像尺寸归一化,顺序不能乱。

2.3 用脚本做一次配对与越界校验

在正式训练前,建议跑一遍校验脚本,确认图像和标签一一对应,且所有坐标都在 0 到 1 之间。这一步能提前暴露大部分数据问题。

import os img_dir = "images/train" label_dir = "labels/train" img_exts = (".jpg", ".jpeg", ".png") img_names = {os.path.splitext(f)[0] for f in os.listdir(img_dir) if f.lower().endswith(img_exts)} label_names = {os.path.splitext(f)[0] for f in os.listdir(label_dir) if f.endswith(".txt")} # 找出有图无标签、有标签无图的情况 missing_label = img_names - label_names missing_img = label_names - img_names print("有图无标签:", missing_label) print("有标签无图:", missing_img) # 校验坐标范围 for name in label_names: path = os.path.join(label_dir, name + ".txt") with open(path) as f: for line_no, line in enumerate(f, 1): parts = line.strip().split() if len(parts) != 5: print(f"{name} 第{line_no}行字段数异常: {parts}") continue vals = list(map(float, parts[1:])) if any(v < 0 or v > 1 for v in vals): print(f"{name} 第{line_no}行坐标越界: {vals}")

逻辑说明:先做集合差集找配对缺口,再逐行检查字段数和坐标范围。参数上,img_exts按实际图像后缀调整,如果数据集里混有.bmp或.webp要补进去。跑完没有输出,说明数据基本干净,可以进入训练环节。

3. 从 data.yaml 到训练启动:yolov8 与 yolov5 的落地差异

数据校验通过后,下一步是把data.yaml接到训练脚本上。不同 yolo 版本对配置文件的字段要求略有差异,直接套用别人的命令容易在路径解析上踩坑。这一章按「先跑通、再调参」的顺序展开。

3.1 修改 data.yaml 的路径策略

data.yaml里的path字段决定训练脚本从哪里找图像。常见做法是写绝对路径,避免因为工作目录变化导致找不到文件。如果数据集要迁移到别的机器,相对路径更灵活,但必须保证训练命令在正确的目录下执行。

# data.yaml 示例,车牌单类别 path: /data/license_plate_dataset train: images/train val: images/val nc: 1 names: ['plate']

参数说明:path是根目录,train和val是相对根目录的子路径。注意train指向的是图像目录,不是标签目录,标签目录由框架按约定自动推导(把images替换成labels)。如果目录名不是images和labels这种标准命名,需要在代码里额外指定labels路径,否则会找不到标签。这是 yolov5 和 yolov8 都存在的隐式约定,很多人第一次用自定义目录时会在这里卡住。

3.2 yolov8 训练命令与关键参数

yolov8 用yolo命令行或 Python API 都可以。命令行方式最直接:

# 从预训练权重开始训练,指定数据配置和轮数 yolo detect train \ data=/data/license_plate_dataset/data.yaml \ model=yolov8n.pt \ epochs=100 \ imgsz=640 \ batch=16 \ device=0 \ project=runs/plate \ name=exp1

参数说明:model选yolov8n.pt是最小的 nano 版本,适合先验证流程;imgsz=640是输入分辨率,车牌目标通常偏小,如果显存允许可以提到 960 或 1280;batch=16按显存调整,爆显存就减半;device=0指定第一块 GPU,CPU 训练去掉这个参数但速度会慢很多。project和name决定结果保存路径,建议每次实验换name,避免覆盖上一次的权重和日志。

3.3 yolov5 的差异点与迁移注意

yolov5 的训练入口是train.py,参数命名和 yolov8 不完全一样。比如data和model含义相同,但project和name的默认行为有区别,yolov5 默认会在runs/train下递增目录名。

python train.py \ --data /data/license_plate_dataset/data.yaml \ --weights yolov5s.pt \ --epochs 100 \ --img 640 \ --batch-size 16 \ --device 0

差异点在于:yolov5 用--img而不是imgsz,用--batch-size而不是batch。如果从 yolov8 切到 yolov5,命令要改,但data.yaml基本通用。yolov7、yolov9、yolov10 和 yolo11 的配置文件格式也大同小异,核心是nc、names和路径字段。迁移时先确认框架读取data.yaml的字段名,再改命令,不要直接复制粘贴。

3.4 训练过程看什么指标

启动后重点看三个输出:box_loss、cls_loss和mAP50。box_loss下降说明框回归在收敛,cls_loss下降说明分类在学,mAP50是验证集上的综合指标。如果box_loss震荡不降,常见原因是学习率偏大或标签有越界;如果mAP50一直很低但 loss 在降,可能是类别索引和names对不上。训练日志里还会打印每轮的验证结果,建议至少跑到 50 轮再判断趋势,车牌这种单类别任务通常收敛较快。

4. 避坑与排查:车牌检测训练中最容易翻车的五件事

数据看起来干净、命令也跑起来了,不代表结果可信。下面这五条是实际项目里反复出现的坑,每条按现象、原因、解决来写。

4.1 现象:训练不报错但 mAP 始终为 0

原因:标签里的 class 索引超出了names列表范围,或者data.yaml的nc写成了 0。框架在计算指标时找不到对应类别,直接跳过。

解决:打开一个 txt 标签,确认第一列的值。单类别车牌应该是 0。再检查data.yaml里nc: 1、names: ['plate']。如果标签里出现 1 或更大的值,说明标注时类别索引错了,需要批量修正。

4.2 现象:验证集图像被跳过,日志提示找不到标签

原因:图像目录和标签目录的命名不符合框架约定。yolov8 默认把images替换成labels来推导标签路径,如果图像目录叫imgs,推导出的lbls不存在。

解决:要么把目录改成标准命名,要么在data.yaml里显式指定标签路径。最稳妥的做法是保持images/train和labels/train的对称结构。

4.3 现象:检测框整体偏移或尺寸异常

原因:标签坐标没有归一化,或者归一化时用错了图像尺寸。比如用缩略图尺寸去算比例,但训练时加载的是原图。

解决:跑一遍 2.3 节的校验脚本,确认所有坐标在 0 到 1 之间。如果发现大量大于 1 的值,说明标签是绝对坐标,需要先转成 YOLO 格式再训练。

4.4 现象:显存溢出,batch 调小后仍然报错

原因:imgsz设得太大,或者数据加载的 worker 数过多导致内存占用叠加。车牌图像如果分辨率很高,直接 resize 到 1280 会显著增加显存。

解决:先把imgsz降到 640 跑通,再逐步往上加。同时把workers调小,比如设为 2 或 4。如果还是溢出,检查是否有其他进程占用 GPU。

4.5 现象:训练集指标很好,验证集一塌糊涂

原因:训练集和验证集划分不合理,比如同一张图的增强版本同时出现在两边,造成数据泄漏。或者验证集样本太少,指标波动大。

解决:确认数据集自带的划分没有重叠。如果自己重新划分,按图像级别随机拆分,不要按标签行拆分。1019 张的规模,验证集建议留 15% 到 20%,也就是 150 到 200 张,太少会导致指标不可信。

5. 进阶用法:用这份数据集做迁移与格式转换的实操技巧

跑通基线之后,这份数据集还能当跳板用。比如拿它预训练一个车牌检测模型,再迁移到自己的场景;或者把 YOLO 标签转成 COCO 格式,接别的评估工具。下面两个技巧是我在实际项目里反复用的。

5.1 用预训练权重做小样本迁移

如果手头只有几十张自己标注的车牌图,直接训练容易过拟合。常见做法是先用这份 1019 张的数据集训练一个基础模型,再在自己的小数据上微调。微调时把学习率调低,比如从 0.01 降到 0.001,冻结 backbone 的前几层,只训练检测头。

# 在基础模型上微调,学习率降低,轮数减少 yolo detect train \ data=/data/my_plate/data.yaml \ model=runs/plate/exp1/weights/best.pt \ epochs=30 \ lr0=0.001 \ imgsz=640 \ batch=8 \ device=0

参数说明:model指向之前训练好的best.pt,lr0是初始学习率,微调时不宜过大。epochs设 30 左右即可,因为模型已经学过车牌特征,不需要从头收敛。如果自己的数据和这份数据集分布差异大,比如车牌颜色或拍摄角度不同,可以适当增加轮数并解冻更多层。

5.2 YOLO 转 COCO 格式做交叉验证

有些评估工具只认 COCO 格式,或者需要和别的模型对比指标。把 YOLO txt 转成 COCO json 的脚本不复杂,核心是构造images、annotations、categories三个字段。

import json import os from PIL import Image def yolo_to_coco(img_dir, label_dir, output_json, class_names): coco = {"images": [], "annotations": [], "categories": []} for i, name in enumerate(class_names): coco["categories"].append({"id": i, "name": name}) ann_id = 1 for img_id, fname in enumerate(os.listdir(img_dir), 1): if not fname.lower().endswith((".jpg", ".png", ".jpeg")): continue img_path = os.path.join(img_dir, fname) w, h = Image.open(img_path).size coco["images"].append({"id": img_id, "file_name": fname, "width": w, "height": h}) label_path = os.path.join(label_dir, os.path.splitext(fname)[0] + ".txt") if not os.path.exists(label_path): continue with open(label_path) as f: for line in f: cls, xc, yc, bw, bh = line.strip().split() xc, yc, bw, bh = map(float, (xc, yc, bw, bh)) xmin = (xc - bw / 2) * w ymin = (yc - bh / 2) * h coco["annotations"].append({ "id": ann_id, "image_id": img_id, "category_id": int(cls), "bbox": [xmin, ymin, bw * w, bh * h], "area": bw * w * bh * h, "iscrowd": 0 }) ann_id += 1 with open(output_json, "w") as f: json.dump(coco, f) yolo_to_coco("images/val", "labels/val", "val_coco.json", ["plate"])

逻辑说明:遍历图像目录,读取宽高,再逐行解析标签。COCO 的bbox格式是[xmin, ymin, width, height],注意和 VOC 的[xmin, ymin, xmax, ymax]区分。area字段用于评估时过滤小目标,iscrowd一般设 0。转换后可以用 pycocotools 跑一遍评估,和 YOLO 自带的 mAP 对比,如果差距很大,通常是坐标换算或类别 id 对不上。

5.3 一个验证训练结果是否可信的习惯

我一般会在训练结束后,从验证集里抽 10 张图,用训练好的模型跑推理,把预测框和真实标签画在同一张图上对比。如果预测框和真实框重合度高,说明模型学到了东西;如果预测框集中在某个区域,可能是标签分布有偏。这个习惯帮我提前发现过好几次标签错位的问题。从那以后,每次拿到新数据集,我都会先跑一遍配对校验和可视化抽查,再启动训练。希望这份 1019 张的车牌数据集能帮你把车牌检测的流程先跑通,后面的调参和迁移就有底了。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询