4月中旬開始,嘗試對目標檢測領域做一個了解,看了差不多6-7篇paper,在這里記錄一下:
一、Detection簡介
人臉檢測的目標是找出圖像中所有的人臉對應的位置,算法的輸出是人臉外接矩形在圖像中的坐標,可能還包括姿態如傾斜角度等信息。下面是一張圖像的人臉檢測結果:
二、面臨的挑戰
准確率:如何使定位更准
實時性:計算復雜度高,不適合試試計算,如何使速度更快。
三、檢測方法
(一)two-stage 兩步走的框架
先進行region proposal(selective proposal,region proposal network等,找出可能是目標區域的bbox),再進行目標分類,和bbox回歸
1、傳統算法
Viola和Jones於2001年提出的VJ框架,使用滑動窗口 + ( 計算Haar特征 + Adaboost )
Adaboost (adaptive boosting自適應提升算法,1995年提出), OpenCV adaboost使用滑動窗口+圖像金字塔生成region proposal
用多個分類器合作完成對候選框的分類,這些分類器組成一個流水線,對滑動窗口中的候選框圖像進行判定,確定它是人臉還是非人臉。
adaboost強分類器:
Adaboost的原理是,多個分類器組合在一起分類loss的上限,是各個分類器誤差之積的函數。
括號內的數值<1, 這樣隨着分類器的增加,loss的上限不斷被壓縮,到最后趨近於0
優點:而且弱分類器構造極其簡單; 可以將不同的分類算法作為弱分類器,集成學習后作為1個強分類器。
缺點:訓練時間長,執行效果依賴於弱分類器的選擇(如果弱分類器每次誤差都在0.5附近,類似於瞎猜,這時loss值很難下降,需要迭代很多次)
2、深度學習(CNN-Based)
VJ是2001年提出來的,此后業界也沒有多少進展。2012年AlexNet在ImageNet舉辦的ILSVRC中大放異彩,此后人們就開始嘗試將卷積引入cv的各種任務里面。我們看到Adaboost分類器的輸入是haar特征,這個特征是按照明確的規則,顯式提取出來的。
有了CNN后,我們可以將特征提取交給卷積神經網絡完成。
14年uc berkerly的Girshick提出了rcnn算法,第一次將cnn引入detection領域,開啟了檢測領域1片新的天地。
(1)RCNN
網絡結構如圖所示,先用selective search進行region box的選擇,選完后送入backbone,進行回歸和分類。
首先介紹一下selective search的原理
用selective search找到proposal,即比較可能是物體的一個區域
我們首先將每個像素作為一組。然后,計算每一組的紋理,並將兩個最接近的組結合起來。我們首先對較小的組進行分組。我們繼續合並區域,直到所有區域都結合在一起。
下圖第一行展示了如何使區域增長,第二行中的藍色矩形代表合並過程中所有可能的 ROI。
具體過程如下:
a.用selective search找到proposal,即比較可能是物體的一個區域
b.特征提取
對每個候選區域,使用深度卷積網絡提取特征 (CNN),這里的基礎網絡backbone采用VGG,將輸入圖片傳入VGG,經過卷積, 池化, 全連接提取特征,得到4096維特征。
c.學習bbox regression回歸
利用卷積網絡計算bbox位置修正信息,detection面臨的一個問題是帶標記的數據少,當時可用的公開數據集不足以訓練大型CNN來計算bbox位置修正,paper中提出以VGG網絡中參數為基礎,用PASCAL VOC 2007數據集,在原網絡基礎上bbox regression訓練
(以VGG現成的參數為基礎訓練regression,這種思想類似於遷移學習, PASCAL VOC 2007數據集,每張圖片中,帶有物體的類別和位置,如下圖所示)
d.類別判斷
利用多個svm分類器(object的種類 +1),判別區域屬於哪個特征,或者是background。
e.Regression部分訓練完畢后,輸入由ss提出的區域,輸出修正候選框位置。結合cls信息做NMS,最后輸出detection結果。
RCNN是將cnn引入到目標檢測領域的開山之作,預測精度相比VJ的haar+adaboost框架,map從40%提高到60%,但也存在不足。
RCNN網絡的不足:
產生大量的region proposals ,它為每個bbox對應的區域進行卷積神經網絡正向傳遞,計算量巨大。很難達到實時目標檢測(1張圖片的計算要50S)
(2)Fast-RCNN
針對rcnn存在的問題,Ross Girshick相應的提出了fast-rcnn網絡。
R-CNN把一張圖像分解成大量的bbox,每個bbox拉伸形成的圖像都會單獨通過CNN提取特征. 實際上這些bbox之間大量重疊,特征值之間完全可以共享,rcnn那種運算方式造成了計算的浪費.
Fast-RCNN,只送1張圖片進卷積,運算量大大減少。
最后一層卷積層后加了一個ROI (region of interset)池化層。這個層可以將所有的bbox,映射到的feature maps的相應位置,並輸出1個固定尺寸的特征圖(論文中以7*7為例)
相比於RCNN,減少大量的計算。
RCNN網絡中,cls和bbox regression分2步進行(SVM + cnn)
fast-rcnn將邊框回歸直接加入到CNN網絡中,損失函數使用了多任務損失函數(multi-task loss),和cls融合到一起訓練。更簡練。
(3)Faster-RCNN
Fast-rcnn相比於rcnn在bbox的生成上快了25倍,但是用selective search生成bbox還是很費時間
16年亞研院的任少卿與kaiming he聯合Girshick提出來faster-rcnn結構(任少卿和kaiming he 5年還聯合提出了resnet)
FASTER-RCNN引入1個小型網絡rpn(region proposal network)
利用已經生成好的feature map,來產生更少,更精准的bbox
(rcnn 和fast-rcnn用selective search產生的Region Proposal有2000個,FASTER-RCNN產生的Region Proposal有300個)
下面我們來了解下RPN的工作原理
Backbone以vgg16為例,原始圖resize成800*600,經過VGG,輸出特征圖50*38*256,每張圖Feature map上1個點,對應的感受野為228 * 228,以這個感受野的中心為錨點,生成9個固定尺寸(128^2, 256^2,512^2)的bbox(例圖只畫了3個示意)
a.將feature map上的1個像素點的256channels信息,送入RPN的cls和bbox regression網絡,計算cls和bbox位置修正。(此時,input是228 * 228的感受野,此感受野是9個anchor的共有區域,以此為輸入,預測9個anchor代表區域的cls和bbox regression)
b.此時一張圖上有50*38 = 1900個anchor,每個anchor有9個同心的bbox,初始產生17100個bbox,對圖像提取(取cls score最大的300個)Region Proposal
anchor確定的9個區域的cls標簽,由其與Ground Truth的IOU確定,Bbox標簽,由Ground Truth確定。
以上面2個數據為基礎,訓練RPN
Resized image中的一個cell是228*228區域,過rpn網絡后生成9個anchor的cls和回歸結果。
但是我們觀察網絡,輸入信息為原來圖上228*228大小的區域,anchor的覆蓋的區域包含感受野外的部分,那么一個有限的輸入,如何對其外部的anchor做出cls和回歸呢?
通過源碼和論文,作者實現的過程如下圖右面部分所示:
輸入的256Dtensor對於原圖中的228*228區域,在制作label的時候,計算好各個感受野對應的9個anchor,算好每個anchor對應的cls和回歸值。
通過神經網絡,讓228*228去擬合9個anchor的cls和回歸信息,以此實現對9個區域的預測。(做label告訴網絡去預測什么)
通過訓練過程強制擬合,深度學習可以逼近任意擬合函數(深度學習黑盒所在)
對這3種Region Proposal的方法,可以做下面一個小游戲來說明
1.滑動窗口 ,遍歷圖像進行查找。
2.過濾掉很多子區域,大大提升效率。
3.RPN算法(將圖片一層層在自己的腦海中進行融合縮小,最后在一張濃縮的小圖上快速定位了目標)
RCNN系列總結
RCNN:首次將CNN引入目標檢測,准確率獲得大幅提升。
Fast-RCNN:因為加入了ROI (region of interset)pooling layer,完成了各bbox到feature map的映射,輸入整張圖片進卷積,運算量大大減少。同時將cls和bbox regression join在一起訓練。
Fastern-rcnn:就是將ss換成了rpn,運算復雜度降低。
單張pic的處理時間,可以看出運行時間得到明顯提高。
一點感想:
1.數據集不夠時,先進行數據增強,如果數據集還是太少,可以拿現成的,性能比較好的網絡,以此為基礎進行訓練(類似於遷移學習的思想),會獲得較好的score
2.Join訓練,fast_cnn將cls和bbox回歸join在一起訓練,score提高,mtcnn將cls,bbox和alignmen join在一起,score提高,faster-rcnn之后,何凱銘又提出mask-rcnn,在Faster-RCNN 的基礎上添加一個分支網絡做segmentation,在實現目標檢測的同時,把目標像素分割出來。這樣loss在cls + bbox 基礎上,又加了個分割的loss,性能進一步獲得提升。
(二)one-stage
1、YOLO(CVPR2016)
單步法,將之前Selective search或RPN省略,直接在截圖上進行cls和bbox regression
1.YOLO的backbone參考GoogleNet
測試圖片resize之后,進入backbone,產生1個7*7*1024的feature map, 這個上面的一共有49個1*1*1024的tensor,每1個tensor對應resized image上面一個區域。將這個feature map過全連接,輸出7*7*30的output,每個1*1*30的tensor,就對應resized image上面1個grid cell
1.這個1*1*30的tensor,表示生成的2個bbox信息,如圖左上角比較細的藍色框框,和青色框框
Offset指的是bbox中心點,相對於感受野尺寸左上角點的偏移值 / receptive field的比值, width,height是bbox高寬 / 原始圖片高寬的比值。
2.confidence代表了,當前grid cell含有object的可能性(0,或者1),有object的話,bbox與GT的IOU是多少,兩重信息,由possibility * iou計算得來
比如說output第2行,青色的5維信息,對應左圖中青色的bbox,其中心點相對於grid cell左上角的Offset是32, receptive field的size64,所以第一個參數是0.5
這里我們觀察一下label的維度維25維,與yolo輸出的shape不同,那么loss應該怎么計算?,怎樣讓網絡去擬合label里面的數據?
實際采用的方法是,預測的2個bbox,只取IOU較大的那個計算。
1.這里可以看出來,對於bbox的預測,如果grid cell,里面有object,那么示性函數為1,計入此項的loss(如果2個bbox中心點都在有object的grid cell里面,則取IOU較大的那個bbox,計算loss),如果grid cell沒有object,那么示性函數為1則bbox的loss就不用疊加到總的loss上了。(ij表示第i個grid cell里面的第j個bbox)
2,3項根據grid cell里面含不含object,只計算1個,在這里計算第5維confidence的損失。
4,計算分類的loss
算bbox的loss時,用了(x^(0.5) – x’(0.5))^2,因為GT里面是10,預測結果是20,跟Gt是100,預測結果是110,雖然差值都是10,但是精准程度顯然不一樣。引入這種loss計算方法,前者的loss就比后者要大
直接輸出的5維信息里面有bbox和confidence信息,但是confidence信息是對bbox所屬區域,先計算有沒有object的possibility,再計算IOU后得來的,我們看到圖上同時輸出了bbox和confidence的結果,這是如何做到的呢?
網絡采用預訓練模型,用ImageNet1000分類數據集Pretrain卷積層,訓練完成后,將Pretrain卷積層,加4層conv,和2層fc,組成backbone,直接對輸入圖像做回歸
,輸出bbox和的cls計算結果(擬合label里面bbox,和label里面根據bbox計算的confidence)
特點:
a1. 因為沒有復雜的檢測流程,YOLO將目標檢測重建為一個單一的回歸問題,從圖像像素直接到邊界框坐標和分類概率,而且只預測49*2個bbox,運算速度超級快,YOLO在Titan X 的 GPU 上能達到45 FPS
a2. R-CNN看不到更大的上下文,在圖像中會將背景塊誤檢為目標。YOLO的feature map要會再過2個全連接層,這樣最終的output能get到圖像的整體信息,相比於region proposal等方法,有着更廣闊的“視野”。YOLO的背景誤檢數量少了一半。
YOLO是直接預測的BBox位置,相比於預測物體的偏移量, 不太好收斂。雖然速度快,但是相對於faster-rcnn,檢測精度較低。同時,由於每個grid cell只預測1個object,對於靠的近的物體的預測效果不好。。另外YOLO對小物體檢測效果也不好,推測可能是因為Loss函數在設置中,offset誤差是權重高,成為影響檢測效果的主要原因,bbox的width和height的loss在總的loss中占比不大。
疑問:每個 1*1*30的維度對應原圖7*7個cell中的一個,過完fc層之后,可以解決特征圖上含有全局信息,但是過完全連接層,感受野就對不上了啊, 每個 1*1*30的維度對應原圖7*7個cell中的一個
2、SSD( Single Shot MultiBox Detector )
Yolo對小物體的檢測效果不好,我們發現,同樣size的一個區域,把這個區域套到網絡前部的feature map上,這個區域對應的感受野就比較小,正好用來檢測小物體,而后部的feature map,這個區域對應的感受野比較大,用來檢測大物體,由此思想提出了SSD算法
Single shot指明了SSD算法屬於one-stage方法,MultiBox指明了SSD是多框預測,
他利用不同尺度的特征圖來做檢測
網絡結構如下圖所示,backbone為VGG16,第一張圖是SSD的架構,第二張圖是YOLO架構。
可以看到,SSD相比yolo,在back bone后面多了幾個卷積層,多出來的幾個卷積層,可以獲得更多的特征圖以用於檢測
最后用了共提取了6個特征圖,feature map的size是38*38, 19*19, 10*10, 5*5, 3*3, 1*1)
各個特征圖的每一個cell,的感受野分別為30*30, 60*60, 111*111, 162*162, 213*213, 264*264
SSD將不同的特征圖匯集在一起,來做檢測任務
另一個改動是yolo一個cell上采用2個bbox,而SSD在每個cell上采用了不同尺度和長寬比的prior boxes(在Faster R-CNN中叫Anchors)
每1個prior bbox的面積,按照公式指定,各個feature map上對應的bbox的邊長,線性增加,aspect ratio是(1, 2, 3, 0.5, 1/3,1’),最后1個1’是 以feature_map當前一個小格(cell)的感受野邊長 * 與feature map上一個小格(cell)的感受野邊長 ,開方后的數值為邊長的bbox
以5*5的feature map為例,對feature map每個cell,生成6個bbox(第一層feature map和最后2層feature map生成4個bbox),計算回歸和cls。
1個1*1*256的tensor,經過檢測模塊后最后輸出這個cell對應原圖上,6個prior box的回歸和cls結果。
預測的時候跟faster-rcnn的region proposal network一樣,也沒有將bbox做輸入進行cls,而是直接拿feature map的點進行計算。
訓練:label的制作.
我們的網絡,是想擬合什么樣的數據?
數據集中給與的GT,如何轉換為訓練中可用的label,使之與每個prior box對應的predict結果相對應?
prior bbox的label的值(x, y, width, height),x,y是GT的中心點,相對於prior bbox的偏移/prior bbox的width,height。 width, height指GT寬、高與prior bbox寬高之比的log值。
眾多prior bbox,並不是每個bbox都做回歸,做label時,將與GT的IOU高於threshold的bbox做如右圖所示的標簽,低於threshold的區域就不算了.
SSD是Faster-rcnn與Yolo的結合,其中Prior bbox提取的過程跟Anchor的設計理念極其相似。
那么為什么Faster-rcnn是two-stage,而SSD是one-stage?
因為faster-rcnn中rpn需要另行訓練,而在SSD中直接預測bounding box的坐標和類別的object detection,沒有生成proposal的過程, one-stage中完成。
四、最新進展
低層次的包含更多紋理的特征,高層次的包含更多上下文的特征,低層級特征被用於檢測尺寸較小的人臉,高層級特征被用於檢測尺寸較大的人臉。
FPN(特征金字塔網絡)只聚合高級和低級輸出層之間的層次結構要素圖, 其實上兩者之間有關聯
前部feature map對應的感受野如上圖所示,圖分辨不出是人臉還是其他物體,但是隨着feature map感受野的逐步擴大,后面的圖像可以看到這個區域是人臉。將不同尺度的feature map聯合在一起進行訓練,會檢測出第一張人臉出來。
(1)PyramidBox
百度18年3月份在WIDER Face數據集上取得第一名
利用Low-level Feature Pyramid Layers將feature map整合,解決小圖像,姿勢,角度等檢測難題。
(2)Dual Shot Face Detector
騰訊優圖(CVPR2019),將當前feature map與高層feature map做了特征融合。
下面的feature enhance module其實是將本層feature map和上一層的frature map做了1個特征融合