白 楊, 姚桂林
(哈爾濱商業(yè)大學 計算機與信息工程學院, 哈爾濱 150028)
近年來,隨著人們生活水平的不斷提高,汽車的數(shù)量不斷激增,安全駕駛[1]成為人們所關(guān)注的問題,智能交通輔助駕駛系統(tǒng)[2]的出現(xiàn)使得危險駕駛的機率大大降低.與此同時無人駕駛[3]也成為各大公司的研究熱點,例如百度在無人駕駛方面就做出了很大的貢獻.在未來,無人駕駛將成為人類研究的一個熱點,但是無論是智能交通輔助駕駛系統(tǒng)還是無人駕駛,交通標志識別[4]都是其重要組成部分之一.
早期交通標志識別方法主要采用的是圖像形態(tài)學[5]、圖像分割技術(shù)[6]、圖像特征提取[7]以及傳統(tǒng)的機器學習算法[8]進行識別的.這些傳統(tǒng)方法雖然表現(xiàn)良好,但是真實世界的交通標志容易受到環(huán)境、天氣等因素的影響,造成準確率降低.卷積神經(jīng)網(wǎng)絡(luò)(CNN)[9]的出現(xiàn)成功解決了這個難題,并且在圖像識別領(lǐng)域有著出色的表現(xiàn).Lecun Y等提出了LeNet-5網(wǎng)絡(luò)模型[10],該網(wǎng)絡(luò)模型在MNIST手寫數(shù)字識別[11]上取得了較好的效果,準確率在97.5%~98.2%之間.Krizhevsky等提出了深度卷積神經(jīng)網(wǎng)絡(luò)AlexNet網(wǎng)絡(luò)模型[12],在2012年的ILSVRC比賽中奪得冠軍.
卷積神經(jīng)網(wǎng)絡(luò)由輸入層、卷積層、池化層和輸出層構(gòu)成.輸入層的作用是將數(shù)據(jù)輸送到網(wǎng)絡(luò)中,數(shù)據(jù)可以是各種形式的,如果輸入的是一張圖片,可以將這個圖片看成一個矩陣輸入到卷積神經(jīng)網(wǎng)絡(luò)中.卷積層的主要任務(wù)是對輸入層傳遞來的數(shù)據(jù)做處理,就是對數(shù)據(jù)做卷積運算,從而提取數(shù)據(jù)的特征.卷積運算和數(shù)字圖像處理中的“濾波”比較相似,卷積核以一定的步長在輸入數(shù)據(jù)上進行滑動,然后將卷積核的元素與對應的數(shù)據(jù)相乘在相加求和,這樣就得到輸入數(shù)據(jù)各個區(qū)域的特征.每進行一次卷積運算,輸入數(shù)據(jù)的尺寸就會變小,在進行多次卷積運算之后,輸入數(shù)據(jù)的尺寸會變得很小,這樣不但造成了數(shù)據(jù)的大量丟失,還會使后續(xù)的卷積運算無法正常進行.為了防止這種情況出現(xiàn)會在輸入數(shù)據(jù)的外圍添加元素0,這樣既避免了數(shù)據(jù)的丟失而且添加的元素不會影響后續(xù)結(jié)果.池化層的主要任務(wù)是對經(jīng)過卷積層的數(shù)據(jù)進行下采樣,用來減少數(shù)據(jù)尺寸的大小,防止網(wǎng)絡(luò)過擬合[13].見圖1.
圖1 卷積神經(jīng)網(wǎng)絡(luò)模型
卷積神經(jīng)網(wǎng)絡(luò)的訓練是指從訓練數(shù)據(jù)中獲取最優(yōu)權(quán)重參數(shù)的過程.訓練過程如下:首先從數(shù)據(jù)集中選取一批圖像輸入到卷積神經(jīng)網(wǎng)絡(luò)中,然后對數(shù)據(jù)進行卷積運算,提取物體的特征、輪廓等信息,接著對數(shù)據(jù)使用激活函數(shù)進行變換,將變換后的數(shù)據(jù)送入到池化層中,池化層對這些數(shù)據(jù)進行下采樣以減小數(shù)據(jù)的長和寬,再將這些數(shù)據(jù)展成一維數(shù)據(jù),最后使用softmax函數(shù)進行分類.
在整個訓練過程中會使用激活函數(shù)和損失函數(shù),這里使用的激活函數(shù)是非線性函數(shù),因為卷積神經(jīng)網(wǎng)絡(luò)的每一層中輸入的數(shù)據(jù)和輸出的數(shù)據(jù)之間是線性關(guān)系的,如果沒有非線性函數(shù)做變換,網(wǎng)絡(luò)的層數(shù)將失去意義.損失函數(shù)用來衡量預測值與真實值之間的差距,這個差距叫做誤差.誤差產(chǎn)生的原因在于神經(jīng)網(wǎng)絡(luò)的權(quán)重值,不同的權(quán)重值會輸出不同的結(jié)果,找到合適的權(quán)重是減小誤差的關(guān)鍵.所以每訓練一次就要對權(quán)重進行更新,更新權(quán)重的方法是利用誤差反向傳播來更新,也就是根據(jù)權(quán)重大小來分配每個節(jié)點的誤差,權(quán)重大的節(jié)點分配的誤差多一些,權(quán)重小的節(jié)點分配的誤差小一些,然后將誤差由輸出層向輸出層的前一層傳播,這就叫誤差的反向傳播.根據(jù)這個原則為每個節(jié)點分配誤差,然后對誤差求偏導數(shù),找到使誤差最小的權(quán)值,然后更新權(quán)重,在重復多次這樣的步驟后就能找到使誤差最小的權(quán)值.見圖2.
圖2 卷積神經(jīng)網(wǎng)絡(luò)訓練流程圖
LeNet-5作為卷積神經(jīng)網(wǎng)絡(luò)的經(jīng)典模型,在手寫數(shù)字識別領(lǐng)域有著不錯的效果,但是在交通標志識別領(lǐng)域的效果表現(xiàn)較差.不過LeNet-5經(jīng)典網(wǎng)絡(luò)結(jié)構(gòu)對于構(gòu)造交通標志領(lǐng)域的卷積神經(jīng)網(wǎng)絡(luò)有著很好的指導價值,因而對LeNet-5網(wǎng)絡(luò)進行改進,構(gòu)建新的卷積神經(jīng)網(wǎng)絡(luò)以獲取更好的性能.
原LeNet-5網(wǎng)絡(luò)的輸出層原本由10個節(jié)點組成,每個節(jié)點的輸出是識別出的數(shù)字,在交通標志的識別中,交通標志的種類有62類,所以最終的輸出應該為由softmax輸出62類.
原LeNet-5網(wǎng)絡(luò)使用的是sigmoid激活函數(shù),sigmoid函數(shù)的值是介于0~1之間,并且容易求導.在負無窮遠處函數(shù)值趨近于0,正無窮遠處函數(shù)值趨近于1,但是函數(shù)左右兩側(cè)圖像趨于平緩,梯度值逐漸趨近于0,容易造成梯度消失,減慢收斂速度,甚至造成網(wǎng)絡(luò)無法學習.為了解決這個問題,將sigmoid激活函數(shù)用relu激活函數(shù)替代.
神經(jīng)網(wǎng)絡(luò)的學習目的是為了找到使損失函數(shù)的值盡可能小的權(quán)重參數(shù)值,尋找這個參數(shù)的過程稱為最優(yōu)化.原LeNet-5網(wǎng)絡(luò)使用的是隨機梯度下降法(SGD)[14],這種方法的缺點是權(quán)重更新的方向過分依賴于當前的batch,造成更新的不確定性,為了解決這個問題采用Adam優(yōu)化算法[15],Adam優(yōu)化算法計算高效,內(nèi)存使用較少,對目標函數(shù)平穩(wěn)沒有要求,對存在較多噪音的樣本也能很好的處理.
對網(wǎng)絡(luò)模型的池化層也進行了改變,原LeNet-5網(wǎng)絡(luò)使用的是平均池化,平均池化是將濾波器范圍內(nèi)的值求和取平均值,得到輸出.在圖像識別領(lǐng)域使用更多的是最大池化,最大池化是將濾波器范圍內(nèi)的值取最大的值作為輸出,最大池化對細微的變化具有較強的魯棒性.
本文的卷積神經(jīng)網(wǎng)絡(luò)詳細參數(shù)如表1所示.
表1 本文卷積網(wǎng)絡(luò)詳細參數(shù)
本文使用的數(shù)據(jù)集是比利時交通標志數(shù)據(jù)集,該數(shù)據(jù)集共有4 575張訓練圖片和2 520張測試圖片,并且數(shù)據(jù)集擁有62種不同的交通標志.由于數(shù)據(jù)集中的圖片尺寸大小不一,為了使卷積神經(jīng)網(wǎng)絡(luò)的全連接層的輸入大小固定,防止網(wǎng)絡(luò)發(fā)生變化,對圖像尺寸大小進行調(diào)整,將圖像的尺寸裁剪為64×64.為了提高網(wǎng)絡(luò)的性能,將圖片的像素歸一化到0~1之間.
本文所使用的比利時交通標志數(shù)據(jù)集圖片數(shù)量較少,網(wǎng)絡(luò)容易造成過擬合,為了解決這個問題,使用數(shù)據(jù)增強的方式來增加訓練集圖片的數(shù)量,提高模型的泛化能力.本文對訓練數(shù)據(jù)集中的圖片翻轉(zhuǎn)一定角度、平移一定距離、增加圖片對比度來增加樣本數(shù)量.
3.3.1 學習率的選擇
學習率對網(wǎng)絡(luò)模型的選擇和網(wǎng)絡(luò)的訓練有著重要的作用.梯度下降速率的快慢取決于學習率,學習率越大,每次梯度下降的速度越快,權(quán)值變化幅度越大,容易錯過最小值點.學習率越小,每次梯度下降的速度越慢,權(quán)值變化幅度越小,容易陷入局部最小值點,造成收斂速度變慢.本文選擇了0.001、0.005、0.0005、0.0006、0.0007、0.0008、0.0009 七組學習率進行實驗.
表2總結(jié)了不同學習率對準確率和損失值的影響.從表2中可以看出,表現(xiàn)最好的學習率是0.000 8,準確率是98.26%,損失值為0.09,而其他的學習率、準確率均不超過98%,損失值均大于0.109,綜上所述最終學習率選擇0.000 8.
3.3.2 激活函數(shù)的選擇
本文選取了relu函數(shù)、sigmoid函數(shù)、tanh函數(shù)和softplus函數(shù)這四種激活函數(shù)進行實驗.
從表3中可以看出,softplus激活函數(shù)表現(xiàn)效果最差,準確率只有2.4%,sigmoid激活函數(shù)表現(xiàn)稍好,準確率有91.42%,tanh激活函數(shù)表現(xiàn)更好,準確率有95.27%,表現(xiàn)最好的是relu激活函數(shù),準確率有97.24%.
表2 不同學習率對準確率和損失值的影響
表3 不同激活函數(shù)對準確率和損失值的影響
3.3.3 添加Dropout層
Dropout是神經(jīng)網(wǎng)絡(luò)最有效也是最常用的正則化方法之一.對某一層使用Dropout,就是在訓練過程中隨機將該層的一些輸出特征舍棄.本文將Dropout的比率設(shè)置為0.5,也就是說每次將有一半的特征被舍棄.
從表4中可以看出,采用Dropout層比不采用Dropout層的準確率要高.
表4 Dropout層對準確率的影響
綜上所述,本文的算法使用的學習率是0.000 8,采用relu激活函數(shù),在訓練過程中使用Dropout層,對數(shù)據(jù)集訓練50次.圖3顯示的是訓練過程和預測過程.剛開始訓練時訓練集的損失值在迅速下降,準確率在迅速提升,測試集亦如此.當訓練次數(shù)大于10次以后,訓練集和測試集的損失值下降緩慢,甚至產(chǎn)生一些波動,準確率變化相同.
圖3 損失值和準確率的變化曲線
圖4是4張測試集的圖像,這4張圖像各有特點第1張圖片是在移動的物體上進行拍攝的,拍攝出來的圖片比較模糊.第2張圖片是在陽光充足的地方拍攝的,整個圖片比較亮.第3張圖片是一個發(fā)生形變的交通標志.第4張圖片是一個由樹木遮擋的交通標志.方括號中的數(shù)字代表交通標志的類別,后面的數(shù)字代表分類的準確率.可以看出這四張圖片分類的準確率均為100%,事實上對測試集中的所有圖像,分類的準確率均在98%以上.
圖4 4種不同環(huán)境下的交通標志
本文重點研究了基于Keras交通標志識別系統(tǒng)的設(shè)計與實現(xiàn).選擇比利時交通標志識別數(shù)據(jù)庫作為本文的數(shù)據(jù)集,對其進行了預處理操作,預處理的主要內(nèi)容是將數(shù)據(jù)集中尺寸不一的圖片統(tǒng)一成64×64.為了防止訓練數(shù)據(jù)集中樣本數(shù)量不足,使用數(shù)據(jù)增強的方式對訓練數(shù)據(jù)集中的圖片進行操作,增加了樣本的數(shù)量.介紹了卷積神經(jīng)網(wǎng)絡(luò)的搭建,通過卷積、池化、全連接層將神經(jīng)網(wǎng)絡(luò)搭建出來,然后使用訓練好的模型對測試集進行測試,并將測試結(jié)果可視化.對不同的學習率、不同的激活函數(shù)和是否添加Dropout層做了實驗和分析,找出了最優(yōu)的方案.對一些復雜環(huán)境下的交通標志進行了測試,包括光照較強或較暗、陰雨天、被部分遮擋和發(fā)生形變等各種情況,結(jié)果表明本文的算法具有一定的實用性,在魯棒性和準確率方面表現(xiàn)較好.