網頁

2018年3月20日 星期二

用Fast R-CNN 定位車牌位置

R-CNN、Fast R-CNN、Faster R-CNN 作為CV領域中較前沿的類神經網路,此三者為前後繼關係,總的來說,後者較前者要更快更準,這邊放上三篇論文的連結,有興趣的朋友可以詳加研讀。

R-CNN: https://goo.gl/vdarfC
Fast R-CNN: https://goo.gl/uAo2ZU
Faster R-CNN: https://goo.gl/m6sphE


這篇文章主要聚焦說明如何應用Fast R-CNN對車牌定位,文中多處為實踐心得,其中說明若有疏漏、錯誤,望大家不吝指教。

資料集


680*440*3的原始圖像


原始圖像是由停車場監視錄影中擷取的圖像,考慮到每次車輛入場的天氣、光影、角度都略有不同,因此將相異兩車子定義為:但凡兩車入場時間不同或車牌號碼不同,即為相異車輛,整個資料集共有相異車953輛,每輛車約有1~20張原始圖像,953輛車合計有10477張,扣除掉未含車牌的原始圖像後,剩下613輛車共4989張,最後將489輛車共3896張劃為訓練集,另124輛車共1093張則為測試集



Fast R-CNN 網路結構


Fast R-CNN


上圖是本文使用的網路架構,這種佈置即為所謂Fast R-CNN,Fast R-CNN是一種多輸入多輸出的網路,其中藍色部份為輸入層,紅色部份則為此網路的輸出層,以下就各結構依序說明。

Orig_Img_Input

用來輸入原始圖像,在這次的應用中,就是輸入由監視器錄影擷取的680*440*3的原始圖像。

ROIs_Input

用來輸入原始圖像的初始ROIs,本文同論文使用了Selective Search算法求得這些區域,若有其他更有效的初始ROIs方法也可替換。

Selective Search 效果

Conv_Block

這層接續Orig_Img_Input輸入的原始圖像進行一連串的卷積(Convolutional)運算,用來輸出特徵圖(Feature Map),與初始的ROIs一同於下層運算,論文使用VGG16前半段的卷積部份,本文受限計算機性能,僅採六層卷積,前三層為各四組3*3的卷積核,後三層為各八組3*3的卷積核。

ROIs_Pooling

這一層是整個Fast R-CNN最精妙之處,這層的運作方式下圖所示:

1. 將初始ROI映射至輸入的Feature Map

ROI映射至Feature Map


2. 計算n*n的Max Pooling

計算n*n的Max Pooling


本文設置的n為5,也就是680*440*8的Feature Map輸入,最終輸出5*5*8的ROI Feature Map。

Flatten

這層僅用來將ROIs_Pooling中得到的ROI Feature Maps展開,以接續下一層全連接層(Fully Connected)

FC1~4

前兩層全連接層(FC1,FC2),用來接續Flatten中展至一維的ROI Feature Maps特徵,Fit兩層後,再輸入對應Class_Output的FC3、ROIs_Output的FC4,另外,網路訓練時本文在FC1至FC2間加入Dropout 50%,在FC2至FC3、FC4間則加入Dropout 25%,FC1~4的神經元個數則分別為:2048、2048、256、256

Class_Output

這層輸出網路預測的每個ROI的分類得分,如果“前景”類別有K類,即輸出K*1維向量。

ROIs_Output

這層輸出初始ROIs的誤差(x_error, y_error, width_error, height_error),如果“前景”類別有K類,輸出(K+1)*4維向量,其中“+1”代表背景,“*4”分別代表四項誤差值。

與R-CNN比較


R-CNN


從上面這張圖可以很清楚的發現,R-CNN會對輸入的每一個初始ROI卷積運算,在傳統CNN輸出類別得分前取FC2層輸出的特徵值以額外訓練SVM及Linear Regression,此二者分別輸出ROIs的類別得分及初始ROIs的誤差,整體而言,R-CNN有兩大缺陷:

  1. 大量的ROIs卷積計算
  2. 須分別訓練三組模型


Fast R-CNN則藉由ROIs_Pooling的設計,每次只對原始圖像卷積運算,避免了大量的ROIs卷積計算,最後則將SVM及Linear Regression的功能整合至類神經模型中,避免了分別訓練的窘況,Fast R-CNN之"Fast"便是體現在此。



訓練Fast R-CNN


如前面所述,Fast R-CNN是一種多輸入多輸出的類神經網路,實務上仍有一些細節需要注意,下面依序敘述:

初始ROIs標記Label (“背景”、“前景”)

原始圖像經過Selective Search計算後約可得到1K~2K不等的初始ROIs,然後以初始ROIs及真實ROIs的IOU作為標準標記,因車牌定位是一個二元辨識的問題,無須細分,如果問題是一個多分類問題,那麼便須再細分前景的Label。

分類標準

計算初始ROIs的誤差

每一個ROI由四個數值組成,分別為 x, y, width, height,故只須將真實的ROI數值減去初始前景ROI的四個數值,即可得到誤差值,若初始ROI為背景,則誤差值一概為0。

誤差算法

訓練策略

至此,每一個初始ROI已經標記了Label,也計算了誤差,考慮到Selective Search製造了大量的初始ROIs,且其中絕大多數為負樣本,自不可全樣本輸入模型訓練,所以,這裡用採樣的作法進行訓練:

  1. 隨機抽取原始圖像250張
  2. 由此250張每張隨機抽取正樣本64筆,負樣本64筆,共128筆。
  3. 若某原始圖像正負樣本任一不足64筆,則過採樣(Oversampling)至64筆為止。
  4. 輸入模型倒傳遞訓練50次(Epochs)
  5. 回到步驟1



測試結果


原始圖像與經Selective Search計算後得到的初始ROIs雙雙輸入至神經網路後,最後得到輸出的類別得分及初始ROIs的誤差值,首先刪去“背景”類別的初始ROIs,接著將留下的“前景”類別的初始ROIs加上神經網路輸出的誤差值得到最終的預測ROIs,計算這些預測ROIs與真實ROIs的IOU,針對每張原始圖像,只要任一預測ROI與真實ROI的IOU≧80%即認為此原始圖像為正確辨識,其中一輛車含10~20張原始圖像不等,任一原始圖像正確辨識即認為此車輛正確辨識,下表是網路經過2300次Ecpchs後的表現,除了原始圖像及車輛的Accuracy外,下表第三欄為預測的ROIs在原始圖像中的平均數量。
Accuracy

最終效果

最後附上在Keras上輸出的模型細節:


模型細節



總結


上述的這些步驟及方法絕非定論,事實上還有許多提昇空間,也希望各位朋友多多指教,另外,本文僅著墨於車牌的定位方法上,未提及車牌內的字元定位及識別,下一篇將延續本文進一步說明如何利用Fast R-CNN對車牌字元進行定位及最後的識別。

沒有留言:

張貼留言