目标识别项目实战:基于Yolov7-LPRNet的动态车牌目标识别算法模型(三)


前言

目标识别如今以及迭代了这么多年,普遍受大家认可和欢迎的目标识别框架就是YOLO了。按照官方描述,YOLOv8 是一个 SOTA 模型,它建立在以前 YOLO 版本的成功基础上,并引入了新的功能和改进,以进一步提升性能和灵活性。从基本的YOLOv1版本到如今v8版本,完成了多次蜕变,现在已经相当成熟并且十分的亲民。我见过很多初学目标识别的同学基本上只花一周时间就可以参照案例实现一个目标检测的项目,这全靠YOLO强大的解耦性和部署简易性。初学者甚至只需要修改部分超参数接口,调整数据集就可以实现目标检测了。但是我想表达的并不是YOLO的原理有多么难理解,原理有多难推理。一般工作中要求我们能够运行并且能够完成目标检测出来就可以了,更重要的是数据集的标注。我们不需要完成几乎难以单人完成的造目标检测算法轮子的过程,我们需要理解YOLO算法中每个超参数的作用以及影响。就算我们能够训练出一定准确度的目标检测模型,我们还需要根据实际情况对生成结果进行一定的改写:例如对于图片来说一共出现了几种目标;对于一个视频来说,定位到具体时间出现了识别的目标。这都是需要我们反复学习再练习的本领。

完成目标检测后,我们应该输出定位出来的信息,YOLO是提供输出设定的超参数的,我们需要根据输出的信息对目标进行裁剪得到我们想要的目标之后再做上层处理。如果是车牌目标识别的项目,我们裁剪出来的车牌就可以进行OCR技术识别出车牌字符了,如果是安全帽识别项目,那么我们可以统计一张图片或者一帧中出现检测目标的个数做出判断,一切都需要根据实际业务需求为主。本篇文章主要是OCR模型对车牌进行字符识别,结合YOLO算法直接定位目标进行裁剪,裁剪后生成OCR训练数据集即可。开源项目地址如下,如果有帮助希望不吝点亮star~
基于Yolov7-LPRNet的动态车牌目标识别算法模型icon-default.png?t=N7T8https://github.com/Fanstuck/Yolov7-LPRNet其中数据集的质量是尤为重要的,决定了模型的上限,因此想要搭建一个效果较好的目标识别算法模型,就需要处理流程较为完善的开源数据集。本篇文章采用的是CCPD数据集,上篇文章已经详细描述了整个项目的初步搭建过程,包括数据集准备和数据预处理,大体系统框架和数据标签聚合,以及利用Yolov7进行模型训练和推理,能够得到图片或者视频帧中车牌的定位数据,现在我们需要搭建LPRNet网络来实现OCR车牌字符识别输出。


一、车牌字符识别

一般来说此类技术都成为OCR,OCR(Optical Character Recognition)技术是一种将图像中的文字转化为可编辑文本的技术。它可以通过计算机视觉和模式识别的方法来识别和提取图像中的文字信息。根据调研使用的常用网络框架有三种都可以作为车牌识别:

CRNN:最经典的OCR模型了,采用CNN+RNN的网络结构,提出CTC-Loss对齐算法解决不定长序列对齐问题;原始源码是用于文字识别的,稍微改成车牌数据集,即可用于车牌识别了

LPRNet*:*相比经典的CRNN模型,LPRNet 没有采用RNN结构;是专门设计用于车牌识别的轻量级的模型,整个网络结构设计高度轻量化,参数量仅有0.48M

PlateNet:LPRNet网络结构中存在MaxPool3d等算子,在端上部署时,会存在OP不支持等问题,PlateNet模型去除MaxPool3d,改成使用MaxPool2d,保证模型可端上部署成功。

模型input-sizeparams(M)GFLOPs
LPRNet94×240.48M0.147GFlops
CRNN160×328.35M1.06GFlops
PlateNet168×481.92M1.25GFlops

 本项目采取的是LPRNet,这里简述一下LPRNet。

二、LPRNet

"LPRNet"是用于车牌识别(License Plate Recognition,LPR)的神经网络模型。主要设计出目标就是针对检测和识别车牌字符。 论文由Intel于2018年发表: LPRNet: License Plate Recognition via Deep Neural Networks,网络结构设计追求高度轻量化,为了能够方便在嵌入式设备使用,且识别率还不低完全够用。LPRNet的特点有:

  • End-to-End设计:LPRNet是一个端到端的网络,可以直接从原始图像中提取车牌信息,而无需手动设计特征提取器。
  • 针对性强:LPRNet专门设计用于车牌识别任务,因此在车牌识别任务上具有很强的性能。
  • 多任务学习:LPRNet通常包括字符分类任务和位置回归任务。字符分类任务用于识别车牌上的每个字符,位置回归任务用于定位车牌的位置。
  • 卷积神经网络:LPRNet通常使用卷积神经网络来提取特征,这使得它对图像的空间信息进行了很好的利用。
  • 采用了特定的损失函数:LPRNet通常会使用CTC(Connectionist Temporal Classification)损失函数来处理字符级别的识别,这是一种适用于序列标注任务的损失函数。

Intel论文中设计了一个图像预处理网络,将车牌图像进行变换(如偏移、旋转车牌图片),得到合适的车牌图片输入到CNN中,论文使用的是LocNet网络自动学习最佳的转换参数。LocNet模型结构如下:

 其中LPRNet的backbone模块是自行设计的一个轻量化的backbone,其中设计的一个Small basic block其实就是一个瓶颈型的结构。

Small basic block结构如下:

先经过第一个1x1卷积进行降维,再用一个3x1和一个1x3卷积进行特征提取,最后再用1个1x1卷积进行升维。不对称卷积可以代替对称矩阵,3x1+1x3产生和3x3一样的效果,参数量还更少了,而且还多了一个ReLU激活函数,增加了非线性。

class small_basic_block(nn.Module):def __init__(self, ch_in, ch_out):super(small_basic_block, self).__init__()self.block = nn.Sequential(nn.Conv2d(ch_in, ch_out // 4, kernel_size=1),nn.ReLU(),nn.Conv2d(ch_out // 4, ch_out // 4, kernel_size=(3, 1), padding=(1, 0)),nn.ReLU(),nn.Conv2d(ch_out // 4, ch_out // 4, kernel_size=(1, 3), padding=(0, 1)),nn.ReLU(),nn.Conv2d(ch_out // 4, ch_out, kernel_size=1),)def forward(self, x):return self.block(x)

 backbone的整体架构:

self.backbone = nn.Sequential(nn.Conv2d(in_channels=3, out_channels=64, kernel_size=3, stride=1), # 0nn.BatchNorm2d(num_features=64),nn.ReLU(),  # 2nn.MaxPool3d(kernel_size=(1, 3, 3), stride=(1, 1, 1)),small_basic_block(ch_in=64, ch_out=128),    # *** 4 ***nn.BatchNorm2d(num_features=128),nn.ReLU(),  # 6nn.MaxPool3d(kernel_size=(1, 3, 3), stride=(2, 1, 2)),small_basic_block(ch_in=64, ch_out=256),   # 8nn.BatchNorm2d(num_features=256),nn.ReLU(),  # 10small_basic_block(ch_in=256, ch_out=256),   # *** 11 ***nn.BatchNorm2d(num_features=256),   # 12nn.ReLU(),nn.MaxPool3d(kernel_size=(1, 3, 3), stride=(4, 1, 2)),  # 14nn.Dropout(dropout_rate),nn.Conv2d(in_channels=64, out_channels=256, kernel_size=(1, 4), stride=1),  # 16nn.BatchNorm2d(num_features=256),nn.ReLU(),  # 18nn.Dropout(dropout_rate),nn.Conv2d(in_channels=256, out_channels=class_num, kernel_size=(13, 1), stride=1), # 20nn.BatchNorm2d(num_features=class_num),nn.ReLU(),  # *** 22 ***)

唯一需要注意的是:最后一层conv用的是一个13x1的卷积代替了原先的BiLSTM来结合序列方向(W方向)的上下文信息。全局上下文嵌入,这部分论文是使用一个全连接层提取上下文信息的,只融合了两层,而这里是使用的avg pool层,而且还在4个尺度上进行了融合:

global_context = list()for i, f in enumerate(keep_features):if i in [0, 1]:f = nn.AvgPool2d(kernel_size=5, stride=5)(f)if i in [2]:f = nn.AvgPool2d(kernel_size=(4, 10), stride=(4, 2))(f)f_pow = torch.pow(f, 2)f_mean = torch.mean(f_pow)f = torch.div(f, f_mean)global_context.append(f)x = torch.cat(global_context, 1)

不用再自己从新搭一遍神经网络,比较麻烦, 我这里利用大佬的开源网络模型:GitHub - Fanstuck/LPRNet_Pytorch: Pytorch Implementation For LPRNet, A High Performance And Lightweight License Plate Recognition Framework.

作者:完全适用于中国车牌识别(Chinese License Plate Recognition)及国外车牌识别!
目前仅支持同时识别蓝牌和绿牌即新能源车牌等中国车牌,但可通过扩展训练数据或微调支持其他类型车牌及提高识别准确率!

将该模型集成到我们项目,

那么接下来我们需要对裁剪的数据集进行训练得到模型权重即可。有几点需要注意:

  1. 准备数据集,图像大小必须为94x24。

  2. 若要显示测试结果,请添加“--show true”或“--show 1”以运行命令。

其他都挺好看清楚的,看作者提供的主要参数说明:

  • -max_epoch:如果想要精度更高一点,epoch可以设定更高一点。

  • -dropout_rate:假设 Dropout rate 为 0.5,即隐藏层中 50% 的神经元将在每次训练迭中被随机关闭。防止过拟合,如果图片量过少的情况下需要高一点更好。

  • -learning_rate:要是算力充足可以调小一点更加精确。

  • train_batch_size和test_batch_size的默认就行,如果数据集较小不用太大。

  • resume_epoch重复训练,数据集小的可以,数据量大的没有必要。

训练模型

根据自己的数据集以及硬件条件设置train_LPRNet.py的超参数,这里得注意我们需要利用YOLOv7检测出来的定位信息去裁剪原图像的车牌坐标,裁剪到的图片需要转换为94,24的img_size的图片才能训练。之前我们有过准备数据集,直接使用即可。

数据集足够大,训练时长给的足够多可以达到比较高的精度,我根据自己制作的数据集训练可以达到93.1%的正确率,该模型权重已经上传github大家不用再次训练了直接使用模型即可。

推理

开源的模型权重能够在我分割的数据集上面跑到73.2%准确率,我们可以使用预训练模型在此基础之上训练得到准确度更高的模型,利用上述模型我们可以进行车牌检测看看效果:

测试了20张图片达到50%,测试1000张图片达到92.3%,测试6000张图片达到了93.5%准确率,效果还是可以的。

 


备注

有问题的私信博主或者直接评论就可以了博主会长期维护此开源项目,目前此项目运行需要多部操作比较繁琐,我将不断更新版本优化,下一版本将加入UI以及一键部署环境和添加sh指令一键运行项目代码。下篇文章将详细解读LPRNet模型如何进行OCR识别, 再次希望对大家有帮助不吝点亮star~

https://github.com/Fanstuck/Yolov7-LPRNeticon-default.png?t=N7T8https://github.com/Fanstuck/Yolov7-LPRNet

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/130806.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android开发-Android项目Jenkins自动化打包流程搭建与配置

Android 项目 Jenkins 自动化打包流程搭建与配置 1. 前言2. Jenkins 下载3. 配置电脑的 JDK 环境4. Jenkins 安装和设置5. Jenkins 设置 Android 项目自动打包流程 1. 前言 由于之前公司的 Android 项目需要 APK 自动打包的功能,所以需要搭建 Jenkins 自动化打包的…

【云计算网络安全】僵尸网络详解:工作原理、控制和保护方法

文章目录 一、什么是僵尸网络?二、僵尸网络因为什么原因而诞生?三、僵尸网络主要用途四、僵尸网络如何工作?五、如何控制僵尸网络?5.1 客户端/服务器僵尸网络模型5.1.1 星形网络拓扑5.1.2 多服务器网络拓扑5.1.3 分层网络拓扑 5.2…

3D开发工具HOOPS助力Eleven Dynamics加速开发QA自动化平台

Nexos平台提供强大的可视化功能,并将整体测量时间减少80%。 2021年10月19日,俄勒冈州本德市(Newswire.com)——工程软件开发工具包的领先供应商Tech Soft 3D今天宣布,Eleven Dynamics是一家位于瑞士的初创公司&#x…

知识增强语言模型提示 零样本知识图谱问答10.8

知识增强语言模型提示 零样本知识图谱问答 摘要介绍相关工作方法零样本QA的LM提示知识增强的LM提示与知识问题相关的知识检索 摘要 大型语言模型(LLM)能够执行 零样本closed-book问答任务 ,依靠其在预训练期间存储在参数中的内部知识。然而&…

在SOLIDWORKS搭建一个简易的履带式机器人

文章目录 前言一、构建模型基本单元二、搭建车体模块三.插入轮子4.构建履带 前言 趁着十一假期,在solidworks中搭建了一个履带式机器人小车,计划将其应用在gazebo中完成多机器人编队的仿真。 一、构建模型基本单元 构建底板(a面&#xff09…

Spring5应用之事务处理

作者简介:☕️大家好,我是Aomsir,一个爱折腾的开发者! 个人主页:Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏-CSDN博客 当前专栏:Spring5应用专栏_Aomsir的博客-CSDN博客 文章目录 参考文献前言事务…

arcgis添加天地图山东wtms服务

arcgis添加天地图wtms服务 首先打开天地图山东网站,进入首页![天地图山东首页](https://img-blog.csdnimg.cn/89df69e1c3d645b4a9e9652a08580342.png)然后点击开发资源进入开发页面点击成为开发者,进入申请秘钥页面,申请秘钥;![在…

Spring5应用之整合MyBatis

作者简介:☕️大家好,我是Aomsir,一个爱折腾的开发者! 个人主页:Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏-CSDN博客 当前专栏:Spring5应用专栏_Aomsir的博客-CSDN博客 文章目录 参考文献前言为什…

Python图形界面框架PyQt5使用详解

概要 使用Python开发图形界面的软件其实并不多,相对于GUI界面,可能Web方式的应用更受人欢迎。但对于像我一样对其他编程语言比如C#或WPF并不熟悉的人来说,未必不是一个好的工具。 常见GUI框架 PyQt5:Qt是一个跨平台的 C图形用户界…

sanic框架解决多进程共享缓存问题

最近在用sanic框架做项目,今天需要处理多进程共享缓存问题,在网上搜索了很多,知道使用multiprocessing模块,但是导入后,直接使用会报错,然后看官网解决问题。 直接看官方文档点我哦 大致意思如下&#xf…

02 认识Verilog HDL

02 认识Verilog HDL ‍ 对于Verilog的语言的学习,我认为没必要一开始就从头到尾认真的学习这个语言,把这个语言所有细节都搞清楚也不现实,我们能够看懂当前FPGA的代码的程度就可以了,随着学习FPGA深度的增加,再不断的…

二维材料黑科技——MXene

石墨烯,一种由单层碳原子组成的二维材料被广泛应用且为人熟知,具有优异的电学、力学和光学性能。还有一类二维材料,它们由过渡金属和碳或氮原子组成,叫做MXene。 MXene是材料科学中的一类二维无机化合物。这些材料由几个原子层厚度…