ARTICLE DETAIL

资讯详情

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

YOLOv5车牌识别Python毕业设计:原理、训练与OCR识别实践

YOLOv5车牌识别Python毕业设计:原理、训练与OCR识别实践 简介面向计算机视觉方向毕业设计的YOLOv5车牌识别Python项目包适合正在筹备目标检测课题的本科或研究生。资源围绕车牌定位与识别全流程展开覆盖深度学习基础、YOLOv5四段式网络结构、模型微调、图像预处理、OCR字符识别与性能指标评估等关键环节从车牌区域检测到字符输出形成完整闭环可直接支撑课程设计或毕业答辩演示。压缩包共78个文件以19个Python训练/推理脚本、9个YAML模型配置、5个pt权重文件为主同时附带测试图像、avi视频样例、运行说明及Docker部署配置整体约346MB目录划分清晰便于按模块查找和使用。现有1504人学习下载项目不仅提供可直接运行的训练与检测代码还包括基于PyTorch的调优流程、Tesseract OCR识别思路、边界框可视化绘制代码以及针对数据标注、数据集划分、mAP评测等实践环节的完整参考适合从数据准备到结果展示逐阶段学习能有效提升毕业设计完成效率与工程实践能力。1. YOLOv5车牌识别Python毕业设计拿到源码包之后真正要做什么每年毕业季都能看到一批被目标检测折腾得焦头烂额的同学。如果毕业设计题目是YOLOv5车牌识别Python实现恭喜你选型方向是稳的——但拿到源码包之后真正的考验才刚刚开始。这份基于YOLOv5的车牌定位和识别源码把检测、训练、推理的完整工程骨架都放在了里面YOLOv5模型定义、预训练权重、训练与检测脚本、测试图片和字体文件一应俱全。它对你最大的价值不是“能跑”而是让你在复现的过程中理解一套真实的目标检测工程是怎么组织起来的。适合三类人急着跑通demo交初稿的、想把模型微调成自己数据集的、以及答辩前想真正看懂每一层网络在干什么的。这篇文章按我自己的复现顺序来写从原理到环境、从训练到踩坑最后把识别链路接完整。2. YOLOv5车牌识别的工作原理Backbone、Neck、Head与两段式识别链路2.1 YOLOv5的网络骨架CSPDarknet、PANet和Detect HeadYOLOv5是典型的一阶段one-stage检测器图像从输入到输出只需要一次前向推理。这套源码里的模型结构定义在models/目录下核心就是三块Backbone、Neck和Head。Backbone用的是CSPDarknet。CSP的意思是跨阶段部分连接它在ResNet的残差结构基础上做了改进把特征图分成两部分一部分走残差块另一部分直接拼接既减少了计算量又保证了梯度流动。Darknet的后面几个stage输出的特征图分辨率逐级降低通道数逐步增加这样网络在不同尺度上都提取到了语义信息。Neck用的是PANet结构全称是Path Aggregation Network。它做的事情简单说就是“自顶向下传递语义、自底向上传递位置”。YOLOv5把Backbone输出的三个不同尺度的特征图送进PANet通过上采样和下采样的反复融合让浅层的位置信息和深层的语义信息互相补充。这对车牌识别很重要因为车牌相对小深层特征图可能丢失细节而PANet能把浅层的高分辨率特征保留下来。Head是Detect层它负责在三个尺度的特征图上分别输出预测结果。每个尺度对应不同大小的目标大尺度特征图负责小目标小尺度特征图负责大目标。对于车牌这种中等偏小的目标源码里默认的输入尺寸是640×640在这个尺寸下车牌通常会占几十到上百个像素检测起来并不吃力。三个部分的分工可以用一个表概括| 模块 | 源码位置 | 作用 | 关键点 | | Backbone | models/ 下的 C3 模块 | 提取图像特征逐层下采样 | CSPDarknet兼顾速度和精度 | | Neck | models/ 下的 PANet 结构 | 多尺度特征融合 | 上采样下采样交替保留位置细节 | | Head | models/ 下的 Detect 层 | 输出边界框和类别概率 | 3个尺度分别对应大中小目标 |你在阅读源码时不用逐行看C3和SPPF的实现先把这三个模块的输入输出尺寸捋清楚就够用了。打开models/yolov5s.yaml你会看到depth_multiple和width_multiple两个系数YOLOv5的s、m、l、x版本就是靠这两个系数缩放网络深度和宽度的源码里默认给的是s版本对车牌识别任务来说性价比最好。2.2 为什么车牌识别要拆成“定位OCR”两段式很多人第一次拿到这个项目时会有一个疑问YOLOv5已经能把车牌框出来了为什么还要再做一个识别直接让模型输出车牌号不行吗理论上可以但实际效果会很差。原因有三点。第一车牌字符是组合式的全国的省份简称有30多个后面跟着字母和数字直接让检测模型输出完整车牌号相当于把分类空间变成了上万个组合训练难度和样本需求都指数级上涨。第二YOLOv5的定位输出是边界框和类别概率它天生不擅长序列识别字符有前后顺序这种序列信息更适合交给循环网络或注意力机制去处理。第三检测和识别的数据需求不同检测只要框住整个车牌就行识别却需要看清每个字符两件事分开做各调各的模型效果更容易控制。所以这套毕业设计的完整链路是第一步用YOLOv5检测模型在画面里找出车牌的位置输出四个坐标和一个置信度第二步把坐标对应的图像区域裁剪出来送到OCR模块去识别字符第三步OCR把识别出的字符按顺序拼成完整的车牌号。源码包里的YOLOv5部分负责第一步OCR部分需要自己接PaddleOCR和EasyOCR是常见的选型后面第6章我会详细讲这一步。完整处理链可以拆成六步答辩讲原理时按这个顺序说最清楚输入图像经过YOLOv5推理输出每个车牌的边界框坐标、置信度和类别根据边界框裁剪出车牌区域如果车牌倾斜做透视变换校正成水平矩形将校正后的图像送到OCR模型输出字符序列过滤掉OCR结果中的误识别字符按车牌规则校验长度和格式把检测框和识别结果画回原图展示最终效果。这里有一个容易被忽视的细节YOLOv5检测出的边界框是矩形但车牌在画面里可能是倾斜的。直接裁剪矩形区域会把车牌周围的背景也带上如果倾斜角度大字符会被裁掉一部分。常见做法是先用检测框的四个角点做透视变换把倾斜的车牌校正成水平矩形再送进OCR。虽然源码的detect.py只输出矩形框但你在做识别部分时这个校正步骤值得加上。2.3 源码里与原理对应的模块models、utils、weights分别管什么把原理对应到源码目录阅读顺序就清晰了。models/是网络结构定义里面不仅有yolo.py还有common.pyC3、SPPF、Concat这些基础组件都在common.py里如果你要改网络结构改这两个文件就够了。utils/是工具函数集合包括数据集加载、增强策略、损失函数、评价指标、画图工具。weights/存放预训练权重源码包里的权重是已经在COCO数据集上训练好的可以直接用来做推理也可以作为微调的起点。数据流的方向是这样的train.py读取data/下的数据集配置调用utils/datasets.py加载图片和标签经过数据增强后送入models中的网络前向传播得到预测结果再和真实标签计算损失反向传播更新权重。detect.py的流程更简单加载weights里的权重处理test*.jpg输入图片在runs/detect/目录下输出画好框的图片。我看源码的习惯是先跑通再回头读代码。拿到这个项目的正确顺序是先按requirements.txt装好环境用test0.jpg跑一次detect.py确认环境没问题然后打开runs/detect/exp/看输出图对检测效果有个直观感受再回头读models/yolo.py和train.py搞清楚训练流程。这样比从头读代码快得多也不容易中途放弃。2.4 为什么选YOLOv5而不是更早的YOLO版本或其他检测器对于车牌识别这个毕业设计选YOLOv5有几个现实原因。YOLOv3论文虽经典但工程化程度不够配置文件和训练流程都更繁琐YOLOv4在精度上有提升但作者团队维护的官方代码不如ultralytics的YOLOv5清晰。YOLOv5的优势在于代码组织得好、文档全、社区活跃遇到问题几乎都能搜到现成答案。而且它把训练、验证、推理、导出封装得一气呵成对毕设来说把精力花在数据集和调参上比花在搭框架上更划算。相比之下如果用Faster R-CNN这类两阶段检测器精度可能更高但速度慢很多实时性展示不好看。如果换成EfficientDet精度和速度均衡但学起来更抽象。车牌识别属于固定场景的检测任务YOLOv5的s版本在CPU上也能跑实时推理这在答辩演示时是很加分的效果。3. 环境搭建与工程目录解读让检测脚本先跑起来3.1 根据 requirements.txt 配置 Python 环境YOLOv5官方对Python版本要求是3.8以上PyTorch版本建议1.8以上。这套源码的requirements.txt里列出了所有依赖numpy、opencv-python、torch、torchvision、matplotlib这些是核心pillow用于图像处理pyyaml用于读取配置文件。安装之前先确认机器有没有NVIDIA显卡有显卡就装CUDA版本的PyTorch没有显卡就装CPU版本CPU版本跑推理没问题跑训练会很慢。我的习惯是先建一个干净的虚拟环境再装依赖避免和系统Python环境打架# 创建并激活Python 3.9虚拟环境 conda create -n yolo-plate python3.9 -y conda activate yolo-plate # 安装CUDA 11.8版本的PyTorch避免pip默认装CPU版 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 # 安装项目剩余依赖 pip install -r requirements.txt第一行创建Python 3.9虚拟环境并命名为yolo-plate第二行激活它。第三行单独安装带CUDA 11.8支持的PyTorch因为requirements.txt里的torch默认走PyPI源装的是CPU版本。最后一行安装剩余依赖。如果你机器上没有CUDA把第三行去掉即可PyTorch会装CPU版。装完依赖建议马上验证torch和cuda状态python -c import torch; print(torch.__version__, torch.cuda.is_available())打印出类似于1.13.1 True这样的输出说明PyTorch装好了且CUDA可用。如果显示False训练时设备参数就只能走CPU速度和精度都会有损失。这个检查很便宜30秒能确认环境是否正常。3.2 源码目录逐项拆解每个文件的角色解压源码包之后第一件事是把目录结构看清楚。整体结构是这样的yolov5-plate/ ├── train.py / train1.py # 训练入口 ├── detect.py # 推理入口 ├── models/ # 网络定义 ├── utils/ # 工具函数 ├── weights/ # 预训练权重 ├── data/ # 数据集配置 ├── runs/ # 输出目录 ├── requirements.txt # 依赖清单 └── simsun.ttc # 中文字体按文件的作用再细分我整理了一张清单| 文件/目录 | 作用 | 说明 | | train.py | 训练主脚本 | 从零训练或微调YOLOv5模型 | | train1.py | 训练辅助脚本 | 源码同时保留两个训练入口train1通常针对车牌场景调整过加载逻辑可以对比差异理解哪些参数可改 | | detect.py | 推理脚本 | 对图片/视频做目标检测输出可视化结果 | | models/ | 网络结构定义 | 包含yolo.py、common.py和yolov5s.yaml | | utils/ | 工具函数 | 数据集加载、损失计算、绘图、评估指标 | | weights/ | 预训练权重 | 没有这个文件的话检测和微调都跑不了 | | data/ | 数据集配置 | data.yaml定义训练/验证集路径和类别列表 | | runs/ | 输出目录 | 训练日志、权重、检测结果图都在这 | | test0.jpg ~ test7.jpg | 测试图片 | 8张车牌场景图用于快速验证检测效果 | | simsun.ttc | 中文字体文件 | OpenCV画图显示中文时必需缺失会报错 | | read_yaml.py | yaml工具 | 读取和打印配置文件内容 | | requirements.txt | 依赖清单 | pip install -r 安装 | | tutorial.ipynb | Jupyter教程 | 逐步演示加载模型和推理过程 |这里有三个容易踩坑的文件需要提前说明。第一是weights/如果解压后这个目录是空的检测脚本会立刻报错去下载对应的yolov5s.pt放到里面。第二是simsun.ttcdetect.py画框时会用这个字体在图片上写中文标签文件名是宋体字体删掉了会在画图时报错。第三是runs/首次运行前它可能不存在脚本会自动创建不用手动建。3.3 用自带测试图片跑通第一次检测环境装好、目录看清之后直接跑推理。源码包里的test0.jpg到test7.jpg就是干这个用的挑一张来验证# 用预训练权重对test0.jpg做车牌检测 python detect.py --weights weights/yolov5s.pt --source test0.jpg --conf-thres 0.4 --iou-thres 0.5weights参数指定检测模型权重source参数指定输入图片。conf-thres是置信度阈值只有预测概率高于这个值的框才会保留0.4意味着模型有40%以上把握才输出结果iou-thres是NMS非极大值抑制的IoU阈值用于去掉重复框。如果你看到图上有多个重叠的车牌框把iou-thres调高到0.6或0.7。跑完去runs/detect/exp/目录看输出源码默认会在每张检测到的车牌上画一个矩形框框角上有“plate”标签和置信度。如果输出里没有框先把conf-thres往下调一调比如调到0.25看看模型是不是其实检测到了但被阈值过滤掉了。打开输出图后除了看有没有框更要看框的贴合程度。如果框比车牌大很多说明模型定位精度不够如果两个框叠在同一个车位上说明NMS阈值偏高调低iou-thres如果置信度普遍低于0.5说明场景与训练分布差异大后面需要微调。第一次跑通之后再把保留下来的8张测试图全部跑一遍# 批量测试8张样例图 python detect.py --weights weights/yolov5s.pt --source test.jpg --conf-thres 0.4 --iou-thres 0.5注意test.jpg是YOLOv5官方自带的测试图它和test0.jpg到test7.jpg不同前者验证的是YOLOv5基础检测能力后者是车牌场景的样例。把所有图片过一遍能对模型在不同光线、角度下的表现有个初步判断。4. 训练自己的车牌检测模型数据集、参数和数据增强4.1 车牌数据集准备标注格式、目录划分和 data.yaml毕业设计如果只用源码自带的预训练权重做推理是不够的。老师大概率会问“你有没有训练过自己的模型”所以自己准备一批车牌数据做微调是必须的。YOLOv5的标注格式是每个目标一行类别id、归一化后的中心点x、中心点y、宽度w、高度h。比如一张640×640的图上车牌框左上角为(400, 300)、右下角为(560, 420)类别为0则对应的标注是0 0.75 0.5625 0.25 0.1875x中心计算为(400560)/2/6400.75y中心为(300420)/2/6400.5625宽度为(560-400)/6400.25高度为(420-300)/6400.1875。手动算容易出错我一般写个小脚本自动转或者用LabelImg等标注工具导出YOLO格式。数据准备好后按train和val两个子目录存放data.yaml是训练的入口配置# 车牌检测数据集配置 train: plate-data/images/train val: plate-data/images/val nc: 1 names: [plate]train和val指向图片目录YOLOv5会自动到同级labels目录找对应的txt标注。nc是类别数这个项目只检测车牌一个类别所以填1。names是类别名称列表[plate]和标注里的类别id 0对应。如果你把nc写错成2或names顺序不对训练时会报维度错误。需要提醒的是train和val的路径尽量用绝对路径尤其当你在Windows上运行时相对路径经常因为当前工作目录不对而找不到数据集。源码包里的read_yaml.py就是个小工具用来检查data.yaml能不能被正确读取# 检查yaml配置文件是否正常 python read_yaml.py plate-data/data.yaml如果打印出正常的dict内容说明yaml没问题再进训练环节。注意data.yaml里的路径如果写的是相对路径train.py执行时一定要从项目根目录运行否则数据集会加载失败。4.2 train.py 训练参数详解把预训练模型微调成自己的车牌检测器训练命令是这套源码里最核心的东西。基于预训练权重微调的常见做法是# 基于COCO预训练权重微调100轮训练 python train.py --data plate-data/data.yaml --weights weights/yolov5s.pt \ --epochs 100 --batch-size 16 --img-size 640 \ --patience 20 --project runs/train --name plate_exp--data指定yaml配置--weights指定预训练权重这两个决定了训练的逻辑。--epochs是总训练轮数车牌检测数据量通常在几百到几千张100轮足够。--batch-size是每批样本数显存不够时往下调8G显存建议816G显存可以到16。--img-size是输入分辨率训练时图片会被resize到这个尺寸640是默认值如果你发现车牌太小可以调到960但耗时和显存都会上涨。--patience是早停参数连续20轮验证集指标没有提升就自动停止防止过拟合的同时节省时间。--project和--name决定训练日志输出位置runs/train/plate_exp下会有weights/目录、训练曲线图和验证结果。训练过程中要注意看终端输出的几行指标box_loss是边界框回归损失obj_loss是置信度损失cls_loss是分类损失这三个值大体上应该逐步下降mAP_0.5是IoU阈值为0.5时的平均精度mAP_0.5:0.95是更严格的综合指标。车牌检测这种单类别任务mAP_0.5高于0.95就算训练得很好了mAP_0.5:0.95在0.7以上是正常水平。如果训练时显存不够不要硬扛把batch-size减半是最直接的办法。img-size也值得试从640降到512显存占用会明显下降而车牌这类目标比较规整的任务512输入带来的精度损失很小。训练时间取决于数据量和显卡一张RTX 3060跑500张图、100轮、batch-size 8大约需要1到2小时。如果只有CPU同样的配置可能跑10个小时以上建议临时租一块GPU跑训练本地用CPU做推理演示就够了。4.3 数据增强策略与训练结果的判断YOLOv5在训练时默认开启了Mosaic增强它会把四张图拼成一张再送进网络相当于每轮看到的目标数量多了几倍对小目标检测很有帮助。源码里train.py的hyp参数还配置了色彩抖动、随机翻转、平移缩放等增强策略。对于车牌识别有一点值得注意车牌是强纹理目标色彩抖动幅度太大时蓝色底或绿色底的颜色特征会被改变干扰检测。如果你的训练数据里蓝色车牌和绿色新能源车牌比例失衡建议在data/hyps/hyp.scratch-low.yaml里适当降低hsv_h、hsv_s的增强强度让颜色特征保留得更完整。训练结束后的权重文件在runs/train/plate_exp/weights/目录下有best.pt和last.pt两个文件。best.pt是验证集上mAP最好的那轮权重last.pt是最后一轮的权重。用best.pt做推理和后续微调除非你明确知道last泛化更好。检测命令与之前类似只是把权重换成训练产物# 用训练好的best.pt做推理 python detect.py --weights runs/train/plate_exp/weights/best.pt \ --source test0.jpg --conf-thres 0.4 --iou-thres 0.5对比推理结果和训练前的预训练权重你会明显看到几个差别自己的模型对特定场景的漏检更少框的位置更贴车牌边缘置信度也普遍更高。这就是微调的价值。5. 避坑记录跑车牌识别最容易翻车的五个点跑这类开源项目环境问题和数据问题消耗的时间往往比写代码还多。下面五条是我在复现和改造这个YOLOv5车牌识别项目时真实遇到过的问题每条的解决思路都不复杂但不知道的话会很花时间。5.1 中文字体报错simsun.ttc 路径不对现象detect.py在画框时崩溃报错信息类似“Could not find a font file ... simsun.ttc”。原因OpenCV的putText不支持中文YOLOv5源码通过PIL加载simsun.ttc来画中文标签。代码里写的是相对路径如果你把源码包里的字体文件移走了或者当前工作目录不在源码根目录就会找不到这个文件。解决先把字体文件放回源码根目录运行时确保cd到了项目根目录再执行python命令。如果还想更稳妥在utils/plots.py里把字体路径改成绝对路径或者复制一份simsun.ttc到系统字体目录。拿到源码包后先不要动任何文件跑通一遍再开始改代码这是最省事的规避方式。5.2 显存溢出训练时 OOM现象train.py启动后在第一个epoch直接报CUDA out of memory终端卡住不动。原因默认batch-size和img-size对显卡显存要求过高。YOLOv5官方默认batch-size是16img-size是640这两者一起决定了显存占用6G以下的卡很容易超过极限。解决先降batch-size到8还不行就降到4。另一种思路是把workers减少到2避免数据加载线程抢显存。如果显卡只有4G把img-size也改到512同时把模型从yolov5s换成更小的版本。这一步没什么玄学显存占用就是batch-size、图片尺寸和模型参数量的乘积关系。训练前用nvidia-smi看一眼显存剩余根据剩余量决定batch-size比报错后再调高效得多。5.3 训练后 mAP 很低但训练损失正常现象训练过程中loss曲线平滑下降但最后mAP_0.5只有0.5甚至更低检测效果惨不忍睹。原因最常见的是数据集没有做shuffle或者train和val的图片分布不一致。车牌数据如果全部来自同一个停车场模型就只学会了那个场景val集用了另一个停车场的数据指标就会很难看。解决把数据集打乱后重新划分train和val保证两个集合在光线、角度、车牌颜色上分布接近。此外检查labels文件里有没有漏标或标错的情况——我遇到过一次val集里有一张图标注框比车牌大了一倍mAP被这一个小错误拉低了几个点。用可视化脚本把标注框画回图片上检查一遍这一步值得花时间。泛化性差的另一个隐藏原因是训练集图片尺寸不一致YOLOv5虽然会resize但图片太糊或压缩过重特征会退化数据清洗时优先保留高分辨率原图。5.4 路径中文和空格问题Windows 上数据读不出来现象在Windows下运行train.py报文件找不到但路径明明存在。原因YOLOv5的datasets.py用了很多路径拼接操作路径中的中文和空格在某些函数里会被错误解析。很多同学的桌面路径是C:\Users\张三\Desktop在中文用户名环境下概率触发。解决把整个项目和数据集移到纯英文路径下比如D:\yolo-plate。另外注意data.yaml里的路径无论是相对还是绝对一律用英文。这个坑在Linux上基本不存在但在Windows上是最高频的报错原因。项目一开始就建在英文目录里不要在桌面或者带中文的目录下解压能省掉很多后续麻烦。5.5 蓝色车牌全部漏检其他图正常现象预训练权重在源码自带测试图上表现正常但换成自己拍的蓝色车牌图就大面积漏检。原因COCO预训练权重里根本没有“plate”这个类别源码的测试图之所以能检测到可能权重经过了额外微调或者测试图和模型训练分布高度一致。你用没有微调过的权重直接去测自己的图片相当于要求模型识别它从来没见过的类别漏检是必然。解决用自己的车牌数据微调后再用best.pt推理。如果你还没训练只是想做demo可以降低conf-thres到0.25看模型是不是有低置信度的检测框如果依然没有说明权重确实不认识车牌老老实实走训练流程。如果检测到但置信度普遍不高检查输入图片的亮度和对比度车牌区域过暗时特征不明显适当做一次直方图均衡化能减少误判。5.6 拿到异常结果后的排查顺序当你发现检测或训练结果不对劲时与其瞎猜不如按顺序排查。第一步确认环境PyTorch版本、CUDA是否可用直接影响训练速度和推理表现第二步确认数据用read_yaml.py检查配置用可视化脚本把标注画到图上检查第三步确认权重预训练权重和微调权重不要搞混命令行里的路径指错了结果自然不对第四步看日志runs/train/exp下的results.csv里有每一轮的指标先看趋势再看绝对值趋势下降说明训练没问题问题出在数据或权重上。按这个顺序走大部分异常能在十几分钟内定位。6. 进阶把检测结果接上OCR并验证整个系统的指标6.1 用检测框裁剪车牌区域交给OCR识别YOLOv5只负责输出车牌框要得到车牌号还需要一个OCR模块。我用PaddleOCR做字符识别的脚本大致是这样import cv2 import torch import paddleocr # 初始化OCRlangch指定中文识别 ocr paddleocr.PaddleOCR(use_angle_clsTrue, langch) # 加载本地训练好的YOLOv5权重 model torch.hub.load(yolov5, custom, sourcelocal, pathruns/train/plate_exp/weights/best.pt) img cv2.imread(car.jpg) results model(img) # 遍历检测结果裁剪车牌区域并交给OCR for det in results.xyxy[0]: x1, y1, x2, y2, conf, cls det.tolist() x1, y1, x2, y2 int(x1), int(y1), int(x2), int(y2) crop img[y1:y2, x1:x2] ocr_res ocr.ocr(crop, clsTrue) print(ocr_res)逻辑分三步第一步加载OCR和检测模型第二步用检测模型在整图上找出车牌框results.xyxy[0]返回的每行依次是左上右下坐标、置信度和类别id第三步按坐标裁剪图片区域把crop这块小图交给OCR识别。拿到OCR结果后我一般会去掉空格和非字母数字字符再判断长度是否符合车牌规则比如普通蓝牌是7位新能源绿牌是8位。提示如果车牌在画面里是倾斜的裁剪前先用检测框的四个角点做一次透视变换把车牌校正成水平矩形再送OCR字符识别率会明显提升。6.2 用 mAP 和字符识别准确率验收整个系统模型训完、OCR接完之后还要有验收指标。检测模块的指标是mAP这个在训练输出里能看到OCR模块的指标是字符识别准确率也就是识别正确的字符数除以总字符数。我一般会准备50到100张没参与过训练的车牌图用上面的脚本批量跑统计三个数据。第一个是车牌定位准确率检测框和真实框的IoU大于0.6算定位成功第二个是整牌识别准确率七个或八个字符全部识别对才算对第三个是单字符准确率算错了也能看出是哪个字容易混——比如“0”和“O”、“1”和“I”在车牌场景里经常被误识别。把这三个数据做成表格放进毕业设计的测试章节比单独放两张效果图有说服力得多。我从这个项目里学到的教训是车牌识别的难点不在YOLOv5本身而在数据分布和字符细节。第一次做的时候我用了几百张停车场图片训练测试时换了一个地库场景漏检率立刻上来了。从那以后我每次做车牌检测任务都强制自己先准备至少三个不同场景的数据训练完先跑一遍场景外的图片再谈指标。这个习惯帮我避免了很多次答辩前的翻车。希望帮到你。本文还有配套的精品资源点击获取
返回列表