陳強(qiáng),吳鍇,柏云濤
(溫州大學(xué)計(jì)算機(jī)與人工智能學(xué)院,溫州325035)
在現(xiàn)代化的交通系統(tǒng)中,快速發(fā)展的圖像識(shí)別技術(shù)能幫助交警快速地處理交通事故,例如近年來出現(xiàn)的車牌識(shí)別系統(tǒng)能幫助交警快速掃描識(shí)別車牌,讀取并記錄車牌信息。
但是傳統(tǒng)車牌識(shí)別系統(tǒng),如基于機(jī)器學(xué)習(xí)車牌識(shí)別技術(shù)的系統(tǒng)由于本身識(shí)別技術(shù)依賴手工提取車牌和車牌字符的特征[1],在雨天或夜里,由于光線條件并不好,難以對(duì)車牌進(jìn)行正確識(shí)別甚至難以定位。這時(shí)只能由交警手動(dòng)抄寫車牌內(nèi)容,然而交警記錄罰單等車輛信息的表格時(shí),往往不僅要記錄車牌號(hào)碼,同時(shí)還要記錄車牌顏色、車輛類型、車輛顏色等數(shù)據(jù),大量的記錄內(nèi)容對(duì)交通處理效率造成一定的影響。
深度學(xué)習(xí)是人工智能研究領(lǐng)域中的一個(gè)比較新技術(shù)[2]。通過深度學(xué)習(xí)的方法能不需要人為地進(jìn)行提取目標(biāo)特征,而讓其自己訓(xùn)練迭代得到目標(biāo)的從淺層到非常深層的具體特征,是一種計(jì)算機(jī)視覺領(lǐng)域的一項(xiàng)重大突破[3]。因此,使用基于深度學(xué)習(xí)技術(shù)的車牌識(shí)別系統(tǒng)能很好地解決傳統(tǒng)技術(shù)魯棒性不夠好,在復(fù)雜多變的場(chǎng)景中車牌難以檢測(cè)的問題。
本文將針對(duì)傳統(tǒng)車牌識(shí)別的局限性問題,使用YOLO 和CRNN 兩大深度學(xué)習(xí)技術(shù)[4-5],設(shè)計(jì)開發(fā)一套準(zhǔn)確性高、魯棒性強(qiáng)的車牌識(shí)別軟件。
將車牌識(shí)別功能分成了兩部分模塊,首先是將車牌從照片中定位出來,然后對(duì)定位后的車牌圖片進(jìn)行字符識(shí)別。如圖1 所示。
圖1 車牌識(shí)別程序主要邏輯圖
車牌定位模塊定位我們使用了最新的圖片對(duì)象識(shí)別定位算法之一YOLO 算法,使用公開車輛數(shù)據(jù)集CCPD 中的三十萬張圖片經(jīng)過兩千次迭代,收斂后生成了我們的單純針對(duì)車牌對(duì)象的識(shí)別權(quán)重[6]。YOLO 算法是一種運(yùn)行效率極高的算法,其運(yùn)行速度約一百倍于Fast R-CNN,這個(gè)運(yùn)行速度可以為我們以后的視頻動(dòng)態(tài)識(shí)別定位做好準(zhǔn)備。
字符識(shí)別模塊我們使用的是循環(huán)卷積神經(jīng)網(wǎng)絡(luò)CRNN 對(duì)車牌進(jìn)行不定長(zhǎng)字符串識(shí)別,CRNN 并不像傳統(tǒng)的字符識(shí)別算法那樣對(duì)整行的字符串進(jìn)行分割后單字識(shí)別,而是直接整行循環(huán)卷積識(shí)別。這樣就能避免了在字符分割時(shí)產(chǎn)生的誤差,大大提高了識(shí)別正確率。我們?cè)谠械腃RNN 網(wǎng)絡(luò)模型上精簡(jiǎn)了兩個(gè)卷積層,使其加快了迭代速度,并加大了Learning rate,重做了字典。
圖形界面模塊我們使用Python 的Tkinter 框架搭建了一個(gè)桌面端的車牌識(shí)別系統(tǒng),使其能調(diào)用以上兩個(gè)神經(jīng)網(wǎng)絡(luò)模塊,讓程序能在圖片中快速定位圖中的車牌并識(shí)別車牌中的文字,并顯示原圖、定位截圖和識(shí)別結(jié)果。
從攝像頭獲取照片之后我們先進(jìn)行車牌的識(shí)別定位,我們使用的是YOLOv3 技術(shù)[4],將車牌從原圖中定位并截取出來。
圖2 YOLO算法的識(shí)別流程
YOLO 是一個(gè)使用了75 個(gè)卷積層的完全卷積網(wǎng)絡(luò)。該技術(shù)首先采用了2 個(gè)步幅的卷積層在特征圖上進(jìn)行下采樣,這樣可以防止過擬合導(dǎo)致的低級(jí)特征丟失。其次YOLO 采用3 種不同尺度進(jìn)行預(yù)測(cè),其步幅分別為32,16,8。先采用步幅為32 的層的特征圖進(jìn)行檢測(cè),然后使用步幅16 和8,依次進(jìn)行檢測(cè)。檢測(cè)層的上采樣系數(shù)都為2,也都保存了前一層特征圖尺寸相近的特征圖連接。再其次YOLO 就將輸出特征圖作為結(jié)果。如圖2 所示,YOLO 將圖像分割成邊長(zhǎng)為S 的網(wǎng)絡(luò)單元格,然后對(duì)每個(gè)單元格的邊框的坐標(biāo)、類標(biāo)簽等信息進(jìn)行預(yù)測(cè),其網(wǎng)絡(luò)輸出為一個(gè)有(B*(5+C))個(gè)參數(shù)的特征圖。表示每一個(gè)單元格可以預(yù)測(cè)B 個(gè)邊框數(shù),并顯示5+C 個(gè)屬性,分別為每個(gè)邊框的中心坐標(biāo)、維度、目標(biāo)值和置信值[7]。預(yù)測(cè)出的邊界框中心點(diǎn)坐標(biāo)可利用sigmoid 函數(shù)來精確,而邊界框的尺寸需要通過對(duì)輸出應(yīng)用對(duì)數(shù)空間轉(zhuǎn)換,與錨點(diǎn)進(jìn)行關(guān)系轉(zhuǎn)化得到。
YOLO 權(quán)重的訓(xùn)練使用了國(guó)內(nèi)的大型數(shù)據(jù)集CCPD[6]數(shù)據(jù)集,它包含了多種復(fù)雜場(chǎng)景下的車牌圖像,我們編寫了Python 文件處理腳本將其放于圖片名中的數(shù)據(jù)信息提取成YOLO 格式轉(zhuǎn)存之后,修改YOLO 網(wǎng)絡(luò)的參數(shù),包括CFG 文件中的Classes 從原本的80 個(gè)對(duì)象調(diào)整為1 個(gè),并相應(yīng)的調(diào)整Filters 參數(shù)與之相匹配。降低了網(wǎng)絡(luò)的學(xué)習(xí)率和batch_size 使其能更好地適應(yīng)我們電腦的配置,讓其更充分的利用GPU 性能。然后開始調(diào)用YOLO 的網(wǎng)絡(luò)進(jìn)行迭代訓(xùn)練,生成可繼續(xù)迭代的.pt 后綴的權(quán)重文件,經(jīng)過長(zhǎng)時(shí)間的反復(fù)resume 訓(xùn)練,權(quán)重文件的準(zhǔn)確率,日漸上升并達(dá)到我們的要求水平。最后我們將ArgumentParser 模塊的命令行參數(shù)全部整理封裝,使其能配合圖形界面窗口的接口的調(diào)用修改。
在完成對(duì)車牌的識(shí)別定位后開始對(duì)車牌中的字符串進(jìn)行識(shí)別,這里我們使用了循環(huán)卷積神經(jīng)網(wǎng)絡(luò)(CRNN)[5]。其結(jié)構(gòu)如圖3 所示。
圖3 CRNN網(wǎng)絡(luò)結(jié)構(gòu)圖
如圖3 所示,首先將車牌圖片的大小重設(shè)成同一高度并將其輸入卷積層,經(jīng)過卷積層得到特征向量序列,在特征圖上從左到右生成這些特征向量,且對(duì)應(yīng)于原始圖像的一個(gè)感受野,然后將這些特征向量的序列輸入循環(huán)層。在循環(huán)層里我們使用一個(gè)向前的LSTM和一個(gè)向后的LSTM 組合成一個(gè)雙向LSTM,并且可以在網(wǎng)絡(luò)中添加多個(gè)雙向LSTM 組件,這使得模型的魯棒性大大提高。在使用循環(huán)層來預(yù)測(cè)每一幀的標(biāo)簽分布之后,再使用轉(zhuǎn)錄層將預(yù)測(cè)變?yōu)閷?shí)際的標(biāo)簽序列,在這里我們基于詞典模式,并預(yù)測(cè)具有概率最高的標(biāo)簽序列[4]。
CRNN 的數(shù)據(jù)集我們采用中科大開源數(shù)據(jù)集CCPD 外,我們還使用了自制的數(shù)據(jù)集,但是這兩個(gè)數(shù)據(jù)集中“皖”與“蘇”的車牌占比過多而其他省份的車牌很少,所以我們還使用了模擬車牌的開源程序額外生成了一些包含各省份的模擬車牌圖像以增強(qiáng)模型對(duì)其他省份車牌的識(shí)別效果,數(shù)據(jù)集如圖4 所示。我們整理了所有圖片數(shù)據(jù)的車牌名稱,生成數(shù)據(jù)集標(biāo)簽文件train.txt(image_name palte_number),將數(shù)據(jù)集制作成LMDB 格式的數(shù)據(jù)庫(kù),并創(chuàng)建字典。
表1 車牌字典集
做好以上數(shù)據(jù)準(zhǔn)備之后,調(diào)用CRNN 模塊進(jìn)行訓(xùn)練,網(wǎng)絡(luò)會(huì)自動(dòng)編碼/解碼字典,經(jīng)過5 萬多次的迭代之后生成的權(quán)重文件識(shí)別準(zhǔn)確率達(dá)到了預(yù)期要求,現(xiàn)在字符識(shí)別準(zhǔn)確率暫時(shí)為98.06%(3138/3200)。
此模塊在項(xiàng)目功能完成后消除了控制臺(tái)下的用戶不友好的弊端,使用Python 的Tkinter 庫(kù)實(shí)現(xiàn)了基本的操作界面,調(diào)用以上YOLO 和CRNN 兩大算法對(duì)圖片中車牌進(jìn)行識(shí)別定位的軟件,軟件首先在本地選中圖片顯示在程序中,點(diǎn)擊“車牌定位”按鈕調(diào)用YOLO 神經(jīng)網(wǎng)絡(luò)對(duì)原圖進(jìn)行車牌識(shí)別定位,并將定位好的車牌圖片以及在原圖中的坐標(biāo)和車牌尺寸顯示在程序中,再接著點(diǎn)擊“車牌識(shí)別”按鈕進(jìn)行CRNN 不定長(zhǎng)字符識(shí)別,并將識(shí)別結(jié)果顯示在程序中。
圖5 車牌識(shí)別程序界面圖
圖4 CRNN數(shù)據(jù)集
車牌識(shí)別軟件效果如圖6 所示,基本能識(shí)別所有復(fù)雜環(huán)境下的車牌,并準(zhǔn)確識(shí)別車牌上的字符。能適應(yīng)的環(huán)境包括:環(huán)境黑暗、鏡頭內(nèi)有強(qiáng)光、車身反光、車身上有影子、車牌距離很遠(yuǎn)或很近、車牌歪斜、雪天、雨天,等等?,F(xiàn)在YOLO 定位準(zhǔn)確率暫時(shí)為98%(588/600),而字符識(shí)別準(zhǔn)確率暫時(shí)為98.06%(3138/3200)。
本文給出了YOLO 算法、CRNN 算法的核心思路以及基于該兩種算法的桌面端車牌識(shí)別軟件的程序。該程序?qū)缮疃葘W(xué)習(xí)算法的應(yīng)用有助于幫助讀者對(duì)深度學(xué)習(xí)算法的理解與應(yīng)用,同時(shí)該程序能輔助識(shí)別定位圖片中的車牌位置和車牌文本內(nèi)容,具有一定的實(shí)際意義。
圖6 軟件識(shí)別結(jié)果圖