1. 目標檢測問題定義
1.1 目標檢測定義
目標檢測是在圖片中對可變數量的目標進行分類和查找。
主要難點:
- 目標種類與數量問題
- 目標尺度問題
- 外在環境干擾問題
- 形態、視角等變化
1.2 目標檢測vs圖像分類
1.3 目標檢測vs目標分割
圖三爲語義分割,圖四爲實例分割。實例分割不僅要區分語義層面上的目標,同一類別的目標也需要劃分出不同的實例。目標檢測相對於目標分割更關注語義層面的分割結果,而目標分割更關注於像素級別處理的任務。 目標檢測主要定位物體的位置,主要表示爲一個矩形,一個矩形可以通過一個四維的數據進行表示,目標分割需要對每一個像素點來進行不同類別的劃分,我們的結果就需要同原始的圖片大小保持一致,所以目標分割往往會採用上採樣、反捲積這樣的方式來得到原始圖像大小的輸出結果。
2. 目標檢測問題方法
2.1 傳統目標檢測方法到深度學習目標檢測方法的變遷
(1)傳統目標檢測算法比較有代表性的算法有V計算法
,HOG
,DPM
等,這些方法主要是傳統的手動提取特徵並結合滑動窗口的方式來進行目標檢測定位,存在問題主要有:
-
通過傳統方式設計特徵,特徵難設計、特徵存在的問題較多不魯棒,比如特徵對某些特定條件不適應、效率也不高。
-
通過滑動窗口的方式生成目標框並對目標框進行分類判定這種策略比較繁瑣,慢,耗時,所以在2008年
DPM
算法提出後目標檢測算法遇到了很大的瓶頸,很難在DPM
上進行提升。
(2)2012年卷積神經網絡興起之後利用卷積神經網絡代替傳統手工設計特徵的方式來完成目標檢測的任務,這也是基於深度學習目標檢測算法的一個里程碑的事件,例如overfeat
,RCNN
方法的提出,但是這些方法在使用深度學習的時候只是利用卷積神經網絡來提取特徵,並沒有從本質上改變搜索框提取目標區域的策略,因此這些方法在速度上依然存在瓶頸。
(3)Faster RCNN
等方法提出以後,通過RPN
網絡來代替原始的窗口策略,標誌基於深度學習的目標檢測方法徹底完成了一個端到端的過程,使得基於深度學習的目標檢測方法在性能和速度上都得到很大地提升。
(4)Yolo
、SSD
等方法不採用提取候選框的策略,而採用直接回歸目標框的位置這一策略來完成目標檢測和定位,再一次對目標檢測算法速度進行了提升,而且在精度上也能保證原先基於propersal
候選框策略的算法基本一致。
2.2 算法基本流程
上面圖表示兩種方法,有候選框特徵提取的方法,和特徵提取直接回歸的方法。兩種方法目前用得比較多的都是深度學習的方法,但是這個框架同樣也適用於傳統方法。
2.3 傳統目標檢測方法
(1)viola-Jones
方法。主要採用積分圖特徵,結合Adaboost
分類器進行人臉檢測等目標檢測的任務。
(2)HOG+SVM
。主要用於行人檢測任務。通過對行人目標候選區域提取HOG
特徵並結合SVM
分類器來進行判定。
(3)DPM
。是基於HOG
特徵的一種變種,但DPM
會加入很多的額外的策略來提升檢測的精度,它是目前非深度學習目標檢測方法中效果性能最優的一種方法。
2.4 深度學習目標檢測方法
(1)One-stage
(YOLO
和SSD
系列) 它主要通過直接回歸目標的位置這種方法來進行目標檢測定位
(2)Two-stage
(Faster RCNN
系列)主要通過利用RPN
網絡對候選區域進行推薦
2.5 傳統目標檢測方法VS深度學習目標檢測方法
傳統目標檢測方法 | 深度學習目標檢測方法 |
---|---|
手動設計特徵 | 深度網絡學習特徵 |
滑動窗口 | Proposal 或者直接回歸 |
傳統分類器 | 深度網絡 |
多步驟 | 端到端 |
準確度和實時性差 | 準確度高和實時性好 |
2.6 目標檢測應用場景
人臉檢測、文本檢測、交通檢測、通用物體識別、衛星圖像等。
3. 傳統目標檢測算法
3.1 綜述
輸入圖片,然後滑動窗口提取候選框,對窗口中的局部圖像信息進行特徵提取,如基於顏色的方法、基於紋理的方法、基於形狀的方法以及一些中高層次語義特徵的方法,這些方法有些是需要經過學習來得到的方法,比如抽取最基本的直方圖特徵,以及紋理特徵如HOG
特徵等,這樣的一些稠密特徵之後經過PCA
算法進行特徵降維,或者LDA
算法進行空間投影,對抽取出的基本特徵來進行進一步學習,來挖掘一些更加魯棒的特徵出來,因此對於傳統計算機視覺中常見的特徵提取方法分爲三大類:
- 底層特徵。顏色紋理等最基本的特徵。
- 中層次特徵。對底層特徵進行機器學習的方法來進行特徵挖掘、特徵學習後得到的特徵,比如
PCA
特徵,LDA
學習之後的特徵等一些基於優化理論來完成的特徵的學習。 - 高層次的特徵。將低層次或中層次特徵進行進一步挖掘和表示,比如可以把一個人可以用是否戴帽子、頭髮的長短、所穿的服裝等來表示。
目標檢測算法中通常使用低層次特徵和中層次特徵。
然後對提取出來的特徵用學習好的分類器進行分類判定。得出一系列可能爲當前檢測目標的候選框,這些候選框可能會存在一些重疊的狀況,然後通過NMS
非極大值抑制的算法來對候選框進行合併,最後得到最終需要檢測的目標,也就是算法輸出的結果。
3.2 Viola-Jones
它主要用於人臉檢測 ,它的主要關鍵點有:
Haar
特徵提取- 訓練人臉分類器(
Adaboost
算法等) - 滑動窗口
(1)特徵
最終特徵的表示形式爲表示爲直方圖,它需要統計下面四種不同類別的特徵
具體可以看這個博客:https://www.cnblogs.com/mikewolf2002/p/3438181.html
(2)Adaboost
算法
- 初始化樣本的權重w,樣本權重之和爲1
- 訓練弱分類器
- 更新樣本權重
- 循環第二步
- 結合各個分類器結果,進行投票
3.3 HOG+SVM
它主要用於行人檢測,行人檢測的難點主要在於行人一般處於運動狀態,行人的姿態存在比較多的差異,它的步驟如下:
- 提取
HOG
特徵 - 訓練
SVM
分類器 - 利用滑動窗口提取目標區域,進行分類判斷
NMS
- 輸出檢測結果
(1)HOG
特徵
HOG
特徵通過計算梯度方向來統計最後的直方圖,也是紋理特徵的一種,它的流程如下:
- 灰度化+
Gamma
變換。hog
特徵主要用在灰度圖上,gamma
變換指對整個像素的值開根號,這樣整個像素的值會變小。 - 計算梯度
map
。即計算每個點在x
方向和y
方向上的梯度值,並利用這個梯度值在計算梯度夾角,方向角a=arctan(x/y)
,然後將a
量化到0-360°
,再劃分爲x
個段,比如18個段,20°
爲一個段。 - 圖像劃分成小的
cell
,統計每個cell
梯度直方圖。如果上面劃分18個段,那麼統計出的直方圖維度就是18維。 - 多個
cell
組成一個block
,特徵歸一化。假如每個cell
得到一個18維的特徵,每四個cell
組合成一個block
,那麼一個block
的特徵維度就是4*18
,然後歸一化。 - 多個
block
串聯,並歸一化。
hog
特徵的維度跟量化的角度有關,然後跟cell
的大小有關係,通常hog
特徵有幾千維,所以直接用hog
特徵計算的時候計算難度也比較大,所以可以採用PCA
降維的方法進行降維
(2)SVM
SVM
的東西比較多,有需要的可以好好學習一下。
3.4 DPM
它是傳統目標檢測算法的巔峯之作,它是對HOG
算法的一種擴展,進行特徵提取時基於HOG
特徵進行擴展和優化,利用SVM
訓練得到物體的梯度。它的流程如下:
- 計算
DPM
特徵圖 - 計算響應圖
Latent SVM
分類器訓練- 檢測識別
(1)計算DPM特徵圖
對於方向特徵,如果我們統計0~360°
一整圈的方向特徵,則稱之爲有符號的梯度,如果不考慮方向,只考慮0-180°
的變換,則稱之爲無符號的梯度。
DPM
算法在特徵提取時分別針對有符號梯度和無符號梯度這兩種特徵進行提取。
在有符號梯度方向表示的時候將整個角度空間表示爲18維的向量,對於無符號梯度方向直方圖將整個角度空間表示爲9維的向量,這樣就能得到27維的特徵,也就是說對每個cell
可以得到27維的直方圖。
針對HOG+SVM
中,HOG
維度過高的弊端,通常會採用PCA
對HOG
特徵進行降維,在DPM
算法中則採用一種逼近PCA
的方法來進行一種近似的處理,即對每一個cell
所提取出的27維的直方圖進行求和來表示,在水平方向上求和得到4個值,在垂直方向上進行求和來得到27個值,然後將4和27個值得到拼接得到最終37維的特徵向量,這樣一方面避免了PCA
降維過程,因爲PCA
可能會帶來性能上的消耗。直接採用累加方式首先速度上有很大地提升,另外也能達到一個較好的降維的效果。
(2)計算響應圖(root filter和part filter)
得到特徵圖後進一步計算響應圖,響應圖表示當前區域可能爲目標的值,這個值可以理解爲能量分佈,當前的能量分佈越高則可能爲檢測目標的概率越大。
響應圖包括局部區域值的檢測和整體的檢測。比如對於一個行人來說可能要去檢測他的頭,檢測他的胳膊,檢測他的軀幹,將他的局部區域檢測出來之後,我們就能進一步地判定當前的目標是否是行人。
(3)Laten SVM分類器訓練
針對響應圖我們訓練SVM
分類器進行分類識別,然後結合NMS
算法進行分類框的合併。
3.5 NMS(非極大值抑制算法)
目的:爲了消除多餘的框,找到最佳的物體檢測的位置。
思想:選取那些鄰域裏分數最高的窗口,同時抑制那些分數低的窗口。
如上圖右邊框過多,我們只需要保留最佳的框。
(1)NMS
:
- 對所有檢測到的框按照得分進行排序,選出得分最高的檢測框。
- 將同得分最高的檢測框的
IOU
面積大於某個閾值的框(即重疊率高的框)刪除。 - 對沒有處理過的檢測框重新排序,選出得分最大的檢測框。
- 將同當前得分最大的檢測框的
IOU
面積大於某個閾值的框 ,再進行刪除。 - 不斷迭代這個過程,直到所有檢測框都被處理後我們輸出最終的檢測框。
(2)soft-NMS
改進:Soft-NMS
(非極大值抑制算法)
我們直接採用閾值來對檢測框進行判定是不太合理的,處理起來過於粗暴。
- 相鄰區域內的檢測框的分數進行調整而非徹底抑制,從而提高了高檢索率情況下的準確率。
- 在低檢索率時仍能對物體檢測性能有明顯提升。
4. 基於深度學習的目標檢測算法
4.1 Two-stage基本介紹
4.1.1 概述
(1)Two-stage
目標檢測算法主要通過一個完整的卷積神經網絡來完成目標檢測的過程。通過卷積來提取候選區域目標的特徵的描述。
(2)它的典型代表有R-CNN
到fast RCNN
、faster RCNN
(3)如果不考慮two-stage
算法需要單獨訓練RPN
網絡這一過程,可以將它理解爲廣義的端到端的目標檢測算法。實際上它也不是完全意義上的端到端,因爲在訓練網絡的過程中需要分爲兩個步驟,第一步是訓練RPN
網絡,第二步纔是訓練目標檢測區域的網絡。但相對於傳統目標檢測算法,它不需要再去額外訓練分類器、做特徵表示這一過程,整個目標檢測的過程都通過一個從A到B的一個完整的卷積神經網絡來完成,相對於傳統的目標檢測算法,它的精度得到了較大的提升。
(4)準確度高,速度相對one-stage
慢。
4.1.2 two-stage基本流程:
- 首先輸入一個圖片
- 然後對圖片通過卷積神經網絡進行深度特徵的提取,我們把這裏的卷積神經網絡稱爲主幹網絡,典型的主幹網絡有如
VGG
,Resnet
等。 - 通過一個
RPN
網絡來產生候選區域,並將候選區域分爲背景和目標兩種,並對目標位置進行初步預測。 ROI_Pooling
。對於多個feature map
,我們想要不去重複地計算CNN
特徵,所以就要ROI Pooling
。fc
全連接進行分類和迴歸分別完成對候選目標類別的判定和位置的精修。
4.1.3 two-stage常見算法
4.2 Two-stage核心組件
Two-stage
核心組件有CNN
網絡和RPN
網絡。
4.2.1 CNN網絡
CNN
網絡我們通常有以下幾個設計原則:
- 從簡到繁再到簡的卷積神經網絡。最開始的網絡如
LeNet
非常簡單,只有幾個卷積層池化層,結構簡單,但在大規模任務中可能性能沒那麼好 。後面VGG
,DenseNet
,ResNet
等複製的網絡被提出,它們一般儘可能增加網絡深度來增強非線性表達能力,如DenseNet
,ResNet
且越深層次的網絡對圖像最初的變換更不敏感,也就是說越深層次的特徵魯棒性越好,但越深的網絡會加大網絡規模和導致梯度消失梯度爆炸;或者儘可能加大網絡寬度來增加網絡的表達能力,如GoogleNet
。在後面設計的輕量網絡如MobileNet
是最後簡的部分。 - 多尺度特徵融合的網絡
- 更輕量級的
CNN
網絡,因爲有些網絡需要跑在終端而不是雲端,如MobileNet
。可以對網絡進行壓縮裁剪等進行輕量化來減小網絡的大小,使網絡在儘可能小地損失性能的情況下壓縮模型的大小,使網絡最終能跑在一些性能比較差的機器上。
4.2.2 RPN網絡
經過主幹網絡之後我們會得到feature map
, 它通常爲一個n*c*w*h
維度的特徵。n
爲batch_size
的數量,c
爲channle
的個數,w
和h
爲長寬。把feature map
送給RPN
網絡來完成區域推薦和候選目標的篩選。這相當於傳統目標檢測算法的滑動窗口策略。
-
區域推薦(
Anchor
機制)feature map
的每個錨點,用9個不同的尺度提取9個候選區域。所以一個w*h
的feature map
可以提取w*h*9
個候選區域,然後對候選區域進行篩選劃分爲背景和目標。用與GT
的IOU
來篩選是否是目標,比如IOU
大於0.7爲正樣本,小於0.3爲負樣本。 此時候選區域是針對特徵圖的,我們要找到相對於原圖的特徵區域的話可以通過原圖下采樣來找。 -
ROI Pooling
輸入:特徵圖、
rois(1*5*1*1)
區域的座標(I(索引),X,Y,W,H
)、ROI
參數。
輸出:固定尺寸的feature map
,通過ROI
參數來設定。因爲後面要進入fc
,所以要固定尺寸。 -
分類和迴歸
改進方向:
4.3 One-stage基本介紹
4.3.1 One-stage 綜述
(1)使用CNN
卷積特徵
(2)直接回歸物體的類別概率和位置座標值(無region proposal
)
(3)準確度低、速度相對two-stage
快
4.3.2 One-stage基本流程
給定輸入後進入一個主幹網絡進行特徵提取,然後直接進行區域的迴歸和目標的分類。在很多嵌入式產品中更加傾向於one-stage
的目標檢測。
4.3.3 One-stage常見算法
其中,YOLO
和SSD
用得最多。
4.4 One-stage核心組件
4.4.1 CNN網絡
CNN
網絡設計原則:
- 從簡到繁再到簡的卷積神經網絡
- 多尺度特徵融合的網絡
- 更輕量級的
CNN
網絡
4.4.2 迴歸網絡
(1)區域迴歸(置信度、位置、類別)
(2)Anchor
機制(SSD
)
SSD
算法同樣採用了Anchor
機制來回歸目標區域,對於經過主幹網絡卷積之後得到的feature map
,我們考慮feature map
中的每個點都是一個anchor
,每個anchor
提取不同尺度的長寬比,然後對這些目標區域進行位置迴歸和類別判定。
4.4.3 迴歸網絡預測過程
以Yolo
爲例:
Yolo
算法進行預測的時候會針對整張圖片進行劃分成S*S
的格子,每個網格分別預測當前網格爲中心的目標區域的位置信息,預測出中心之後再給出格子的尺寸,就能在圖片中找到一個矩形區域,然後再預測一個置信度。然後針對每一個格子預測出當前的格子所屬的目標的類別的概率分佈值。後面的省略。
由於我們採用格子劃分的方式,認爲每一個格子點都是目標檢測的中心點,但有可能劃分的格子都不是目標的中心點,所以基於中心點來預測目標區域所對應的boundingbox
這種假設會導致檢測框準確度會更低;它也可能一個格子中包含兩個中心點,這時候會漏檢。
4.5 One-stage VS Two-stage
一些解釋:
對於共享計算量,Two-stage
中提取出目標候選區域後通過共享參數的方式減小網絡的模型,這一點因爲one-stage
網絡上所以不會被用到,Two-stage
中相當於對模型進行了正則。
具體的算法選型通常依賴於計算的瓶頸,也就是在產品中會分配給多少資源給目標檢測,如果很難做到任意資源的分配的話,需要平衡算法的性能以及算法模型大小和功耗。