# 經典目標檢測識別方法概述RCNN/FAST/FASTER RCNN/MASK RCNN/SSD/DSSD/YOLO V1/YOLO V2等

經典目標檢測識別方法概述@陳子逸

經典目標檢測識別方法概述

由於水碩期間自學了一些目標探測的方法,這裏做一個概述,肯定有不完美的地方,還請指正一起進步.

綜述

1.分別簡單描述一下RCNN系列:

在我看來, RCNN 是一個benchmark,首先利用傳統的圖像檢測方法基於紋理特徵用selective search 如HOG,sift來產生一些候選框,然後將這些候選框加入到卷積神經網絡中進行訓練和分類.這很明顯不是一個端到端的算法,我記得一幅圖就需要47s以上的時間來識別.

在這個基礎上何等人又提出了Fast rcnn. 這裏就不用傳統的SVM/reg(線性迴歸模型) 來分類而是同樣採用神經網絡(多任務網絡)來分類, 他是結合SPPnet改進RCNN,在這裏提出了ROI Pooling,利用這個ROI Pooling層得到FC層固定的輸入. 但是在候選區域提取的過程仍然選擇的是selective search的方法.
Linear+ softmax:分類
Bounding-box regressors:迴歸
但是Roi 還是需要一些傳統的算法去原始圖像上找,再把處理的結果匯入CNN
.這一步只能在CPU上面做!!!沒辦法用GPU,所以無法迭代到神經網絡中來.

Faster就把候選區域提取這一部分的工作進行了優化,引入了RPN網絡. RPN網絡最直接的是anchor機制, 這個機制對特徵圖上的每個像素點進行三個尺度的反映射,利用感受野的比例在原圖上產生一堆box. 然後對這些可能是目標的box進行篩選和精細化過濾,這裏有一些小tricks. 比如把和圖像邊框重疊的去掉以及以IOU比例來去掉一部分,再加上非極大值抑制,最終一幅圖大概還剩2000個框. 然後就是2層共四個分類迴歸器當中.第一層是判斷前景背景,從傳遞函數可以看出來,如果不是前景,Pi*(anchor預測是物體的概率)是0,右邊半部分是0,就不需要bbox regression的計算了同時左邊很明顯是二分類交叉熵損失.朗達值是用來分配分類迴歸權重的.
在這裏插入圖片描述
而mask-rCNN呢 比起之前有了2個最明顯的提高. mask的backbone使用新的resnet+FPN.另外使用ROI align替換ROI Pooling.更具體一點就是ResNeXt+RPN+RoI Align+Fast R-CNN+FCN。 深度殘差網絡是一種神經網絡中將輸入輸出跨層連接 的一種網絡,函數是F(x)+x,x爲之前層的輸出.因爲隨着網絡深度的增長,cnn的效果(performance)並不是越來越好,相反會下降,而深度殘差網絡因爲將前幾層的結果跨層輸入到後面的層未經過激活函數的放縮可以極大的保存原始的特徵.而RPN網絡是左右2個模型,左邊是bottom-up模型就是簡單的卷積過程,這裏作者是將深度殘差網絡中的幾個過程分爲幾個stage.,feature map的大小在經過某些層後會改變(Pooling層),而在經過其他一些層的時候不會改變,作者將不改變feature map大小的層歸爲一個stage,因此每次抽取的特徵都是每個stage的最後一個層輸出,這樣就能構成特徵金字塔。將每個stage 的結果輸出成爲C1-C5的特徵圖,其分辨率從512到32,然後通過C5一個11卷積得到P5(達到通道數與高層相同),再P5高層與較低一層且通過11卷積後的C4相加得到P4,後面以此類推.生成P2–P5後,再通過一個33的卷積生成新的P2-P5(消除混疊效應),P5上採樣生成P6只進行RPN網絡使用.
每個層利用RPN三個比例就能生成15個anchor,那麼如何決定該選擇哪層特徵圖進行ROI Pooling呢? 有一個公式,其作用是大尺度的ROI就用高層特徵.輸出爲三個: rpn-logits/rpn-class/rpn-bbox. Roialign呢就是針對之前roipooing的座標轉換的浮點型近似帶來的特徵圖信息值缺失的改良,對該點周圍四個像素點進行雙線性插值,然後maxpooling得到的值比只進行近似要好很多.進行完roi pooling後, 用FCN對mask 分支機構對每個roi產生k個分辨率m
m的二值掩膜,K爲分類物體總類數.根據faster rcnn裏面的預測判斷使用哪一個掩膜,對於預測的二值掩膜的每一個像素點,我們都應用sigmod激活函數(127-0.77舉個例子),整體使用二分類交叉熵損失函數.這樣就允許每個類生成獨立的掩膜,避免類間競爭(解耦).如果像只用FCN那樣對每個像素點進行softmax,整體使用多任務交叉熵,會引起競爭,導致分割效果差.
FCN是全卷積,實現任何輸入,而且因爲pooling的分辨率降低,便使用上採樣,同時有結合不同深度的跳級skip結構.
在這裏插入圖片描述
SSD?

SSD是利用多尺度特徵圖來進行檢測的算法, 主幹網絡是vgg16,去掉了最後的FC層.因爲vgg16後面的FC層是用來分類,在這些只利用前部分提取特徵不用分類,一共有6個尺度的特徵圖,從3838到11. 這裏也借鑑了faster rcnn中的rpn網絡, 叫prior box其實差不多,scale也是自己定義.3838、1919、1010每個產生6個,其他三個每個產生4個box. 最終輸出的向量緯度爲(C類+4)kmn.同樣是參照rpn,設定一個閾值,大於爲正樣本,小於一個閾值爲負樣本.中間的省略.這裏要注意兩個閾值不一樣.同時負樣本也會添加一些難例,正負樣本比例基本是1:3.數據增強是通過隨機採用多個path,分類用的softmax loss,迴歸用的smooth L1. 損失函數裏面採用的jaccard函數算IOU其實就是RPN裏面算IOU的方法.最終損失函數通過置信損失和分類損失按比例和的形式得到.

DSSD ?

將SSD中的vgg16模型前部分backbone替換成了ResNet. 然後在網絡後面添加了反捲積網絡層,原因是增加了大量上下文信息.後面還有些作者添加不同的預測結構這個有餘力可以看看。

YOLO V1

將圖像分爲SS個格子, 每個框包含ground truth的拿去迴歸. 這裏我們可以發現, 無論大小分辨率的圖都是固定的SS個格子,這樣對於小物體的檢測沒有特別突出的優化,容易檢測失誤. 但這是一個端到端的算法, 或者說one-stage. 它沒有faster rcnn那種候選框提取的步驟,整個網絡都在CNN網絡中進行, 每個格子產生B個框,每個框有5個座標,4個位置,1個置信度,置信度就是框和ground的IOU,所以總的輸出向量爲(5B+C)SS這一個tensor. C是預測的類別信息,置信度爲box含物體的概率IOU兩個乘積(測得有多準).從這裏可以看出如果不是objct,第一項就是0,總的置信度0,也就不參與後面計算. 得到的box一樣也是設定閾值再NMS. 有個特點是使用小卷積代替了inception moudule.但是這個inception module我不瞭解,回頭學習一下. 爲了更加精細化, 分辨率也是從224達到了448,同時設置一個dropout層,在第一個全連接層後面,ratio=0.5,爲了防止過擬合.
但是在損失函數上面,作者將分類,迴歸,置信度三部分平方和,這樣比較簡單粗暴.如果是原論文的模型, B=2, C20類 5*B+C=30. 拿8維的迴歸座標和20維的分類來同樣權重平方和不太合理.而且由於大部分都不是物體,置信度爲0可能會導致後面的網絡發散或者崩潰.所以目標函數權重引入參數比較好.另外缺點還有隻能輸入固定尺寸,對小目標識別較差.

YOLO V2

最明顯的是用卷積層代替了FC,同時引入了anchor機制. 同時對所有層都進行batch norm.batch norm 就是對每次的輸入進行批規範化處理(歸一化), 使其輸入儘量高斯分佈,使訓練比較規範,不會擴散錯誤,加快訓練速度. 輸入尺寸從v1的448變成416,因爲總的池化層pooling尺度爲32,這樣到最後一層就是13,對於圖片來說一般的物體在中間的概率最大,13的話中心就是一個點,更好捕捉信息. 而且改造了darknet來代替以往的純CNN結構,更加高效,這個網絡特點就是每次下采樣通道翻倍. 因爲SSD和faster rcnn的box scale都是手動設置,而v2採取聚類K-means去分類box,但是沒有采用歐式距離這樣box越大error比較大,而是採用1-IOU進行聚類分析.

以下是分別詳細的回憶

RCNN

Region proposal
給一些候選框,然後再找.

Selective search
先通過一些紋理特徵 將圖像分爲潛在的可能是物體的候選框.

SVM 分類器、Bbox reg:迴歸

RCNN: 一張圖像產生2k個候選框,再分別進行CNN處理.
慢!!!~ 47s一張圖像
卷積不限制輸入大小,全連接層有限制: 要保持輸入一致.

ROI pooling
通過一個pooling 層把大小不同尺寸大小的特徵圖連成串(拼接在一起)的大小是一致的.
在這裏插入圖片描述
SPPnet的優化:
輸入: feature map
原始的需要reseize
在這裏插入圖片描述
得到一個21維的特徵每個通道. 21*通道(256)
就可以忽略feature map的大小,只對原圖進行一次卷積.

Fast RCNN

在這裏插入圖片描述
不用SVM/Reg來分類用CNN.

與SPPnet不同的是採用了ROI pooling層來得到FC層的固定輸入.
在這裏插入圖片描述
在這裏插入圖片描述
ROI Pooling: 在這裏插入圖片描述
在這裏插入圖片描述
先卷積, 候選區域是selective research.

先總的卷積.
RoIs: 通過感受野找到原始圖像該區域的大小.

基本上是端到端.
Linear+ softmax:分類
Bounding-box regressors:迴歸
在這裏插入圖片描述
但是Roi 還是需要一些傳統的算法去原始圖像上找,再把處理的結果匯入CNN
.這一步只能在CPU上面做!!!沒辦法用GPU,所以無法迭代到神經網絡中來.

RCNN Fast RCNN 對比:
在這裏插入圖片描述

Faster RCNN

15年年末
在這裏插入圖片描述
Region Proposal Network
之前是沒有一個好的產生候選框的方法,也不是在神經網絡中產生的
在這裏插入圖片描述
主要完成二分類,背景和前景.,RPN裏面也有一個Roi Pooling層.
粗分類,粗定位.
在這裏插入圖片描述
3*3滑動窗口,中心點作爲anchor.

三個面積爲: 128/256/512.

從特徵圖產生候選框!!!.
在這裏插入圖片描述
有四個LOSS值:
在這裏插入圖片描述
對產生的2w個候選框進行2分類,看看他是什麼,是不是物體.
1: 判斷是不是前景還是背景. 2分類
2: 做微調,用Bounding box regression 算與當前
3. 20分類
4. 找到最合適的邊框迴歸的位置.
端到端!!!
在這裏插入圖片描述
以往的方法: 1圖像金字塔 將圖像按不同比例放大縮小 再卷積
2對feature map 按不同比例縮放.

RPN網絡: 把任意圖像都能當成輸入.
                輸出: 當前框是不是物體,以及它是不是物體的得分.

在這裏插入圖片描述
對特徵圖再進行一次卷積:
對於特徵圖的每一個點,都有其原圖的感受野,對特徵圖每一個點進行映射到原始的輸入上,得到的區域就是感受野.

K anchor boxes
	9個box 3個初始長寬比. 128/256/512

在這裏插入圖片描述
cls layer: 分類 看是不是物體 2k個 前景和背景的得分
reg layer: 迴歸 判斷座標 4k個

Sliding window: 不停滑動
2個11的卷積代替全連接層.
在這裏插入圖片描述
原圖400
600 最後一層conv 40*60 2400個點 總共2w個候選框

Loss Function

1. 選擇候選框中重疊比例最大的, 打爲正標籤.
2. IOU大於0.7的,打爲正標籤. 負例爲小於0.3. 中間的全部去掉.

在這裏插入圖片描述

RPN網絡訓練

Mini batch=1.
任意選256個. 儘量使正負樣本爲1:1, 都是高斯初始化.

越界的框也不要了. 剩 6000個.

大多數框都重疊了: 引入非極大值抑制NMS
保留物體比例 Sa>Sb 大的. 剩2000個

再取個top N. 128個

RPN做的它到底是不是東西,最後還有一個分類做的是它到底是個什麼東西. 20分類…
在這裏插入圖片描述
SPPnet的優化:
輸入: feature map
原始的需要reseize
在這裏插入圖片描述
得到一個21維的特徵每個通道. 21*通道(256)
就可以忽略feature map的大小,只對原圖進行一次卷積.

Mask RCNN

遵循自下而上的原則,依次的從backbone,FPN,RPN,anchors,RoIAlign,classification,box regression,mask這幾個方面講解。
FPN: 特徵金字塔.

除了class和box,加了mask分割的任務.

轉置卷積 *2

RPN: 基於滑窗的無類別obejct檢測器

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
RPN在圖像上創建大量的boxes(anchors),並在anchors上運行一個輕量級的二值分類器返回有目標/無目標的分數。具有高分數的anchors(positive anchors,正樣本)會被傳到下一階段用於分類。

通常,positive anchors也不會完全覆蓋目標,所以RPN在對anchor打分的同時會迴歸一個偏移量和放縮值,用於修正anchors位置和大小。
在這裏插入圖片描述
語義分割, 實例分割.
在這裏插入圖片描述
在這裏插入圖片描述
後來出現的SNIP、SNIPER也是基於Image Pyramid.

SSD: 在不同尺度的feature map上做檢測
在這裏插入圖片描述
SSD就採用了圖像特徵金字塔, 但FPN作者認爲SSD算法中沒有用到足夠低層的特徵(在SSD中,最低層的特徵是VGG網絡的conv4_3),而在作者看來足夠低層的特徵對於檢測小物體是很有幫助的。

FPN:把低分辨率、高語義信息的高層特徵和高分辨率、低語義信息的低層特徵進行自上而下的側邊連接,使得所有尺度下的特徵都有豐富的語義信息。

VGG16/ROIalign

在這裏插入圖片描述
假定我們輸入的是一張800x800的圖像,在圖像中有兩個目標(貓和狗),狗的BB大小爲665x665,經過VGG16網絡後,獲得的feature map 會比原圖縮小一定的比例,這和Pooling層的個數和大小有關:

在該VGG16中,我們使用了5個池化操作,每個池化操作都是2Pooling,因此我們最終獲得feature map的大小爲800/32 x 800/32 = 25x25(是整數)

但是將狗的BB對應到feature map上面,我們得到的結果是665/32 x 665/32 = 20.78 x 20.78,結果是浮點數,含有小數,取整變爲20 x 20,在這裏引入了第一次的量化誤差;
然後我們需要將20 x 20的ROI映射成7 x 7的ROI feature,其結果是 20 /7 x 20/7 = 2.86 x 2.86,同樣是浮點數,含有小數點,同樣的取整,在這裏引入了第二次量化誤差。

爲了得到爲了得到固定大小(7X7)的feature map,ROIAlign技術並沒有使用量化操作,取而代之的使用了雙線性插值,它充分的利用了原圖中虛擬點(比如20.56這個浮點數,像素位置都是整數值,沒有浮點值)四周的四個真實存在的像素值來共同決定目標圖中的一個像素值,即可以將20.56這個虛擬的位置點對應的像素值估計出來。

藍色的虛線框表示卷積後獲得的feature map,黑色實線框表示ROI feature,最後需要輸出的大小是2x2,那麼我們就利用雙線性插值來估計這些藍點(虛擬座標點,又稱雙線性插值的網格點)處所對應的像素值,最後得到相應的輸出。
然後在每一個橘紅色的區域裏面進行max pooling或者average pooling操作,獲得最終2x2的輸出結果。我們的整個過程中沒有用到量化操作,沒有引入誤差,即原圖中的像素和feature map中的像素是完全對齊的,沒有偏差,這不僅會提高檢測的精度,同時也會有利於實例分割。
在這裏插入圖片描述
在這裏插入圖片描述
重點在於:作者把各種網絡作爲backbone進行對比,發現使用ResNet-FPN作爲特徵提取的backbone具有更高的精度和更快的運行速度,所以實際工作時大都採用右圖的完全並行的mask/分類迴歸

mask分支針對每個RoI產生一個Kmm的輸出,即K個分辨率爲m*m的二值的掩膜,K爲分類物體的種類數目。依據預測類別分支預測的輸出,我們僅將第i個類別的輸出登記,用於計算

對於預測的二值掩膜輸出,我們對每個像素點應用sigmoid函數,整體損失定義爲平均二值交叉損失熵。引入預測K個輸出的機制,允許每個類都生成獨立的掩膜,避免類間競爭。這樣做解耦了掩膜和種類預測。不像FCN的做法,在每個像素點上應用softmax函數,整體採用的多任務交叉熵,這樣會導致類間競爭,最終導致分割效果差。
在這裏插入圖片描述

SSD

不同尺度的特徵圖上進行預測.
在這裏插入圖片描述

One-stage 直接回歸.不需要proposal.
1.主幹網絡是Vgg16.去掉了原始的fc層,目標檢測不需要分類任務,增加捲積層,提高模型性能.
2.對6個尺度的feature map.3838-11

3.Prior box
Anchor(cell),等比,找到原始圖的box.跟rpn差不多.
Scale: 定義.1. Sk=(smin+smax-smin/m-1)(k-1) 2.長寬比
6個不同的box.
在這裏插入圖片描述
(C類別+4個座標偏移值)K個anchorM
N 特徵圖 這樣緯度的輸出.

大於閾值正樣本,中間的省略.
負樣本: 難例, 正負樣本比達到1:3

數據增強: 隨機採樣多個path.
分類: softmax loss.
迴歸: smooth L1.
在這裏插入圖片描述

DSSD

DSSD有哪些創新點?
1. Backbone:將ResNet替換SSD中的VGG網絡,增強了特徵提取能力
2. 添加了Deconvolution層,增加了大量上下文信息

YOLO V1

在這裏插入圖片描述
對於每個格子,預測出 5*B+C這樣的向量長度.

總的: (5B+C)SS
YOLO對每個bounding box有5個predictions:x, y, w, h,
and confidence。
座標x,y代表了預測的bounding box的中心與柵格邊界的相對值。
座標w,h代表了預測的bounding box的width、height相對於整幅圖像width,height的比例。
confidence就是預測的bounding box和ground truth box的IOU值。
每一個柵格還要預測C個 conditional class probability(條件類別概率):Pr(Classi|Object)。即在一個柵格包含一個Object的前提下,它屬於某個類的概率。
我們只爲每個柵格預測一組(C個)類概率,而不考慮框B的數量。
conditional class probability信息是針對每個網格的。 confidence信息是針對每個bounding box的。在測試階段,將每個柵格的conditional class probabilities與每個 bounding box的 confidence相乘:
24個卷積層+2個全連接層.
Yolo1使用1
1+33小卷積代替inception module.
爲了更精細化,224
224分辨率提升到448*448.
爲了防止過擬合,在第一個全連接層後面接一個ratio=0.5的dropout層.
損失函數
損失函數的設計目標就是讓座標(x,y,w,h),confidence,classification 這個三個方面達到很好的平衡。
簡單的全部採用了sum-squared error loss來做這件事會有以下不足:
a) 8維的localization error和20維的classification error同等重要顯然是不合理的。
b) 如果一些柵格中沒有object(一幅圖中這種柵格很多),那麼就會將這些柵格中的bounding box的confidence 置爲0,相比於較少的有object的柵格,這些不包含物體的柵格對梯度更新的貢獻會遠大於包含物體的柵格對梯度更新的貢獻,這會導致網絡不穩定甚至發散。
在這裏插入圖片描述
在這裏插入圖片描述
置信度: 兩種概率的乘積.
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
正如損失函數寫的,只有該bounding box負責該物體的時候,纔會產生loss

缺點:
在這裏插入圖片描述

YOLO V2/YOLO9000

在這裏插入圖片描述
在這裏插入圖片描述
Batch norm:
在這裏插入圖片描述
在這裏插入圖片描述
13*13 反推32下采樣=416.

Bounding box : 兩個重疊/兩個面積並 排出了框尺寸的影響
在這裏插入圖片描述
重新設計的網絡:
每次max pooling(下采樣),通道翻倍.
在這裏插入圖片描述
對於每一個box: 預測 (5+C)*B 更加關注類別,因爲anchor.

YOLO-v2取消了全連接層,而是使用anchor box(應該是借鑑SSD)。去掉了一個池化層來得到更高的分辨率。爲了最後得到奇數個位置,確定中心,所以分辨率改爲416416。最後得到一個1313的feature map。
K-means對Bouding box進行聚類。傳統的聚類方法是用歐式距離,這樣大的box往往有更大的error,所以作者採用1-IOU作爲聚類的距離。因爲模型僅僅使用卷積和池化,所以可以隨意修改尺寸。作者訓練的多種尺寸的網絡。包含{320,352,…608}。尺寸越大正確率越高,速度越慢。所以可以根據需求選擇分辨率.之前大部分的檢測框架基於VGG-16,一個強大,準確的網絡。但是運算量太大。所以作者構建了新的框架darknet-19。

一些新型網絡

HyperNet:
2016由清華提出.

RFCN:何凱明.

Light-Head RCNN 曠視和清華.

部分來源:1. https://blog.csdn.net/u011974639/article/details/78483779
2.https://www.cnblogs.com/hellcat/p/9749538.html

以上圖片資料均來自公開論文及其開源網站,如有冒犯,請私我刪除.

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