陳強,吳鍇,柏云濤
(溫州大學計算機與人工智能學院,溫州325035)
在現代化的交通系統中,快速發展的圖像識別技術能幫助交警快速地處理交通事故,例如近年來出現的車牌識別系統能幫助交警快速掃描識別車牌,讀取并記錄車牌信息。
但是傳統車牌識別系統,如基于機器學習車牌識別技術的系統由于本身識別技術依賴手工提取車牌和車牌字符的特征[1],在雨天或夜里,由于光線條件并不好,難以對車牌進行正確識別甚至難以定位。這時只能由交警手動抄寫車牌內容,然而交警記錄罰單等車輛信息的表格時,往往不僅要記錄車牌號碼,同時還要記錄車牌顏色、車輛類型、車輛顏色等數據,大量的記錄內容對交通處理效率造成一定的影響。
深度學習是人工智能研究領域中的一個比較新技術[2]。通過深度學習的方法能不需要人為地進行提取目標特征,而讓其自己訓練迭代得到目標的從淺層到非常深層的具體特征,是一種計算機視覺領域的一項重大突破[3]。因此,使用基于深度學習技術的車牌識別系統能很好地解決傳統技術魯棒性不夠好,在復雜多變的場景中車牌難以檢測的問題。
本文將針對傳統車牌識別的局限性問題,使用YOLO 和CRNN 兩大深度學習技術[4-5],設計開發一套準確性高、魯棒性強的車牌識別軟件。
將車牌識別功能分成了兩部分模塊,首先是將車牌從照片中定位出來,然后對定位后的車牌圖片進行字符識別。如圖1 所示。

圖1 車牌識別程序主要邏輯圖
車牌定位模塊定位我們使用了最新的圖片對象識別定位算法之一YOLO 算法,使用公開車輛數據集CCPD 中的三十萬張圖片經過兩千次迭代,收斂后生成了我們的單純針對車牌對象的識別權重[6]。YOLO 算法是一種運行效率極高的算法,其運行速度約一百倍于Fast R-CNN,這個運行速度可以為我們以后的視頻動態識別定位做好準備。
字符識別模塊我們使用的是循環卷積神經網絡CRNN 對車牌進行不定長字符串識別,CRNN 并不像傳統的字符識別算法那樣對整行的字符串進行分割后單字識別,而是直接整行循環卷積識別。這樣就能避免了在字符分割時產生的誤差,大大提高了識別正確率。我們在原有的CRNN 網絡模型上精簡了兩個卷積層,使其加快了迭代速度,并加大了Learning rate,重做了字典。
圖形界面模塊我們使用Python 的Tkinter 框架搭建了一個桌面端的車牌識別系統,使其能調用以上兩個神經網絡模塊,讓程序能在圖片中快速定位圖中的車牌并識別車牌中的文字,并顯示原圖、定位截圖和識別結果。
從攝像頭獲取照片之后我們先進行車牌的識別定位,我們使用的是YOLOv3 技術[4],將車牌從原圖中定位并截取出來。

圖2 YOLO算法的識別流程
YOLO 是一個使用了75 個卷積層的完全卷積網絡。該技術首先采用了2 個步幅的卷積層在特征圖上進行下采樣,這樣可以防止過擬合導致的低級特征丟失。其次YOLO 采用3 種不同尺度進行預測,其步幅分別為32,16,8。先采用步幅為32 的層的特征圖進行檢測,然后使用步幅16 和8,依次進行檢測。檢測層的上采樣系數都為2,也都保存了前一層特征圖尺寸相近的特征圖連接。再其次YOLO 就將輸出特征圖作為結果。如圖2 所示,YOLO 將圖像分割成邊長為S 的網絡單元格,然后對每個單元格的邊框的坐標、類標簽等信息進行預測,其網絡輸出為一個有(B*(5+C))個參數的特征圖。表示每一個單元格可以預測B 個邊框數,并顯示5+C 個屬性,分別為每個邊框的中心坐標、維度、目標值和置信值[7]。預測出的邊界框中心點坐標可利用sigmoid 函數來精確,而邊界框的尺寸需要通過對輸出應用對數空間轉換,與錨點進行關系轉化得到。
YOLO 權重的訓練使用了國內的大型數據集CCPD[6]數據集,它包含了多種復雜場景下的車牌圖像,我們編寫了Python 文件處理腳本將其放于圖片名中的數據信息提取成YOLO 格式轉存之后,修改YOLO 網絡的參數,包括CFG 文件中的Classes 從原本的80 個對象調整為1 個,并相應的調整Filters 參數與之相匹配。降低了網絡的學習率和batch_size 使其能更好地適應我們電腦的配置,讓其更充分的利用GPU 性能。然后開始調用YOLO 的網絡進行迭代訓練,生成可繼續迭代的.pt 后綴的權重文件,經過長時間的反復resume 訓練,權重文件的準確率,日漸上升并達到我們的要求水平。最后我們將ArgumentParser 模塊的命令行參數全部整理封裝,使其能配合圖形界面窗口的接口的調用修改。
在完成對車牌的識別定位后開始對車牌中的字符串進行識別,這里我們使用了循環卷積神經網絡(CRNN)[5]。其結構如圖3 所示。

圖3 CRNN網絡結構圖
如圖3 所示,首先將車牌圖片的大小重設成同一高度并將其輸入卷積層,經過卷積層得到特征向量序列,在特征圖上從左到右生成這些特征向量,且對應于原始圖像的一個感受野,然后將這些特征向量的序列輸入循環層。在循環層里我們使用一個向前的LSTM和一個向后的LSTM 組合成一個雙向LSTM,并且可以在網絡中添加多個雙向LSTM 組件,這使得模型的魯棒性大大提高。在使用循環層來預測每一幀的標簽分布之后,再使用轉錄層將預測變為實際的標簽序列,在這里我們基于詞典模式,并預測具有概率最高的標簽序列[4]。
CRNN 的數據集我們采用中科大開源數據集CCPD 外,我們還使用了自制的數據集,但是這兩個數據集中“皖”與“蘇”的車牌占比過多而其他省份的車牌很少,所以我們還使用了模擬車牌的開源程序額外生成了一些包含各省份的模擬車牌圖像以增強模型對其他省份車牌的識別效果,數據集如圖4 所示。我們整理了所有圖片數據的車牌名稱,生成數據集標簽文件train.txt(image_name palte_number),將數據集制作成LMDB 格式的數據庫,并創建字典。

表1 車牌字典集
做好以上數據準備之后,調用CRNN 模塊進行訓練,網絡會自動編碼/解碼字典,經過5 萬多次的迭代之后生成的權重文件識別準確率達到了預期要求,現在字符識別準確率暫時為98.06%(3138/3200)。
此模塊在項目功能完成后消除了控制臺下的用戶不友好的弊端,使用Python 的Tkinter 庫實現了基本的操作界面,調用以上YOLO 和CRNN 兩大算法對圖片中車牌進行識別定位的軟件,軟件首先在本地選中圖片顯示在程序中,點擊“車牌定位”按鈕調用YOLO 神經網絡對原圖進行車牌識別定位,并將定位好的車牌圖片以及在原圖中的坐標和車牌尺寸顯示在程序中,再接著點擊“車牌識別”按鈕進行CRNN 不定長字符識別,并將識別結果顯示在程序中。

圖5 車牌識別程序界面圖

圖4 CRNN數據集
車牌識別軟件效果如圖6 所示,基本能識別所有復雜環境下的車牌,并準確識別車牌上的字符。能適應的環境包括:環境黑暗、鏡頭內有強光、車身反光、車身上有影子、車牌距離很遠或很近、車牌歪斜、雪天、雨天,等等。現在YOLO 定位準確率暫時為98%(588/600),而字符識別準確率暫時為98.06%(3138/3200)。
本文給出了YOLO 算法、CRNN 算法的核心思路以及基于該兩種算法的桌面端車牌識別軟件的程序。該程序對兩深度學習算法的應用有助于幫助讀者對深度學習算法的理解與應用,同時該程序能輔助識別定位圖片中的車牌位置和車牌文本內容,具有一定的實際意義。

圖6 軟件識別結果圖