基於深度學習的物體偵測

作者:Alex老師 編輯:TibaMe行銷團隊

傳統機器學習技術的物件偵測架構,通常是特徵萃取加上分類器以sliding widow的方式來實現,以人臉偵測為例,當如下這張圖中的window框住人臉時,理論上會輸出最高的confidence,然而,這樣的方法主要有幾個缺點,第一是這些特徵是人為設計的,所以複雜度較低,當人臉不夠正,或是五官變異性較大時,例如正臉與側臉,就需要不同的人臉偵測模型,也就是同一個模型無法同時偵測正臉與側臉。

人臉辨識

相較於人臉,要偵測任一角度的同一類物體那就更複雜了,例如車的種類有很多種,不同廠牌的貨車、房車、卡車從不同角度來看,長相都不同,因此,傳統的機器學習演算法最終發展出Deformable Part Model這樣的物體偵測演算法,其主要精神是將每一個物體區分成多個部位,且每個部位都有專用的分類器,搭配sliding window來克服淺層特徵無法偵測任一角度物體的問題。

在深度學習的時代,物件偵測的初始模型是two-stage的,也就是從一張影像中先找出region proposal,再利用CNN分類器對這個region proposal進行分類,如下圖的R-CNN是先以Selective Search這個方法從每張影像中提取兩千個region proposal,接著使用CNN提取每個region proposal裏的特徵,再利用SVM進行分類,達到多類物體偵測的功能。雖然使用CNN可以提取更為複雜的特徵,使得從任意視角偵測同一類物體的問題獲得改善,但R-CNN最主要的缺點是region proposal過多,使得系統幾乎無法達到即時運算,假使一個region proposal需要0.001秒的處理時間,兩千個region proposal就需要兩秒鐘,而這離即時運算所需的30 fps還有極大的差距。

有鑑於R-CNN每個region proposal都需要一個CNN的完整運算,它的加速版-Fast R-CNN,同樣是使用Selective Search提取region proposal,但每張影像只用CNN的卷積層處理一次,最後在conv5的特徵上,剪下對應region proposal位置的feature map並正規化成7×7的大小,最後再進行分類與bounding box位置的微調。雖然Fast R-CNN已經省去了每個region proposal在convolution layer的處理時間,但產生region proposal的方法-Selective Search仍然需要兩秒鐘才能完成一張圖中region proposal的提取。

針對Fast R-CNN的缺點,Faster R-CNN提出了RPN (Region Proposal Network)來提取region proposal,如下圖所示,後續的分類與bounding box大小與位置的微調還是使用Fast R-CNN。

RPN的具體實現方式是,在feature map上以sliding window的方式迴歸重心在這3×3 convolution kernel中心的物體類別(物體vs非物體)以及bounding box的大小(w, h)與位置(x, y),為了達到更好的bounding box精度,每個物體都會使用k個anchor box做為迴歸的基底。Faster R-CNN最終在Pascal 版的Titan X上可達到7 FPS,精準度更是進一步的提升,然而,這樣的two stage模型,由於模型的後半段,也就是Fast R-CNN的部份,每一個region proposal還是需要執行一次,使得速度依然離即時運算有很遙遠的距離,而正因為即時運算在物體偵測領域裏強烈的需要,第一個one stage模型才能橫空出世,而這個模型也就是鼎鼎大名的YOLO (You Only Look Once),也就是針對一張圖片,整個CNN中的每一層只會被執行一次。

YOLO的具體執行步驟如下圖所示,也就是先將每張圖正規化到448*448的尺寸,接著將這張圖輸入網路進行運算,在解讀最後一層的tesnor後,即可完成偵測,而這樣運算模式與影像分類CNN幾乎一樣,所以才能達到即時運算。

YOLO的具體實現方式基本上就是將圖分成很多個grid cell,如下圖所示,每個grid cell負責學習重心落在此grid cell上的物體的類別、大小以及位置,以PASCAL VOC(20類)此dataset為例,YOLO的設定是S=7,B=2,C=20,也就是每個grid cell可以偵測兩個同類型的物體,整張圖共有7*7個grid cell,最後輸出的tensor為S×S×(B×5+C),也就是7×7×(2×5+20)= 7×7×30=1470。

YOLO作者用ImageNet 2012此dataset來預訓練(pretrain)模型,此模型的top-5 accuracy達到了88%,而且作者自行開發了一個深度學習的框架,稱為Darknet,並將YOLO實現在Darknet上。

YOLO的loss function 如下,其實並不複雜,但作者在開發的過程中發現大多數的grid cell 內沒有物件,所以有物件的grid cell反而訓練效果不佳,為了解決這個問題,作者增加了在bounding box座標預測的loss權重 (λcoord=5)並降低那些不包含物件的grid cell,所對應的confidence權重(λnoobj=0.5)。

相較於Faster R-CNN,YOLO的辨識率低了10%,但速度快六倍多,這可謂是一相當具有貢獻的突破,而Fast YOLO速度進一步的達到了155 FPS,只是辨識率又再降了10%。

YOLO論文詳細分析了其與Fast R-CNN在物件偵測上錯誤的差異,如下圖所示,相較於Fast R-CNN,YOLO在背景的犯錯率較小,也就是比較不會有false-positive,但bounding box不夠準確,也就是IOU介於0.1與0.5間。

若是進一步的結合Fast R-CNN以及YOLO的偵測結果,Fast R-CNN的辨識率可提升3.2%,如下圖所示。

YOLO是第一個one stage的物件偵測模型,其速度即使在嵌入式系統或是手機上也能達到即時運算,因此,這樣的架構現在廣為先進駕駛輔助系統或是自駕車所用,YOLO的出現帶起了後續其它one stage模型的開發熱潮,而這類模型的後續進展就有待下一篇文章再來好好介紹。

立即點擊學習更多關於深度學習,購課輸入”2020TibaMeBlog”享TibaMe Blog讀者專屬非早鳥課程95折優惠

發表留言

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料