资讯动态

YOLOv5车牌识别实战:从数据集训练到TensorRT部署全流程

发布时间:2026/10/1 3:25:40 来源:尧图企业网站定制
简介这份资源面向深度学习初学者、目标检测方向的学生及毕业设计开发者提供基于YOLOv5实现车牌识别的完整工程实践。压缩包内共77个文件以29个Python脚本、17个YAML配置、21张示例图片及2个预训练权重文件为主涵盖模型定义、训练推理、数据转换与权重下载等模块整体约25.4MB。资源围绕数据预处理、模型训练、参数调优、验证测试与实时部署五个环节展开读者可借助其中的网络结构配置、训练脚本与已训练权重快速复现车牌检测流程并在此基础上调整超参数、替换数据集或迁移到安防监控与智能交通场景。目前已有2591人学习下载适合作为课程实践、课题研究或毕业设计的起步模板帮助理解卷积神经网络如何自动提取车牌特征并完成端到端定位识别。1. 车牌识别为什么选 YOLOv5从一张违章抓拍说起前阵子帮朋友看一个停车场出入口的抓拍项目相机像素不低但车牌识别率死活上不去白天还行一到傍晚逆光就大面积漏检。翻了他的代码才发现检测环节用的是传统边缘加颜色分割阈值全靠手调光照一变就崩。这类场景其实特别适合把检测环节换成 YOLOv5——它把车牌当成一个普通目标来框鲁棒性比手工特征强太多而且工程化程度高从训练到部署一条龙都有现成脚本。这份资源就是围绕「YOLOv5 实现车牌识别」这条主线展开的包含数据集组织、模型训练、推理后处理到部署落地的完整链路。它解决的核心问题是让你不用从零搭检测框架直接在一个验证过的工程结构上把车牌检测加字符识别跑通。适合两类人一是刚接触深度学习目标检测、想拿一个真实场景练手的工程师二是手里有车牌识别需求、想快速验证方案可行性的开发者。下面我按自己拆包复现的顺序把关键环节和踩过的坑讲清楚。2. YOLOv5 车牌检测的工程结构与环境配置2.1 为什么是 YOLOv5 而不是 v8 或 Faster R-CNN先说说选型。车牌检测这个任务有几个特点目标尺寸相对固定、长宽比偏扁、单张图里目标数量少通常一到两个、对实时性要求高。YOLOv5 在这个场景下的优势很明显。它的 anchor 机制对扁长目标友好只要聚类出来的先验框贴合车牌比例召回率就稳推理速度快n/s 版本在普通显卡上轻松跑到几十帧生态成熟导出 ONNX、TensorRT 的脚本都是现成的。Faster R-CNN 精度不差但两阶段推理慢部署到边缘设备上很吃力。YOLOv8 更新但如果你手里的部署工具链、后处理代码都是围绕 v5 写的贸然换版本反而增加迁移成本。常见做法是验证阶段用 YOLOv5s 快速迭代确认方案可行后再考虑换更轻或更新的骨干。这个资源选 v5我认为是务实的选择不是追新。2.2 目录结构与关键文件拿到包之后别急着跑先把结构理清楚。典型的 YOLOv5 车牌项目会包含这几块目录/文件作用复现时要动的地方data/数据集配置与图片标签改 yaml 里的路径和类别数models/网络结构定义一般不动除非改 anchorweights/预训练权重放 yolov5s.pt 做迁移学习utils/数据加载、后处理、指标车牌后处理常在这里加train.py训练入口调超参detect.py推理入口调置信度和 NMS车牌识别和通用检测最大的不同在于检测框出来之后还要做字符识别。所以工程里通常会有两个模型或者一个检测加一个 CRNN 识别。这份资源的主线是检测部分识别部分一般接一个轻量 OCR。你得先明确自己要的是「只检测车牌位置」还是「检测加识别字符」这决定了后面要不要再接一个识别模型。2.3 环境配置conda 建环境与依赖安装环境这块翻车最多我一般强制用 conda 隔离避免和系统里的 torch 打架。步骤和命令如下# 创建独立环境python 版本按项目要求一般 3.8 比较稳 conda create -n plate_yolo python3.8 -y conda activate plate_yolo # 安装 pytorch注意 cuda 版本要和驱动匹配这里以 cu118 为例 pip install torch2.0.1 torchvision0.15.2 --index-url https://download.pytorch.org/whl/cu118 # 安装项目其余依赖 pip install -r requirements.txt # 验证 torch 是否能识别到显卡 python -c import torch; print(torch.cuda.is_available())逻辑说明先建环境再装 torch是因为 requirements.txt 里往往也写了 torch如果顺序反了pip 可能装成 CPU 版本训练时慢到怀疑人生。参数上python 版本别盲目上 3.11很多老项目的 numpy、opencv 轮子对高版本支持不好。最后那句验证一定要跑输出 True 才算环境通了。如果输出 False先查驱动和 cuda 版本对应关系别急着改代码。提示requirements.txt 里的版本号如果和你的 cuda 冲突优先保证 torch 和 cuda 匹配其余依赖可以适当放宽版本。3. 数据集准备与 YOLOv5 训练调参实战3.1 车牌数据集标注格式与目录组织YOLOv5 用的是 YOLO 格式标签每张图对应一个 txt每行是类别 中心x 中心y 宽 高全部归一化到 0 到 1。车牌场景一般就一个类别所以类别 id 恒为 0。目录组织常见两种我推荐按下面这种dataset/ images/ train/ val/ labels/ train/ val/图片和标签文件名必须一一对应只是后缀不同。这里有个血泪经验标注时框要贴紧车牌边缘别把车牌外的螺丝孔、边框留太多否则模型学到的框会偏大后处理裁剪字符时容易带进干扰。另外车牌如果是倾斜的标注框用水平矩形就行YOLOv5 默认不做旋转框倾斜靠数据增强和后续透视校正解决。数据配置文件一般叫plate.yaml内容长这样# 数据集根路径建议写绝对路径避免相对路径找不到 path: /home/user/dataset train: images/train val: images/val # 类别数车牌只有一类 nc: 1 names: [plate]参数说明path写绝对路径能省掉很多「找不到文件」的玄学问题nc一定要和标签里的最大类别 id 加一一致写错了训练不报错但结果全乱。改完 yaml先用官方脚本检查一遍标签有没有越界、有没有空文件比训练到一半才发现问题划算得多。3.2 迁移学习与超参数设置车牌数据量通常不大几千张就算多了所以必须用预训练权重做迁移学习。命令如下# 用 yolov5s 预训练权重训练 100 轮批次大小按显存调 python train.py \ --weights yolov5s.pt \ --data data/plate.yaml \ --epochs 100 \ --batch-size 16 \ --img-size 640 \ --cfg models/yolov5s.yaml \ --hyp data/hyps/hyp.scratch-low.yaml \ --name plate_exp逻辑说明--weights指定预训练权重这是小数据集能训出来的关键--img-size设 640 是 v5 的默认车牌目标不大如果显存够可以上 1280小目标召回会更好--hyp选低增强配置车牌颜色和纹理比较固定过强的色彩抖动反而有害。批次大小 16 是 8G 显存的经验值爆显存就往下调别硬撑。训练过程中重点看三个指标mAP0.5、precision、recall。车牌场景我更看重 recall漏检比误检麻烦因为漏了就没法补救。如果 recall 上不去先查标注质量再考虑调低置信度阈值或增加正样本。3.3 anchor 聚类让先验框贴合车牌比例YOLOv5 默认 anchor 是给通用目标用的车牌又扁又宽直接训也能收敛但用聚类重新生成 anchor 会明显提升。项目里一般带一个聚类脚本跑法如下# 对训练集标签做 k-means生成 9 个 anchor python utils/autoanchor.py --data data/plate.yaml逻辑说明这个脚本会读取所有训练标签的宽高聚类出最贴合数据分布的 9 个框然后你可以把它们替换到模型 cfg 里。参数上聚类数保持 9 和 v5 的三个检测头对应。替换后重新训练通常 mAP 能涨一两个点。注意别在验证集上聚类那是数据泄露要用训练集。4. 推理、后处理与车牌识别串联4.1 detect.py 推理与置信度阈值训练完拿到best.pt先用推理脚本看看效果python detect.py \ --weights runs/train/plate_exp/weights/best.pt \ --source test_images/ \ --conf-thres 0.25 \ --iou-thres 0.45 \ --save-txt逻辑说明--conf-thres是置信度阈值低于它的框直接丢--iou-thres控制 NMS 的重叠阈值。车牌场景目标少NMS 压力不大iou 设 0.45 够用。--save-txt会把检测框坐标存下来方便你接后续的字符识别。如果发现漏检先把 conf 降到 0.15 看看是不是阈值卡太死如果误检多再往上提。4.2 从检测框到字符识别裁剪与透视校正检测框出来只是第一步要识别字符还得把车牌区域抠出来。这里有两个坑一是框可能带背景二是车牌有倾斜。常见做法是先按框裁剪再做一次透视校正。核心代码逻辑如下import cv2 import numpy as np def crop_plate(img, box): # box 格式为 xyxy转成整数 x1, y1, x2, y2 map(int, box) # 适当外扩几个像素避免切掉字符边缘 pad 2 x1, y1 max(0, x1 - pad), max(0, y1 - pad) x2, y2 min(img.shape[1], x2 pad), min(img.shape[0], y2 pad) plate img[y1:y2, x1:x2] # 转灰度再做自适应阈值逆光场景更稳 gray cv2.cvtColor(plate, cv2.COLOR_BGR2GRAY) binary cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2) return binary逻辑说明外扩 pad 是为了防止框太紧切掉字符自适应阈值比固定阈值抗光照变化参数 11 是邻域块大小2 是常数项逆光时可以适当调大常数。裁剪出来的图再送进 CRNN 或轻量 OCR 做字符识别。如果车牌倾斜明显还得先做角点检测加透视变换把车牌摆正再识别否则字符分割会乱。4.3 端到端串联与结果输出把检测和识别串起来流程是读图 → YOLOv5 推理 → 遍历每个框 → 裁剪校正 → 识别字符 → 输出结构化结果。输出格式建议统一成 JSON方便下游系统对接results [] for box, conf in zip(boxes, confs): plate_img crop_plate(img, box) text ocr_model(plate_img) # 识别模型返回字符串 results.append({ bbox: box, confidence: float(conf), plate_text: text })逻辑说明把置信度和识别文本一起返回下游可以根据置信度做二次校验。车牌识别里常见的「0 和 O」「1 和 I」混淆可以在识别后加一层规则校正比如按车牌格式校验位数和字符集不合规的标记为可疑。这一步能显著降低误识率属于工程上很实用的后处理。5. 避坑与常见问题排查5.1 训练 loss 不降反升现象训练几轮后 box loss 或 obj loss 突然飙升。原因通常是学习率太大或者数据里有脏标注框越界、宽高为 0。解决先把学习率降一个数量级试再用脚本扫一遍标签把宽高小于 0.001 的框删掉。我遇到过一张图标签坐标全是 0就是标注工具导出时出的错。5.2 验证集 mAP 很高但实际推理漏检现象训练日志里 mAP0.5 到 0.9 了实际跑图却漏。原因多半是验证集和实际场景分布不一致比如验证集都是白天图实际有夜间。解决重新划分验证集保证覆盖各种光照和角度推理时适当降低 conf 阈值并检查预处理是否和训练一致归一化方式、通道顺序。5.3 显存溢出 CUDA out of memory现象训练到一半报显存不足。原因批次太大、img-size 太高或者没释放中间变量。解决先降 batch-size再降 img-size两者按平方关系影响显存。如果还不够开启梯度累积模拟大批次。别一味加显存先把参数调合理。5.4 导出 ONNX 后推理结果对不上现象PyTorch 里结果正常导出 ONNX 后框全乱。原因导出时没指定动态轴或者后处理里的坐标变换依赖了框架特有算子。解决导出时加--dynamic并核对预处理和后处理是否和原脚本一致。ONNX 的 NMS 有时要单独实现别指望它自动带上。5.5 车牌字符识别串位现象检测框没问题但识别出来的字符顺序乱或丢字。原因裁剪时没做透视校正字符倾斜导致分割错位。解决在裁剪后加一步透视变换用车牌四个角点做映射把车牌摆正再送识别。这一步对倾斜抓拍场景提升明显。6. 进阶技巧用 TensorRT 加速与精度回归验证方案跑通之后下一步就是提速。车牌识别在出入口场景对延迟敏感YOLOv5 导出 TensorRT 是常见做法。流程是先把 best.pt 导出 ONNX再用 trtexec 转 engine# 导出 onnx指定动态批次 python export.py --weights best.pt --include onnx --dynamic # 转 TensorRT enginefp16 精度速度更快 trtexec --onnxbest.onnx --saveEnginebest.engine --fp16逻辑说明--dynamic让批次维度可变部署时更灵活--fp16用半精度推理速度通常能翻倍精度损失很小。转完之后一定要做精度回归别只看速度。我的习惯是拿同一批测试图分别跑 PyTorch 和 TensorRT逐张比对检测框的 IoU 和识别文本IoU 低于 0.9 的挑出来看确认不是精度塌方。验证方法上我一般会建一个小型回归集覆盖白天、夜间、逆光、倾斜、污损车牌这几类每类几十张每次改模型或换部署方式都跑一遍记录 mAP 和识别准确率。这个习惯帮我挡掉过好几次「训练指标好看、上线就崩」的情况。参数上TensorRT 的 workspace 大小按显存给一般 1G 到 2G 够用给太大反而占资源。还有个实用技巧把检测和识别拆成两个 engine检测用 fp16识别用 fp32因为字符识别对精度更敏感混着用能在速度和准确率之间找平衡。部署到边缘设备时先测功耗和散热别只看帧率长时间跑降频是常事。从那以后我每次换部署后端都强制走一遍回归集比对不省这一步。希望帮到你。本文还有配套的精品资源点击获取

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

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

免费获取报价 →
↑