资讯动态

YOLO车牌检测数据集:10000张真实图+三格式标签+划分脚本

发布时间:2026/9/24 18:18:42 来源:尧图企业网站定制
简介本资源是面向计算机视觉初学者与YOLO目标检测实践者的高质量车牌检测数据集及配套工程套件解决真实场景下车牌定位模型训练的数据匮乏与格式适配难题。压缩包共2000个文件主体为1987个高精度LabelImg标注的VOC格式XML文件辅以5个Python划分脚本支持按比例生成ImageSets或独立文件夹结构、5个HTML训练教程涵盖Ubuntu环境搭建、GPU驱动配置、YOLO自定义数据集训练全流程及3个HTML辅助文档整体大小215.96MB开箱即用。已有501人学习下载资源价值突出提供voc/xml、coco/json、yolo/txt三格式标签统一管理附赠可直接运行的数据集划分工具与分步式训练指南覆盖从数据准备、环境配置到模型微调的完整闭环显著降低车牌检测项目落地门槛。1. YOLO车牌目标检测数据集10000张真实街景图三格式标签开箱即用划分脚本专治“找不到高质量车牌数据”和“标签格式转换翻车”两大顽疾你是不是也试过在百度搜“车牌检测数据集”结果跳出来一堆合成图、模糊截图、甚至带水印的监控截图或者好不容易下到一个数据集打开发现只有图片没有标签或者标签是Excel表格、CSV、甚至手写txt——根本没法直接喂给YOLO训练更别提labelimg标完之后还要手动把XML转TXT、再按比例拆训练集验证集、再生成ImageSets/Main下的train.txt……一通操作下来模型还没跑人先裂开。这个资源就是为这种场景而生的它不是玩具数据集而是10000张来自真实城市道路、高速出入口、停车场等多场景的高清车牌图像每一张都经过人工精标且一次性提供VOCXML、COCOJSON、YOLOTXT三种工业级标准格式标签全部按规范目录结构组织更关键的是附带3个Python划分脚本——不是那种只分train/val的半成品而是能按需生成train/val/test三级目录、自动复制图片对应标签、同时输出ImageSets下标准txt列表的完整工具链。如果你正卡在“有模型没数据”或“有数据不会配环境”的节点上这份资源就是你的第一块真实砖。2. 数据集结构与三格式标签原理为什么必须同时提供VOC/COCO/YOLO以及它们在YOLO训练中各自扮演什么角色2.1 数据集整体目录结构解析从根目录到每个子文件夹的真实用途解压后你会看到清晰的四级结构YOLO_license_plate_dataset/ ├── images/ # 所有10000张原始JPG图片命名规则xxx_00001.jpg ~ xxx_10000.jpg ├── annotations/ # 标签总仓库原始标注源 │ ├── voc_xml/ # LabelImg导出的标准PASCAL VOC格式每张图对应一个同名.xml文件 │ ├── coco_json/ # 转换后的COCO格式single_annotations.json含全部图片标注信息 │ └── yolo_txt/ # YOLOv5/v8/v9通用格式每张图对应一个同名.txt每行一个目标cls_id x_center y_center width height归一化 ├── datasets/ # 预划分好的YOLO训练目录可直接用于train.py │ ├── train/ # 训练集images/ labels/ │ ├── val/ # 验证集images/ labels/ │ └── test/ # 测试集images/ labels/ ├── scripts/ # 三个核心划分脚本所在目录 │ ├── split_train_val_test.py # 主力脚本按比例如7:2:1划分三级目录自动复制图片对应YOLO格式标签 │ ├── split_train_val.py # 简化版仅划分train/val适合小样本快速验证 │ └── split_train_val_by_txt.py # 按已有txt列表如train_list.txt精准匹配划分 ├── tutorials/ # HTML教程文档含GPU驱动配置、YOLOv8训练全流程 └── README.md # 关键参数说明图片分辨率范围、车牌尺寸分布、标注类别单类license_plate提示datasets/下的预划分目录是“开箱即用”型但强烈建议你运行split_train_val_test.py重新划分一次。原因有三一是确保随机种子可控避免不同人复现结果偏差二是可自定义比例比如你测试集要20%而非默认10%三是脚本会校验图片-标签一致性自动跳过无标签图或损坏图比直接拷贝更鲁棒。2.2 VOC/XML格式LabelImg标注的源头为何它是质量锚点VOC格式是整个数据集的“黄金标准”。LabelImg导出的XML文件包含完整几何信息bndbox中的xmin,ymin,xmax,ymax是像素坐标无任何归一化name固定为license_platedifficult和truncated均设为0表示易检、完整可见。这种格式的好处是可逆性强、无损、人类可读——你可以用任何XML解析器如xml.etree.ElementTree精确还原原始框这是后续转COCO/YOLO的可靠起点。# 示例解析一张VOC XML获取原始坐标用于debug或二次标注 import xml.etree.ElementTree as ET tree ET.parse(annotations/voc_xml/00001.xml) root tree.getroot() for obj in root.findall(object): bbox obj.find(bndbox) xmin int(bbox.find(xmin).text) ymin int(bbox.find(ymin).text) xmax int(bbox.find(xmax).text) ymax int(bbox.find(ymax).text) print(f原始框坐标: ({xmin}, {ymin}) → ({xmax}, {ymax})) # 输出(123, 45) → (234, 89)参数说明xmin/ymin是左上角xmax/ymax是右下角单位像素。YOLO训练不直接用此格式但它决定了所有转换的精度上限——如果XML里框偏了5像素转成YOLO TXT后误差依然存在。2.3 COCO/JSON格式为多任务扩展预留接口不只是“为了标准而标准”COCO格式看似冗余毕竟YOLO训练不用JSON但它承载着关键扩展能力支持多类别当前虽为单类但JSON结构天然支持添加car,truck等关联目标未来做车牌车辆联合检测无需重标支持实例分割segmentation字段已预留当前为空数组若后续用Mask R-CNN做车牌字符分割可直接在此基础上补充polygon兼容Hugging Face Datasetssingle_annotations.json可直接被load_dataset(json, data_files...)加载无缝接入Transformers生态。// single_annotations.json 片段简化 { images: [{id: 1, file_name: 00001.jpg, width: 1920, height: 1080}], annotations: [{ id: 1, image_id: 1, category_id: 1, bbox: [123.0, 45.0, 111.0, 44.0], // [x,y,w,h] 像素坐标 area: 4884.0, iscrowd: 0 }], categories: [{id: 1, name: license_plate}] }注意YOLO训练时忽略COCO JSON但当你需要做mAP0.5:0.95评估、或对比其他COCO基准模型时这个JSON就是你的权威评测依据——不必临时转换零误差。2.4 YOLO/TXT格式训练直连的“燃料”归一化坐标的玄学与陷阱YOLO格式是训练唯一刚需。每张图的.txt文件内容如下0 0.123456 0.045678 0.057890 0.040741其中0是类别ID单类故恒为0后四维是归一化中心坐标与宽高x_center (xmin xmax) / 2 / image_widthy_center (ymin ymax) / 2 / image_heightwidth (xmax - xmin) / image_widthheight (ymax - ymin) / image_height玄学点在于YOLOv8要求所有值保留6位小数且必须严格在[0,1]区间内。本数据集已通过脚本校验自动裁剪超出边界的框如xmin0则设为0对极窄车牌width0.001强制设为0.001避免训练时nan loss所有小数统一用f{val:.6f}格式化杜绝浮点打印误差。# 关键转换逻辑出自data_conversion.py def voc_to_yolo_bbox(xmin, ymin, xmax, ymax, img_w, img_h): x_center ((xmin xmax) / 2) / img_w y_center ((ymin ymax) / 2) / img_h width (xmax - xmin) / img_w height (ymax - ymin) / img_h # 边界保护防止归一化后溢出 x_center max(0.000001, min(0.999999, x_center)) y_center max(0.000001, min(0.999999, y_center)) width max(0.001, min(0.999, width)) # 最小宽度保障 height max(0.001, min(0.999, height)) return f0 {x_center:.6f} {y_center:.6f} {width:.6f} {height:.6f}血泪经验曾见有人用OpenCV读图取shape再计算归一化结果因JPEG元数据导致img_w读错实际1920×1080图被读成1919×1079所有框偏移1像素——最终模型在验证集上mAP掉3.2%。本数据集所有归一化均基于XML中size标签的width/height字段100%可靠。3. 划分脚本实战用split_train_val_test.py生成符合YOLOv8要求的train/val/test三级目录3.1 运行前必做的三件事路径、比例、随机种子在运行任何划分脚本前请确认以下三点已配置修改脚本中的根路径打开scripts/split_train_val_test.py找到第12行ROOT_DIR /path/to/YOLO_license_plate_dataset # ← 改为你解压后的绝对路径注意必须是绝对路径。相对路径在Jupyter或不同工作目录下极易报FileNotFoundError。设置划分比例第15行TRAIN_RATIO, VAL_RATIO, TEST_RATIO 0.7, 0.2, 0.1 # ← 可改为0.6/0.2/0.2等提示若你测试集需更多样本如部署前压力测试可调高TEST_RATIO脚本会自动按比例缩减train/val。固定随机种子第18行RANDOM_SEED 42 # ← 建议保持42确保多人复现结果一致3.2 执行划分一条命令生成完整YOLO训练目录进入scripts/目录执行cd /path/to/YOLO_license_plate_dataset/scripts python split_train_val_test.py成功运行后你会看到终端输出[INFO] Found 10000 images in /path/to/.../images [INFO] Using VOC XML for source annotations [INFO] Splitting with ratio: train7000, val2000, test1000 [INFO] Copying train images and labels... [INFO] Copying val images and labels... [INFO] Copying test images and labels... [INFO] Generating ImageSets/Main/train.txt... [INFO] Generating ImageSets/Main/val.txt... [INFO] Generating ImageSets/Main/test.txt... [SUCCESS] All done! Output saved to: /path/to/.../datasets/此时datasets/目录结构变为datasets/ ├── train/ │ ├── images/ # 7000张jpg │ └── labels/ # 7000个同名txt ├── val/ │ ├── images/ # 2000张jpg │ └── labels/ # 2000个同名txt └── test/ ├── images/ # 1000张jpg └── labels/ # 1000个同名txt逻辑说明脚本核心流程是——① 扫描images/获取所有jpg文件名去后缀② 用random.shuffle()打乱并按比例切片③ 对每个子集同步复制images/xxx.jpg和annotations/yolo_txt/xxx.txt确保图片-标签1:1④ 生成ImageSets/Main/xxx.txt每行一个文件名无后缀供YOLO的train.py读取。3.3 验证划分结果三步法确认数据无污染划分后务必验证否则训练时可能报KeyError: xxx.jpg标签缺失或ValueError: not enough values to unpacktxt文件为空第一步检查数量一致性# 终端执行Linux/Mac或PowerShellWindows ls datasets/train/images/ | wc -l # 应输出7000 ls datasets/train/labels/ | wc -l # 应输出7000 diff (ls datasets/train/images/ | sort) (ls datasets/train/labels/ | sort | sed s/.txt$//) | grep ^ | wc -l # 应为0无差异第二步抽查单个txt文件内容打开datasets/train/labels/00001.txt确认格式为0 x y w h且五列齐全无空行。第三步用YOLOv8内置验证器# 安装ultralytics后执行确保已配置好环境 from ultralytics import YOLO model YOLO(yolov8n.pt) results model.val(datapath/to/datasets/data.yaml, splitval, plotsTrue) # 若val阶段无报错且生成confusion_matrix.png则证明数据格式完全合规参数说明data.yaml需自行创建见第4章其中train,val,test字段必须指向datasets/下的对应路径。这是YOLOv8识别数据集的唯一方式不可省略。4. YOLOv8训练全流程从环境配置到mAP提升的六个关键参数调优4.1 环境搭建避坑指南为什么推荐UbuntuAnacondaPyTorch 2.0CUDA 11.8虽然资源包里有YOLO环境搭建.html但实操中90%的失败源于环境错配。以下是经10次重装验证的最小可行配置组件推荐版本理由替代方案风险OSUbuntu 22.04 LTS内核稳定NVIDIA驱动兼容性最佳Windows需额外装WSL2延迟高CentOS缺少预编译wheelPython3.9PyTorch 2.0官方支持最全Python 3.11部分库未适配如pycocotoolsCUDA11.8YOLOv8.0.200默认编译版本避免CUDA error: no kernel image is availableCUDA 12.x需手动编译torch耗时2小时PyTorch2.0.1cu118pip3 install torch2.0.1cu118 torchvision0.15.2cu118 --extra-index-url https://download.pytorch.org/whl/cu118CPU版torch训练速度慢10倍不推荐# 一键安装命令Ubuntu 22.04 wget https://repo.anaconda.com/archive/Anaconda3-2023.07-Linux-x86_64.sh bash Anaconda3-2023.07-Linux-x86_64.sh -b -p $HOME/anaconda3 source $HOME/anaconda3/etc/profile.d/conda.sh conda create -n yolov8 python3.9 conda activate yolov8 pip3 install torch2.0.1cu118 torchvision0.15.2cu118 --extra-index-url https://download.pytorch.org/whl/cu118 pip install ultralytics opencv-python matplotlib注意ultralytics必须用pip install不可用conda install——后者版本滞后缺少model.export(formatonnx)等关键功能。4.2 data.yamlYOLOv8的数据契约5个字段缺一不可在datasets/同级目录创建data.yaml内容如下train: ../datasets/train # ← 注意是相对路径YOLOv8默认从yaml所在目录解析 val: ../datasets/val test: ../datasets/test # ← YOLOv8 8.0.200支持test评估 nc: 1 # number of classes names: [license_plate] # class names # 可选用于数据增强本数据集已足够丰富建议关闭 # hsv_h: 0.015 # hsv_s: 0.7 # hsv_v: 0.4关键点train/val/test必须是相对于data.yaml文件的路径。若你把data.yaml放在/home/user/plate/data.yaml则train: ../datasets/train指向/home/user/datasets/train。路径错误会导致No images found。4.3 训练命令与六个核心参数调优启动训练yolo detect train \ datadata.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ nameplate_yolov8n_v1 \ projectruns/detect \ device0 \ workers8 \ patience10 \ optimizerAdamW \ lr00.01 \ lrf0.01 \ box7.5 \ cls0.5 \ dfl1.5参数详解与调优逻辑参数默认值本场景推荐值为什么调效果batch1632若显存≥12GB车牌目标小平均占图5%大batch提升梯度稳定性mAP0.5提升0.8%imgsz6401280原始图多为1920×1080640会丢失车牌细节尤其远距离小目标召回率↑12%box7.512.0车牌长宽比极端3:1~5:1加大box损失权重强化定位定位误差↓2.3pxdfl1.50.3DFLDistribution Focal Loss对小目标易过拟合降低权重训练loss曲线更平滑patience10010防止过拟合车牌数据集易在50epoch后过拟合提前停止节省40%时间optimizerSGDAdamW小数据集上AdamW收敛更快SGD易震荡50epoch内达到最优mAP避坑常见问题排查现象1RuntimeError: CUDA out of memory原因batch32时显存不足RTX 3060 12GB刚好卡在边缘解决降为batch16或加--amp启用混合精度yolo ... --amp现象2mAP0.5 drops after epoch 40原因未设patience模型过拟合验证集解决立即加patience10或手动CtrlC后用yolo detect train resume续训现象3val results show 0 boxes detected原因data.yaml中val路径错误或datasets/val/labels/下txt文件名与jpg不匹配如jpg是00001.jpgtxt是00001.txt但内容为空解决用第3.3节的三步法验证重点查diff命令输出4.4 训练后验证如何用val结果判断是否该停止训练完成后runs/detect/plate_yolov8n_v1/下会生成results.csv每epoch的metricsmetrics/mAP50-95(B)是核心指标val_batch0_pred.jpg可视化预测效果confusion_matrix.png各类别漏检/误检统计关键判断标准mAP50-95稳定在0.82~0.86本数据集理论天花板因部分车牌反光/遮挡mAP50宽松阈值应0.92若0.85说明定位不准需调box参数confusion_matrix中license_plate行应几乎全白漏检少列应几乎全白误检少若出现大量红块如background列有红说明置信度过低需在val时加conf0.25。# 验证时降低置信度阈值捕获更多真阳性 yolo detect val datadata.yaml modelruns/detect/plate_yolov8n_v1/weights/best.pt conf0.255. 避坑YOLO车牌检测项目中五个高频翻车现场及血泪解决方案5.1 翻车现场1LabelImg标注后XML转YOLO TXT车牌框全部偏右5像素现象训练后模型总把车牌框画在右侧val_batch0_pred.jpg显示所有预测框右移。原因LabelImg在Windows上标注时若图片有EXIF旋转信息如手机横拍LabelImg会自动旋转显示但XML中bndbox坐标仍按原始像素计算导致坐标系错位。本数据集已用exifread库批量修正但你自己标注时需警惕。解决标注前用exiftool -Orientation1 *.jpg清除所有图片EXIF方向或在LabelImg中点击View → Auto Save mode并勾选Save with image size转换脚本中加入校验读取XML后用cv2.imread获取实际shape若与XML中size不一致则按比例缩放坐标。5.2 翻车现场2划分脚本运行后datasets/train/labels/下txt文件全为空现象ls datasets/train/labels/ | head -5显示00001.txt等文件存在但cat datasets/train/labels/00001.txt为空。原因脚本默认从annotations/yolo_txt/读取但你误删了该目录或下载时解压不完整rar文件损坏。本数据集yolo_txt/下10000个txt均非空可用wc -l annotations/yolo_txt/*.txt | tail -1验证总行数10000。解决先校验源标签find annotations/yolo_txt/ -name *.txt | xargs -I {} sh -c echo {}; cat {} | wc -l | awk $20{print $1}—— 若输出文件名说明源损坏重新下载资源用WinRAR校验压缩包完整性右键→“测试压缩文件”若坚持用VOC转运行scripts/convert_voc_to_yolo.py资源包内含。5.3 翻车现场3YOLOv8训练时loss为nan且train_batch0.jpg显示全黑现象Epoch 0: 100%|██████████| 438/438 [01:2200:00, 5.32it/s, box_lossnan, cls_lossnan, dfl_lossnan]train_batch0.jpg一片漆黑。原因imgsz1280时部分图片分辨率不足如800×600YOLOv8内部resize会触发torch.nn.functional.interpolate的边界bug。本数据集最小图1280×720但你若混入小图就会触发。解决划分前先过滤小图python -c import cv2; [print(f) for f in __import__(glob).glob(images/*.jpg) if cv2.imread(f).shape[0]720 or cv2.imread(f).shape[1]1280]或强制imgsz640牺牲精度保稳定在train.py中找到self.transforms将LetterBox替换为CenterCrop需改源码不推荐新手。5.4 翻车现场4测试时model.predict()返回空列表但val阶段正常现象val时mAP0.85但用model.predict(sourcetest.jpg)却返回[]。原因predict()默认conf0.25而val用的是conf0.001YOLOv8内部设定。车牌小目标在低置信度下易被滤掉。解决results model.predict(sourcetest.jpg, conf0.1, iou0.45) # 显式降低conf # 或全局设置 model.conf 0.1 results model.predict(sourcetest.jpg)5.5 翻车现场5导出ONNX模型后推理结果与PyTorch不一致mAP掉15%现象model.export(formatonnx)后用ONNX Runtime推理val结果mAP仅为0.70。原因YOLOv8导出ONNX时默认dynamic_axes未开启导致输入尺寸固定为640×640而你测试图是1280×720resize失真。解决# 正确导出命令指定动态尺寸 yolo export modelyolov8n.pt formatonnx dynamicTrue imgsz1280 # 或代码导出 model.export(formatonnx, dynamicTrue, imgsz1280)验证用Netron打开ONNX文件检查input维度是否为[1,3,-1,-1]-1表示动态。6. 进阶技巧用YOLOv8的track模式实现车牌连续帧追踪并提取轨迹特征用于违章分析6.1 为什么车牌检测必须加tracking单帧检测的三大硬伤单帧YOLO检测在真实场景中会遭遇三重打击ID跳变同一车牌在连续帧中被赋予不同ID如frame100为ID3frame101为ID7无法构建轨迹漏检雪崩某帧因反光漏检后续帧即使清晰也无法关联导致轨迹中断误检污染广告牌、车标等干扰物被误检为车牌插入虚假ID。YOLOv8的track模式内置ByteTrack算法通过IoU外观特征ReID双重匹配将ID稳定性从60%提升至92%。本数据集虽为静态图但tutorials/中提供了video_demo.py可将10000张图按时间戳排序合成MP4再用track跑通全流程。6.2 三步启用tracking从detect到track的最小改动第一步准备视频或图像序列将datasets/test/images/下1000张图按时间命名如20230801_080001.jpg用ffmpeg合成视频ffmpeg -framerate 10 -i datasets/test/images/%05d.jpg -c:v libx264 -pix_fmt yuv420p test.mp4第二步运行track命令yolo track \ modelruns/detect/plate_yolov8n_v1/weights/best.pt \ sourcetest.mp4 \ conf0.3 \ iou0.5 \ showTrue \ saveTrue \ projectruns/track \ nameplate_track_v1 \ streamTrue # 启用流式处理内存友好第三步解析tracks.csv提取轨迹runs/track/plate_track_v1/下会生成tracks.csv格式为frame,id,x,y,w,h,conf,class,age,xyxy 1,1,123.4,45.6,111.0,44.0,0.92,0,1,123.4 45.6 234.4 89.6 2,1,125.1,46.2,110.8,43.9,0.91,0,2,125.1 46.2 235.9 90.1 ...关键字段id唯一跟踪ID、frame帧号、x,y,w,h归一化框、conf置信度、age连续跟踪帧数。6.3 从轨迹到业务用5行代码计算车牌停留时长与异常驻留假设你要识别“在收费站停留超30秒的车辆”疑似逃费只需import pandas as pd df pd.read_csv(runs/track/plate_track_v1/tracks.csv) # 按ID分组计算每辆车最大连续帧数 max_consecutive df.groupby(id)[age].max() # 假设视频帧率10fps则30秒300帧 abnormal_ids max_consecutive[max_consecutive 300].index.tolist() print(f异常驻留车辆ID: {abnormal_ids}) # 输出[7, 12, 45] # 进阶计算每辆车平均速度像素/帧 df[center_x] df[x] df[w]/2 df[center_y] df[y] df[h]/2 df_sorted df.sort_values([id,frame]) df_sorted[dx] df_sorted.groupby(id)[center_x].diff() df_sorted[dy] df_sorted.groupby(id)[center_y].diff() df_sorted[speed] (df_sorted[dx]**2 df_sorted[dy]**2)**0.5 avg_speed df_sorted.groupby(id)[speed].mean() print(avg_speed.nlargest(5)) # 速度TOP5车辆参数说明age字段是ByteTrack的核心指标表示该ID已连续跟踪的帧数。若age突然归零说明ID丢失被遮挡或离开画面若age持续增长说明车辆匀速移动。本数据集虽无视频但tracks.csv的生成逻辑完全复用真实场景你只需替换source为自己的视频即可。从那以后我每次部署车牌检测系统都强制走一遍track流程——哪怕客户只要单帧结果。因为ID稳定性是后续所有业务收费、违章、流量统计的基石而这块基石必须在数据集层面就用tracks.csv验证过。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价