介紹
對於Udacity(優達學城)自動駕駛汽車納米學位的汽車檢測和跟蹤項目,如果使用傳統的計算機可視化技術將是一個挑戰,就像方向梯度直方圖(Histogram of Oriented Gradients,HOG)和其它特征組合在一起在視頻里跟蹤汽車一樣,理想的解決方案應該是實時運行的,如>30FPS,我曾經使用線性SVM來處理視頻,在一台i7 CPU計算機上得到的結果只有可憐的3FPS。最后我使用YOLO來處理視頻終於通過了Udacity的項目,YOLO是一個超快的用於對象檢測的卷積神經網絡,如果你的GPU夠快(我當時使用的是GTX 1080),視頻處理的速度可以達到65FPS,比我用SVM+HOG的方法足足快20倍。
數據集
我使用了KITTI和GTI數據集,以及來自項目訓練倉庫的一些其它數據,只有兩類數據:有車的和沒有車的,GTI數據從視頻流獲得,因此所有圖像都完全是隨機的,然后被分為訓練和測試數據集,在訓練和測試數據集之間建立相關關系,我將每個數據源30%的數據集作為驗證和測試數據集,所有圖像都被重置為64x64像素的大小,以便於特征的提取。
特征提取
我使用的特征向量如下:
空間特征:除了用於自檢的像斑(16x16像素)外啥都沒有。
顏色直方圖特征:捕獲每個像斑的統計顏色信息,通過這種特征向量捕獲的汽車顏色通常是非常飽和的。
方向梯度直方圖(HOG)特征:捕獲每個圖像通道的梯度結構,在不同的光線條件下,這種方法表現得還不錯。
在這篇博客里有關於HOG特征的詳細描述,其思想始終是,在一個直方圖里,在一個圖像上聚集梯度,讓特征向量在不同視角和光線條件下變得更加穩定。下面是HOG特征應用於有車的和沒車的圖像上時的可視化呈現。
最后一個特征向量包含前面3個不同方法提取的特征,因此有必要對每一個特征進行計量,防止因取值范圍不同導致某一特征占主導地位,我使用了scikit學習包中的Standard.Scaler函數,通過移動平均值和按比例縮放到單位方差來標准化特征。
訓練一個線性支持向量機
和其它分類和檢測問題不同,檢測汽車需要強實時,因此,要在高准確性和速度之間取得平衡,影響性能最主要的兩個參數是特征向量的長度和汽車檢測算法,線性SVM在速度和准確性之間提供了最好的折中方案,比隨機森林(快但准確性不夠)和非線性SVM(rbf內核,非常慢)的表現要好得多。最后測試時使用了一個包含6156個特征的特征向量,准確性超過了98.5%,但仍然有將近1.5%的像斑時不時的晃眼,特別是車道線、事故故障和欄桿。
滑動窗口
通常情況下,汽車檢測和攝像機使用滑動窗口掃描圖像一幀一幀記錄類似,對每個窗口而言,通過計算特征向量並輸入到分類器中,汽車在不同距離出現時,有必要搜索多個尺度,通常會有100多個特征向量需要提取,然后輸入到分類器中,對每一幀圖像進行處理。下面是正面檢測大約150個窗口的例子,不出意外,仍然會有一些失誤。
為了過濾掉誤判結果,我一直跟着檢測窗口直到最后30幀,只考慮被准確識別的圖像,最后有超過15次檢測被記錄下來,我用熱圖來呈現最終結果,可以看到噪點大大減少,
通過熱圖的閾值,包含所有非零值的熱圖最小矩形邊界框就可以確定下來。