前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >基于YOLOv3的车辆号牌定位算法【文末送书】

基于YOLOv3的车辆号牌定位算法【文末送书】

作者头像
Color Space
发布于 2022-12-22 07:47:07
发布于 2022-12-22 07:47:07
50300
代码可运行
举报
运行总次数:0
代码可运行

注:本文选自中国水利水电出版社出版的《PyTorch深度学习之目标检测》一书,略有改动。经出版社授权刊登于此。

文末有送新书福利!

活动截止时间为12月9日晚19点。

01 OCR原理分析

本文中采用的车辆号牌识别部分的是采用CNN+LSTM+CTC组合而成,整个网络部分可以分为三个部分,首先是主干网络CNN用于提取字符的特征信息,其次采用深层双向LSTM网络在卷积特征的基础上提取文字或字符的序列特征,最终引入CTC结构解决训练时字符无法对齐的问题。详细组合结构如图1所示。

图1 OCR算法结构图

(1)主干网络CNN提取特征。由于该网络只是通过卷积的形式来提取号牌的整个特征信息来做号牌上字符的识别,因此,该算法的输入是整个号牌图像。

(2)LSTM提取序列信息。LSTM作为长短时记忆网络是一种特殊的RNN结构,使用该结构能够避免长期依赖的问题。与循环卷积神经网络(RNN)不同的RNN能保存不同时刻的状态,而LSTM的独特网络结构能够保存四个不同状态的特征,LSTM网络结构单元主要由遗忘门、输入门和输出门三种组合而成,单元结构图如下图2所示。

图2 LSTM网络单元

遗忘门主要是决定从网络中丢弃和保留其中的部分特征,实现过程是通过读取网络输入参数Xt和上一层的输出状态ht-1,并将其通过Sigmoid函数归一化到0-1范围区间中,0表示丢弃的特征,1表示需要保留的特征。遗忘门实现公式如式1所示:

输入门与遗忘门的结构不同,该部分分为两部分结构,一部分与遗忘门类似,另外一部分则是在遗忘门的基础上通过tanh函数将特征映射至-1和1之间,其中-1表示不同更新的部分,1表示需要更新的特征部分,如式2和3所示:

输出门中的sigmoid函数决定哪部分的函数是需要进行输出的,输出部分的特征通过tanh函数,并将其与sigmoid函数的输出进行乘积,最终决定输出部分的特征。实现部分公式如式4和5所示:

(3)CTC结构。CTC结构是解决语音识别中自动对齐的一种方案,CTC网络结构在字符识别上的应用解决了人为切割字符带来的问题,从而提高整个算法的准确率。

02 车牌号数据集制作

本章中该部分采用的数据集,是在第一部分数据集的基础上截取图片中的号牌得到,在配有Python环境的机器上编写Python脚本读取数据集,从已经标注的xml文件解析出号牌所在图片的位置。为了保证切割图片的完整性,同样采取扩大像素值的办法,xml文件中保存的号牌位置,其中左上角位置坐标点分别减少5个像素,右下角位置坐标点分别增加5个像素。与目标检测不同,识别号牌上的文本除了数据图片之外,还需要将图片名称根据号牌上的文本进行修改。如图3为处理后的可训练号牌数据集。

图3 号牌数据集

初步处理后的数据只是得到具体号牌的图片,尚未对图片进行标注处理,因此并不能直接作为数据集来训练OCR算法,该部分主要实现号牌上文本的识别,本章3.2小节中已经通过YOLOv3算法实现全部遮挡号牌、未悬挂号牌和其他类号牌的定位和分类,在目标检测算法基础上选择识别结果中其他类的图片进行进一步处理,除了与图片标注的质量有关之外,图片的数量也直接影响最终的模型是否更好的泛化能力,数据集中的车辆号牌图片除了包括正常号牌之外,还存在半遮挡的号牌。在进行训练之前还要对图片进行处理,实施过程如图4所示。

图4 训练集数据处理流程图

(1)修改图片名称为号牌的文本。与目标检测的标注方式不同,号牌的标注要根据实际图片中的文本修改为图片的名称,并且图片的后缀保持不变,对数据集标注完成之后还要根据实际项目需要的格式修改数据集,按照使用Python脚本程序将图片按照6:1的比例分为训练集和测试集,在项目中新建data目录,并在data文件夹中分别新建train/text和test/text两个路径,其中train/text用来存放处理后的训练集图片,train中存放处理的train.pkl二进制文件,test/text中存放测试集图片,同样,test中存放测试集的test.pkl二进制文件。

(2)生成pkl文件。pkl文件是存储二进制内容的文件格式,训练过程中网络从pkl文件中读取文本信息和对应的图片进行训练。分别将训练集和验证集中的图片名称按照次序依次存入新建的pkl文件中,命名为train.pkl和test.pkl,并把对应的图片名称存储为序号。

03 修改预权重文件

本章中采用在预训练权重的基础上进行训练,使用预训练权重的好处在于,不仅能够保证模型快速收敛,减少训练模型的时间,也能避免从零开始训练导致训练过程中出现梯度爆炸和梯度消失的情况发生。预训练权重是通过Python的第三方模块Collections中的子类OrderedDict模块对数据进行存储,OrderedDict是一种有序字典,能够按照输入的顺序对元素进行存储并保证顺序不发生变化,也因此OrderedDict的使用能够保证权重文件中的参数按照训练网络结构的层次和顺序进行存储,权重文件的存储除了在保证权重文件中数据存储的格式顺序之外,还与训练过程中的设备、存储方式和网络结构相关,因此使用预训练权重需要首先对预训练权重的结构以及其存储训练的方式进行了解。本章中对预训练权重的修改包括分析权重文件,修改权重文件的维度两部分,共同实现修改预训练权重文件的目的。具体的实现方式如图5所示。

图5 修改权重文件实现方式

(1)分析权重结构。预训练权重的存储方式根据其训练方式可以分为CPU训练、单GPU训练和多GPU训练,其中CPU和单GPU的情况下保存的模型结构相同;根据存储的方式可以分为保存模型的网络结构和训练参数到权重文件,只保存训练参数到权重文件两种;根据存储的方式可以分为保存训练过程中训练的批次、训练参数、网络结构的中间结构的权重文件和只保存最终训练参数的权重文件两种方式;根据网络的结构可以通过Python脚本打印出权重文件的网络结构,根据需求可以修改权重中需要修改的网络参数。

(2)修改预训练权重的维度。修改网络中的参数会导致网络发生变化,因此,要修改预训练权重文件来适配当前网络,解决的方法有两种:剔除其中不合适的网络的节点训练参数;修改不适合训练的网络节点,将其节点进行填充。本章采用第二种方式来匹配网络,使用Python读取权重中的节点名称和维度信息,修改权重文件中的第一层的参数维度和最后对应种类数的网络节点参数为修改后的种类数。保存修改后的权重文件为新的权重文件。

04 模型参数设置及训练过程

OCR识别的训练过程之前,要根据自己训练的数据集和硬件配置来设置具体的参数,具体的参数配置如下。

(1)加载数据集的位置 在工程目录cnn+lstm下,打开trian_crnn.py文件,修改类OCRIter中初始化加载函数中图片和pkl文件的相对路径,训练集图片路径为./data/train/text,训练集标签pkl文件./data/train,测试集图片路径./data/test/text,测试集标签pkl文件./data/test,同时设置参数train_flag为True,在工程代码中修改读取的pkl文件名称。数据集的代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if train_flag:
    self.data_path = os.path.join(os.getcwd(), "data", "train", "text")
    self.label_path = os.path.join(os.getcwd(), "data", "train")
else:
    self.data_path = os.path.join(os.getcwd(), "data", "test", "text")
    self.label_path = os.path.join(os.getcwd(), "data", "test")

生成pkl文件的代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def _label_path_from_index(self):
    label_file = os.path.join(self.label_path, "train_pkl")
    assert os.path.exists(label_file, "path dose not exits:{}".format(label_file))
    gt_file = open(label_file, "rb")
    label_file = cPickle.load(gt_file)
    gt_file.close()
    return label_file

注意:在Python代码中以下滑线开始的Python函数表示的是私有函数,其中以单前导下划线_开头的方法或变量,仅允许类内部和子类进行访问,类的实例无法访问此属性和方法。和单前导下划线类似的是双前导下划线__,以此为开头的变量和方法,仅允许类内部进行访问,类实例和派生类均不能进行访问此属性和方法。

(1)修改识别的标签的个数。识别的字符中包含数字、字母和汉字,OCR识别原理上相当于多分类算法,因此,类别上设置包含数字0-1,包含汉字甲-亥和地域简称京、津、晋、冀、蒙、辽、吉、黑、沪、苏、浙、皖、闽、鲁、豫、鄂、湘、粤、桂、琼、川、贵、云、藏、陕、甘、青、宁、渝、赣、新、台、港、澳。具体的修改参数如图6所示。

图6 数据集代码配置

(2)修改num_epoch=6000,BATCH_SIZE=64,配置使用GPU-0训练,contexts = [mx.context.gpu(0)],默认生成并保存权重的路径为工程项目中的model文件夹。

05 阈值分析

实际应用中,污损遮挡号牌的识别不仅和算法的识别率有关,更与所采集的车辆图像质量和实际车牌质量息息相关,车牌质量的好坏直接影响最终的识别性能,例如车牌会受到主观因素上的车辆套牌、车牌遮挡、多车牌等影响,也会受到客观因素上的生锈、字体脱落掉漆、号牌倾斜等影响。除此之外,也会在拍摄过程中受到天气等各种因素影响,这些因素的不同也在不同程度上影响了最终的识别效果。

OCR识别算法是通过识别号牌上的文本来实现正常号牌和半遮挡号牌的分类,因此,OCR算法对每个识别到的字符都会产生一个置信度,且各字符之间相互独立,为了能描述整个识别号牌的置信度,采用识别出各字符的置信度相乘的方式作为号牌的置信度,confi表示第i个字符的置信度,conf表示号牌的整体置信度,实现的公式如式6所示:

从公式中可以看出,识别到的字符中任何一个字符存在过低置信度的字符会直接导致整个号牌的置信度降低,因此,可以选择直接根据整个号牌的置信度设置阈值进行过滤,从而可以达到区分正常号牌和半遮挡号牌的目的,详细的实现过程如图7所示。

图7 阈值分析流程图

(1)准备数据。各准备清晰号牌和模糊或半遮挡的号牌一百张,其中号牌的种类还应该包括各种不同颜色、不同种类的号牌数据。其中正常号牌命名为正常号牌+序号的方式,序号从1-100,半遮挡号牌命名方式为半遮挡号牌+序号,序号同样为1-100,处理后的数据放置文件夹dataset下。

(2)编写代码。处理后的数据通过程序计算不同阈值情况下的准确率,并保存每次修改阈值后计算得出的准确率,最后生成折线图。实现过程中判断号牌的置信度是否大于设置的阈值,高于阈值的号牌并被判断其命名为正常号牌的作为正常号牌,低于阈值并被判断命名方式中含有半遮挡号牌的同样作为正确识别,在这两个条件下计算号牌的准确率。

(3)选择阈值。经过公式3-6可以得出整个号牌的置信度,因此使用号牌的置信度增加过滤的阈值可以达到分类的效果。编写脚本统计在不同阈值情况下验证数据集的准确率,低于设定阈值的号牌作为半遮挡号牌,否则为正常号牌,设定初始值为0.5并以0.02的速度递增,从而测试出在最高准确率的情况下最合适的阈值,从图中可见,阈值大致随准确率呈正比状态,阈值为0.95左右时趋向平稳,达到96%的准确率,因此,选取合适的阈值为0.95,实验部分的涨幅图如图8所示。

图8 阈值图

06 实验结果

配置好模型参数后,启动模型开始进行训练,训练OCR模型主要分为生成中间权重文件以及验证实验结果二个部分。详细过程如下。

(1)生成权重文件。本章中设置每一次epoch生成一次权重文件,权重文件保存到工程项目的model路径下,权重文件的命名中包含epoch值,用来记录迭代的次数,在不发生梯度爆炸的情况下,随着不断地训练,损失值loss值不断减少,学习效果也更好,由于数据量大并且收敛速度较为缓慢,因此在设置保存间隔时可设置为较大的值,本文中设置的间隔为迭代1000次进行一次权重文件的保存。

(2)选择模型。训练过程中loss值越低代表在训练集上拟合效果越好,但并不代表对验证集效果也好,因此,除了要求训练过程中loss值不断减少之外,还要求保存中间产生的权重文件,保证验证集测试其模型既能够学习到足够的特征,也能保持更好的泛化能力。经过验证在epoch为4500时,准确率更高,loss也更低。测试部分图片的输出结果如图9所示。

图9 OCR输出结果

从数据选择用来计算准确率的验证集200张,其中包含正常号牌一百张,半遮挡号牌一百张,其中包括各种情况下的号牌,例如蓝牌、黄牌、新能源等等。验证OCR算法的指标与目标检测的指标相同。

本次实验中使用的阈值为0.95来计算其验证集中的准确率、召回率等等指标,计算指标的数据分为两部分,一部分采用正常号牌,另外一部分为半遮挡号牌,分别计算其准确率(accuracy)、召回率(recall)、精确率(precision)和F1score三部分,从下表中可以得出,在准确率上识别正常号牌的准确率高达94.90%,远高于半遮挡号牌的准确率,但半遮挡号牌的精确率在召回率为91.61%的基础上可以达到100%的识别,从最后计算的F1score上来看,半遮挡号牌的识别效果要好于正常号牌。计算后的结果如表1所示。

测试平台的不同也会影响其运行效率,为了减少其他因素造成的影响,使对比效果更加具有可信度,本次采用的操作系统均为Ubuntu 16.04。其中GPU测试平台为NVIDIA GeForce GTX 1080 Ti显卡,使用的Cuda版本为10.0,并在测试的GPU平台上安装Cudnn加速库,CPU平台为AMD 3550H处理器。为了实现不同平台上的速度测试,分别在不同的平台上搭建环境,运行代码的测试除了根据硬件设施需要对环境进行安装之外还需要对代码进行重新编译。测试后的运行速率如表2所示。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-12-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 OpenCV与AI深度学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
区块链DApp的开发技术方案
DApp(去中心化应用)的开发技术方案是一个多层级、涉及区块链、智能合约、前端和去中心化存储的综合架构。下面将详细阐述其关键技术组件和最佳实践。
数字孪生开发者
2025/05/21
900
区块链DApp的开发技术方案
go-ethereum v1.15.10发布!解决死锁BUG,主网同步Electra与Pectra分叉,性能再升级!
以太坊官方客户端go-ethereum(Geth)迎来了重要版本更新——v1.15.10!本次更新重点修复了日志索引器的死锁问题,并完成了主网灯塔链轻客户端对Electra分叉的配置,补上了上一个版本遗留的关键环节。同时,它也为即将到来的Pectra分叉做好完备准备。除此之外,随着默认区块燃气上限提升至3600万,本次版本在性能和稳定性方面实现了多重提升。
福大大架构师每日一题
2025/04/30
760
go-ethereum v1.15.10发布!解决死锁BUG,主网同步Electra与Pectra分叉,性能再升级!
geth v1.15.9重磅发布!Prague主网升级倒计时,5月7日这些EIP将改变以太坊
以太坊核心客户端Geth迎来v1.15.9版本更新!本次升级不仅为即将到来的Prague硬分叉铺平道路,还包含多项性能优化和关键修复。Prague分叉已确定于北京时间2025年5月7日18:05:11(区块时间戳1746612311)启动,10项重要EIP将正式生效。本文将为你深度解析更新内容,助你提前做好准备!
福大大架构师每日一题
2025/04/23
1430
geth v1.15.9重磅发布!Prague主网升级倒计时,5月7日这些EIP将改变以太坊
go-ethereum v1.15.8紧急更新!存档节点安全升级,开发者必看十大亮点解析​
Go-Ethereum v1.15.8 是继v1.15.7后的又一关键补丁版本,聚焦数据库安全、交易池优化与网络稳定性三大方向,为开发者与节点运营者提供更可靠的运行环境!
福大大架构师每日一题
2025/04/13
680
go-ethereum v1.15.8紧急更新!存档节点安全升级,开发者必看十大亮点解析​
geth v1.15.7重磅发布:修复关键漏洞,存档节点安全再升级!
以太坊核心开发团队近日发布了go-ethereum (Geth) v1.15.7版本,这是一个以紧急修复和性能优化为主的更新。本次更新重点解决了存档节点数据库可能崩溃的严重问题,同时优化了交易池逻辑和内存管理,为开发者和节点运营者提供了更稳定的运行环境。
福大大架构师每日一题
2025/04/02
1420
geth v1.15.7重磅发布:修复关键漏洞,存档节点安全再升级!
​【刘文彬】以太坊RPC机制与API实例
原文链接:醒者呆的博客园,https://www.cnblogs.com/Evsward/p/eth-rpc.html
圆方圆学院
2018/12/24
1.9K0
把700元的单片机改造成以太坊节点, 9步get起新技能!
智能合约,是指完全按照编程方式运行的应用程序,它排除了任何停机、审查、欺诈或第三方干扰的可能性。
区块链大本营
2019/12/03
1.3K0
以太坊介绍和使用
以太坊是一个能够在区块链上实现智能合约、开源的底层系统。换言之,以太坊是可编程的区块链,它并不是给用户一系列预先设定好的操作(例如比特币交易),而是允许用户按照自己的意愿创建复杂的操作。这样一来,以太坊是就可以作为多种类型去中心化区块链应用的平台,这些应用比如包括之前很火的各种代币但并不仅限于此,我们可以做很多除了代币之外的东西,比如你可以输出一行代表自己不是外行身份的hello world,或者在上面做一个简单的计算器,总之你可以在上面实现你想要的任何功能。
fnatic
2022/07/15
37.4K0
第三课 以太坊术语说明及开发者资源列表
也称钱包,提供账户管理、挖矿、转账、智能合约的部署和执行等等功能,以太坊节点利用以太坊客户端接入到以太坊网络。 现在以太坊客户端主要有:Wallent/ist , Geth, Parity, Harmony,
辉哥
2018/08/10
7900
第三课 以太坊术语说明及开发者资源列表
以太坊数据存证性能与膨胀率测试
我们基于区块链在企业中的应用最广泛的就是“存证”功能需求,这是利用了区块链不可篡改和数据共享的特点,存证的业务数据一方面可以保证留痕和追溯,另一方面也实现了多个节点(如果部署在不同企业和部门)之间的数据共享。如果要实现存证,我们最关心并不是图灵完备,也不是去中心化,而是 存证的性能(也就是TPS)和数据膨胀率(也就是存1M的业务数据,单个节点要消耗多少M的磁盘空间)。
深蓝studyzy
2023/09/15
3140
以太坊数据存证性能与膨胀率测试
Bitcoin Core v29.0震撼发布!全新功能优化、性能提升与安全升级全方位解析
大家期待已久的 Bitcoin Core v29.0 现已正式发布!此次新版不仅带来了全新的功能改进和重要的性能优化,还修复了多项关键漏洞,提升了整体的安全性和使用体验。无论你是比特币节点运营者,还是区块链爱好者,升级 Bitcoin Core 到 v29.0 都将为你带来更稳定高效的网络环境。下面,我们为大家详细解读本次升级的亮点内容。
福大大架构师每日一题
2025/04/21
1050
Bitcoin Core v29.0震撼发布!全新功能优化、性能提升与安全升级全方位解析
部署自己的 Ethereum 浏览器
Blockscout 允许用户搜索交易、查看账户和余额、验证和与智能合约互动,并查看和与以太坊网络上的应用程序进行交互,包括许多分叉、侧链、L2 和测试网。
孟斯特
2024/11/06
3754
部署自己的 Ethereum 浏览器
以太坊客户端Geth命令用法-参数详解
Geth在以太坊智能合约开发中最常用的工具(必备开发工具),一个多用途的命令行工具。 熟悉Geth可以让我们有更好的效率,大家可收藏起来作为Geth命令用法手册。 本文主要是对geth help的翻译,基于最新的geth 1.7.3-stable版本。 如果你还不知道geth是什么,请先阅读入门篇:以太坊是什么。 以下开始正文。 命令用法 geth [选项] 命令 [命令选项] [参数…] 版本: 1.7.3-stable 命令: account 管理账户 attach 启动交互式JavaSc
Tiny熊
2018/06/21
2.4K0
搭建以太坊智能合约测试环境
早就想学习区块链相关技术了,可惜因为懒惰一直没有付诸实践,最近随着诸如 God.Game,Fomo3D 等区块链游戏接连暴出安全漏洞,让我对智能合约的兴趣愈发强烈起来,于是利用周末搭建以太坊智能合约测试环境,原想应该很简单,实际却花了不少精力,记录一下以飨读者。
LA0WAN9
2021/12/14
9190
搭建以太坊智能合约测试环境
Geth GraphQL使用说明
Geth V1.9.x增加了GraphQL的支持,开发者可以在经典的JSON RPC API和GraphQL API之间根据自己的去中心化应用具体需求进行选择。本文将介绍Geth 1.9新增GraphQL API的原因,并介绍其使用方法。
用户1408045
2019/10/10
1.8K0
Geth GraphQL使用说明
Solidity、Geth、EVM 三者之间的关系
在以太坊开发生态系统中,Solidity 版本、Geth 版本 和 EVM(Ethereum Virtual Machine)版本 之间有密切的关系。理解它们的关系对于智能合约开发、部署和执行至关重要。以下是对这些版本关系的详细介绍:
孟斯特
2024/10/12
2720
Solidity、Geth、EVM 三者之间的关系
金钱难寐,大盗独行——以太坊 JSON-RPC 接口多种盗币手法大揭秘
2010年,Laszlo 使用 10000 个比特币购买了两张价值25美元的披萨被认为是比特币在现实世界中的第一笔交易。
Seebug漏洞平台
2018/08/16
1.3K0
金钱难寐,大盗独行——以太坊 JSON-RPC 接口多种盗币手法大揭秘
以太坊私有链搭建_以太坊节点减少
下载地址:https://geth.ethereum.org/downloads/,下载之后是个 .exe文件,然后安装就好了,安装之后把geth的安装目录加入到系统环境变量的path里。验证是否安装成功,打开cmd窗口,输入 geth version 如果出来下面的内容,表示安装好了。(如果不加任何任何参数直接运行 geth ,会自动连接到以太坊公网,此时会开始同步区块)
全栈程序员站长
2022/11/09
1.5K0
探索查看以太坊交易池的方法
以太坊主网的内存池(称为交易池或 txpool)是动态内存中的区域,在那有待处理的交易驻留在其中,之后它们会被静态地包含在一个块中。
Tiny熊
2022/11/07
2.1K0
探索查看以太坊交易池的方法
搭建以太坊私有链
区块链技术正在逐渐走向成熟,以太坊作为区块链领域的重要代表被广泛应用于智能合约、去中心化应用等领域,然而公有链上的交易需要消耗大量的手续费,且数据的公开性也限制了其在某些场景下的应用。因此搭建以太坊私有链成为了一种更加灵活、高效、安全的解决方案,本文将介绍如何搭建以太坊私有链帮助读者更好地理解和应用区块链技术
Al1ex
2023/09/07
1.6K1
搭建以太坊私有链
推荐阅读
相关推荐
区块链DApp的开发技术方案
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验