目標檢測——深度學習算法

前文簡單概述了目標檢測的傳統算法,本文將步入深度學習時代。ILSVRC 2012中AlexNet 的出現標誌着計算機視覺進入深度學習階段,目標檢測算法隨之在2014年問世了R-CNN算法框架。

各傳統算法的主要區別在於特徵提取的思路不同,如果用CNN提取特徵,我們便能得到一個粗略的基於CNN特徵提取的目標檢測算法:暴力搜索,從左到右、從上到下滑動窗口,利用分類識別目標。爲了在不同觀察距離處檢測不同的目標類型,我們使用不同大小和寬高比的窗口;輸入模型前再將窗口內的圖片縮放至統一的尺寸。但這種搜索方法運算量很大,效率低下,需要進一步優化。

R-CNN

爲了進一步改進,有人提出採用候選區域方法(Region Proposal method)創建目標檢測的感興趣區域(ROI),即進行選擇性搜索(selective search,SS)。基於這種Region Proposal 的思路,也就誕生了R-CNN(Regions with CNN features)。

候選區域如何產生

首先將每個像素都獨立作爲一區域。然後計算每個區域的紋理,並將兩個最接近的區域合併。爲了避免單個區域吞噬其他區域,優先對較小的區域進行合併。一直合併區域,直到所有區域都結合在一起。在這個過程中,出現過的所有區域,都將作爲候選區域。

      

算法概述

R-CNN 利用這種方法創建約 2000 個 Region Proposals。這些區域被縮放至固定大小的圖像,並使用卷積神經網絡進行特徵提取,再使用SVM對區域進行分類,及使用線性迴歸來校正邊界框,以實現目標分類並得到邊界框。

      

預備知識

基本概念之IoU

IoU的定義:框A與框B的IoU=(A∩B)/(A∪B),表示框A與框B的重合度(相似度)。R-CNN使用IoU來定量候選框與Ground Truth框之間的重合關係。

      

基本概念之NMS

非極大值抑制NMS在目標檢測的傳統算法裏就已經很常見,其作用是去除冗餘的候選框,保留最好的一個。

舉個栗子:

假設有6個候選框,根據分類器的類別分類概率做排序,假設從小到大屬於車輛的概率 分別爲A、B、C、D、E、F。

從最大概率矩形框F開始,分別判斷A~E與F的重疊度IoU是否大於某個設定的閾值;假設B、D與F的重疊度超過閾值,那麼就扔掉B、D;並標記第一個矩形框F,並保留下來的。從剩下的矩形框A、C、E中,選擇概率最大的E,然後判斷E與A、C的重疊度,重疊度大於一定的閾值,那麼就扔掉;並標記E是我們保留下來的第二個矩形框。如此一直重複,找到所有被保留下來的矩形框。

R-CNN算法框架

Step 1 大樣本 pre-training

使用大量有類別標籤的圖像進行類別訓練(CNN模型)。論文中“學習率=0.01,輸入爲227×227的ILSVRC訓練集圖像,輸出最後一層爲4096維特徵->1000類的映射”。

Step 2 特定領域的 fine-tuning

爲了讓CNN適應新的任務(即檢測任務)和新的領域(變形後的推薦窗口),再次使用變形後的推薦區域對CNN參數進行微調。採用來自各Region Proposals,與真實標註框(Ground Truth)的IoU>= 0.5就認爲是正例,否則就是負例。學習率=0.001(爲了在學習新東西時不至於忘記之前的記憶)。輸入圖像爲Region Proposals變形後的227×227的圖像,輸出維度不再是1000類,而是需要檢測的類別數+1(背景)。

至此,CNN特徵提取器構建完畢。

Step 3 SVM分類訓練

正樣本爲Ground Truth,負樣本爲與Ground Truth的IoU<0.3的Region Proposals。SVM採用的是二分類器,需要爲每個類別訓練單獨的SVM。

爲什麼不直接使用CNN的softmax輸出類別?對此的解釋摘自:R-CNN論文詳解

爲什麼單獨訓練了一個SVM而不是直接用softmax,作者提到,剛開始時只是用了ImageNet預訓練了CNN,並用提取的特徵訓練了SVMs,此時用正負樣本標記方法就是前面所述的0.3,後來剛開始使用fine-tuning時,也使用了這個方法,但是發現結果很差,於是通過調試選擇了0.5這個方法,作者認爲這樣可以加大樣本的數量,從而避免過擬合。然而,IoU大於0.5就作爲正樣本會導致網絡定位準確度的下降,故使用了SVM來做檢測,全部使用ground-truth樣本作爲正樣本,且使用非正樣本的,且IoU大於0.3的“hard negatives”,提高了定位的準確度。

Step 4 Bbox 迴歸訓練

訓練樣本爲:與Ground Truth的IoU>0.6的Region Proposal。這一步是用來對Region Proposal的位置和大小進行校正,使當前Region Proposal更接近Ground Truth框。簡單理解就是,訓練一組變換參數(平移參數dx,dy、縮放參數dw,dh ),使當前Region Proposal(x,y,w,h)(下圖中的P)能通過該變換能夠擬合到Ground Truth(下圖中的G)。

      

爲什麼選擇IoU>0.6d的Region Proposal進行訓練?作者認爲當IoU儘可能大時,迴歸模型是線性的(即可以使用平移縮放變換),否則模型將是複雜的非線性變換。具體理解可以參考:邊框迴歸(Bounding Box Regression)詳解

Bounding Box Regression實際上的輸入並不是Region Proposal 的位置參數(x,y,w,h),而是CNN的pool5層輸出特徵向量。具體關於Bounding Box Regression的介紹可以參考:

對Bounding-Box regression的理解

邊框迴歸:BoundingBox-Regression(BBR)

邊框迴歸(Bounding Box Regression)詳解

Step 5 測試

對於輸入圖像,提取候選框後,送入CNN進行特徵提取,然後再連接到SVM Classifier 和Bounding Box Regression,從而獲得類別預測和位置預測。

 

R-CNN家族的優化

SPP-Net

特點:

1、將提取候選框特徵向量的操作轉移到卷積後的特徵圖上進行。在R-CNN中,每個候選框先縮放到統一大小,然後分別作爲CNN的輸入,這樣是很低效的。SPP-Net對此進行了優化:只對原圖進行一次卷積得到整張圖的特徵圖,然後找到每個候選框在特徵圖上的映射patch,將此patch作爲每個候選框的卷積特徵輸入到SPP layer和之後的層。節省了存儲空間和計算時間,比R-CNN有一百倍左右的提速。

2、在最後一個卷積層和第一個全連接層之間做一些處理,引入了Spatial Pyramid pooling層,對卷積特徵圖像進行空間金字塔採樣獲得固定長度的輸出,可對特徵層任意長寬比和尺度區域進行特徵提取。
      

在得到卷積特徵圖之後,對卷積特徵圖進行三種尺度的切分:4*4,2*2,1*1,對於切分出來的每個小塊進行max-pooling下采樣,之後再將下采樣的結果全排列成一個列向量,送入全連接層。

例如每個候選區域在最後的512張卷積特徵圖中得到了512個該區域的卷積特徵圖,通過SPP層下采樣後得到了一個512×(4×4+2×2+1×1)維的特徵向量,這樣就將大小不一的候選區的特徵向量統一到了一個維度(避免了對候選框進行縮放)。

 

Fast R-CNN

特點

1、將原來的串行結構改成並行結構。

2、加入RoI pooling layer,它將不同大小候選框的卷積特徵圖統一採樣成固定大小的特徵。ROI池化層是簡化的SPP層,做法和SPP層類似,但只使用一個尺度進行網格劃分和池化。

步驟

1、特徵提取:以整張圖片爲輸入利用CNN得到圖片的特徵圖;

2、提取候選區:通過Selective Search等方法從原始圖片提取區域候選框,並把這些候選框投影到最後的特徵圖;

3、區域歸一化:針對特徵層上的每個候選框進行RoI Pooling操作,得到固定大小的特徵表示;

4、分類與迴歸:然後再通過兩個全連接層,分別用分類做目標識別,用迴歸模型進行邊框位置與大小微調。

 

Faster R-CNN

本部分節選自:計算機視覺目標檢測算法綜述

在Faster R-CNN之前,生成候選區域都是用的一系列啓發式算法(Selective Search),基於Low Level特徵(紋理相似性)生成候選框。這種做法生成了大量無效區域則會造成算力的浪費。Faster R-CNN提出 Region Proposal Network(RPN)網絡替代Selective Search算法,利用神經網絡自己學習去生成候選區域。RPN 使得神經網絡可以學到更加高層、語義、抽象的特徵,且生成的候選區域的可靠程度大大提高。從此,目標識別真正實現了端到端的計算,所有的任務都統一在了深度學習的框架之下,所有計算都在GPU內進行,使得計算的速度和精度都有了大幅度提升。RPN和RoI pooling共用前面的卷積神經網絡——將RPN嵌入原有網絡,原有網絡和RPN一起預測,大大地減少了參數量和預測時間。

算法思路:首先對整張圖片進行卷積計算,得到卷積特徵,然後利用RPN進行候選框選擇,再返回卷積特徵圖取出候選框內的卷積特徵利用ROI提取特徵向量最終送入全連接層進行精確定位和分類。簡言之:RPN+Fast R-CNN=Faster R-CNN。

      

在RPN中引入了anchor的概念,feature map中每個滑窗位置都會生成 k 個anchor,然後判斷anchor覆蓋的圖像是前景還是背景,同時迴歸Bounding box(Bbox)的精細位置,預測的Bbox更加精確。以論文爲例,每個滑窗(論文采用3*3卷積核通過滑窗提取候選框)對應的每個特徵區域同時預測輸入圖像3種尺度及3種長寬比(1:1,1:2,2:1)的候選框,也就是9個anchor。

R-CNN家族各算法的檢測速度對比:

      

 

YOLO

上文將Two stage 流派的主要算法簡單梳理了一下,我們來看一下目標檢測算法的發展簡圖。

 

      

在Two stage流派發展至高潮時,以YOLO爲代表的One stage流派誕生了,One stage主要關注檢測速度(FPS大大提升)。由於筆者的項目更加關注檢測精度,因此對One stage流派研究不多,此處僅簡述其核心觀點。

YOLO 的全稱是You Only Look Once,其核心思想就是利用整張圖作爲網絡的輸入,直接在輸出層迴歸 bounding box(邊界框) 的位置及其所屬的類別。R-CNN系列通過Bbox迴歸調整邊框的位置和大小,既然反正最後都是要調整的,幹嘛還要先費勁去尋找候選區呢,大致有個區域範圍就行了,所以YOLO就這麼幹了。

YOLO並沒有真正去掉候選區,而是採用了預定義的預測區,也就是將圖片劃分爲 7*7=49 個網格(grid)。如果某個 object 的中心落在這個網格中,則這個網格就負責預測這個 object。每個網格允許預測出2個邊框(bounding box,包含某個對象的矩形框),總共 49*2=98 個bounding box。可以理解爲98個候選區,它們很粗略的覆蓋了圖片的整個區域。每個 bounding box 除了要回歸自身的位置之外,還要附帶預測一個置信度。其中,bounding box的置信度 = 該bounding box內存在對象的概率 * 該bounding box與該對象實際bounding box的IOU。 

      

論文中,輸出是一個 7*7*30 的張量(tensor)。 7*7 就對應着輸入圖像的 7*7 網格,30維向量 = 20個對象的概率 + 2個bounding box * 4個座標 + 2個bounding box的置信度。

值得注意的是,YOLO的bounding box雖然像Faster R-CNN的Anchor(一個grid的2個Anchor),但有所不同,YOLO並沒有預先設置2個bounding box的大小和形狀。這裏採用的bounding box,有點不完全算監督算法,而是像進化算法。YOLO的2個bounding box事先並不知道會在什麼位置,只有經過前向計算,網絡會輸出2個bounding box。具體的請參考其他資料。其他內容諸如損失函數等等,也請參考其他資料。YOLO的進一步改進,如YOLO v2、YOLO v3等,都是在YOLO v1的基礎上進行優化,此處暫不作介紹。

 

SSD

本部分節選自:目標檢測算法之SSD

SSD最大的特點是:採用了多尺度的特徵圖,用不同尺度的特徵圖檢測不同尺度的物體。

 

      

SSD核心設計理念

1、採用多尺度特徵圖用於檢測。CNN網絡一般前面的特徵圖比較大,後面會逐漸採用stride=2的卷積或者pool來逐步降低特徵圖大小,不同大小的特徵都用來做檢測:比較大的特徵圖來用來檢測相對較小的目標,而小的特徵圖負責檢測大目標。

2、採用卷積進行檢測。與Yolo最後採用全連接層不同,SSD直接採用卷積對不同的特徵圖來進行提取檢測結果。從效率上來看,替換掉FC層,可以減少大量參數,節約時間和空間。

3、設置先驗框。與YOLO的自適應bounding box不同,SSD借鑑了Faster R-CNN中anchor的理念,每個單元設置尺度或者長寬比不同的先驗框。

由於採用卷積而非FC層對特徵圖進行檢測,SSD本質上是在多尺度特徵圖上密集採樣檢測。

SSD算法框架(與YOLO對比)

      

 

另外,還有諸如RetinaNet、R-FCN,及採用FPN的各類算法等方法,本文不作介紹了。另外,對於小目標檢測、點檢測等細粒度任務,上述方法不一定可以達到很高的精度,可以嘗試根據自己的應用場景調整算法思路,也可嘗試其他目標檢測算法或語義分割類算法。

本文暫時比較簡略,以後有空再進一步補充梳理。

 

參考資料:

R-CNN論文詳解

對Bounding-Box regression的理解

邊框迴歸:BoundingBox-Regression(BBR)

邊框迴歸(Bounding Box Regression)詳解

R-CNN 論文解讀及個人理解

R-CNN

R-CNN論文詳解

計算機視覺目標檢測算法綜述

從RCNN到SSD,這應該是最全的一份目標檢測算法盤點

YOLO文章詳細解讀

YOLO v1深入理解

目標檢測綜述

目標檢測算法之SSD

 

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