基于CNN的车牌识别网络

前期准备

这篇博客记录神经网络方法与应用的实验项目,项目开源链接:【免费】神经网络课程设计项目.zip资源-CSDN下载

数据集

数据集是我本人在百度飞桨网站上找到的,这个数据集整理的很全面详细,数据集信息包含10w张训练照片,1w张测试照片,并且分别使用train.txt和test.txt两个文本文件记录下每张图片的真实车牌号码,同时图片的命名也采取编号+车牌号的命名方法,图片信息统一为130*32像素值大小,且包含不同光照条件下、拍摄角度、以及各种不同车牌颜色,很好的涵盖了目前大陆的车牌组成,因此比较适合。

我使用标准且合理的机器学习数据划分方法,把10w张图片中9w用于训练模型,实际更新参数,剩下1w张图片用于验证这一训练轮次模型的识别准确率。另外1w张图片额外编写脚本文件和GUI项目单独验证保存的最佳模型效果如何。

数据集地址:车牌数据_数据集-飞桨AI Studio星河社区

训练设备与环境配置

# check_env_versions.py import sys import subprocess import platform def get_python_info(): """获取Python信息""" print(f"Python: {sys.version.split()[0]}") print(f"Platform: {platform.platform()}") print(f"Architecture: {platform.machine()}") print() def get_package_version(package_name): """获取包版本信息""" try: # 特殊处理一些包 if package_name.lower() == 'pillow': import PIL return PIL.__version__ elif package_name.lower() == 'torch': import torch return torch.__version__ elif package_name.lower() == 'torchvision': import torchvision return torchvision.__version__ else: module = __import__(package_name.lower()) return getattr(module, '__version__', 'unknown') except ImportError: # 尝试通过pip获取 try: result = subprocess.run( [sys.executable, '-m', 'pip', 'show', package_name], capture_output=True, text=True, encoding='utf-8' ) if result.returncode == 0: for line in result.stdout.split('\n'): if line.startswith('Version:'): return line.split(':')[1].strip() return 'not installed' except: return 'not installed' def check_gpu_info(): """检查GPU信息""" try: import torch print("CUDA available:", torch.cuda.is_available()) if torch.cuda.is_available(): print(f"CUDA version: {torch.version.cuda}") print(f"GPU count: {torch.cuda.device_count()}") for i in range(torch.cuda.device_count()): print(f" GPU {i}: {torch.cuda.get_device_name(i)}") print() except ImportError: print("torch not installed, cannot check GPU") print() def main(): """主函数""" print("=" * 50) print("环境版本检查") print("=" * 50) # Python信息 get_python_info() # 检查的包列表 packages = [ 'torch', 'torchvision', 'Pillow', 'numpy', 'pandas', 'opencv-python' # 虽然代码没导入,但常用来处理图像 ] # 获取每个包的版本 print("Package versions:") print("-" * 30) for pkg in packages: version = get_package_version(pkg) print(f"{pkg:20} : {version}") print() # GPU信息 print("GPU/CUDA info:") print("-" * 30) check_gpu_info() # 标准库版本(部分) print("Other info:") print("-" * 30) print(f"PIL (Pillow) installed: {'Yes' if 'Pillow' in packages else 'No'}") # 检查代码中导入的标准库 standard_libs = ['json', 'csv', 'os', 're', 'warnings', 'time', 'datetime', 'pickle', 'string'] print(f"Required stdlibs: all available ✓") if __name__ == "__main__": try: main() except Exception as e: print(f"Error: {e}")
================================================== 环境版本检查 ================================================== Python: 3.9.7 Platform: Windows-10-10.0.17763-SP0 Architecture: AMD64 Package versions: ------------------------------ torch : 2.7.1+cu118 torchvision : 0.22.1+cu118 Pillow : 8.4.0 numpy : 1.21.5 pandas : 1.3.4 opencv-python : 4.5.5.64 GPU/CUDA info: ------------------------------ CUDA available: True CUDA version: 11.8 GPU count: 2 GPU 0: NVIDIA RTX A6000 GPU 1: NVIDIA RTX A6000 Other info: ------------------------------ PIL (Pillow) installed: Yes Required stdlibs: all available ✓ 进程已结束,退出代码0

网络结构

我参考Le-Net设计结构简单搭建了一个CNN网络,主要实现了三层卷积,卷积核大小都是3x3,区别在于通道数不一样,添加了一个自适应池化层,两个全连接层(准确来说应该是八个),最后输出字符。因为大陆车牌统一编码规则为7位,我使用的端到端识别方案,没有做视觉识别裁剪分割,而是直接输入图片输出字符串,这很大一部分原因是训练集图片都为固定大小且以车牌为中心,换做其他的数据集肯定就不行了。

对于全连接层,最后一个全连接层实际上是七对256->67的输出,在这之前每个字符共享网络参数,但是这一层每个字符之间的网络的权重并不一致,所以属于独立参数,或许有助于提升准确性。这个网络的设计实际上硬生生把一个字符串识别任务变成了7个单字符分类任务。

流程图(作者第一次用Visio,有点没对齐)

日志

为什么我看的大部分神经网络的项目,都没有花时间提一嘴日志的事情。本人小白一开始写代码根本就不知道要写日志保存训练过程,结果一个小时训练完了除了一个模型文件啥也没有,连正确率曲线都画不出来,只好重新改代码让它生成日志文件json格式,当然也有读者友好的txt总结文件。

在日志里面可以看到整个网络的训练过程,每个epoch的batch结果,非常详细。文档还保存了每轮epoch输出的模型文件,方便之后在已有模型上继续训练。


实验结果图

这么一看感觉还行,第一次折腾神经网络就有这种效果,86%的准确率真不赖。训练准确率曲线明显低于验证准确率曲线,大概率是因为训练的时候我对数据又进行了一些处理(调了调亮度啥的),但是验证的时候是没有对数据处理的(相对来说比较干净),所以验证准确率会大于训练准确率。

我的学习率采用了OneCycleLR调度器,简单来说就是前面增长的很快,方便收敛,后面慢慢减小方便微调模型参数。

后面两位的准确率明显低于前面五位,很大原因和训练集有关系。有的训练集照片拍摄角度太刁钻,车牌都没拍全,导致后两位准确率偏低。

GUI验证

让AI写了个界面从test文件夹里面“随机”挑了几张看效果(我真没造假),还是很不错的。

结果显示,第一张车牌和第三张车牌都正确预测,第二张最后一位预测错误。且第一张置信度低于第二张,第三张置信度最高。我分析认为最可能的原因是,红底车牌在训练集内并不多见,所以网络学到的关于这类车牌信息较少,置信度较低。浅蓝底和深蓝底车牌较多,但第二张车牌末尾严重丢失,所以模型把最后一位认成Q,而不是0,属于正常现象,且有力证明了为什么之前关于字符预测准确率最后两位会显著低于前几位,就是因为训练集图片末尾残缺导致。第三张车牌置信度为1,是因为照片为车牌正对视角,且无模糊,车牌主体占据照片中心,属于某种意义上的最佳训练图,因此置信度毫无疑问最高。

写在最后

这是我学习神经网络自己跑的第一个例子,虽然学术性没那么强,但是至少是让我体会了一下关于数据集、网络设计、训练过程、结果验证方方面面的流程,对我本人以后相关的学习也有很大帮助。这个项目是我在AI的辅助下完成的,所以代码部分没有参考任何现有论文,只是网络结构上参考了一下Le-Net,因为我觉得本地训练的话10w张图片应该需要的参数量和Le-Net相当,考虑到车牌识别实际上是字符串识别任务,或者说是7个字符的独立分类任务,复杂度明显高于手写数字体识别,因此准确率远不及LeNet-5也是在我的预料范围内。

后续如果有糕手打算改进这个项目的话,我的建议是可以利用车牌的构造特征简化参数,这样有可能会性能更好。比如车牌首位一定是汉字,后六位字母不含I与O,所以网络结构可以继续优化。同时,当我们确定了汉字之后,第二位字母是由固定范围的,以湖南为例,湘A是长沙,湘B是株洲,但是没有湘P、湘Q、湘Z等等车牌,这也是利用先验知识优化网络设计。同时,端到端的输入,很受训练集的影响,后续如果想要拓展成实际项目的话,应该考虑训练如果在图片之框出车牌位置,固定像素大小裁取再输入到模型中,应该会有不错的效果,这样可以搭配摄像头和传感器使用。

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

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

相关文章

Spring Boot 钩子全集实战(五):ApplicationContextInitializer详解

Spring Boot 钩子全集实战(五):ApplicationContextInitializer 详解 在上一篇中,我们深入剖析了 SpringApplicationRunListener.environmentPrepared() 这一关键扩展点,实现了环境合法性校验、启动上下文传递、多环境…

【Git核心操作实战】从初始化到冲突解决与回滚(附完整演示)

文章目录目录引言环境准备一、仓库初始化与首次提交1.1 初始化 Git 仓库1.2 创建 .gitignore 文件1.3 首次提交技术解析二、分支创建与多轮小步提交2.1 切出 feature 分支2.2 2-3 次小步提交第一次提交:新增功能基础文件第二次提交:实现核心逻辑第三次提…

Teams Webhook 传递长文本的技巧与示例

引言 在团队协作工具中,Microsoft Teams和Slack是两个非常流行的选择。它们都支持通过Webhook发送消息,但有时你会发现Teams在处理长文本消息时会遇到一些限制。本文将详细介绍如何使用Teams Webhook传递多行文本,并确保URL链接可以点击,内容完整显示,就像用户直接输入一…

Apache Paimon多模态数据湖实践:从结构化到非结构化的技术演进

在近期的 Streaming Lakehouse Meetup Online EP.2|Paimon StarRocks 共话实时湖仓 直播中,Apache Paimon PMC 成员/阿里云数据湖资深工程师叶俊豪带来了关于 Paimon 多模态数据湖的深度技术分享。随着大模型训练对数据规模与多样性的要求不断提升&…

利用多进程提升图表模拟程序的性能

引言 在实时数据处理和图表模拟的领域,程序的响应速度和效率至关重要。特别是当我们处理大量数据并需要实时更新图表时,如何高效地利用系统资源就成为了一个关键问题。今天我们来探讨如何通过多进程来优化一个图表模拟程序的性能。 问题描述 我们有一款图表模拟程序,用于…

基于Java+SpringBoot+SSM儿童医院挂号管理系统(源码+LW+调试文档+讲解等)/儿童医院预约系统/儿童医院就诊管理系统/医院挂号管理系统/儿童医院挂号平台/儿童医院在线挂号

博主介绍 💗博主介绍:✌全栈领域优质创作者,专注于Java、小程序、Python技术领域和计算机毕业项目实战✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 2025-2026年最新1000个热门Java毕业设计选题…

网上租赁系统信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】

摘要 随着互联网技术的快速发展,传统租赁行业正逐步向数字化转型。网上租赁系统作为一种高效、便捷的商业模式,能够有效解决传统租赁过程中信息不对称、管理效率低下等问题。该系统通过整合线上资源,为用户提供租赁物品的浏览、下单、支付及管…

总结了 12 个嵌入式项目

前两天有一个读者问我,如果要做嵌入式项目,哪些项目会比较合适,这里总结了 12 个比较有代表性的项目,使用的cpu 也是主流的,推荐给大家,希望对大家学习有所帮助。1. Avem:轻量级无人机飞控项目项…

使用aop切面springmvc后抛出异常一直捕捉不到异常(抛出异常UndeclaredThrowableException类)

WebLogControllerAop这是一个切面处理类,使用的Around处理切面,有异常必须抛出,不然全局异常捕捉不到的 package cn.geg.lifecycle.config;import cn.geg.lifecycle.util.WebLogUtils; import cn.hutool.core.collection.CollUtil; import cn…

在Azure中实现跨订阅的AMPLS自动链接策略

在Azure环境中,管理和自动化资源链接是提升运维效率和确保安全性的关键。特别是在处理不同订阅的资源时,如何高效地实现跨订阅的自动链接是一个常见的挑战。本文将通过一个实际的案例,详细介绍如何利用Azure Policy实现Application Insights与AMPLS(Azure Monitor Private …

Java Web Web足球青训俱乐部管理后台系统系统源码-SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0【含文档】

摘要 足球青训俱乐部管理后台系统的开发旨在解决传统足球青训俱乐部在管理学员信息、课程安排、教练分配等方面效率低下的问题。随着足球运动的普及和青训体系的完善,俱乐部需要一套高效、智能化的管理系统来优化运营流程。传统的人工记录和Excel表格管理方式容易导…

Flask应用中的实例路径问题探讨

引言 在Flask应用程序开发中,实例路径(instance path)是一个经常被忽视但又非常关键的概念。特别是在部署和管理数据库时,如果不正确处理实例路径,可能会导致一系列难以诊断的问题。本文将通过一个真实的案例,详细探讨Flask实例路径的设置和其在生产环境中的影响。 实例…

上班是一场冷静的交易

将上班视作一场冷静的交易,这并非 cynicism,而是一种珍贵的清醒。它像一副坚固的甲胄,保护我们在职业的疆场上不被无谓的情绪流矢所伤,不被暧昧的期望绑架。我们付出标定好的时间、技能与专注,换取等值的报酬、经验与履…

【2025最新】基于SpringBoot+Vue的师生健康信息管理系统管理系统源码+MyBatis+MySQL

摘要 在当今信息化时代,校园健康管理已成为教育机构重点关注的方向之一。传统的师生健康信息管理多依赖纸质记录或分散的电子表格,存在数据冗余、更新滞后、查询效率低下等问题。随着互联网技术的快速发展,构建一个高效、安全、便捷的师生健康…

实时语音识别回声消除技巧

💓 博客主页:借口的CSDN主页 ⏩ 文章专栏:《热点资讯》 实时语音识别回声消除的实战技巧:突破传统局限目录实时语音识别回声消除的实战技巧:突破传统局限 引言:回声消除——语音识别的隐形守护者 现在时&am…

《斯图尔特微积分(下册)》什么时候出?带答案吗???

《斯图尔特微积分》上册中文版9月出版后,读者评价“讲解语言生动,带入生活实际,能够了解数学公式或定理在其他学科的应用。”“良好的阅读体验,美观的版面和由浅入深的内容。”评论和后台常有人私信下册什么时候出?答案…

解决Unity中按钮点击索引问题

在使用Unity开发游戏或应用时,经常会遇到需要为多个按钮动态添加点击事件并传递索引参数的情况。然而,这种操作在C#中可能会导致一些意想不到的问题。本文将通过一个实际例子,解释这些问题及其解决方案。 问题描述 假设我们有一个ScrollView组件,其内容包含多个Button对象…

python开发中虚拟环境配置

在Python开发中,虚拟环境是项目隔离的最佳实践。以下是详细的使用指南: 1. 为什么需要虚拟环境? 依赖隔离:不同项目可以使用不同版本的包避免冲突:防止系统Python环境被污染便于部署:可以精确导出项目依赖团…

【毕业设计】SpringBoot+Vue+MySQL 社区医院信息平台平台源码+数据库+论文+部署文档

摘要 随着信息技术的快速发展,传统社区医院管理模式逐渐暴露出效率低下、信息孤岛等问题。社区医院作为基层医疗服务的重要载体,亟需通过信息化手段优化业务流程,提升服务质量。当前,社区医院在患者档案管理、药品库存监控、预约挂…

Day32 >> 56、合并区间 + 738、单调递增的数字

代码随想录-贪心算法Part5 56、合并区间 class Solution {public int[][] merge(int[][] intervals) {List<int[]> result new LinkedList<>();Arrays.sort(intervals, (x, y) -> Integer.compare(x[0], y[0]));int start intervals[0][0];int end interva…