竞赛选题 python 机器视觉 车牌识别 - opencv 深度学习 机器学习

news2024/11/17 11:31:19

1 前言

🔥 优质竞赛项目系列,今天要分享的是

🚩 基于python 机器视觉 的车牌识别系统

🥇学长这里给一个题目综合评分(每项满分5分)

  • 难度系数:3分
  • 工作量:3分
  • 创新点:3分

🧿 更多资料, 项目分享:

https://gitee.com/dancheng-senior/postgraduate

1 课题背景

车牌识别其实是个经典的机器视觉任务了,通过图像处理技术检测、定位、识别车牌上的字符,实现计算机对车牌的智能管理功能。如今在小区停车场、高速公路出入口、监控场所、自动收费站等地都有车牌识别系统的存在,车牌识别的研究也已逐步成熟。尽管该技术随处可见了,但其实在精度和识别速度上还需要进一步提升,自己动手实现一个车牌识别系统有利于学习和理解图像处理的先进技术。

本文详细介绍基于深度学习的中文车牌识别与管理系统,在介绍算法原理的同时,给出Python的实现代码以及PyQt的简单UI界面。在界面中可以选择需要识别的车牌视频、图片文件等。

2 效果演示

首先还是用动图先展示一下效果,系统主要实现的功能是对图片、视频中的车牌进行检测和识别,演示效果如下。

2.1 图片检测识别

在这里插入图片描述

2.2视频检测识别

在这里插入图片描述

3 车牌检测与识别

目前,智能交通系统中集成运用计算机视觉、物联网、人工智能等多种技术成为未来发展方向。其中,车牌识别(License Plate Recognition,
LPR)技术作为一项重要技术,从获取的图像中提取目标车辆的车牌信息,成为完善智能交通管理运行的基础。

由于本文介绍的是中文车牌,所以可以简单了解一下国内汽车拍照的特点:字符数为七个,包括汉字、字母和数字。车牌颜色组合中,其中最常见的组合为普通小型汽车蓝底白字和新能源汽车的渐变绿底黑字。

在这里插入图片描述

总结来说,车牌是一个有特点的图像区域,几种特征可以综合起来确定车牌定位,所以之前就有利用车牌与周围环境的差异的算法。目前常见的车牌定位算法有以下 4
种:基于颜色、纹理、边缘信息的车牌定位算法和基于人工神经网络的车牌定位算法。

如下图所示,常规的步骤包括图像采集、预处理、车牌定位、字符分割、字符识别、输出结果。深度学习技术成熟之后,端到端的网络模型使得这一过程变得简单起来。从思想上来说,基于深度学习的车牌识别实现思路主要包括两个部分:(1)车牌检测定位;(2)车牌字符识别。

在这里插入图片描述

其中,车牌的检测定位本质是一个特定的目标检测任务,即通过算法框选出属于车牌的位置坐标,以便将其与背景区分开来。可以认为检测出的车牌位置才是我们的感兴趣区域。好用的方法如Cascade
LBP,它是一种机器学习的方法,可以利用OpenCV训练级联分类器,依赖CPU进行计算,级联分类器的方法对于常用场景效果比较好,检测速度较快,曾经一度比较流行,但准确率一般。基于深度学习的检测算法有Mobilene-
SSD、YOLO-v5等,利用大批量的标注数据进行训练.

当ROI被检测出来,如何对这一区域中的字符进行识别,这就涉及到采取的处理方式。第一种处理方式,首先利用一系列字符分割的算法将车牌中的字符逐个分开,然后基于深度学习进行字符分类,得到识别结果;第二种,区别于第一种先分割再分类的两步走方式,利用端到端的CTC(
Connectionist Temporal Classification)网络直接进行识别。

这里我们使用网上开源的HyperLPR中文车牌识别框架,首先导入OpenCV和hyperlpr,读取一张车牌图片调用架构中的车牌识别方法获得结果,以下代码来自官方的示例:

    #导入包
    from hyperlpr import *
    #导入OpenCV库
    import cv2
    #读入图片
    image = cv2.imread("demo.jpg")
    #识别结果
    print(HyperLPR_plate_recognition(image))

以上代码运行结果如下,可以看出该方法识别了车牌的车牌字符、置信度值、车牌位置坐标、图片尺寸等结果。

在这里插入图片描述

这样的结果还不够直观,我们写一个函数将车牌的识别结果标注在图片上,首先导入相关依赖包,其代码如下:

    # 导入包
    from hyperlpr import *
    # 导入OpenCV库
    import cv2 as cv
    from PIL import Image, ImageDraw, ImageFont
    import numpy as np

新建一个函数drawRectBox,将图像数据、识别结果、字体等参数传入,函数内部利用OpenCV和PIL库添加标注框和识别结果的字符,其代码如下:

    def drawRectBox(image, rect, addText, fontC):
        cv.rectangle(image, (int(round(rect[0])), int(round(rect[1]))),
                     (int(round(rect[2]) + 8), int(round(rect[3]) + 8)),
                     (0, 0, 255), 2)
        cv.rectangle(image, (int(rect[0] - 1), int(rect[1]) - 16), (int(rect[0] + 75), int(rect[1])), (0, 0, 255), -1, cv.LINE_AA)
        img = Image.fromarray(image)
        draw = ImageDraw.Draw(img)
        draw.text((int(rect[0] + 1), int(rect[1] - 16)), addText, (255, 255, 255), font=fontC)
        imagex = np.array(img)
        return imagex

我们首先读取图片文件,利用前面的HyperLPR_plate_recognition方法识别出车牌结果,调用以上函数获得带标注框的图片,利用OpenCV的imshow方法显示结果图片,其代码如下:

    image = cv.imread('test3.jpeg')  # 读取选择的图片
    res_all = HyperLPR_plate_recognition(image)
    fontC = ImageFont.truetype("./platech.ttf", 14, 0)
    res, confi, axes = res_all[0]
    image = drawRectBox(image, axes, res, fontC)
    cv.imshow('Stream', image)
    c = cv.waitKey(0) & 0xff

此时运行以上代码可以得到如下结果:

在这里插入图片描述

同理,识别视频中的车牌也可以做类似的操作,不过我们需要先对视频文件进行逐帧读取,然后采用以上的方式在图片中标识出车牌并显示。

这部分代码如下:

    
capture = cv.VideoCapture("./车牌检测.mp4")  # 读取视频文件
fontC = ImageFont.truetype("./platech.ttf", 14, 0)  # 字体,用于标注图片
​    

i = 1
while (True):
    ref, frame = capture.read()
    if ref:
        i = i + 1
        if i % 5 == 0:
            i = 0
            res_all = HyperLPR_plate_recognition(frame)  # 识别车牌
            if len(res_all) > 0:
                res, confi, axes = res_all[0]  # 获取结果
                frame = drawRectBox(frame, axes, res, fontC)
            cv.imshow("num", frame)  # 显示画面if cv.waitKey(1) & 0xFF == ord('q'):break  # 退出else:break

以上代码每5帧识别一次视频中的车牌,将车牌的结果标注在画面中进行实时显示,运行结果的截图如下所示:
在这里插入图片描述

车牌的识别部分代码演示完毕,对此我们完成了图片和视频的识别,然而这些还是简单的脚本呈现。为了方便更换图片、视频以及管理车牌,还需要设计文件选择功能以及系统的UI界面。这部分代码如下:

    class Ui_MainWindow(object):
        def setupUi(self, MainWindow):
            MainWindow.setObjectName("MainWindow")
            MainWindow.resize(800, 600)
            self.centralwidget = QtWidgets.QWidget(MainWindow)
            self.centralwidget.setObjectName("centralwidget")
            self.openimage = QtWidgets.QPushButton(self.centralwidget)
            self.openimage.setGeometry(QtCore.QRect(20, 40, 91, 51))
            self.openimage.setObjectName("openimage")
            self.showlabel = QtWidgets.QLabel(self.centralwidget)
            self.showlabel.setGeometry(QtCore.QRect(110, 10, 471, 441))
            self.showlabel.setObjectName("showlabel")
            self.LPRdetect = QtWidgets.QPushButton(self.centralwidget)
            self.LPRdetect.setGeometry(QtCore.QRect(20, 150, 81, 51))
            self.LPRdetect.setObjectName("LPRdetect")
            self.LPR_Rec = QtWidgets.QPushButton(self.centralwidget)
            self.LPR_Rec.setGeometry(QtCore.QRect(20, 292, 75, 31))
            self.LPR_Rec.setObjectName("LPR_Rec")
            self.lineEdit_result = QtWidgets.QLineEdit(self.centralwidget)
            self.lineEdit_result.setGeometry(QtCore.QRect(20, 400, 101, 41))
            self.lineEdit_result.setObjectName("lineEdit_result")
            self.openvideo = QtWidgets.QPushButton(self.centralwidget)
            self.openvideo.setGeometry(QtCore.QRect(20, 360, 75, 23))
            self.openvideo.setObjectName("openvideo")
            MainWindow.setCentralWidget(self.centralwidget)
            self.menubar = QtWidgets.QMenuBar(MainWindow)
            self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 23))
            self.menubar.setObjectName("menubar")
            MainWindow.setMenuBar(self.menubar)
            self.statusbar = QtWidgets.QStatusBar(MainWindow)
            self.statusbar.setObjectName("statusbar")
            MainWindow.setStatusBar(self.statusbar)
            self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.openimage.setText(_translate("MainWindow", "打开图片"))
        self.showlabel.setText(_translate("MainWindow", "TextLabel"))
        self.LPRdetect.setText(_translate("MainWindow", "车牌检测"))
        self.LPR_Rec.setText(_translate("MainWindow", "车牌识别"))
        self.openvideo.setText(_translate("MainWindow", "PushButton"))

4 HyperLPR库

4.1 简介

HyperLPR是一个使用深度学习针对对中文车牌识别的实现,与较为流行的开源的EasyPR相比,它的检测速度和鲁棒性和多场景的适应性都要好于目前开源的EasyPR,HyperLPR可以识别多种中文车牌包括白牌,新能源车牌,使馆车牌,教练车牌,武警车牌等。

4.2 特点

  • 基于端到端sequence模型,无需进行字符分割,识别速度更快。
  • 速度快 720p ,单核 Intel 2.2G CPU (macbook Pro 2015)平均识别时间<=90ms
  • 识别率高,仅仅针对车牌ROI在EasyPR数据集上,0-error达到 95.2%, 1-error识别率达到 97.4% (指在定位成功后的车牌识别率)
  • 轻量总代码量不超1k行。
  • 带有Android实现,其Android Demo可解决一些在一些普通业务场景(如执法记录仪)下的车牌识别任务。
  • 支持多种车牌的识别,详情见如下

4.3 HyperLPR的检测流程

  • 使用opencv的HAAR Cascade检测车牌大致位置
  • Extend检测到的大致位置的矩形区域
  • 使用类似于MSER的方式的多级二值化和RANSAC拟合车牌的上下边界
  • 使用CNN Regression回归车牌左右边界
  • 使用基于纹理场的算法进行车牌校正倾斜
  • 使用CNN滑动窗切割字符
  • 使用CNN识别字符

4.4 安装


​ pip install hyperlpr

4.5 Python 依赖

  • Keras (>2.0.0)

  • Theano(>0.9) or Tensorflow(>1.1.x)

  • Numpy (>1.10)

  • Scipy (0.19.1)

  • OpenCV(>3.0)

  • Scikit-image (0.13.0)

  • PIL

  • 使用CNN识别字符

5 最后

🧿 更多资料, 项目分享:

https://gitee.com/dancheng-senior/postgraduate

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

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

相关文章

机器学习之Kmeans丨集成学习丨决策树测试

选择题 下面属于决策树的后剪枝的是&#xff1f;【 正确答案: A】 A. 把数据集分成测试集和训练集&#xff0c;用测试集构建一个足够大的决策树&#xff0c;用测试集判断叶节点合并是否能降低误差。 B. 当树到达一定深度的时候停止生长。 C. 当前节点的样本数量小于某个阈值时&…

node.js游戏网站-计算机毕业设计源码031726

摘 要 基于网络游戏的蓬勃发展&#xff0c;游戏网站发挥着吸引玩家和提高玩家之间的互动性的重要作用&#xff0c;因而&#xff0c;建设了一个以游戏为中心的游戏官网。 该游戏提供了一个大型的玩家交流互动平台&#xff0c;包括用户管理、游戏社区、游戏信息、分类信息、游戏资…

蓝卓基于三大服务全“数”推进成渝工业互联网一体化

面向成渝地区的产业特色&#xff0c;蓝卓正不断提供多行业、多场景、多维度的解决方案&#xff0c;通过最佳实践、标杆案例&#xff0c;为企业数字化转型提供可参考的示范效应。 系统解决方案服务涵盖智能石化、汽配行业、智慧大数据等解决方案。以汽配行业为例&#xff0c;针对…

EcmaScript6全新语法特性-----EcmaScript6

{ // var会越狱,但是let会有作用域 var a 1; let b 2; } var m 1; var m 2; // var变量可以多次声明,但是let只能声明一次 let n 1; // let n 2; // var声明的变量会自动提升,这里没有就会显示undefined console.log(x); var x 10; // let变量不会变化,没有就报错 // co…

FISCO BCOS跨境应用获评工信部2024年新型数字服务优秀案例

6月18日&#xff0c;国家工信部公布2024年新型数字服务优秀案例名单&#xff0c;由前海管理局报送的“基于区块链技术打造深港跨境数据验证平台促进深港数据高效可信流动”案例入选。 随着深港合作的深入推进&#xff0c;FISCO BCOS发挥国产关键技术优势&#xff0c;持续助力深…

医院信创数字化运营平台,办公、院务、内控全面数字化,低代码拓展应用、安全可控

随着政策与技术的双重驱动&#xff0c;医院OA需求已经从传统的协同办公&#xff0c;转向信创环境下的运营、管理、服务的全程数字化、智能化。目前&#xff0c;医院信创建设全面展开&#xff0c;信创需求不断增加。 01.医院数字化信创建设政策 共同助力医院的高质量发展 医疗…

【DS Solutions】一个反欺诈产品的进化,Stripe Radar

Stripe Radar 是 Stripe 提供的一项防欺诈服务&#xff0c;它利用机器学习技术来帮助商家检测和阻止信用卡欺诈行为。这篇文章是Stripe公司关于其反欺诈解决方案Stripe Radar的构建过程的介绍。文章从Stripe的防欺诈团队工程师的角度出发&#xff0c;详细讲述了Stripe Radar的工…

精益管理咨询公司在与企业沟通时,应该如何展示自己的专业性?

在竞争激烈的商业环境中&#xff0c;精益管理咨询公司扮演着至关重要的角色。它们不仅为企业提供策略性的指导&#xff0c;还帮助企业实现资源的优化配置&#xff0c;从而达到提高效率、降低成本的目的。那么&#xff0c;精益管理咨询公司在与企业沟通时&#xff0c;应该如何展…

西部证券:1+1>2?

又一起券商收购拉开帷幕&#xff0c;证券业并购浪潮呼之欲出。 这次是——西部证券。 最近&#xff0c;西部证券公告称&#xff0c;因自身发展需要正在筹划收购国融证券控股权事项&#xff0c; 这是继“浙商国都”、“国联民生”、“华创太平洋”之后&#xff0c;今年券商并购…

抓包工具whistle的安装和使用

whistle基于Node实现的跨平台web调试代理工具&#xff0c;类似的工具有Windows平台上的Fiddler&#xff0c;主要用于查看、修改HTTP、HTTPS、Websocket的请求、响应&#xff0c;也可以作为HTTP代理服务器使用。 一、安装 whistle&#xff0c;没有cnpm的可以先安装下或者直接使…

测评四款AI视频热门神器,没想到最好用的竟然是它!

在这个科技飞速发展的时代&#xff0c;AI视频工具已经成为我们创意与想象的最佳拍档。今天&#xff0c;就让我们一起走进2024年最热门的四款AI视频工具&#xff0c;看看它们如何为我们的创作插上翅膀&#xff01;今天&#xff0c;就让我们一起走进2024年最热门的四款AI视频工具…

使用 HTML5 新标签 details 制作 Accordion 组件(赠送3个相关案例源码)

今天&#xff0c;我要和大家分享一个使用 HTML5 新标签 <details> 制作 Accordion&#xff08;手风琴&#xff09;组件的源码。通过这个源码&#xff0c;你可以快速掌握如何在网页中实现可折叠的问答列表功能&#xff0c;非常适合用于 FAQ 页面。 案例展示 案例效果&…

基于豆瓣电影TOP250的可视化设计

本文要完成的目的&#xff0c;实现豆瓣电影TOP250的可视化 思路 讲解思路&#xff0c;采用倒推的方式&#xff0c; 首先确定可视化图表&#xff0c;也就是最终的效果。这样就能确定需要那些基础数据根据需要的数据进行按需爬取存储。 本篇文章完成前两步。可视化图表设计 和 …

yolov7报错:报错 For debugging consider passing CUDA_LAUNCH_BLOCKING=1

报错信息 RuntimeError: CUDA error: invalid device ordinal CUDA kernel errors might be asynchronously reported at some other API call,so the stacktrace below might be incorrect. For debugging consider passing CUDA_LAUNCH_BLOCKING1.解决方法&#xff1a; 原因…

[图解]建模相关的基础知识-17

1 00:00:00,190 --> 00:00:09,650 那么1、2、5这个地方&#xff0c;这几个它都需要修改 2 00:00:09,660 --> 00:00:11,410 都要改成资金管理部 3 00:00:13,340 --> 00:00:15,020 那么违反第三范式 4 00:00:15,030 --> 00:00:19,650 是一个比较严重的问题 5 00:…

SVN学习(005 subversive操作分支)

尚硅谷SVN高级教程(svn操作详解) 总时长 4:53:00 共72P 此文章包含第43p-第p53的内容 介绍 创建相关目录 创建一个工程 分享到服务器端 将工程放到trunk文件夹下 在svn服务器上的位置 在branches下添加文件夹&#xff08;用于作为分支&#xff09; 创建代码分支 切换分支…

2024年6月23日

1.PPT学习赋能 调整到1907 2.动漫协会 完成 3.数据库 完成 4.慕课 完成 5.学习强国 刷满 虚伪的设计也应该提上日程了 Neo4j是一款高性能的图数据库&#xff0c;专门用于存储和处理图形数据。它采用节点、关系和属性的图形结构&#xff0c;非常适用于表示和查询复杂的实体…

ONLYOFFICE 8.1版本桌面编辑器测评

在现代办公环境中&#xff0c;选择一款功能强大且高效的办公套件至关重要。随着技术的不断进步&#xff0c;ONLYOFFICE 8.1 版本桌面编辑器以其丰富的功能和用户友好的界面成为了众多用户的首选。本文将对ONLYOFFICE 8.1版本进行详细测评&#xff0c;帮助读者了解其最新特性和优…

MUR4060PT-ASEMI逆变焊机MUR4060PT

编辑&#xff1a;ll MUR4060PT-ASEMI逆变焊机MUR4060PT 型号&#xff1a;MUR4060PT 品牌&#xff1a;ASEMI 封装&#xff1a;TO-247 恢复时间&#xff1a;35ns 最大平均正向电流&#xff08;IF&#xff09;&#xff1a;40A 最大循环峰值反向电压&#xff08;VRRM&#x…

Web渗透:文件上传漏洞

文件上传漏洞&#xff08;File Upload Vulnerability&#xff09;是网络安全中的一种常见漏洞&#xff0c;攻击者可以通过此漏洞将恶意文件上传到服务器&#xff0c;从而执行任意代码、覆盖重要文件、或进行其他恶意操作。这种漏洞可能带来严重的安全风险&#xff0c;包括数据泄…