何梓林
(200093 上海 上海理工大學)
隨著社會交通事業的蓬勃發展,省、市際公路網、高速、橋梁及其收費網點迅猛增加,車輛智能分類越來越受到重視,直接促使車型分類辨認系統成為“智能交通”的一個重要組成部分。隨著計算機和數字圖像以及信號信息處理檢測技術的發展,機器視覺檢測器取代傳統檢測器進行車輛檢測已經成為一種具有巨大發展潛力的檢測方法[1]。
車型智能識別是指以數字圖像或視頻信號流作為研究對象,通過圖像處理與自動識別獲取機動車輛有關型號信息的技術。隨著計算機技術、軟件技術、模式識別技術等的快速發展,車型識別產品在智能交通系統中得到了廣泛應用。
文獻[2]將目前常見車型分為3 大類:客車、卡車和轎車。本文采集了1 650 余張圖片,將車輛分為6 種常見車型:公共汽車、轎車、消防車、卡車、中巴車和SUV。采用基于Tensorflow 框架、應用卷積神經網絡對6 種類型的汽車圖片進行處理、數據增強、建模、訓練、測試等,通過多次訓練校正神經網絡超參數,最終得到準確率約為92%的汽車類型識別神經網絡模型。
TensorFlow 是谷歌基于DistBelief 研發的人工智能學習系統,它將復雜的數據結構傳輸至人工智能神經網進行分析和處理。TensorFlow 完全開源,具有可移植性、可延伸性、高效性、靈活性等特點。目前,TensorFlow 機器學習逐漸成為一個重要的研究熱點[3],它提供了豐富的構建和訓練機器學習模型的 API 庫,支持卷積神經網絡(CNN)、循環神經網絡(RNN)、長短期記憶網絡(LSTMN)等深度神經網絡模型。
卷積神經網絡是近年發展起來并引起廣泛重視的高效識別方法。20 世紀中期,HUBEL 和WIESEL 在研究貓腦皮層中用于局部敏感和方向選擇的神經元時,發現其獨特的網絡結構可有效降低反饋神經網絡的復雜性,繼而提出了卷積神經網絡(CNN)[4]?,F在,CNN 已經成為眾多學科領域的研究熱點之一,特別是在圖片分類領域,由于該網絡無需對圖像進行復雜的前期預處理,甚至一張原始圖像不經處理即可作為其網絡的輸入對象,因而CNN 得到了廣泛的應用。
當電腦看到一個圖像(以圖像作為輸入)時,它看到的其實是一個像素值的數組。假設有一個JPG 格式的彩色圖像,它的大小是64×64,代表性的數組將是64×64×3,3 指的是RGB 值。這些數字中的每一個都有一個從0 到255 的值,它描述該點的像素強度。這些數字對于人類肉眼進行圖像分類時雖然毫無意義,卻是計算機唯一可利用的輸入信息。圖1 所示為一個完整的卷積神經網絡框架,由卷積層conv1、池化層p1、卷積層conv2、池化層p2 和全連接層構成[5]。

圖1 卷積神經網絡模型Fig.1 Convolutional neural network model
卷積神經網路中每層卷積層由若干個卷積單元組成,每個卷積單元的參數通過反向傳播算法優化得到。卷積運算的目的是提取輸入的不同特征,第1 層卷積層可能只提取一些低級的特征如邊緣、線條和角等層級,更多層的網絡就能從低級特征中迭代提取出更復雜的特征[6]。
如圖2 所示,經過一個3×3 的卷積核處理后,輸入圖像已經顯得棱角分明、畫面清晰。該卷積利用圖像的邊緣信息比周圍像素有更高的對比度,經過卷積之后進一步增強了這種對比,從而達到銳化圖像的效果。

圖2 卷積Fig.2 Convolution
池化層實際上是一種形式的降采樣,它具有多種不同形式的非線性池化函數,而其中“最大池化(Max pooling)”是最為常用的。最大池化是指將輸入的圖像劃分為若干個矩形區域,對其中每個子區域都輸出最大值。池化能夠有效的原因主要是發現一個特征之后,它的精確位置遠不及它和其他特征的相對位置的關系重要。池化層會不斷地減小數據的空間大小,因此會導致參數的數量和計算量下降,這在某種程度上也可以控制過擬合。常見的池化層除最大池化還有平均池化、全局平均池化、全局最大池化和重疊池化[7]。
對輸入圖像的卷積過程中,只存在少量的有用信息,大多數信息屬于冗余信息,采用最大池化能避免較多冗余信息的介入。
本文原始圖片數據主要是從湖南大學2018-2019 秋季學期《機器學習》課程項目提供的2 000余張標注了的車輛場景分類信息的高分辨率圖片和BIT-Vehicle 數據集中人工篩選出的。
BIT-Vehicle 數據集是北京理工大學實驗室公布的一批數據,包含9 850 張車輛圖像,這些圖像包含照明條件、尺度、車輛表面顏色和視點的變化,數據集中的所有車輛分為6 類:公共汽車、微型汽車、小型貨車、轎車、SUV 和卡車[8]。本文將汽車分為6 種車型:公共汽車、轎車、消防車、卡車、中巴車和SUV,不同類型目標的圖片數目分別為156,258,155,302,145,289。
3.2.1 數據增強
一般而言,比較成功的卷積神經網絡往往需要大量的訓練數據,而實際情況中數據并沒有想象的那么多,為了進行更多訓練和獲取數據,一般采用2 種方法:一是獲取新數據,這往往需要在技術上投入大量成本;二是對已有訓練數據進行強化,比如對現有訓練數據進行翻轉、平移或旋轉以創建更多數據。通過數據增強,可以極大增加訓練的數據容量,提高模型的泛化性能,同時還增加了噪聲和數據,提升了模型的魯棒性,避免過擬合。
Keras 作為前端,在keras.preprocessing.image模塊中有專門用于做數據增強的圖片生成器ImageDataGenerator,每一次給模型一個“batch_size”大小的樣本數據,同時也可以在每一批次中對“batch_size”個樣本數據進行數量增強,擴充數據集大小以增強神經網絡模型的泛化能力。常見的增強手段有旋轉、變形、歸一化等等。如圖3 所示,9 張圖中第1 張為原圖,后8 張都是通過一定程度的翻轉變換、縮放變換、尺度變換、錯切變換、對比度變換等數據增強手段得到的圖片[9]。通過數據增強后的數據集各車型數目如表1 所示。

圖3 數據增強Fig.3 Data enhancement

表1 數據增強后各車型數目Tab.1 The number of models after data enhancement
3.2.2 數據預處理
由于神經網絡在接收輸入圖片時,只能接收一個或幾個固定的尺寸,原始圖片數據集的尺寸又各式各樣,所以將圖片輸入到卷積神經網絡之前,需對圖片進行預處理及優化。考慮到每張圖片具有不同的形狀和大小,所以對圖片數據集的第1 步處理是使圖像大小相同,本文中將數據集圖片統一處理成64×64 像素大小的圖片。
除圖像尺寸需要統一外,還要對圖像色彩進行調整。色彩調整包括對圖像的亮度、對比度、飽和度和色相方面的調整,訓練神經網絡模型時將隨機調整這些屬性,目的是使經過訓練的模型盡可能少地受這些與圖像識別無關因素的影響,使CNN 模型更加穩定。
如前文所述,卷積神經網絡主要由輸入層、卷積層、池化層、全連接層和輸出層組成。ALEX Krizhevsky 在2012 年提出的Alexnet 深度學習模型引爆了神經網絡的應用熱潮,使得CNN 成為在圖像分類上的核心算法模型。首先,Alexnet 模型使用RelU 函數作為CNN 的激活函數,解決了梯度彌散問題;其次,在訓練時使用Dropout 隨機忽略一部分神經元,以避免模型過擬合;同時,在CNN 中使用重疊的最大池化,避免了平均池化的模糊化效果。本文搭建的卷積神經網絡模型即是在AlexNet 模型的基礎上,改變原網絡的卷積層,采用2 個3×3 的卷積層堆疊,同時對全連接層參數進行調整。
本文以Tensorflow 為后端,keras 作為前端進行建模,分別對每層進行介紹:
(1)Input 層:為輸入層,卷積神經網絡的輸入數據是維度為64×64×3 的圖像,即輸入圖像的高度為64,寬度為64,色彩,通道數為3。
(2)Conv1 層:為卷積神經網絡的第1 個卷積層,使用的卷積核為(3*3*1)*64(卷積核大小為3*3,輸入通道為1,輸出通道為64),步長為1,Padding 為same 方式,保證輸入圖片大小和輸入圖片大小一致。
(3)Conv2 層 :為卷積神經網絡的第 2 個卷積層,使用的卷積核為(3*3*64)*64,步長為1,Padding 為same 方式。
(4)MaxPool1 層 :為卷積神經網絡的第1個最大池化層,池化核大小為3×3,步長為2,Padding 為valid 方式,即對邊界數據不處理。
(5)Dropout1 層:在訓練的時候以1/2 概率使得隱藏層的某些神經元的輸出為0,這樣就丟掉了一半節點的輸出,反向傳播的時候也不更新這些節點。
(6)batch_normalization 層:批量歸一化層,使數值更穩定,使深層神經網絡更容易收斂而且降低過擬合風險。
(7)Conv3 層 :為卷積神經網絡的第3 個卷積層,使用的卷積核為(3*3*64)*128,步長為1,Padding 同為same 方式。
(8)Conv4 層 :為卷積神經網絡的第4 個卷積層,使用的卷積核(3*3*64)*128,步長為1,Padding 為same 方式。
(9)MaxPool2 層 :為卷積神經網絡的第2個最大池化層,池化核大小為為3×3,步長為2,Padding 為valid 方式。
(10)Dropout2 層:同樣在訓練的時候以1/2概率使得隱藏層的某些神經元的輸出為0。
(11)batch_normalization 層:批量歸一化層。
(12)FC5 層:為卷積神經網絡的第1 個全連接層,首先要對輸入的特征圖進行扁平化處理,將其變成維度為1×28 800 的輸入特征圖,本層要求輸出數據的維度是1×2 304。
(13)Dropout3 層:在訓練的時候以1/2 概率使得隱藏層的某些神經元的輸出為0。
(14)FC6 層:為卷積神經網絡的第2 個全連接層,輸入數據的維度為1×2 304,輸出數據的維度是1×1 000。
(15)Dropout4 層:在訓練的時候以1/2 概率使得隱藏層的某些神經元的輸出為0。
(16)FC7 層:為卷積神經網絡的分類層,采取softmax 多分類函數,輸入數據的維度為1×1 000,輸出數據的維度要求是1×6,表示6種車型,最后得到輸出數據的維度為1×6。
如表2 和圖4 所示,在學習率為0.01,激活函數選擇ReLU,優化算法選擇SGD,訓練2 h 后迭代150 次時,模型已經開始收斂且準確率曲線波動不超過2%,訓練集準確率接近1,損失函數值在0.06 左右,驗證集綜合準確率能達到92%;損失函數值在0.36 左右,各車型驗證集上的準確率都能達到85%以上。模型依然存在過擬合現象,原因是數據特征過多,而數據量不足,可以繼續增加圖片數據集數量或者進一步使用數據增強手段以降低過擬合。

表2 CNN 模型驗證結果Tab.2 CNN model validation results

圖4 訓練結果Fig.4 Training results
保存訓練好的模型最后進行預測,從數據集庫中選擇新鮮的圖片輸入,輸出結果如圖5 所示,可以成功預測出輸入圖片的正確車型。

圖5 預測結果Fig.5 Predicted results
本文說明了車型識別在智能交通領域的重要意義,介紹了Tensorflow 機器學習架構和卷積神經網絡的基本原理。
通過多種數據增強手段對原有數據集進行擴充,提高了模型在驗證集上的準確率,降低了CNN 模型的過擬合;基于Alexnet 神經網絡模型,采用Dropout 以降低過擬合,同時使用堆疊的最大池化層,有效避免平均池化的模糊化效果,采用兩層3×3 的卷積層堆疊,一方面減少了參數量,加快了模型的訓練速度,另一方面每層可以使用兩次ReLU 激活函數,使得CNN 對特征的學習能力更強;通過對模型的多次訓練調整,最終得到準確率達92%的車型識別CNN 模型,并能準確預測出新的圖片數據。