1 前言
?? 優(yōu)質(zhì)競(jìng)賽項(xiàng)目系列,今天要分享的是
?? 基于python 機(jī)器視覺(jué) 的車(chē)牌識(shí)別系統(tǒng)
??學(xué)長(zhǎng)這里給一個(gè)題目綜合評(píng)分(每項(xiàng)滿(mǎn)分5分)
- 難度系數(shù):3分
- 工作量:3分
- 創(chuàng)新點(diǎn):3分
?? 更多資料, 項(xiàng)目分享:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-767542.html
https://gitee.com/dancheng-senior/postgraduate文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-767542.html
1 課題背景
車(chē)牌識(shí)別其實(shí)是個(gè)經(jīng)典的機(jī)器視覺(jué)任務(wù)了,通過(guò)圖像處理技術(shù)檢測(cè)、定位、識(shí)別車(chē)牌上的字符,實(shí)現(xiàn)計(jì)算機(jī)對(duì)車(chē)牌的智能管理功能。如今在小區(qū)停車(chē)場(chǎng)、高速公路出入口、監(jiān)控場(chǎng)所、自動(dòng)收費(fèi)站等地都有車(chē)牌識(shí)別系統(tǒng)的存在,車(chē)牌識(shí)別的研究也已逐步成熟。盡管該技術(shù)隨處可見(jiàn)了,但其實(shí)在精度和識(shí)別速度上還需要進(jìn)一步提升,自己動(dòng)手實(shí)現(xiàn)一個(gè)車(chē)牌識(shí)別系統(tǒng)有利于學(xué)習(xí)和理解圖像處理的先進(jìn)技術(shù)。
本文詳細(xì)介紹基于深度學(xué)習(xí)的中文車(chē)牌識(shí)別與管理系統(tǒng),在介紹算法原理的同時(shí),給出Python的實(shí)現(xiàn)代碼以及PyQt的簡(jiǎn)單UI界面。在界面中可以選擇需要識(shí)別的車(chē)牌視頻、圖片文件等。
2 效果演示
首先還是用動(dòng)圖先展示一下效果,系統(tǒng)主要實(shí)現(xiàn)的功能是對(duì)圖片、視頻中的車(chē)牌進(jìn)行檢測(cè)和識(shí)別,演示效果如下。
2.1 圖片檢測(cè)識(shí)別
2.2視頻檢測(cè)識(shí)別
3 車(chē)牌檢測(cè)與識(shí)別
目前,智能交通系統(tǒng)中集成運(yùn)用計(jì)算機(jī)視覺(jué)、物聯(lián)網(wǎng)、人工智能等多種技術(shù)成為未來(lái)發(fā)展方向。其中,車(chē)牌識(shí)別(License Plate Recognition,
LPR)技術(shù)作為一項(xiàng)重要技術(shù),從獲取的圖像中提取目標(biāo)車(chē)輛的車(chē)牌信息,成為完善智能交通管理運(yùn)行的基礎(chǔ)。
由于本文介紹的是中文車(chē)牌,所以可以簡(jiǎn)單了解一下國(guó)內(nèi)汽車(chē)拍照的特點(diǎn):字符數(shù)為七個(gè),包括漢字、字母和數(shù)字。車(chē)牌顏色組合中,其中最常見(jiàn)的組合為普通小型汽車(chē)藍(lán)底白字和新能源汽車(chē)的漸變綠底黑字。
總結(jié)來(lái)說(shuō),車(chē)牌是一個(gè)有特點(diǎn)的圖像區(qū)域,幾種特征可以綜合起來(lái)確定車(chē)牌定位,所以之前就有利用車(chē)牌與周?chē)h(huán)境的差異的算法。目前常見(jiàn)的車(chē)牌定位算法有以下 4
種:基于顏色、紋理、邊緣信息的車(chē)牌定位算法和基于人工神經(jīng)網(wǎng)絡(luò)的車(chē)牌定位算法。
如下圖所示,常規(guī)的步驟包括圖像采集、預(yù)處理、車(chē)牌定位、字符分割、字符識(shí)別、輸出結(jié)果。深度學(xué)習(xí)技術(shù)成熟之后,端到端的網(wǎng)絡(luò)模型使得這一過(guò)程變得簡(jiǎn)單起來(lái)。從思想上來(lái)說(shuō),基于深度學(xué)習(xí)的車(chē)牌識(shí)別實(shí)現(xiàn)思路主要包括兩個(gè)部分:(1)車(chē)牌檢測(cè)定位;(2)車(chē)牌字符識(shí)別。
其中,車(chē)牌的檢測(cè)定位本質(zhì)是一個(gè)特定的目標(biāo)檢測(cè)任務(wù),即通過(guò)算法框選出屬于車(chē)牌的位置坐標(biāo),以便將其與背景區(qū)分開(kāi)來(lái)??梢哉J(rèn)為檢測(cè)出的車(chē)牌位置才是我們的感興趣區(qū)域。好用的方法如Cascade
LBP,它是一種機(jī)器學(xué)習(xí)的方法,可以利用OpenCV訓(xùn)練級(jí)聯(lián)分類(lèi)器,依賴(lài)CPU進(jìn)行計(jì)算,級(jí)聯(lián)分類(lèi)器的方法對(duì)于常用場(chǎng)景效果比較好,檢測(cè)速度較快,曾經(jīng)一度比較流行,但準(zhǔn)確率一般?;谏疃葘W(xué)習(xí)的檢測(cè)算法有Mobilene-
SSD、YOLO-v5等,利用大批量的標(biāo)注數(shù)據(jù)進(jìn)行訓(xùn)練.
當(dāng)ROI被檢測(cè)出來(lái),如何對(duì)這一區(qū)域中的字符進(jìn)行識(shí)別,這就涉及到采取的處理方式。第一種處理方式,首先利用一系列字符分割的算法將車(chē)牌中的字符逐個(gè)分開(kāi),然后基于深度學(xué)習(xí)進(jìn)行字符分類(lèi),得到識(shí)別結(jié)果;第二種,區(qū)別于第一種先分割再分類(lèi)的兩步走方式,利用端到端的CTC(
Connectionist Temporal Classification)網(wǎng)絡(luò)直接進(jìn)行識(shí)別。
這里我們使用網(wǎng)上開(kāi)源的HyperLPR中文車(chē)牌識(shí)別框架,首先導(dǎo)入OpenCV和hyperlpr,讀取一張車(chē)牌圖片調(diào)用架構(gòu)中的車(chē)牌識(shí)別方法獲得結(jié)果,以下代碼來(lái)自官方的示例:
?
#導(dǎo)入包
from hyperlpr import *
#導(dǎo)入OpenCV庫(kù)
import cv2
#讀入圖片
image = cv2.imread("demo.jpg")
#識(shí)別結(jié)果
print(HyperLPR_plate_recognition(image))
?
以上代碼運(yùn)行結(jié)果如下,可以看出該方法識(shí)別了車(chē)牌的車(chē)牌字符、置信度值、車(chē)牌位置坐標(biāo)、圖片尺寸等結(jié)果。
這樣的結(jié)果還不夠直觀,我們寫(xiě)一個(gè)函數(shù)將車(chē)牌的識(shí)別結(jié)果標(biāo)注在圖片上,首先導(dǎo)入相關(guān)依賴(lài)包,其代碼如下:
?
# 導(dǎo)入包
from hyperlpr import *
# 導(dǎo)入OpenCV庫(kù)
import cv2 as cv
from PIL import Image, ImageDraw, ImageFont
import numpy as np
?
新建一個(gè)函數(shù)drawRectBox,將圖像數(shù)據(jù)、識(shí)別結(jié)果、字體等參數(shù)傳入,函數(shù)內(nèi)部利用OpenCV和PIL庫(kù)添加標(biāo)注框和識(shí)別結(jié)果的字符,其代碼如下:
?
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方法識(shí)別出車(chē)牌結(jié)果,調(diào)用以上函數(shù)獲得帶標(biāo)注框的圖片,利用OpenCV的imshow方法顯示結(jié)果圖片,其代碼如下:
?
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
?
此時(shí)運(yùn)行以上代碼可以得到如下結(jié)果:
同理,識(shí)別視頻中的車(chē)牌也可以做類(lèi)似的操作,不過(guò)我們需要先對(duì)視頻文件進(jìn)行逐幀讀取,然后采用以上的方式在圖片中標(biāo)識(shí)出車(chē)牌并顯示。
這部分代碼如下:
capture = cv.VideoCapture("./車(chē)牌檢測(cè).mp4") # 讀取視頻文件
fontC = ImageFont.truetype("./platech.ttf", 14, 0) # 字體,用于標(biāo)注圖片
?
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) # 識(shí)別車(chē)牌
if len(res_all) > 0:
res, confi, axes = res_all[0] # 獲取結(jié)果
frame = drawRectBox(frame, axes, res, fontC)
cv.imshow("num", frame) # 顯示畫(huà)面
? if cv.waitKey(1) & 0xFF == ord('q'):
? break # 退出
? else:
? break
?
以上代碼每5幀識(shí)別一次視頻中的車(chē)牌,將車(chē)牌的結(jié)果標(biāo)注在畫(huà)面中進(jìn)行實(shí)時(shí)顯示,運(yùn)行結(jié)果的截圖如下所示:
車(chē)牌的識(shí)別部分代碼演示完畢,對(duì)此我們完成了圖片和視頻的識(shí)別,然而這些還是簡(jiǎn)單的腳本呈現(xiàn)。為了方便更換圖片、視頻以及管理車(chē)牌,還需要設(shè)計(jì)文件選擇功能以及系統(tǒng)的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", "打開(kāi)圖片"))
self.showlabel.setText(_translate("MainWindow", "TextLabel"))
self.LPRdetect.setText(_translate("MainWindow", "車(chē)牌檢測(cè)"))
self.LPR_Rec.setText(_translate("MainWindow", "車(chē)牌識(shí)別"))
self.openvideo.setText(_translate("MainWindow", "PushButton"))
?
4 HyperLPR庫(kù)
4.1 簡(jiǎn)介
HyperLPR是一個(gè)使用深度學(xué)習(xí)針對(duì)對(duì)中文車(chē)牌識(shí)別的實(shí)現(xiàn),與較為流行的開(kāi)源的EasyPR相比,它的檢測(cè)速度和魯棒性和多場(chǎng)景的適應(yīng)性都要好于目前開(kāi)源的EasyPR,HyperLPR可以識(shí)別多種中文車(chē)牌包括白牌,新能源車(chē)牌,使館車(chē)牌,教練車(chē)牌,武警車(chē)牌等。
4.2 特點(diǎn)
- 基于端到端sequence模型,無(wú)需進(jìn)行字符分割,識(shí)別速度更快。
- 速度快 720p ,單核 Intel 2.2G CPU (macbook Pro 2015)平均識(shí)別時(shí)間<=90ms
- 識(shí)別率高,僅僅針對(duì)車(chē)牌ROI在EasyPR數(shù)據(jù)集上,0-error達(dá)到 95.2%, 1-error識(shí)別率達(dá)到 97.4% (指在定位成功后的車(chē)牌識(shí)別率)
- 輕量總代碼量不超1k行。
- 帶有Android實(shí)現(xiàn),其Android Demo可解決一些在一些普通業(yè)務(wù)場(chǎng)景(如執(zhí)法記錄儀)下的車(chē)牌識(shí)別任務(wù)。
- 支持多種車(chē)牌的識(shí)別,詳情見(jiàn)如下
4.3 HyperLPR的檢測(cè)流程
- 使用opencv的HAAR Cascade檢測(cè)車(chē)牌大致位置
- Extend檢測(cè)到的大致位置的矩形區(qū)域
- 使用類(lèi)似于MSER的方式的多級(jí)二值化和RANSAC擬合車(chē)牌的上下邊界
- 使用CNN Regression回歸車(chē)牌左右邊界
- 使用基于紋理場(chǎng)的算法進(jìn)行車(chē)牌校正傾斜
- 使用CNN滑動(dòng)窗切割字符
- 使用CNN識(shí)別字符
4.4 安裝
?
? pip install hyperlpr
4.5 Python 依賴(lài)
-
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識(shí)別字符
5 最后
?? 更多資料, 項(xiàng)目分享:
https://gitee.com/dancheng-senior/postgraduate
到了這里,關(guān)于競(jìng)賽保研 python 機(jī)器視覺(jué) 車(chē)牌識(shí)別 - opencv 深度學(xué)習(xí) 機(jī)器學(xué)習(xí)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!