【目標檢測】算法梳理

目標檢測20年綜述之(一)

傳統方法

VJ 檢測器—檢測人臉
方向梯度直方圖(Histogram of Oriented Gradient, HOG)特徵 從cell到bolck構造檢測的特徵向量
Deformable Part-based Model (DPM)利用HOG和SVM進行後續的分割、分類


候選區域/窗 + 深度學習分類

在深度學習時代,目標檢測可以分爲兩類:two-stage和one-stage,前者是由粗到精的過程,而後者則一步到位。RCNN、Fast RCNN、ROI Pooling、Faster RCNN、YOLO、SSD、YOLO V2、YOLO V3、SSD V2、FCN較爲經典的算法,需要熟知。
推薦閱讀1:R-CNN系列與SPP-Net總結
推薦閱讀2:一文讀懂目標檢測:R-CNN、Fast R-CNN、Faster R-CNN、YOLO、SSD

RCNN Regions with CNN features

論文解析推薦閱讀
R-CNN的簡要核心步驟如下,核心思想是分成:分類和迴歸
(1) 輸入測試圖像,利用選擇性搜索Selective Search這是個什麼東西,說出來你看你不信,pip可以直接安裝他,主要思想就是分割、貪心融合)算法在圖像中從下到上提取2000個左右的可能包含物體的候選區域Region Proposal

(3) 調整大小:因爲取出的區域大小各自不同,所以需要將每個Region Proposal縮放(warp)成統一的227x227的大小並輸入到CNN,將CNN的fc7層的輸出作爲特徵

(4) 將每個Region Proposal提取到的CNN特徵輸入到SVM進行分類

(5) 使用迴歸器精細修正候選框位置:對於每一個類,訓練一個線性迴歸模型去判定這個框是否框得完美。(Bounding-box迴歸,就是算出他的xyhw來確定這個框)

在測試階段,最後用SVM分類好之後,會用針對每個類,通過計算 IoU(IoU=重疊面積 /(面積1+面積2-重疊面積)) 指標,然後採取非極大性抑制,以最高分的區域爲基礎,剔除掉那些重疊位置的區域。

提問:爲什麼不直接用softmax的輸出結果?
因爲在訓練softmax的時候數據本來就不是很準確,而SVM的訓練使用的是hard negative也就是樣本比較嚴格,所以SVM效果會更好。
補充非極大值抑制(Non-Maximum Suppression,NMS),顧名思義就是抑制不是極大值的元素,可以理解爲局部最大搜索。這個局部代表的是一個鄰域,鄰域有兩個參數可變,一是鄰域的維數,二是鄰域的大小。在RCNN中,目的是選出最好的那個框,常用的閾值是 0.3 ~ 0.5。推薦閱讀

SPP Net(我有ROI Pooling,不要Selective Search,還要SVM)

SPP Net的第一個貢獻就是在最後一個卷積層後,接入了金字塔池化層,保證傳到下一層全連接層的輸入固定。SPP Net在普通的CNN結構中加入了ROI池化層(ROI Pooling就是池化的一種,加在激活函數後面),使得網絡的輸入圖像可以是任意尺寸的,輸出則不變,同樣是一個固定維數的向量。(不需要Region Proposal,神經網絡幫你搞定這些候選區域,直接輸入圖片就完事了)。
在這裏插入圖片描述
spatial pyramid pooling layer:具體做法是,在conv5層得到的特徵圖是256層,每層都做一次spatial pyramid pooling。先把每個特徵圖分割成多個不同尺寸的網格,比如網格分別爲44、22、11,然後每個網格做max pooling,這樣256層特徵圖就形成了16256,4256,1256維特徵,他們連(Concatinate)起來就形成了一個固定長度的特徵向量,將這個向量輸入到後面的全連接層。之後再將原圖的proposal映射到到feature map。
不足:1.雖然解決了R-CNN許多大量冗餘計算的問題,但是還是沿用了R-CNN的訓練結構,也訓練了SVM分類器, 單獨進行BBox regression。2.SPP-Net 很難通過fine-tuning對SPP-layer之前的網絡進行參數微調,效率會很低,原因具體是(Fast-RCNN中的解釋): SPP做fine-tuning時輸入是多個不同的圖片,這樣對於每一個圖片都要重新產出新的feature map,效率很低,而Fast-RCNN對其進行了改進。

Fast R-CNN(ROI Pooling,Selective Search我都要,不要SVM)

推薦閱讀:Fast RCNN算法詳解
算法概述:Fast R-CNN還是用的Selective Search來提取region proposal,Fast R-CNN 將整個圖片與通過Selective Search篩選出的region proposals一同輸入(我全都用),經過卷積層、池化層產出feature map,計算出原圖的proposal在feature map的映射,將相應的feature送到ROI pooling層,進行池化,產出固定長度的feature vector作爲FC層(SVD分解實現,說白了就是得到包含重要信息的矩陣)的輸入最終分支成兩個兄弟輸出層:一個通過softmax產生K+1個分類的概率,另一個對於每個object 類別輸出四個實數,代表一個較爲精確的BBox position,最後進行NMS得到最終的結果。
在這裏插入圖片描述
創新點:1.SVD分解實現FC層加速什麼是SVD;2.在全連接層之前加了簡化版的spp層
使用softmax進行預測概率而不是SVM:由於softmax在分類過程中引入了類間競爭,分類效果更好;(對於類間競爭,我的理解是softmax所有類的概率相加爲1,一個類的概率變高,其他類的概率必然有所下降,這樣即使論文中的competition between classes)。Fast R-CNN去掉了SVM這一步,所有的特徵都暫存在顯存中,就不需要額外的磁盤空間,省時省力。

Faster R-CNN(ROI Pooling,RPN替代Selective Search,不要SVM)

Faster R-CNN文章詳細解讀
算法概述:Faster R-CNN就此問題提出了使用RPN生成region proposal,然後再接上Fast R-CNN形成了一個完全的end-to-end的CNN對象檢測模型,可以完全在GPU運行,同時RPN與後面的detection network 共享full-image convolutional features
RPN在預訓練的網絡模型生成的特徵圖(convolutional feature map )上滑動一個小網絡(slide a small network),這個網絡把特徵圖上的一個n x n窗口(文章中n=3)的特徵作爲輸入,對於每個窗口,以窗口的中心點作爲基準,通過不同(文章中9個)的anchors映射到原圖從而得到一個個proposals,之後通過對這些proposal進行softmax分類與BBox regression的學習,從而輸出調優後的proposal with score。

ROI Pooling層 補充:
ROI Pooling層:Pooling層的一種,輸入特徵圖尺寸不固定,但是輸出特徵圖尺寸固定,最大的好處就在於降低了參數量,極大地提高了處理速度。

  • ROI Pooling的輸入 輸入有兩部分組成:
    1. 特徵圖:指的是圖1中所示的特徵圖,在Fast RCNN中,它位於RoI Pooling之前,在Faster RCNN中,它是與RPN共享那個特徵圖,通常我們常常稱之爲“share_conv”;
    2. rois:在Fast RCNN中,指的是Selective Search的輸出;在Faster RCNN中指的是RPN的輸出,一堆矩形候選框框,形狀爲1x5x1x1(4個座標+索引index),其中值得注意的是:座標的參考系不是針對feature map這張圖的,而是針對原圖的(神經網絡最開始的輸入)

ROI Pooling的輸出
輸出是batch個vector,其中batch的值等於RoI的個數,vector的大小爲channel * w * h;RoI Pooling的過程就是將一個個大小不同的box矩形框,都映射成大小固定(w * h)的矩形框;


基於深度學習的迴歸方法

一步走(one-stage)算法:直接對輸入圖像應用算法並輸出類別和相應的定位(YOLO系列)
推薦閱讀:YOLO目標檢測從V1到V3結構詳解

YOLO

(CVPR2016, oral)論文解析閱讀傳送門1
論文解析閱讀傳送門2
在這裏插入圖片描述
網絡輸入:圖片爲448*448大小
網絡輸出:網絡是根據GoogLeNet改進的,輸出迴歸得到的7x7x(2x5+20)張量(7是單元格;2x5是指每個單元格需要預測B個bbox值(bbox值包括座標和寬高,原文中B=2),同時爲每個bbox值預測一個置信度(confidence scores),也就是每個單元格需要預測B×(x,y,w,h,confidence)個值;20是物體種類個數,相應的損失函數的權重有所不同,關於座標的權重更大,)(confidence置信度是由兩部分組成,一是格子內是否有目標,二是bbox的準確度)
最終輸出:得到每個 box 的 class-specific confidence score 以後,設置閾值,濾掉得分低的 boxes,對保留的 boxes 進行 NMS 非極大值抑制處理,就得到最終的檢測結果。

不足
1.小物體你就不行,後續的改進也是針對這個問題:對於目標比較小的物體,雖然採用均方誤差,其同等對待大小不同的邊界框,但是實際上較小的邊界框的座標誤差應該要比較大的邊界框要更敏感。爲了保證這一點,將網絡的邊界框的寬與高預測改爲對其平方根的預測,但是效果還是不太行。
2.一個格多個物體你就不行:另外一點時,由於每個單元格預測多個邊界框。但是其對應類別只有一個。那麼在訓練時,如果該單元格內確實存在目標,那麼只選擇與ground truth的IOU最大的那個邊界框來負責預測該目標,而其它邊界框認爲不存在目標。這樣設置的一個結果將會使一個單元格對應的邊界框更加專業化,其可以分別適用不同大小,不同高寬比的目標,從而提升模型性能。大家可能會想如果一個單元格內存在多個目標怎麼辦,其實這時候Yolo算法就只能選擇其中一個來訓練,這也是Yolo算法的缺點之一。
3.在測試階段:對於輸出的7x7x2=98個boxes,首先將小於置信度閾值的值歸0,然後分類別地對置信度值採用NMS,這裏NMS處理結果不是剔除,而是將其置信度值歸爲0。最後纔是確定各個box的類別,當其置信度值不爲0時才做出檢測結果輸出。這個策略不是很直接,但是貌似Yolo源碼就是這樣做的。

YOLO_v2

推薦閱讀傳送門1
推薦閱讀傳送門2
相對於V1的不同點 (DarkNet-19):
1.每個卷積層後面都添加了Batch Normalization層,並且不再使用droput;
2.使用高分辨率的數據;
3.使用 anchor box 進行卷積,什麼是anchor box,看下圖(就是邊界box裏面,我每一個都加分類的張量進去,沒想到吧);
在這裏插入圖片描述
4.用聚類先確定先驗框,選用 boxes 之間的 IOU 值作爲聚類指標;
5.根據所在網格單元的位置來預測座標,並且對每個格子設置了0~1,最後在網絡調整框框偏移量的時候,就不會像fast-rcnn一樣會亂jb估,模型也會快點收斂;
6.像SPP一樣,最後多尺度的輸入(有點殘差網絡的感覺了)

存在的問題:YOLO v2 對 YOLO v1 的缺陷進行優化,大幅度高了檢測的性能,但仍存在一定的問題,如無法解決重疊問題的分類等。

YOLO_v3

一文看懂YOLO v3
相對於的不同點 (DarkNet-53):
1.Feature Pyramid Networks for Object Detection加了圖像金字塔,對小的物體有更好的特徵提取
2.用邏輯迴歸替代 softmax 作爲分類器:在實際應用場合中,一個物體有可能輸入多個類別,單純的單標籤分類在實際場景中存在一定的限制。舉例來說,一輛車它既可以屬於 car(小汽車)類別,也可以屬於 vehicle(交通工具),用單標籤分類只能得到一個類別。因此在 YOLO v3 在網絡結構中把原先的 softmax 層換成了邏輯迴歸層,從而實現把單標籤分類改成多標籤分類。用多個 logistic 分類器代替 softmax 並不會降低準確率,可以維持 YOLO 的檢測精度不下降。

SSD: Single Shot MultiBox Detector

在這裏插入圖片描述
首先SSD獲取目標位置和類別的方法跟YOLO一樣,都是使用迴歸,但是YOLO預測某個位置使用的是全圖的特徵,SSD預測某個位置使用的是這個位置周圍的特徵。假如某一層特徵圖(圖b)大小是88,那麼就使用33的滑窗提取每個位置的特徵,然後這個特徵迴歸得到目標的座標信息和類別信息(圖c)。
不同於Faster R-CNN,這個anchor是在多個feature map上,這樣可以利用多層的特徵並且自然的達到多尺度(不同層的feature map 3*3滑窗感受野不同)。圖b不同大小的框框就是default box。在這裏插入圖片描述
創新點:1.在多層多尺度特徵圖上進行檢測,淺層網絡不同尺度的結果會輸出到detections中;2.SSD借鑑RPN網絡中的anchor box概念。首先將feature map劃分爲小格子叫做feature map cell,再在每個cell中設置一系列不同長寬比的default box。;3.在向default box迴歸的時候,採用了3x3的卷積。
在YOLO中,首次提出了將特徵圖劃分爲格子,以格子爲單位進行分類迴歸預測,但其採用了全連接層,導致參數非常多。SSD借鑑了Faster R-CNN的RPN網絡,將YOLO中的全連接層換成了3x3的卷積;4.標定GT的時候還要標定一下default box
迴歸loss:這部分有兩個loss,一個是預測的box與default box之間的偏移量,也即網絡輸出的4個值;另一個是ground truth與default box的偏移量(在給定輸入圖片groudth與爲整個網絡設置好default box後,該值是可以直接計算出來的,其計算公式沿用了RPN網絡的中的公式)。迴歸部分的loss是希望預測的box與default box之間的差距儘可能與ground truth和default box差距接近,這樣預測的box就能儘量和ground truth一樣。
Confidence Loss:(分類loss):Confidence loss是一個softmax分類loss,爲每個default box進行分類。


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