ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

车牌检测数据集实战:1019张YOLO格式带标签数据,快速跑通训练流程

车牌检测数据集实战:1019张YOLO格式带标签数据,快速跑通训练流程 简介本资源为面向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/trainval验证集图像路径images/valnc类别数车牌场景通常为 1names类别名称列表[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 \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ device0 \ projectruns/plate \ nameexp1参数说明model选yolov8n.pt是最小的 nano 版本适合先验证流程imgsz640是输入分辨率车牌目标通常偏小如果显存允许可以提到 960 或 1280batch16按显存调整爆显存就减半device0指定第一块 GPUCPU 训练去掉这个参数但速度会慢很多。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 \ modelruns/plate/exp1/weights/best.pt \ epochs30 \ lr00.001 \ imgsz640 \ batch8 \ device0参数说明model指向之前训练好的best.ptlr0是初始学习率微调时不宜过大。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 张的车牌数据集能帮你把车牌检测的流程先跑通后面的调参和迁移就有底了。本文还有配套的精品资源点击获取
返回列表