計算機競賽 python 機器視覺 車牌識別 - opencv 深度學習 機器學習

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 cvfrom PIL import Image, ImageDraw, ImageFontimport 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 + 1if i % 5 == 0:i = 0res_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.translateMainWindow.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.pswp.cn/news/36415.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/36415.shtml
英文地址,請注明出處:http://en.pswp.cn/news/36415.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【設計模式】建造者模式

建造者模式&#xff08;Builder Pattern&#xff09;使用多個簡單的對象一步一步構建成一個復雜的對象。這種類型的設計模式屬于創建型模式&#xff0c;它提供了一種創建對象的最佳方式。 一個 Builder 類會一步一步構造最終的對象。該 Builder 類是獨立于其他對象的。 介紹 …

微信小程序:Mobx的使用指南

簡要 微信小程序中有時需要進行全局狀態管理&#xff0c;這個時候就需要用到Mobx.下面我們來看一下在小程序中是如何使用Mobx的 安裝 pnpm i mobx-miniprogram4.13.2 mobx-miniprogram-bindings1.2.1 或 npm i mobx-miniprogram4.13.2 mobx-miniprogram-bindings1.2.1 或 yarn…

LeetCode 31題:下一個排列

目錄 題目 思路 代碼 題目 整數數組的一個 排列 就是將其所有成員以序列或線性順序排列。 例如&#xff0c;arr [1,2,3] &#xff0c;以下這些都可以視作 arr 的排列&#xff1a;[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1] 。 整數數組的 下一個排列 是指其整數的下一個字典序…

Flink 火焰圖

方式一 使用 Flink Web UI 的 Flame Graph Flink 自己也支持了 Task 粒度的 Flame Graphs 功能&#xff0c;并且可以細化到 subtask 粒度。 第一步&#xff1a;配置啟用功能 Flink 作業動態參數里增加配置&#xff1a;“rest.flamegraph.enabled”: “true” 并重啟作業。當前…

Blazor 簡單組件(0):簡單介紹

文章目錄 前言說明環境安裝 前言 Blazor 這個技術還是比較新&#xff0c;相關的UI組件還在完善&#xff0c;我這里提供一下我個人的組件開發。 說明 本UI組件是基于BootstrapBlazor(以下簡稱BB)開發。 BootstrapBlazor 文檔 環境安裝 C#小輪子&#xff1a;Visual Studio自…

C語言快速回顧(二)

前言 在Android音視頻開發中&#xff0c;網上知識點過于零碎&#xff0c;自學起來難度非常大&#xff0c;不過音視頻大牛Jhuster提出了《Android 音視頻從入門到提高 - 任務列表》&#xff0c;結合我自己的工作學習經歷&#xff0c;我準備寫一個音視頻系列blog。C/C是音視頻必…

目前有哪些好用的免費開源wms倉儲管理軟件?

什么是開源&#xff1f; 開源指的是軟件的源代碼是公開可見和可自由使用的。開源軟件的授權許可通常允許用戶查看、修改和分發源代碼&#xff0c;以及根據自己的需求進行定制和擴展。 開源工具的核心理念是共享和協作。通過開放源代碼&#xff0c;開源軟件鼓勵用戶之間的合作…

Tubi 前端測試:遷移 Enzyme 到 React Testing Library

前端技術發展迅速&#xff0c;即便不說是日新月異&#xff0c;每年也都推出新框架和新技術。Tubi 的產品前端代碼倉庫始建于 2015 年&#xff0c;至今 8 年有余。可喜的是&#xff0c;多年來緊隨 React 社區的發展&#xff0c;Tubi 絕大多數的基礎框架選型都遵循了社區流行的最…

CentOS-6.3安裝MySQL集群

安裝要求 安裝環境&#xff1a;CentOS-6.3 安裝方式&#xff1a;源碼編譯安裝 軟件名稱&#xff1a;mysql-cluster-gpl-7.2.6-linux2.6-x86_64.tar.gz 下載地址&#xff1a;http://mysql.mirror.kangaroot.net/Downloads/ 軟件安裝位置&#xff1a;/usr/local/mysql 數據存放位…

達夢數據庫(dm8) Centos7 高可用集群

國產數據庫-達夢 一、環境詳情二、Centos7 參數優化&#xff08;所有節點&#xff09;三、創建用戶&#xff08;所有節點&#xff09;四、開始安裝&#xff08;所有節點&#xff09;五、服務注冊啟動 當前安裝&#xff1a;在指定版本環境下 測試&#xff0c;僅供參考 官網描述&…

風丘科技將亮相 EVM ASIA 2023

風丘科技將首次亮相 EVM ASIA 2023 WINDHILL will debut EVM ASIA 2023 ——可持續移動的未來 —The Future of SUSTAINABLE Mobility EVM ASIA 2023是亞太地區電氣化的國際性展會&#xff0c;專注于新能源汽車、充電技術及汽車零件制造等。展會致力于促進包括充電站、交通…

[系統安全] 五十二.DataCon競賽 (1)2020年Coremail釣魚郵件識別及分類詳解

您可能之前看到過我寫的類似文章,為什么還要重復撰寫呢?只是想更好地幫助初學者了解病毒逆向分析和系統安全,更加成體系且不破壞之前的系列。因此,我重新開設了這個專欄,準備系統整理和深入學習系統安全、逆向分析和惡意代碼檢測,“系統安全”系列文章會更加聚焦,更加系…

InnoDB文件物理結構解析5 - FIL_PAGE_INDEX

本文討論FIL_PAGE_INDEX頁的可回收垃圾記錄(Garbage/Deleted Records)&#xff0c;當我們刪除某一條記錄(delete from …)時&#xff0c;通常InnoDB并不會在物理存儲上進行完全刪除&#xff0c;而是在記錄上置一個刪除標志位&#xff0c;我們稱這些行記錄為垃圾記錄&#xff0c…

嵌入式Qt開發—Excel表格數據導出

有一個嵌入式Excel表格數據導出的需求&#xff1a;應用軟件運行于嵌入式Linux平臺上&#xff0c;在設備運行過程中&#xff0c;存儲了許多數據&#xff0c;這些數據想以表格的形式導出。考慮到Windows平臺的普遍性&#xff0c;需要將數據以excel表格形式導出&#xff0c;故選擇…

python庫打包

一、背景 想讓自己寫的python庫可以使用pip install xxx安裝。 二、環境準備 注冊PYPI賬號已經寫好的能正常使用的庫/方法/項目&#xff08;可以本地調用&#xff09;安裝依賴庫setuptools和twinw pip install setuptools pip install twine # 簡化將庫發布到PYPI流程的工…

“中國軟件杯”飛槳賽道晉級決賽現場名單公布

“中國軟件杯”大學生軟件設計大賽是由國家工業和信息化部、教育部、江蘇省人民政府共同主辦&#xff0c;是全國軟件行業規格最高、最具影響力的國家級一類賽事&#xff0c;為《全國普通高校競賽排行榜》榜單內賽事。今年&#xff0c;組委會聯合百度飛槳共同設立了“智能系統設…

C++11之后的C++標準特性宏定義方便功能特性測試

C是一個龐大的編程語言體系&#xff0c;它的高效性是可以直接連接硬件系統&#xff0c;它的靈活性是不斷迭代完善的通用語義機制&#xff0c;當下C的發展演進可謂一路狂奔。不同應用中需要知道C對應的平臺或者版本的功能特性&#xff0c;標準庫信息、C編譯器特性等&#xff0c;…

基于PHP的輕量級博客typecho

本文完成于 5 月中旬&#xff0c;發布時未在最新版本上驗證&#xff1b; 什么是 typecho &#xff1f; Typecho 是一款基于 PHP 的博客軟件&#xff0c;旨在成為世界上最強大的博客引擎。Typecho 在 GNU 通用公共許可證 2.0 下發布。支持多種數據庫&#xff0c;原生支持 Markdo…

24屆近5年南京大學自動化考研院校分析

今天給大家帶來的是南京大學控制考研分析 滿滿干貨&#xff5e;還不快快點贊收藏 一、南京大學 學校簡介 南京大學是一所歷史悠久、聲譽卓著的高等學府。其前身是創建于1902年的三江師范學堂&#xff0c;此后歷經兩江師范學堂、南京高等師范學校、國立東南大學、國立第四中…

JS 刪除的是最后一頁的最后一條,頁碼設置邏輯

刪除的場景&#xff1a; 解決思路&#xff1a; 1、計算操作后的總頁數 2、刪除成功之后的總頁數與當前總頁數進行比較 3、如果刪除成功之后的總頁數比小于當前總頁數&#xff0c;需要把當前頁碼減去1&#xff1b;否則&#xff0c;直接進行列表數據的請求 代碼實現 /*總條數…