交通標誌識別

交通標誌識別實際上包括交通標誌的檢測和識別兩個過程,檢測是在圖像中尋找到感興趣目標並定位,識別是對感興趣目標進行分類。現在R-CNN系列、YOLO、SSD能夠很好的將檢測和分類兩個過程融合到一起,並且在PASCAL VOC等數據集上取得了很好的效果,但對像交通標誌這種小目標的檢測效果並不好。就交通標誌檢測而言,如果在Faster RCNN的anchor中,將scale調小一點,ratio調下再做訓練,是可以很好的檢測到圖像中尺寸較小的交通標誌;也可以訓練級聯CNN,將目標檢測問題轉化爲分類問題。傳統的檢測方法中,可以人工設計特徵來檢測感興趣目標,例如可以利用交通標誌的顏色和形狀等信息來檢測並定位到交通標誌;然後對檢測到的標誌進行識別或分類,判斷它是哪種交通標誌。
我們暫時先不考慮檢測問題,先做分類實驗。利用卷積神經網絡來試試交通標誌識別的效果如何。
The German Traffic Sign Recognition Benchmark是IJCNN 2011舉辦的一個圖像分類挑戰賽,其提供了GTSRB數據集,共包含了43類交通標誌,訓練樣本39209張,測試樣本12630張。提供的樣本圖像中包含了標誌區域及其周圍10%的區域(這是爲採用邊緣方法者所考慮),樣本圖像尺寸範圍爲15x15到250x250,當然它不一定是正方形。
這裏寫圖片描述
該挑戰賽的冠軍是IDSIA團隊所採用的Multi-column Deep Neural Network即多列深度神經網絡的方法來進行交通標誌識別,最後在43類交通標誌的識別準確率達到了99.46%,超過了人類表現的98.84%。該方法採用了25個具有完全相同網絡結構的DNN(實際上是總共9層的卷積神經網絡) Paper地址
這25個DNN分別對應了五種輸入數據,包括原圖像以及原圖經過四種不同的預處理後得到的圖像共五種;然後每種都採用五個不同的隨機網絡初始值來訓練,得到網絡結構和參數相同但訓練得到的網絡權重不同的DNN模型。
測試時將每張圖像做四種預處理得到共五張輸入圖像,再將每張圖象都送入到其對應的五種網絡初始值不同的DNN中,然後將求得的共25個分數做平均得到最後的識別結果。
其DNN結構實際上是在三個卷積層後面跟上兩個全連接層做分類,輸入圖像固定尺寸爲48x48。GTSRB數據集下載地址如下,分別下載訓練集和測試集。數據集下載地址
下載得到的GTSRB數據集的格式是ppm格式,需要轉換成jpg格式。註解標籤存放在csv文件中,包括了位置標籤(包圍標誌的最小矩形框位置)和類別標籤,通過位置標籤進行裁剪並縮放到固定尺寸,固定尺寸大小48x48,下圖爲裁剪縮放後測試集的部分圖像,有的標誌人眼都很難分辨,若將其進行直方圖均衡等預處理則可能會更容易識別。IDSIA團隊採用的多列DNN方法所達到的99.46%的超過人眼的識別水平確實很高。
接下來我們來做交通標誌的識別實驗,暫時先不考慮多列問題。這裏提供 項目下載地址
這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述

1.數據集準備

暫時先不考慮數據增廣(後面會提到有關預處理)。
如果你對數據集的製作不感興趣,可以跳過後面的製作過程,項目中提供已經轉換好的可以直接作爲caffe輸入,解壓‘GTSRB數據集’文件夾,包含了tran_lmdb文件夾、val_lmdb文件夾和mean.binaryproto文件,將上述三個文件放在data\gtsrb文件夾下
這裏寫圖片描述
下面簡單介紹數據集的製作過程。
由於GTSRB提供的下載數據集格式是ppm格式,需要轉化成jpg格式,數據集中的圖像是帶有周圍背景的,需要根據提供的csv文件裁剪出感興趣區域即最小包圍框,然後縮放到固定尺寸(這一步也可以在用caffe轉換成lmdb格式時來歸一化尺寸)。可以用下圖所示的matlab腳本實現之,包括如何讀取csv中圖像標籤信息、轉換PPM文件爲jpg格式,三種圖像預處理(後面會提到),以及生成train.txt、val.txt。
這裏寫圖片描述
這裏也提供轉化後的圖片數據集以及製作好的類別標註文本,下載鏈接,解壓得到‘GTSRB數據集’文件夾,將其放在data\gtsrb目錄下。需要注意的是,如果是在windows下使用caffe,train.txt中的’/’要替換成反斜槓’\’。
這裏寫圖片描述
這裏寫圖片描述
這樣就準備好了訓練和測試數據集以及對應的train.txt、val.txt。
因爲博主的前期預處理在windows下進行的,所以只介紹windows系統下轉化成lmdb文件。首先在caffe-master/data/gtsrb目錄下新建了一個create_gtsrb.txt,打開後加入以下代碼,其中包括了轉化訓練集、測試集(直接將測試集作爲驗證集,在驗證模型好壞的同時得到測試效果)、生成均值向量文件三個過程,關閉保存,修改後綴名爲.bat得到create_gtsrb.bat文件,直接雙擊執行就可以了。完成後會發現data/gtsrb文件夾下多出了tran_lmdb文件夾、val_lmdb文件夾和mean.binaryproto文件。

2.訓練卷積神經網絡

在models\gtsrb文件夾下,準備好網絡模型文件train_val.prototxt、訓練超參數文件solver.prototxt,測試時還需要用到deploy.prototxt,需要注意的是不要在prototxt中對樣本進行鏡像。卷積神經網絡結構如下圖:
這裏寫圖片描述
經過多次調整參數實驗後確定,我的訓練超參數solver.prototxt文件內容如圖,學習率0.001,步進式衰減,4000次迭代衰減10倍,最大迭代20000次,train_val.prototxt中訓練集和驗證集batchsize分別爲50和20,test_iter爲632次(12630/20),每次20個剛好能覆蓋12630個測試樣本,每5000次打印一次快照。
這裏寫圖片描述

3 實驗初步效果

以不做預處理的原圖訓練單列DNN最後的測試(驗證),迭代20000次後,準確率可以達到96%左右,由於隨機初始化最後的結果會稍有差異。

這裏寫圖片描述
下圖給出了部分識別出錯的標誌圖像,可以發現,部分圖像中標誌人眼很好識別但算法識別出錯,說明網絡在極端情況還有提升空間,還有一些傾斜嚴重、圖像質量太差、最小包圍框不夠準確等情況。
這裏寫圖片描述

4 實驗改進

考慮兩種改進思路:
(1)對數據集進行數據增廣,例如部分交通標誌具有水平鏡像或垂直鏡像的不變性,還可以對訓練樣本圖像隨機旋轉一個較小的角度來應對真實場景下圖像中的標誌傾斜問題(上圖中就有因標誌傾斜而出現識別出錯),訓練耗時增加而測試時耗時不變,泛化能力提高。
(2)採用多列深度網絡的思路,對原始數據集進行多種預處理得到多個數據集,對每個數據集採用同樣的網絡結構進行訓練,在測試時對測試圖像進行多種預處理,分別送入到各自的卷積神經網絡中,最後將輸出結果取平均。

博主首先對數據進行了增廣,對具有水平鏡像或垂直鏡像的不變性的標誌進行了鏡像,對所有標誌額外進行了隨機旋轉某個小角度,單列DNN的測試結果提高到96.79%。
然後採用了原數據集和經過三種預處理(圖像調整、直方圖均衡、自適應直方圖均衡)共四種數據源,每種採用兩個不同初始化的DNN網絡構成了的8列DNN,對8列DNN求平均的結果作爲輸出,最後將準確率提高到了97.88%(也犧牲了速度),12630張測試圖像中有268張識別出錯,相比於人類表現還有一段距離。
其中在做圖像預處理時,對彩色圖像進行對比度拉伸、直方圖均衡化和自適應直方圖均衡化,實際上先將RGB空間轉換到Lab顏色空間,其中L爲圖像亮度,取值範圍0~100,表示從純黑到純白,然後對亮度通道L進行對比度拉伸、直方圖均衡化和自適應直方圖均衡化,然後再轉回到RGB空間。
另外也曾嘗試在網絡中加入Relu層、Norm層和dropout層但效果均不理想,大家也可以試試改改網絡參數來刷準確率。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章