1. 程式人生 > >綜述|基於深度學習的目標檢測

綜述|基於深度學習的目標檢測

概述

影象分類,檢測及分割是計算機視覺領域的三大任務。影象分類模型(詳情見這裡)是將影象劃分為單個類別,通常對應於影象中最突出的物體。但是現實世界的很多圖片通常包含不只一個物體,此時如果使用影象分類模型為影象分配一個單一標籤其實是非常粗糙的,並不準確。對於這樣的情況,就需要目標檢測模型,目標檢測模型可以識別一張圖片的多個物體,並可以定位出不同物體(給出邊界框)。目標檢測在很多場景有用,如無人駕駛和安防系統。

影象分類,目標檢測與例項分割的對比

目前主流的目標檢測演算法主要是基於深度學習模型,其可以分成兩大類:(1)two-stage檢測演算法,其將檢測問題劃分為兩個階段,首先產生候選區域(region proposals),然後對候選區域分類(一般還需要對位置精修),這類演算法的典型代表是基於region proposal的R-CNN系演算法,如R-CNN,Fast R-CNN,Faster R-CNN等;(2)one-stage檢測演算法,其不需要region proposal階段,直接產生物體的類別概率和位置座標值,比較典型的演算法如YOLO和SSD。目標檢測模型的主要效能指標是檢測準確度和速度,對於準確度,目標檢測要考慮物體的定位準確性,而不單單是分類準確度。一般情況下,two-stage演算法在準確度上有優勢,而one-stage演算法在速度上有優勢。不過,隨著研究的發展,兩類演算法都在兩個方面做改進。Google在2017年開源了

TensorFlow Object Detection API,並對主流的Faster R-CNN,R-FCN及SSD三個演算法在MS COCO資料集上的效能做了細緻對比(見Huang et al. 2017),如下圖所示。近期,Facebook的FAIR也開源了基於Caffe2的目標檢測平臺Detectron,其實現了最新的Mask R-CNN,RetinaNet等檢測演算法,並且給出了這些演算法的Baseline Results 。不得不說,準確度(accuracy)和速度(speed)是一對矛盾體,如何更好地平衡它們一直是目標檢測演算法研究的一個重要方向。

Faster R-CNN,R-FCN及SSD演算法在MS COCO資料集上的效能對比

在這篇長文中,我們將對最新的目標檢測演算法做一個綜述。在介紹目標檢測演算法之前,先簡單介紹目標檢測領域常用的資料集以及效能指標。

資料集和效能指標

目標檢測常用的資料集包括PASCAL VOC,ImageNet,MS COCO等資料集,這些資料集用於研究者測試演算法效能或者用於競賽。目標檢測的效能指標要考慮檢測物體的位置以及預測類別的準確性,下面我們會說到一些常用的效能評估指標。

資料集

PASCAL VOC(The PASCAL Visual Object Classification)是目標檢測,分類,分割等領域一個有名的資料集。從2005到2012年,共舉辦了8個不同的挑戰賽。PASCAL VOC包含約10,000張帶有邊界框的圖片用於訓練和驗證。但是,PASCAL VOC資料集僅包含20個類別,因此其被看成目標檢測問題的一個基準資料集。

ImageNet在2013年放出了包含邊界框的目標檢測資料集。訓練資料集包含500,000張圖片,屬於200類物體。由於資料集太大,訓練所需計算量很大,因而很少使用。同時,由於類別數也比較多,目標檢測的難度也相當大。2014 ImageNet資料集和2012 PASCAL VOC資料集的對比在這裡

另外一個有名的資料集是Microsoft公司(見T.-Y.Lin and al. 2015)建立的MS COCO(Common Objects in COntext)資料集。這個資料集用於多種競賽:影象標題生成,目標檢測,關鍵點檢測和物體分割。對於目標檢測任務,COCO共包含80個類別,每年大賽的訓練和驗證資料集包含超過120,000個圖片,超過40,000個測試圖片。測試集最近被劃分為兩類,一類是test-dev資料集用於研究者,一類是test-challenge資料集用於競賽者。測試集的標籤資料沒有公開,以避免在測試集上過擬合。在COCO 2017 Detection Challenge中,曠視科技團隊憑藉提出的Light-Head R-CNN模型奪得冠軍(AP為0.526 ),看來還是two-stage演算法準確度更勝一籌。

2015 COCO資料集的分割例項. 來源: T.-Y.Lin and al. (2015)

效能指標

目標檢測問題同時是一個迴歸和分類問題。首先,為了評估定位精度,需要計算IoU(Intersection over Union,介於0到1之間),其表示預測框與真實框(ground-truth box)之間的重疊程度。IoU越高,預測框的位置越準確。因而,在評估預測框時,通常會設定一個IoU閾值(如0.5),只有當預測框與真實框的IoU值大於這個閾值時,該預測框才被認定為真陽性(True Positive, TP),反之就是假陽性(False Positive,FP)。

對於二分類,AP(Average Precision)是一個重要的指標,這是資訊檢索中的一個概念,基於precision-recall曲線計算出來,詳情見這裡。對於目標檢測,首先要單獨計算各個類別的AP值,這是評估檢測效果的重要指標。取各個類別的AP的平均值,就得到一個綜合指標mAP(Mean Average Precision),mAP指標可以避免某些類別比較極端化而弱化其它類別的效能這個問題。

對於目標檢測,mAP一般在某個固定的IoU上計算,但是不同的IoU值會改變TP和FP的比例,從而造成mAP的差異。COCO資料集提供了官方的評估指標,它的AP是計算一系列IoU下(0.5:0.05:0.9,見說明)AP的平均值,這樣可以消除IoU導致的AP波動。其實對於PASCAL VOC資料集也是這樣,Facebook的Detectron上的有比較清晰的實現

除了檢測準確度,目標檢測演算法的另外一個重要效能指標是速度,只有速度快,才能實現實時檢測,這對一些應用場景極其重要。評估速度的常用指標是每秒幀率(Frame Per Second,FPS),即每秒內可以處理的圖片數量。當然要對比FPS,你需要在同一硬體上進行。另外也可以使用處理一張圖片所需時間來評估檢測速度,時間越短,速度越快。

R-CNN

R-CNN(R. Girshick et al., 2014)是基於region proposal方法的目標檢測算法系列開山之作,其先進行區域搜尋,然後再對候選區域進行分類。在R-CNN中,選用Selective search方法(J.R.R. Uijlings and al. 2012)來生成候選區域,這是一種啟發式搜尋演算法。它先通過簡單的區域劃分演算法將圖片劃分成很多小區域,然後通過層級分組方法按照一定相似度合併它們,最後的剩下的就是候選區域(region proposals),它們可能包含一個物體。

Selective Search方法:上面是分割結果,下面是候選框. 來源: J.R.R. Uijlings and al. (2012)

對於一張圖片,R-CNN基於selective search方法大約生成2000個候選區域,然後每個候選區域被resize成固定大小( 227\times 227 )並送入一個CNN模型中,最後得到一個4096-d的特徵向量。然後這個特徵向量被送入一個多類別SVM分類器中,預測出候選區域中所含物體的屬於每個類的概率值。每個類別訓練一個SVM分類器,從特徵向量中推斷其屬於該類別的概率大小。為了提升定位準確性,R-CNN最後又訓練了一個邊界框迴歸模型。訓練樣本為 (P, G) ,其中 P=(P_x, P_y, P_w, P_h) 為候選區域,而 G=(G_x, G_y, G_w, G_h) 為真實框, G 是與 P 的IoU最大的真實框(只使用IoU大於0.6的樣本),迴歸器的目標值定義為:

t_x = (G_x - P_x)/P_w, t_y = (G_y - P_y)/P_h

t_w = \log(G_w/P_w), t_h = \log(G_h/P_h)

在做預測時,利用上述公式可以反求出預測框的修正位置。R-CNN對每個類別都訓練了單獨的迴歸器,採用最小均方差損失函式進行訓練。

R-CNN模型的訓練是多管道的,CNN模型首先使用2012 ImageNet中的影象分類競賽資料集進行預訓練。然後在檢測資料集上對CNN模型進行finetuning,其中那些與真實框的IoU大於0.5的候選區域作為正樣本,剩餘的候選區域是負樣本(背景)。共訓練兩個版本,第一版本使用2012 PASCAL VOC資料集,第二個版本使用2013 ImageNet中的目標檢測資料集。最後,對資料集中的各個類別訓練SVM分類器(注意SVM訓練樣本與CNN模型的funetuning不太一樣,只有IoU小於0.3的才被看成負樣本)。

總體來看,R-CNN是非常直觀的,就是把檢測問題轉化為了分類問題,並且採用了CNN模型進行分類,但是效果卻很好。最好的R-CNN模型在2012 PASCAL VOC資料集的mAP為62.4%(比第二名高出了22個百分點),在2013 ImageNet上的mAP為31.4%(比第二名高出7.1個百分點)。

R-CNN模型結構圖

SPP-net

SPP-net(Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition, He et al. 2014)提出的起因是解決影象分類中要求輸入圖片固定大小的問題,但是SPP-net中所提出的空間金字塔池化層(Spatial Pyramid Pooling Layer, SPP)可以和R-CNN結合在一起並提升其效能。採用深度學習模型解決影象分類問題時,往往需要影象的大小固定(比如 224\times 224 ),這並不是CNN層的硬性要求,主要原因在於CNN層提取的特徵圖最後要送入全連線層(如softmax層),對於變大小圖片,CNN層得到的特徵圖大小也是變化的,但是全連線層需要固定大小的輸入,所以必須要將圖片通過resize, crop或wrap等方式固定大小(訓練和測試時都需要)。但是實際上真實的圖片的大小是各種各樣的,一旦固定大小可能會造成影象損失,從而影響識別精度。為了解決這個問題,SSP-net在CNN層與全連線層之間插入了空間金字塔池化層來解決這個矛盾。

SPP-net與普通網路的結構對比

SPP層原理如下所所示,假定CNN層得到的特徵圖大小為 a\times a (比如 13\times 13 ,隨輸入圖片大小而變化),設定的金字塔尺度為 n\times n bins(對於不同大小圖片是固定的),那麼SPP層採用一種滑動視窗池化,視窗大小 win\_size=\lceil a/n\rceil ,步為 stride=\lfloor a/n\rfloor ,採用max pooling,本質上將特徵圖均分為 n\times n 個子區域,然後對各個子區域max pooling,這樣不論輸入圖片大小,經過SPP層之後得到是固定大小的特徵。一般設定多個金字塔級別,文中使用了 4\times 42\times 21\times 1 三個尺度。每個金字塔都得一個特徵,將它們連線在一起送入後面的全連線層即可,這樣就解決了變大小圖片輸入的問題了。SPP-net在ImageNet ILSVRC 2014影象分類大賽中奪得了第三名。

SPP-net中的空間金字塔池化層

那麼SPP-net和R-CNN有什麼關係呢?在R-CNN中,由於每個候選區域大小是不同,所以需要先resize成固定大小才能送入CNN網路,SPP-net正好可以解決這個問題。繼續上前一步,就是R-CNN每次都要挨個使用CNN模型計算各個候選區域的特徵,這是極其費時的,不如直接將整張圖片送入CNN網路,然後抽取候選區域的對應的特徵區域,採用SPP層,這樣可以大大減少計算量,並提升速度。基於SPP層的R-CNN模型在準確度上提升不是很大,但是速度卻比原始R-CNN模型快24-102倍。這也正是接下來Fast R-CNN所改進的方向。

SPP層用於R-CNN模型

Fast R-CNN

Fast R-CNN(Fast Region-based Convolutional Network, R. Girshick 2015)的提出主要是為了減少候選區域使用CNN模型提取特徵向量所消耗的時間,其主要借鑑了SPP-net的思想。在R-CNN中,每個候選區域都要單獨送入CNN模型計算特徵向量,這是非常費時的,而對於Fast R-CNN,其CNN模型的輸入是整張圖片,然後結合RoIs(Region of Interests)pooling和Selective Search方法從CNN得到的特徵圖中提取各個候選區域的所對應的特徵。對於每個候選區域,使用RoI pooling層來從CNN特徵圖中得到一個固定長和寬的特徵圖(長和寬是超引數,文中選用 7\times7 ),RoI pooling的原理很簡單,其根據候選區域按比例從CNN特徵圖中找到對應的特徵區域,然後將其分割成幾個子區域(根據要輸出的特徵圖的大小),然後在每個子區域應用max pooling,從而得到固定大小的特徵圖,這個過程是可導的(見RoI pooling層的Caffe官方實現,RoI pooling層在大部分深度學習框架中是沒有官方實現的,需要自己擴充套件,Tensorflow上的開源實現可以參考deepsense-ai/roi-pooling,但是在TensorFlow中可以基於一種crop+resize+pooling的方式來簡化實現,可以參考一下Luminoth上的實現),RoI pooling層相比SPP層看起來主要是隻使用一個金字塔級別。然後RoI pooling層得到的特徵圖送入幾個全連線層中,併產生新的特徵向量,這些特徵向量分別用於一個softmax分類器(預測類別)和一個線性迴歸器上(用於調整邊界框位置)來進行檢測。在實現上是使用兩個不同的全連線層,第一個全連線層有 N+1 個輸出(是 N 類別總數, 1 是背景),表示各個類別的概率值;第二個全連線層有 4N 個輸出,表示座標迴歸值 (t_x, t_y, t_w, t_h) ,這個與R-CNN是一樣的,每個類別都預測4個位置座標值。

Fast R-CNN的分類與迴歸預測. 來源:https://tryolabs.com/blog/ RoI pooling原理圖,特徵圖大小為8x8,候選區域為5x7,輸出2x2. 來源:https://blog.deepsense.ai/region-of-interest-pooling-explained/

Fast R-CNN與R-CNN的另外的一個主要區別點是採用了softmax分類器而不是SVM分類器,而且訓練過程是單管道的,因為Fast R-CNN將分類誤差和定位誤差合併在一起訓練,定位誤差採用smooth L1 而不是R-CNN中的L2。這裡說點題外話,就是R-CNN訓練是多管道的,除了對CNN模型預訓練,R-CNN還先對CNN模型funetuning,使用的是softmax分類器,但是最後卻又訓練SVM分類器(原因可以見原論文),直覺上感覺有點多此一舉,所以現在Fast R-CNN直接採用softmax分類器了。Fast R-CNN訓練採用mini-batch sampling,每個mini-batch大小為 128 ,從 N=2 個圖片中構建,其中25%來自正樣本(IoU>=0.5),75%從負樣本中抽樣得到(背景,IoU \in[0.1,0.5) ),這裡的IoU閾值屬於超引數。在影象分類中,當我們說batch_size=32時,是指的是32個圖片,在Fast R-CNN中並不是這樣,因為一個圖片含有很多RoIs,每個batch使用的圖片非常少(記憶體限制),所以有時候你會看到Fast R-CNN訓練時直接從一個圖片中構建batch,這實現起來更容易一些。

L(p, u, t^u, v)=L_{cls}(p, u) + \lambda [u>0]L_{loc}(t^u,v)

最好的Fast R-CNN模型在2007 PASCAL VOC測試集上的mAp為70%,在2010 PASCAL VOC測試集上的mAP為68.8%,而在2012 PASCAL VOC測試集上的mAP為68.4%,準確度相比R-CNN略有提升,其實主要是速度更快。

Fast R-CNN模型結構圖

Faster R-CNN

對於Fast R-CNN,其仍然需要selective search方法來生產候選區域,這是非常費時的。為了解決這個問題,Faster R-CNN模型(The Faster Region-based Convolutional Network, S. Ren and al. 2016)引入了RPN (Region Proposal Network)直接產生候選區域。Faster R-CNN可以看成是RPN和Fast R-CNN模型的組合體,即Faster R-CNN = RPN + Fast R-CNN

對於RPN網路,先採用一個CNN模型(一般稱為特徵提取器)接收整張圖片並提取特徵圖。然後在這個特徵圖上採用一個 N\times N (文中是 3\times 3 )的滑動視窗,對於每個滑窗位置都對映一個低維度的特徵(如256-d)。然後這個特徵分別送入兩個全連線層,一個用於分類預測,另外一個用於迴歸。對於每個視窗位置一般設定 k 個不同大小或比例的先驗框(anchors, default bounding boxes),這意味著每個位置預測 k 個候選區域(region proposals)。對於分類層,其輸出大小是 2k ,表示各個候選區域包含物體或者是背景的概率值,而回歸層輸出 4k 個座標值,表示各個候選區域的位置(相對各個先驗框)。對於每個滑窗位置,這兩個全連線層是共享的。因此,RPN可以採用卷積層來實現:首先是一個 n\times n 卷積得到低維特徵,然後是兩個 1\times 1 的卷積,分別用於分類與迴歸。

RPN架構圖

可以看到RPN採用的是二分類,僅區分背景與物體,但是不預測物體的類別,即class-agnostic。由於要同時預測座標值,在訓練時,要先將先驗框與ground-truth box進行匹配,原則為:(1)與某個ground-truth box的IoU最高的先驗框;(2)與某個ground-truth box的IoU值大於0.7的先驗框,只要滿足一個,先驗框就可以匹配一個ground-truth,這樣該先驗框就是正樣本(屬於物體),並以這個ground-truth為迴歸目標。對於那些與任何一個ground-truth box的IoU值都低於0.3的先驗框,其認為是負樣本。RPN網路是可以單獨訓練的,並且單獨訓練出來的RPN模型給出很多region proposals。由於先驗框數量龐大,RPN預測的候選區域很多是重疊的,要先進行NMS(non-maximum suppression,IoU閾值設為0.7)操作來減少候選區域的數量,然後按照置信度降序排列,選擇top-N個region proposals來用於訓練Fast R-CNN模型。RPN的作用就是代替了Selective search的作用,但是速度更快,因此Faster R-CNN無論是訓練還是預測都可以加速。

Faster R-CNN模型採用一種4步迭代的訓練策略:(1)首先在ImageNet上預訓練RPN,並在PASCAL VOC資料集上finetuning;(2)使用訓練的PRN產生的region proposals單獨訓練一個Fast R-CNN模型,這個模型也先在ImageNet上預訓練;(3)用Fast R-CNN的CNN模型部分(特徵提取器)初始化RPN,然後對RPN中剩餘層進行finetuning,此時Fast R-CNN與RPN的特徵提取器是共享的;(4)固定特徵提取器,對Fast R-CNN剩餘層進行finetuning。這樣經過多次迭代,Fast R-CNN可以與RPN有機融合在一起,形成一個統一的網路。其實還有另外一中近似聯合訓練策略,將RPN的2個loss和Fast R-CNN的2個loss結合在一起,然後共同訓練。注意這個過程,Fast R-CNN的loss不對RPN產生的region proposals反向傳播,所以這是一種近似(如果考慮這個反向傳播,那就是非近似聯合訓練)。應該來說,聯合訓練速度更快,並且可以訓練出同樣的效能。

最好的Faster R-CNN模型在 2007 PASCAL VOC測試集上的mAP為78.8% ,而在2012 PASCAL VOC測試集上的mAP為75.9%。論文中還在 COCO資料集上進行了測試。Faster R-CNN中的某個模型可以比採用selective search方法的Fast R-CNN模型快34倍。可以看到,採用了RPN之後,無論是準確度還是速度,Faster R-CNN模型均有很大的提升。Faster R-CNN採用RPN代替啟發式region proposal的方法,這是一個重大變革,後面的two-stage方法的研究基本上都採用這種基本框架,而且和後面演算法相比,Faster R-CNN在準確度仍然佔據上風。

Faster R-CNN模型結構圖

參考文章