
简介面向计算机视觉与智能交通应用开发者数据集包含蓝牌、黄牌、新能源绿牌以及少量白牌、黑牌等多类车牌图像样本适用于车牌定位、字符识别等模型训练可服务于交通监控、智能停车和自动驾驶等场景。压缩包采用rar格式共收录1296个文件其中650张jpg图像对应646个xml标注文件整体大小约228MB可直接与常见深度学习框架配合使用。已有1848人学习下载标注信息完整便于研究者快速开展实验。数据集中常见牌型覆盖充分新能源绿牌的特殊字符与图案可增强模型对新型车牌的适应性jpg与xml的组合既支持YOLO、SSD等检测算法的标注读取也可为CRNN等识别模型提供训练素材。配合数据增强、正则化等手段能有效提升模型泛化能力助力构建高效准确的车牌识别系统。 做车牌检测识别这件事最耗时间的往往不是写模型而是搞训练数据集。无论你准备用YOLOv8、YOLOv5还是走端到端的车牌识别方案模型的上限基本在数据准备阶段就定死了。这不是我一个人拍脑袋的结论凡是自己从头训过车牌模型的同行应该都有同感公开数据集很难覆盖实际业务场景自己采集、标注、增强、训练一条龙走下来才是最稳的路。这篇文章就围绕“车牌检测识别训练数据集”展开从数据集怎么设计、怎么采集、怎么标注到怎么用YOLOv8把模型训起来尽量把能落地的细节都写清楚。适合想自训车牌检测/识别模型的算法工程师、嵌入式方向的朋友也适合刚入门想拿车牌当练手项目的同学。1. 车牌检测识别数据集的设计思路1.1 先拆解任务检测和识别本质是两套问题很多新手一上来就想做一个“输入图片、输出车牌号”的模型然后到处找能同时干这件事的数据集结果发现要么数量太少要么标注格式五花八门最后训出来效果很迷。这里建议先拆任务。车牌检测Plate Detection解决的是“车牌在哪里”输出一个边界框通常用目标检测模型来做比如YOLO系、SSD、Faster R-CNN。车牌识别Plate Recognition解决的是“框里的字符是什么”输出一串文本属于序列识别/OCR任务常用LPRNet、CRNN、PaddleOCR的文本识别模块或者自己接一个轻量分类器。这两个任务的数据组织方式完全不同。检测数据集只需要每张图里有“车牌框”的坐标和类别识别数据集则是把检测框裁剪出来给每张裁剪图配一个字符串标签。把它们混在一个数据集里训练会导致损失函数、输入分辨率、评估指标全都互相打架项目后期想单独优化其中一个任务都无从下手。我的建议是数据层面就分开管理模型层面做两级串联先用检测模型把车牌区域切出来再送进识别模型输出字符序列。1.2 数据集的难点不在“量”在“分布”做车牌数据集第一反应往往是“我要收集多少张图”。但其实比数量更重要的是样本分布能不能覆盖你的真实使用场景。场景分布里最主要的几个维度光照白天、黄昏、夜晚还有地下车库的暗光、出入口的逆光。天气晴天、阴天、雨天、雾天雨天的水渍和反光对识别影响非常明显。角度车辆正对相机、斜向驶入、略俯拍不同角度下车牌形变程度差异很大。车牌类型蓝牌小型燃油车、黄牌大型车、绿牌新能源、白牌特殊车辆、黑牌涉外车辆形状和字符排列方式都不一样。一个特别典型的反面案例是只用停车场白天的监控截图训练模型在实验室跑测试集mAP很高一到夜间逆光的道闸场景就大面积漏检。原因就是训练数据里“夜间逆光”这个组合完全没有覆盖。所以设计数据集之前不要急着问“多少张”先问自己“我的模型到底要扛住哪些场景”再按场景配比去收集数据。2. 数据采集与样本构成2.1 实拍采集的机位与场景安排实拍是数据的主力来源。如果你有现场条件建议按以下方式安排采集机位高度1.2~1.5米模拟道闸相机或者监控立杆的视角。俯仰角尽量控制在15°以内。俯角太大车牌在画面里会变成明显的梯形水平检测框的难度会陡增。拍摄距离3~8米覆盖车牌从“较小目标”到“充满画面”的不同尺度。时段早上、正午、傍晚、夜晚各拍一部分夜间还要分“有补光”和“无补光”。天气尽量等到阴天和雨天补拍不要全部集中在阳光强烈的晴天。也有人问我用OV7670这类低成本摄像头模块行不行。说实话OV7670这种30万像素级别的传感器VGA分辨率只有640x480拿来做个原型验证、在光线好的室内拍几张测流程是没问题的但想靠它积累一套能上线的训练数据集画质和动态范围都不太够车牌在远距离下细节丢失太严重。除非你的应用本身就是低成本嵌入式设备且工作距离很近否则还是建议用普通USB摄像头、手机或者工业相机采集画质上限决定了训练集的天花板。另外提醒一句市面上不少商业车牌识别相机自带封闭算法有些还有区域加密、取流限制数据基本拿不出来直接用于自训。这其实是自建数据集的另一个意义把数据主动权握在自己手里模型迭代不受外部方案限制。2.2 合成数据怎么补才不翻车实拍数据收集慢、类不均衡的问题突出比如你所在的城市可能满大街都是蓝牌绿牌比例低特殊车牌更是难得一见。这时候合成数据就能派上用场。合成车牌的基本思路用代码按真实车牌的排版规则生成字符贴图省份汉字字母数字的固定组合再叠加透视变换、模糊、噪声、光照渐变、反光斑等干扰最后粘贴到真实道路背景图上。工具上可以直接写Python脚本也可以借助Blender做3D场景合成后者效果更真实但成本更高。这里有几个实操经验字符间距、字体、颜色要严格参照真实车牌样式不要“大概像”就行。合成数据如果和真实车牌差异太大模型学到的纹理特征在实拍图上完全不适用。透视变换的随机范围不要太小。很多合成脚本只会做轻微旋转导致模型对真实场景中常见的侧倾、俯仰不鲁棒。合成数据与实拍数据的比例建议控制在1:3以内。合成数据占比过高模型会产生“合成感”在真实图像上的泛化能力反而下降。2.3 样本量与配比建议很多教程会说“200张也能训”这话本身没错但得分清楚是“跑通流程”还是“能上线”。我的经验数据可以参考下面这个范围目标检测数据集规模说明最小实验验证训练流程200~500张能看到loss下降mAP可能不高仅适合学习项目试用单场景单类型3000~8000张覆盖白天/夜晚/不同角度可以小范围验证工业级产品3万~10万张需要覆盖多地区、多类型、多天气含难例挖掘至于划分比例训练集/验证集/测试集用8:1:1比较常规。重点在于测试集必须与训练集隔离不要用同一个路段、同一个时段的数据既训又测。最稳妥的做法是完全按时间切分比如前两周采集的做训练后一周采集的做测试这样才能评估模型面对“没见过场景”的真实表现。3. 标注规范与实操工具3.1 标注工具选型标注阶段最影响效率的是你选什么工具。LabelImg老牌工具简单直接能导出YOLO格式的txt文件。缺点是标注效率一般批量操作少。X-AnyLabeling我目前主力用这个。它支持加载模型做自动标注/半自动标注用一个小模型先跑一遍人工只需要修正错框和漏框效率能提升一大截。labelme适合标多边形、旋转框这类复杂形状导出JSON格式再转别的格式。Roboflow在线平台带数据增强和格式转换适合小规模数据集快速处理但出于数据安全考虑项目早期不建议直接传敏感照片到云端。3.2 车牌检测框的标注细节标注框这件事看起来简单但细节最能影响模型最终效果。第一框要紧贴车牌边缘但保留2%~5%的边距。太紧模型学到的特征被截断太松框内背景太多检测框会不稳定。第二不要包含铆钉和牌照架。很多车牌上下沿有铆钉、螺丝如果框把它们包进去模型会误认为这也是车牌的一部分导致检测框在实拍时抖动。第三倾斜超过30°的车牌建议使用旋转框标注OBB比如YOLOv8-OBB或者mmrotate普通水平框在倾斜车牌上IoU损失太大但大多数道闸和监控场景里车辆基本正向进出车牌倾角小于30°这时候用水平框更简单、也更稳。双层黄牌大车怎么标我的做法是整体标一个框两行字符在识别阶段单独按双行处理。不要拆成上下两个框因为检测阶段的任务是找到“车牌这块区域”拆开会把类别定义搞乱。还有一个原则遮挡严重的车牌宁可标“漏”也不要标“半”。如果车牌一半被前车挡了你硬画一个框包含遮挡物模型训练时会学到错误信息在真实场景里更容易误检。这种图直接跳过或者放到专门的“遮挡难例”类别里单独处理。3.3 识别数据集的标注方式识别阶段的数据组织方式比较特殊。对每个检测裁剪图只需要一个字符串标签就行比如“京A12345”不需要给每个字符单独画框。中国车牌种类多蓝牌7位、新能源8位、双层黄牌两行字符串长度不固定所以识别模型需要支持变长序列输出LPRNet这类模型就是为这个场景设计的。省份简称汉字数量多而且形近字一堆比如“湘”和“浙”、“鄂”和“闽”、“渝”和“沪”在低分辨率下非常容易混淆。如果识别模型在验证集上总把某个省份字符认错不要急着调模型结构先看看该省份的样本数是不是明显偏少如果确实“难分”可以把这些形近字专门挑出来做难例集单独加强训练。4. 用YOLOv8把数据集跑起来4.1 目录结构与配置文件假设你已经有一些标注好的图像下面直接用YOLOv8走一遍完整训练流程。先按下面的目录结构整理数据datasets/plate/ ├── images/ │ ├── train/ │ └── val/ └── labels/ ├── train/ └── val/对应YAML配置文件写成这样# plate.yaml path: datasets/plate train: images/train val: images/val names: 0: blue_plate 1: green_plate 2: yellow_plate 3: white_plate注意类别是按“车牌类型”划分不是按省份或字符划分。检测模型只负责判断“这是哪个类型的车牌区域”字符交给识别模型处理。4.2 标注格式转换与预处理如果你用的标注工具导出的不是YOLO格式需要转换。YOLO格式的txt文件里每一行是class_id x_center y_center width height所有坐标都是相对于图像宽高的归一化值取值在0~1之间。比如图像宽度1920车牌框中心点x坐标是960那x_center就写0.5。下面是常见的坐标转换逻辑把LabelImg的XML或者COCO的JSON转成YOLO txt时核心代码都长这样import os def convert(size, box): # size: (img_w, img_h) # box: (xmin, ymin, xmax, ymax) dw 1.0 / size[0] dh 1.0 / size[1] x_center (box[0] box[2]) / 2.0 y_center (box[1] box[3]) / 2.0 w box[2] - box[0] h box[3] - box[1] return (x_center * dw, y_center * dh, w * dw, h * dh)预处理方面YOLOv8会把图像按长边缩放到训练尺寸并做padding一般不需要你手动统一尺寸。但要注意输入图像不要做非等比拉伸否则车牌会变形检测框也会跟着错。4.3 训练参数与实操命令数据准备好之后训练命令其实非常简洁yolo detect train dataplate.yaml modelyolov8s.pt epochs150 imgsz640 batch16几个关键参数说下我的经验预训练权重强烈建议用yolov8s.pt或yolov8m.pt作为初始权重而不是从零训练。车牌检测虽然和COCO的80类差异很大但COCO预训练模型已经学会了通用的边缘、纹理、形状特征迁移过来之后收敛速度会快很多最终精度也更高。数据增强mosaic默认是开的对车牌这种小目标有正面效果。但fliplr水平翻转要注意车牌上的字符顺序是有语义的翻转之后字符顺序颠倒检测阶段影响不大但如果你后续要在同一个数据集上顺带训练识别模块建议把fliplr设成0或者很小的值。显存不足先降batch到8或4再把imgsz降到480。实在不行加device0配合workers0排除数据加载瓶颈。训练时的收敛情况主要看三个指标box_loss、cls_loss、dfl_loss它们整体呈下降趋势就说明模型在正常学习。最终效果看验证集上的mAP50和mAP50-95前者看基础检测能力后者看框的贴合精度。模型训练完用下面的命令评估yolo detect val dataplate.yaml modelruns/detect/train/weights/best.pt然后导出成ONNX方便后续部署yolo export modelruns/detect/train/weights/best.pt formatonnx opset124.4 检测与识别串联推理训练好的检测模型只能输出车牌框要拿到车牌号还得再接一个识别模型。常见做法是把检测框裁剪出来缩放到识别模型需要的输入尺寸再送给LPRNet或CRNN。这一步可以用OpenCV做裁剪和缩放推理代码逻辑很直接import cv2 import torch # 检测结果 box: (x1, y1, x2, y2) plate_crop frame[int(y1):int(y2), int(x1):int(x2)] plate_crop cv2.resize(plate_crop, (width, height)) # 送入识别模型得到字符串 plate_text rec_model(plate_crop)如果不想自己训练识别模型也可以用HyperLPR、PaddleOCR这类开源方案里的车牌识别模块先顶上等数据积累够了再替换成自训练模型。整体思路是一样的检测负责定位识别负责读字。5. 常见问题与排查技巧实录5.1 训练和上线阶段最容易踩的坑整理了一个速查表都是我在实际项目中反复遇到的问题现象原因解决方法白天效果好晚上大面积漏检训练集夜间样本不足补充夜间和低照度数据适当加亮度/对比度增强蓝牌被识别成绿牌类别不均衡蓝牌样本远多于绿牌训练集中平衡各类别数量或者用focal loss检测框在视频里抖动标注边界不一致框有时紧有时松统一标注规范后处理加帧间滤波汉字“湘”和“浙”混淆形近字样本不足专门收集形近字难例做难例挖掘车牌倾斜超过30°就漏检水平框在斜车牌上IoU太低换YOLOv8-OBB或者mmrotate做旋转框检测雨天车牌识别率骤降水渍、反光干扰增加雨天/水渍样本建议采集时用偏振镜辅助合成数据训出来的模型在实拍图上效果差合成与实拍比例失衡把合成比例降到1:3以下并加域随机化5.2 几个我反复确认过的经验第一标注规范统一比多标一千张更有用。如果两个标注员一个人框紧贴车牌边缘一个人框包含铆钉和牌照架模型学到的边界就会混乱训练过程中loss降不下去检测框输出也抖。项目开始前花半小时写一份标注规范后面能剩下一整天返工时间。第二难例挖掘比单纯加大数据量更高效。训练第一轮之后把验证集里预测失败漏检、误检、识别错字符的图片全部收集起来人工修正标注放回训练集重训。这个循环做两三轮效果的提升比盲目多拍几千张图要明显得多。第三先跑通最小闭环再谈优化。很多人一上来就想做一个“全国多省份、全天候、多车型”的完美数据集结果数据收集做了两个月还没开始训练。我的做法是先用300张左右的数据快速跑通训练、导出、推理的完整流程确认技术链路没问题再按场景逐步扩数据。这样风险小也更容易及时发现标注或格式上的问题。写在最后说实话车牌检测识别这个领域的技术方案已经相当成熟了YOLO系列、LPRNet、PaddleOCR这些开源工具把门槛压得很低真正拉开差距的反而是数据工程能力。谁能把数据采集、标注规范、难例挖掘这套流程跑得顺谁就能把模型精度快速做上去。我个人踩过几次坑之后的体会是数据质量永远比数量重要标注规范永远比模型结构重要。与其纠结用YOLOv8s还是YOLOv8m不如先把标注统一、把夜间样本补齐返工率会直线下降。后面如果再深入可以往旋转框检测OBB、端到端车牌识别、TensorRT嵌入式部署这几个方向走数据集的构建逻辑是相通的。先把手里这套数据做好后续扩展都是顺水推舟的事。本文还有配套的精品资源点击获取