信息量爆炸,看了各種博客后摘抄總結(jié)一下,免得明天又忘了。。

目標(biāo)檢測(cè)近年來已經(jīng)取得了很重要的進(jìn)展,主流的算法主要分為兩個(gè)類型:(1)two-stage方法,如R-CNN系算法,其主要思路是先通過啟發(fā)式方法(selective search)或者CNN網(wǎng)絡(luò)(RPN)產(chǎn)生一系列稀疏的候選框,然后對(duì)這些候選框進(jìn)行分類與回歸,two-stage方法的優(yōu)勢(shì)是準(zhǔn)確度高;(2)one-stage方法,如Yolo和SSD,其主要思路是均勻地在圖片的不同位置進(jìn)行密集抽樣,抽樣時(shí)可以采用不同尺度和長(zhǎng)寬比,然后利用CNN提取特征后直接進(jìn)行分類與回歸,整個(gè)過程只需要一步,所以其優(yōu)勢(shì)是速度快,但是均勻的密集采樣的一個(gè)重要缺點(diǎn)是訓(xùn)練比較困難,這主要是因?yàn)檎龢颖九c負(fù)樣本(背景)極其不均衡(參見Focal Loss),導(dǎo)致模型準(zhǔn)確度稍低。不同算法的性能如圖1所示,可以看到兩類方法在準(zhǔn)確度和速度上的差異。(3)Anchor free方法。如:centernet
一、Two-stage類別的目標(biāo)檢測(cè)算法
如R-CNN系列算法,其主要思路是先通過啟發(fā)式方法(selective search)或者 CNN 網(wǎng)絡(luò)(RPN)產(chǎn)生一系列稀疏的候選框,然后對(duì)這些候選框進(jìn)行分類(classification)與回歸(bounding box regression),two-stage方法的優(yōu)勢(shì)是準(zhǔn)確度高;
圖源鏈接:https://blog.csdn.net/gaoyu1253401563/article/details/86485851


1.R-CNN


主要思想:
1.輸入一張圖像
2.(Selective Search)選擇性搜索從圖像中生成2000個(gè)左右的區(qū)域建議框。
不使用暴力方法,而是用候選區(qū)域方法(region proposal method)創(chuàng)建目標(biāo)檢測(cè)的感興趣區(qū)域(ROI)。在選擇性搜索(selective search,SS)中,我們首先將每個(gè)像素作為一組。然后,計(jì)算每一組的紋理,并將兩個(gè)最接近的組結(jié)合起來。但是為了避免單個(gè)區(qū)域吞噬其他區(qū)域,我們首先對(duì)較小的組進(jìn)行分組。我們繼續(xù)合并區(qū)域,直到所有區(qū)域都結(jié)合在一起。下圖第一行展示了如何使區(qū)域增長(zhǎng),第二行中的藍(lán)色矩形代表合并過程中所有可能的 ROI。

3.將每一個(gè)區(qū)域建議框轉(zhuǎn)換為固定大小的圖像,并分別饋送到卷積神經(jīng)網(wǎng)絡(luò)中。該網(wǎng)絡(luò)架構(gòu)后面會(huì)跟幾個(gè)全連接層,提取特征,并組合特征。
4.使用線性SVM分類器對(duì)每個(gè)區(qū)域建議框分類
5.通過邊界框回歸算法重新定義目標(biāo)邊界框
局限性:
1.目標(biāo)候選區(qū)域的重疊使CNN特征提取存在很大冗余,如果我們有 2000 個(gè)候選區(qū)域,且每一個(gè)都需要獨(dú)立地饋送到 CNN 中,那么對(duì)于不同的 ROI,我們需要重復(fù)提取 2000 次特征。
2.crop/warp導(dǎo)致圖片的信息缺失或變形,影響識(shí)別精度。
2.Fast R-CNN


主要思想:
1.生成建議窗口,F(xiàn)ast R-CNN用(Selective Search)方法生成建議窗口,每張圖片大約2000張。
2.Fast R-CNN 使用特征提取器(CNN)先提取整個(gè)圖像的特征,而不是從頭開始對(duì)每個(gè)圖像塊提取多次。Fast R-CNN將建議窗口映射到CNN的最后一層卷積feature map上。
3.ROI Pooling 將不同尺寸的特征圖塊轉(zhuǎn)換為固定的大小,并饋送到全連接層進(jìn)行分類和定位
????因?yàn)?Fast R-CNN 使用全連接層,所以我們應(yīng)用 ROI Pooling 將不同大小的 ROI 轉(zhuǎn)換為固定大小。
????ROI Pooling 借鑒了spp的思想,可理解為單尺度的SPP層。
????為簡(jiǎn)潔起見,我們先將 8×8 特征圖轉(zhuǎn)換為預(yù)定義的 2×2 大小。

????輸入特征圖(左上),輸出特征圖(右下),ROI (右上,藍(lán)色框)。
????按上述步驟得到一個(gè) 2×2 的特征圖塊,可以饋送至分類器和邊界框回歸器中
4.送入全連接層和softmax計(jì)算每個(gè)候選框具體屬于哪個(gè)類別,輸出類別的得分
5. Smooth L1 Loss 生成邊框回歸

解決R-CNN問題:
1.Fast R-CNN直接將圖像歸一化后接CNN,然后在最后一層特征圖上增加區(qū)域建議框,相比R-CNN要將每個(gè)區(qū)域建議框使用CNN提取特征要節(jié)省很多計(jì)算量,因此速度得到顯著提升。
2.對(duì)特征圖塊進(jìn)行ROI Pooling取代 R-CNN中crop/warp圖像的操作
3.Fast R-CNN還引入了一個(gè)重要的策略,在對(duì)窗口進(jìn)行分類的同時(shí),還會(huì)對(duì)物體的邊框進(jìn)行回歸,使得檢測(cè)框更加準(zhǔn)確。前面我們說候選窗口會(huì)有非常高的召回率,但是可能框的位置不是很準(zhǔn),例如一個(gè)人體框可能是缺胳膊缺腿,那么通過回歸就能夠?qū)z測(cè)框進(jìn)行校準(zhǔn),在初始的位置上求精。Fast R-CNN把分類和回歸放在一起來做,把R-CNN的SVM和邊框回歸去掉,采用了多任務(wù)協(xié)同學(xué)習(xí)的方式由CNN直接得到類別和邊框。?
3.Faster R-CNN
算法詳解(anchor機(jī)制)


之前的Fast R-CNN已經(jīng)基本實(shí)現(xiàn)端到端的檢測(cè),而主要的速度瓶頸是在Selective Search算法實(shí)現(xiàn)的Region Proposal,故到了Faster R-CNN,主要是解決Region Proposal問題,以實(shí)現(xiàn)Real-Time檢測(cè)。Faster R-CNN的主要思路是,既然檢測(cè)工作是在卷積的結(jié)果Feature Map上做的,那么候選區(qū)域的選取是否也能在Feature Map上做?于是RPN網(wǎng)絡(luò)(Region Proposal Network)應(yīng)運(yùn)而生。
候選框提取不一定要在原圖上做,特征圖上同樣可以,低分辨率特征圖意味著更少的計(jì)算量,基于這個(gè)假設(shè),MSRA的任少卿等人提出RPN(RegionProposal Network),整體架構(gòu)如下圖所示

主要思想:
1.Faster R-CNN 目標(biāo)檢測(cè)分為4個(gè)部分(候選區(qū)域生成,特征提取,分類,和Bounding box回歸)
2.候選區(qū)域由RPN完成,其它三個(gè)部分沿用Fast R-CNN

RPN
RPN引入了所謂anchor box的設(shè)計(jì),具體來說,RPN在最后一個(gè)卷積層輸出的特征圖上,先用3x3的卷積得到每個(gè)位置的特征向量,然后基于這個(gè)特征向量去回歸k個(gè)不同大小和長(zhǎng)寬比的窗口,把這些窗口按照分?jǐn)?shù)進(jìn)行排序,然后取前300個(gè)作為候選窗口,送去做最終的分類 。

對(duì)于特征圖中的每一個(gè)位置,RPN 會(huì)做 k 次預(yù)測(cè)。因此,RPN 將輸出 4×k 個(gè)坐標(biāo)和每個(gè)位置上 2×k 個(gè)得分。下圖展示了 8×8 的特征圖,且有一個(gè) 3×3 的卷積核執(zhí)行運(yùn)算,它最后輸出 8×8×3 個(gè) ROI(其中 k=3)。下圖(右)展示了單個(gè)位置的 3 個(gè)候選區(qū)域。

此處有 3 種猜想,稍后我們將予以完善。由于只需要一個(gè)正確猜想,因此我們最初的猜想最好涵蓋不同的形狀和大小。因此,F(xiàn)aster R-CNN 不會(huì)創(chuàng)建隨機(jī)邊界框。相反,它會(huì)預(yù)測(cè)一些與左上角名為「錨點(diǎn)」的參考框相關(guān)的偏移量(如x、y)。我們限制這些偏移量的值,因此我們的猜想仍然類似于錨點(diǎn)。

要對(duì)每個(gè)位置進(jìn)行 k 個(gè)預(yù)測(cè),我們需要以每個(gè)位置為中心的 k 個(gè)錨點(diǎn)。每個(gè)預(yù)測(cè)與特定錨點(diǎn)相關(guān)聯(lián),但不同位置共享相同形狀的錨點(diǎn)。這些錨點(diǎn)是精心挑選的,因此它們是多樣的,且覆蓋具有不同比例和寬高比的現(xiàn)實(shí)目標(biāo)。這使得我們可以以更好的猜想來指導(dǎo)初始訓(xùn)練,并允許每個(gè)預(yù)測(cè)專門用于特定的形狀。該策略使早期訓(xùn)練更加穩(wěn)定和簡(jiǎn)便。
Faster R-CNN 部署 9 個(gè)錨點(diǎn)框:3 個(gè)不同寬高比、不同大小的錨點(diǎn)框。每一個(gè)位置使用 9 個(gè)錨點(diǎn),每個(gè)位置會(huì)生成 2×9 個(gè) objectness 分?jǐn)?shù)和 4×9 個(gè)坐標(biāo)。

二、Anchor based One-stage類別的目標(biāo)檢測(cè)算法


直接通過主干網(wǎng)絡(luò)給出類別和位置信息,沒有使用RPN網(wǎng)路。這樣的算法速度更快,但是精度相對(duì)Two-stage目標(biāo)檢測(cè)網(wǎng)絡(luò)了略低。
目前常用的典型的One-stage目標(biāo)檢測(cè)網(wǎng)絡(luò)
? ? ? ? YOLOv1、YOLOv2、YOLOv3
? ? ? ? SSD、DSSD等

思路
基于區(qū)域的檢測(cè)器是很準(zhǔn)確的,但需要付出代價(jià)。Faster R-CNN 在 PASCAL VOC 2007 測(cè)試集上每秒處理 7 幀的圖像(7 FPS)。
作為替代,我們是否需要一個(gè)分離的候選區(qū)域步驟?我們可以直接在一個(gè)步驟內(nèi)得到邊界框和類別嗎?
feature_maps = process(image)
results = detector3(feature_maps) # No more separate step for ROIs
讓我們?cè)倏匆幌禄瑒?dòng)窗口檢測(cè)器。我們可以通過在特征圖上滑動(dòng)窗口來檢測(cè)目標(biāo)。對(duì)于不同的目標(biāo)類型,我們使用不同的窗口類型。以前的滑動(dòng)窗口方法的致命錯(cuò)誤在于使用窗口作為最終的邊界框,這就需要非常多的形狀來覆蓋大部分目標(biāo)。更有效的方法是將窗口當(dāng)做初始猜想,這樣我們就得到了從當(dāng)前滑動(dòng)窗口同時(shí)預(yù)測(cè)類別的檢測(cè)器。

這個(gè)概念和 Faster R-CNN 中的錨點(diǎn)很相似。只不過,單次檢測(cè)器會(huì)同時(shí)預(yù)測(cè)邊界框和類別。例如,我們有一個(gè) 8 × 8 特征圖,并在每個(gè)位置做出 k 個(gè)預(yù)測(cè),即總共有 8 × 8 × k 個(gè)預(yù)測(cè)結(jié)果。在每個(gè)位置,我們有 k 個(gè)錨點(diǎn)(錨點(diǎn)是固定的初始邊界框猜想),一個(gè)錨點(diǎn)對(duì)應(yīng)一個(gè)特定位置。我們使用相同的 錨點(diǎn)形狀仔細(xì)地選擇錨點(diǎn)和每個(gè)位置。使用 4 個(gè)錨點(diǎn)在每個(gè)位置做出 4 個(gè)預(yù)測(cè)。

在 Faster R-CNN 中,我們使用卷積核來做 5 個(gè)參數(shù)的預(yù)測(cè):4 個(gè)參數(shù)對(duì)應(yīng)某個(gè)錨點(diǎn)的預(yù)測(cè)邊框,1 個(gè)參數(shù)對(duì)應(yīng) objectness 置信度得分。因此 3× 3× D × 5 卷積核將特征圖從 8 × 8 × D 轉(zhuǎn)換為 8 × 8 × 5(有點(diǎn)迷,前文說的是輸出 4個(gè)坐標(biāo)和2個(gè)得分,這里兩個(gè)得分統(tǒng)一成一個(gè)了吧)。

在單次檢測(cè)器中,卷積核還預(yù)測(cè) C 個(gè)類別概率以執(zhí)行分類(每個(gè)概率對(duì)應(yīng)一個(gè)類別)。因此我們應(yīng)用一個(gè) 3× 3× D × 25 卷積核將特征圖從 8 × 8 × D 轉(zhuǎn)換為 8 × 8 × 25(C=20),這就很接近YOLO V1的思路了。


4.YOLO v1

主要思想:
1.將整個(gè)圖像分成S*S個(gè)格子
2.將整張圖像送入CNN,預(yù)測(cè)每一個(gè)格子是否存在目標(biāo)、(預(yù)測(cè)目標(biāo)邊界框和目標(biāo)的類別)
3.將預(yù)測(cè)的邊界框做非最大值抑制(NMS),得到最終結(jié)果。

可以看出,這個(gè)網(wǎng)絡(luò)中主要采用了1x1卷積后跟著3x3卷積的方式。
特征提取網(wǎng)絡(luò)采用了前20個(gè)卷積層,加一個(gè)avg-pooling層和一個(gè)全連接層,對(duì)ImageNet2012進(jìn)行分類,top-5正確率為88%,輸入分辨率為224x224。
檢測(cè)時(shí),將輸入分辨率改為448x448,因?yàn)榫W(wǎng)絡(luò)結(jié)構(gòu)是全卷積的,所以輸入分辨率可以改變,整個(gè)網(wǎng)絡(luò)輸出為7x7x30維的tensor。
YOLO算法主要有以下優(yōu)點(diǎn):
1.檢測(cè)速度達(dá)到實(shí)時(shí)幀檢測(cè),在Titan X GPU上每秒可檢測(cè)45幀,快速版每秒能做到150幀
2.YOLO 是對(duì)整張圖進(jìn)行檢測(cè),采取回歸的方式檢測(cè)目標(biāo)的位置和類別,是一種全新的檢測(cè)方式
缺點(diǎn):
1.定位精度差,沒有區(qū)域建議算法高,主要由于該算法對(duì)圖像做回歸而不是滑動(dòng)窗口檢測(cè)
2.對(duì)小目標(biāo),或目標(biāo)之間位置接近的情況下檢測(cè)效果不好
Trick:
模型首先會(huì)將ImageNet作為訓(xùn)練集預(yù)訓(xùn)練模型,最終達(dá)到88%精度,然后使用遷移學(xué)習(xí)將預(yù)訓(xùn)練的模型應(yīng)用到當(dāng)前標(biāo)注的訓(xùn)練集進(jìn)行訓(xùn)練。ImageNet分辨率為224x224。檢測(cè)時(shí),將輸入分辨率改為448x448,因?yàn)榫W(wǎng)絡(luò)結(jié)構(gòu)是全卷積的,所以輸入分辨率可以改變,整個(gè)網(wǎng)絡(luò)輸出為7x7x30維的tensor。
模型輸出5維信息(x,y,w,h,score),使用Leaky Relu作為激活函數(shù),全連接層后添加Dropout層防止過擬合。在得到輸出值之后,我們需要計(jì)算每個(gè)box與ground true的Iou值,然后通過非極大值抑制篩選box。
5.SSD

SSD在YOLO的基礎(chǔ)上改進(jìn)了三點(diǎn):多尺度特征圖,利用卷積進(jìn)行檢測(cè),設(shè)置先驗(yàn)框。
SSD 使用 VGG19 網(wǎng)絡(luò)作為特征提取器(和 Faster R-CNN 中使用的 CNN 一樣),在該網(wǎng)絡(luò)之后添加自定義卷積層(藍(lán)色),并使用卷積核(綠色)執(zhí)行預(yù)測(cè)。

然而,卷積層降低了空間維度和分辨率。因此上述模型僅可以檢測(cè)較大的目標(biāo)。為了解決該問題,SSD從多個(gè)特征圖上執(zhí)行獨(dú)立的目標(biāo)檢測(cè)。

(1)采用多尺度特征圖用于檢測(cè)
所謂多尺度采用大小不同的特征圖,CNN網(wǎng)絡(luò)一般前面的特征圖比較大,后面會(huì)逐漸采用stride=2的卷積或者pool來降低特征圖大小,這正如圖3所示,一個(gè)比較大的特征圖和一個(gè)比較小的特征圖,它們都用來做檢測(cè)。這樣做的好處是比較大的特征圖來用來檢測(cè)相對(duì)較小的目標(biāo),而小的特征圖負(fù)責(zé)檢測(cè)大目標(biāo),如圖4所示,8x8的特征圖可以劃分更多的單元,但是其每個(gè)單元的先驗(yàn)框尺度比較小。

(2)采用卷積進(jìn)行檢測(cè)
與Yolo最后采用全連接層不同,SSD直接采用卷積對(duì)不同的特征圖來進(jìn)行提取檢測(cè)結(jié)果。對(duì)于形狀為m×n×p的特征圖,只需要采用3×3×p這樣比較小的卷積核得到檢測(cè)值。 對(duì)于一個(gè)大小m×n的特征圖,共有mn個(gè)單元,每個(gè)單元設(shè)置的先驗(yàn)框數(shù)目記為k,每個(gè)現(xiàn)驗(yàn)框有(c+4)個(gè)檢測(cè)值,那么每個(gè)單元共需要(c+4)k個(gè)預(yù)測(cè)值,所有的單元共需要(c+4)kmn個(gè)預(yù)測(cè)值,由于SSD采用卷積做檢測(cè),所以就需要(c+4)k個(gè)卷積核完成這個(gè)特征圖的檢測(cè)過程。
(3)設(shè)置先驗(yàn)框?
SSD采用了不同尺度和長(zhǎng)寬比的先驗(yàn)框(Prior boxes, Default boxes,在Faster R-CNN中叫做錨,Anchors)
在Yolo中,每個(gè)單元預(yù)測(cè)多個(gè)邊界框,但是其都是相對(duì)這個(gè)單元本身(正方塊),但是真實(shí)目標(biāo)的形狀是多變的,Yolo需要在訓(xùn)練過程中自適應(yīng)目標(biāo)的形狀。而SSD借鑒了Faster R-CNN中anchor的理念,每個(gè)單元設(shè)置尺度或者長(zhǎng)寬比不同的先驗(yàn)框,預(yù)測(cè)的邊界框(bounding boxes)是以這些先驗(yàn)框?yàn)榛鶞?zhǔn)的,在一定程度上減少訓(xùn)練難度。一般情況下,每個(gè)單元會(huì)設(shè)置多個(gè)先驗(yàn)框,其尺度和長(zhǎng)寬比存在差異,如圖5所示,可以看到每個(gè)單元使用了4個(gè)不同的先驗(yàn)框,圖片中貓和狗分別采用最適合它們形狀的先驗(yàn)框來進(jìn)行訓(xùn)練,后面會(huì)詳細(xì)講解訓(xùn)練過程中的先驗(yàn)框匹配原則。

SSD的檢測(cè)值也與Yolo不太一樣。對(duì)于每個(gè)單元的每個(gè)先驗(yàn)框,其都輸出一套獨(dú)立的檢測(cè)值,對(duì)應(yīng)一個(gè)邊界框,主要分為兩個(gè)部分。第一部分是各個(gè)類別的置信度或者評(píng)分,值得注意的是SSD將背景也當(dāng)做了一個(gè)特殊的類別,如果檢測(cè)目標(biāo)共有c個(gè)類別,SSD其實(shí)需要預(yù)測(cè)c+1個(gè)置信度值,其中第一個(gè)置信度指的是不含目標(biāo)或者屬于背景的評(píng)分。后面當(dāng)我們說c個(gè)類別置信度時(shí),請(qǐng)記住里面包含背景那個(gè)特殊的類別,即真實(shí)的檢測(cè)類別只有c?1個(gè)。在預(yù)測(cè)過程中,置信度最高的那個(gè)類別就是邊界框所屬的類別,特別地,當(dāng)?shù)谝粋€(gè)置信度值最高時(shí),表示邊界框只包含背景。第二部分就是邊界框的location,包含4個(gè)值(cx,cy,w,h),分別表示邊界框的中心坐標(biāo)以及寬高(通過預(yù)測(cè)偏移量而不是坐標(biāo)值能夠簡(jiǎn)化問題,所以是邊界框相對(duì)于先驗(yàn)框的轉(zhuǎn)換值offset)。
在訓(xùn)練過程中,首先要確定訓(xùn)練圖片中的ground truth(真實(shí)目標(biāo))與哪個(gè)先驗(yàn)框來進(jìn)行匹配,與之匹配的先驗(yàn)框所對(duì)應(yīng)的邊界框?qū)⒇?fù)責(zé)預(yù)測(cè)它。在Yolo中,ground truth的中心落在哪個(gè)單元格,該單元格中與其IOU最大的邊界框負(fù)責(zé)預(yù)測(cè)它。但是在SSD中卻完全不一樣,SSD的先驗(yàn)框與ground truth的匹配原則主要有兩點(diǎn)。首先,對(duì)于圖片中每個(gè)ground truth,找到與其IOU最大的先驗(yàn)框,該先驗(yàn)框與其匹配,這樣,可以保證每個(gè)ground truth一定與某個(gè)先驗(yàn)框匹配。通常稱與ground truth匹配的先驗(yàn)框?yàn)檎龢颖?,反之,若一個(gè)先驗(yàn)框沒有與任何ground truth進(jìn)行匹配,那么該先驗(yàn)框只能與背景匹配,就是負(fù)樣本。一個(gè)圖片中g(shù)round truth是非常少的, 而先驗(yàn)框卻很多,如果僅按第一個(gè)原則匹配,很多先驗(yàn)框會(huì)是負(fù)樣本,正負(fù)樣本極其不平衡,所以需要第二個(gè)原則。第二個(gè)原則是:對(duì)于剩余的未匹配先驗(yàn)框,若某個(gè)ground truth的IOU大于某個(gè)閾值(一般是0.5),那么該先驗(yàn)框也與這個(gè)ground truth進(jìn)行匹配。這意味著某個(gè)ground truth可能與多個(gè)先驗(yàn)框匹配,這是可以的。但是反過來卻不可以,因?yàn)橐粋€(gè)先驗(yàn)框只能匹配一個(gè)ground truth,如果多個(gè)ground truth與某個(gè)先驗(yàn)框IOU大于閾值,那么先驗(yàn)框只與IOU最大的那個(gè)先驗(yàn)框進(jìn)行匹配。第二個(gè)原則一定在第一個(gè)原則之后進(jìn)行,仔細(xì)考慮一下這種情況,如果某個(gè)ground truth所對(duì)應(yīng)最大IOU小于閾值,并且所匹配的先驗(yàn)框卻與另外一個(gè)ground truth的IOU大于閾值,那么該先驗(yàn)框應(yīng)該匹配誰,答案應(yīng)該是前者,首先要確保某個(gè)ground truth一定有一個(gè)先驗(yàn)框與之匹配。但是,這種情況我覺得基本上是不存在的。由于先驗(yàn)框很多,某個(gè)ground truth的最大IOU肯定大于閾值,所以可能只實(shí)施第二個(gè)原則既可以了。

盡管一個(gè)ground truth可以與多個(gè)先驗(yàn)框匹配,但是ground truth相對(duì)先驗(yàn)框還是太少了,所以負(fù)樣本相對(duì)正樣本會(huì)很多。為了保證正負(fù)樣本盡量平衡,SSD采用了hard negative mining,就是對(duì)負(fù)樣本進(jìn)行抽樣,抽樣時(shí)按照置信度誤差(預(yù)測(cè)背景的置信度越小,誤差越大)進(jìn)行降序排列,選取誤差的較大的top-k作為訓(xùn)練的負(fù)樣本,以保證正負(fù)樣本比例接近1:3
(4)NMS
在 SSD 算法中,NMS 至關(guān)重要。因?yàn)槎鄠€(gè) feature map 最后會(huì)產(chǎn)生大量的 bounding boxes,即最終檢測(cè)結(jié)果。然而在這些bounding boxes中存在著大量的錯(cuò)誤的、重疊的、不準(zhǔn)確的樣本,這不僅造成了巨大的計(jì)算量,如果處理不好會(huì)影響算法的性能。僅僅依賴于IOU 是不現(xiàn)實(shí)的,IOU值設(shè)置的太大,可能就會(huì)丟失一部分檢測(cè)的目標(biāo),即會(huì)出現(xiàn)大量的漏檢情況;IOU值設(shè)置的太小,則會(huì)出現(xiàn)大量的重疊檢測(cè),會(huì)大大影響檢測(cè)器的性能。
? ? ? 即使在IOU處理掉大部分的bounding boxes之后,仍然會(huì)存在大量的錯(cuò)誤的、重疊的、不準(zhǔn)確的bounding boxes(如圖14),這就需要NMS進(jìn)行迭代優(yōu)化。

NMS簡(jiǎn)單原理: 對(duì)于Bounding Box的列表B及其對(duì)應(yīng)的置信度S,采用下面的計(jì)算方式.選擇具有最大 score的檢測(cè)框M,將其從B集合中移除并加入到最終的檢測(cè)結(jié)果D中.通常將B中剩余檢測(cè)框中與M的IoU大于閾值的框從B中移除.重復(fù)這個(gè)過程,直到B為空。

trick:
數(shù)據(jù)擴(kuò)增技術(shù)很重要,對(duì)于mAP的提升很大;
使用不同長(zhǎng)寬比的先驗(yàn)框可以得到更好的結(jié)果;

優(yōu)點(diǎn):
? 運(yùn)行速度超過YOLO,精度超過Faster R-CNN(一定條件下,對(duì)于稀疏場(chǎng)景的大目標(biāo)而言)。
缺點(diǎn):
(1)需要人工設(shè)置default boxes的初始尺度和長(zhǎng)寬比的值。網(wǎng)絡(luò)中default boxes的基礎(chǔ)大小和形狀不能直接通過學(xué)習(xí)獲得,而是需要手工設(shè)置。而網(wǎng)絡(luò)中每一層 feature使用的default box大小和形狀恰好都不一樣,導(dǎo)致調(diào)試過程非常依賴經(jīng)驗(yàn)。
(2)對(duì)小尺寸的目標(biāo)識(shí)別仍比較差,還達(dá)不到 Faster R-CNN 的水準(zhǔn)。因?yàn)?SSD 使用 conv4_3 低級(jí) feature 去檢測(cè)小目標(biāo),而低級(jí)特征卷積層數(shù)少,存在特征提取不充分的問題。
6.YOLO V2
YOLO-v2在YOLO-v1的版本上做了一些改進(jìn)。
(1)添加了BN層,map提高了2%。
隨著神經(jīng)網(wǎng)絡(luò)的訓(xùn)練,網(wǎng)絡(luò)層的輸入分布會(huì)發(fā)生變動(dòng),逐漸向激活函數(shù)取值兩端靠攏,如:sigmoid激活函數(shù),此時(shí)會(huì)進(jìn)入飽和狀態(tài),梯度更新緩慢,對(duì)輸入變動(dòng)不敏感,甚至梯度消失導(dǎo)致模型難以訓(xùn)練。BN,在網(wǎng)絡(luò)層輸入激活函數(shù)輸入值之前加入,可以將分布拉到均值為0,標(biāo)準(zhǔn)差為1的正態(tài)分布,從而使激活函數(shù)處于對(duì)輸入值敏感的區(qū)域,從而加快模型訓(xùn)練。
BN的地位:與激活函數(shù)層、卷積層、全連接層、池化層一樣,BN(Batch Normalization)也屬于網(wǎng)絡(luò)的一層。
BN的本質(zhì)原理:在網(wǎng)絡(luò)的每一層輸入的時(shí)候,又插入了一個(gè)歸一化層,也就是先做一個(gè)歸一化處理(歸一化至:均值0、方差為1),然后再進(jìn)入網(wǎng)絡(luò)的下一層。但是不像我們想象的那么簡(jiǎn)單,它是一個(gè)可學(xué)習(xí)、有參數(shù)(γ、β)的網(wǎng)絡(luò)層。
BN的作用:
? ? ? ?1)改善流經(jīng)網(wǎng)絡(luò)的梯度
? ? ? ?2)允許更大的學(xué)習(xí)率,大幅提高訓(xùn)練速度:
? ? ? ? ? ??你可以選擇比較大的初始學(xué)習(xí)率,讓你的訓(xùn)練速度飆漲。以前還需要慢慢調(diào)整學(xué)習(xí)率,甚至在網(wǎng)絡(luò)訓(xùn)練到一半的時(shí)候,還需要想著學(xué)習(xí)率進(jìn)一步調(diào)小的比例選擇多少比較合適,現(xiàn)在我們可以采用初始很大的學(xué)習(xí)率,然后學(xué)習(xí)率的衰減速度也很大,因?yàn)檫@個(gè)算法收斂很快。當(dāng)然這個(gè)算法即使你選擇了較小的學(xué)習(xí)率,也比以前的收斂速度快,因?yàn)樗哂锌焖儆?xùn)練收斂的特性;
? ? ? ?3)減少對(duì)初始化的強(qiáng)烈依賴
? ? ? ?4)改善正則化策略:作為正則化的一種形式,輕微減少了對(duì)dropout的需求
你再也不用去理會(huì)過擬合中drop out、L2正則項(xiàng)參數(shù)的選擇問題,采用BN算法后,你可以移除這兩項(xiàng)了參數(shù),或者可以選擇更小的L2正則約束參數(shù)了,因?yàn)锽N具有提高網(wǎng)絡(luò)泛化能力的特性;
? ? ? ?5)再也不需要使用使用局部響應(yīng)歸一化層了(局部響應(yīng)歸一化是Alexnet網(wǎng)絡(luò)用到的方法,搞視覺的估計(jì)比較熟悉),因?yàn)锽N本身就是一個(gè)歸一化網(wǎng)絡(luò)層;
? ? ? ?6)可以把訓(xùn)練數(shù)據(jù)徹底打亂(防止每批訓(xùn)練的時(shí)候,某一個(gè)樣本都經(jīng)常被挑選到,文獻(xiàn)說這個(gè)可以提高1%的精度)。
(2)用448x448的輸入分辨率在ImageNet上進(jìn)行參數(shù)微調(diào),map提高了4%。
(3)把全連接層取消,使用anchor boxes來預(yù)測(cè)目標(biāo)方框;使用anchor boxes的話就把分類置信度和空間位置分離了,所以對(duì)每個(gè)預(yù)測(cè)方框都可以回歸一個(gè)方框置信度和分類置信度。不用anchor box時(shí)map是69.5%,召回率是81%,使用了之后map是69.2%召回率是88%。
(4)用k-means來選擇好的方框先驗(yàn)。
(5)對(duì)于每個(gè)方格,預(yù)測(cè)5個(gè)方框。
(6)把26x26x512的feature-map,相鄰特征分到不同的channel中,因此得到13x13x2048的feature-map,與后面層進(jìn)行concat,使得map提高了1%。這里主要是添加了一個(gè)層:passthrough layer。這個(gè)層的作用就是將前面一層的26*26的feature map和本層的13*13的feature map進(jìn)行連接,有點(diǎn)像ResNet。這樣做的原因在于雖然13*13的feature map對(duì)于預(yù)測(cè)大的object以及足夠了,但是對(duì)于預(yù)測(cè)小的object就不一定有效。通過這個(gè)passthrough layer把高分辨率特征與低分辨率特征聯(lián)系在了一起,聯(lián)系起來的方法是把相鄰的特征堆積在不同的 Channel(通道) 中,這一方法類似與 Resnet(殘缺網(wǎng)絡(luò)) 的 Identity Mapping(恒等映射),從而把 26*26*512 變成 13*13*2048。YOLO 中的檢測(cè)器位于擴(kuò)展后(expanded )的特征圖的上方,所以他能取得細(xì)粒度的特征信息,這提升了 YOLO 1% 的性能。
(7)多scale的訓(xùn)練,因?yàn)榫W(wǎng)絡(luò)為全卷積層,所以同樣的網(wǎng)絡(luò)可以預(yù)測(cè)不同分辨率的輸入,每10個(gè)batch隨機(jī)選擇一個(gè)新的image size。
遷移學(xué)習(xí)之前,在介紹YOLO-v1的時(shí)候我們說到,模型需要先在ImageNet上預(yù)訓(xùn)練模型,因此,此時(shí)圖像輸入為224x224,使用遷移學(xué)習(xí)訓(xùn)練后我們的圖像輸入是448x448,因此模型需要適應(yīng)圖像分辨率的改變。在YOLO-v2中,我們?cè)陬A(yù)訓(xùn)練模型中先224x224訓(xùn)練160個(gè)epoch,然后將輸入調(diào)整到448x448,再跑10個(gè)epoch,也就是在ImageNet數(shù)據(jù)集中兩種分辨率跑兩次。YOLO大神作者實(shí)現(xiàn)表明,這樣操作可以提高4%的map
訓(xùn)練階段,采用32的倍數(shù)作為圖像尺寸動(dòng)態(tài)輸入,如【320,352。。。608】。這種網(wǎng)絡(luò)訓(xùn)練方式使得相同網(wǎng)絡(luò)可以對(duì)不同分辨率的圖像做detection。
(8)新的分類網(wǎng)絡(luò)Darknet-19

(9)分類和檢測(cè)聯(lián)合訓(xùn)練Joint classification and detection
使用1000類的ImageNet進(jìn)行訓(xùn)練,為了建立WordtTree 1K,把所有中間詞匯加入到WordTree上,把標(biāo)簽空間從1000擴(kuò)大到了1369。在訓(xùn)練過程中,如果有一個(gè)圖片的標(biāo)簽是”Norfolk terrier“,那么這個(gè)圖片還會(huì)獲得”狗“(dog)以及“哺乳動(dòng)物”(mammal)等標(biāo)簽??傊F(xiàn)在一張圖片是多標(biāo)記的,標(biāo)記之間不需要相互獨(dú)立。?

如圖所示,之前的ImageNet分類是使用一個(gè)大softmax進(jìn)行分類。而現(xiàn)在,WordTree只需要對(duì)同一概念下的同義詞進(jìn)行softmax分類。

YOLO-v2利用WordTree,將分類和檢測(cè)任務(wù)進(jìn)行聯(lián)合訓(xùn)練,對(duì)于沒有方框標(biāo)注的物體也能預(yù)測(cè)出其方框,能夠?qū)υ~典中9000個(gè)概念進(jìn)行預(yù)測(cè)。YOLO-v2也叫做YOLO9000。
訓(xùn)練一個(gè)Extremely Large Scale檢測(cè)器。所以訓(xùn)練的時(shí)候使用WordTree混合了COCO檢測(cè)數(shù)據(jù)集與ImageNet中的Top9000類,混合后的數(shù)據(jù)集對(duì)應(yīng)的WordTree有9418個(gè)類。另一方面,由于ImageNet數(shù)據(jù)集太大了,作者為了平衡一下兩個(gè)數(shù)據(jù)集之間的數(shù)據(jù)量,通過過采樣(oversampling)COCO數(shù)據(jù)集中的數(shù)據(jù),對(duì)COCO過采樣的方式進(jìn)行數(shù)據(jù)集擴(kuò)增,使COCO數(shù)據(jù)集與ImageNet數(shù)據(jù)集之間的數(shù)據(jù)量比例達(dá)到1:4。
YOLO9000的訓(xùn)練基于YOLO v2的構(gòu)架,但是使用3priors而不是5來限制輸出的大小。當(dāng)網(wǎng)絡(luò)遇到檢測(cè)數(shù)據(jù)集中的圖片時(shí)則正常地反方向傳播,當(dāng)遇到分類數(shù)據(jù)集圖片的時(shí)候,只使用分類的loss功能進(jìn)行反向傳播。同時(shí)作者假設(shè)IOU最少為 .3。最后根據(jù)這些假設(shè)進(jìn)行反向傳播(有點(diǎn)迷)。
使用聯(lián)合訓(xùn)練法,YOLO9000使用COCO檢測(cè)數(shù)據(jù)集學(xué)習(xí)檢測(cè)圖片中的物體的位置,使用ImageNet分類數(shù)據(jù)集學(xué)習(xí)如何從大量的類別中進(jìn)行分類。
為了評(píng)估這一方法,使用ImageNet Detection Task對(duì)訓(xùn)練結(jié)果進(jìn)行評(píng)估。
評(píng)估結(jié)果:
YOLO9000取得19.7mAP。
在未學(xué)習(xí)過的156個(gè)分類數(shù)據(jù)上進(jìn)行測(cè)試,mAP達(dá)到16.0。
YOLO9000的mAP比DPM高,而且YOLO有更多先進(jìn)的特征,YOLO9000是用部分監(jiān)督的方式在不同訓(xùn)練集上進(jìn)行訓(xùn)練,同時(shí)還能檢測(cè)9000個(gè)物體類別,并保證實(shí)時(shí)運(yùn)行。
7.YOLO V3
YOLO-v3在YOLO-v2的基礎(chǔ)上進(jìn)行了一些改進(jìn)。
(1)用logistic regression對(duì)方框置信度進(jìn)行回歸,對(duì)先驗(yàn)與實(shí)際方框IOU大于0.5的作為正例,與SSD不同的是,若有多個(gè)先驗(yàn)滿足目標(biāo),只取一個(gè)IOU最大的先驗(yàn)。
(2)類別預(yù)測(cè)由softmax改為logistic(使用sigmoid):用于處理預(yù)測(cè)物體之間存在包含關(guān)系問題,解決多標(biāo)簽對(duì)象支持。比如woman和person,softmax輸出:person,logistic輸出兩者。
(3)利用多個(gè)scale進(jìn)行預(yù)測(cè),實(shí)際使用3個(gè)不同的scale。將前兩層的feature-map進(jìn)行上采樣,與開始的feature-map進(jìn)行concat起來,加一些卷積層,然后進(jìn)行預(yù)測(cè)。

(4)新的特征提取網(wǎng)絡(luò)Darkent-53

(5)網(wǎng)絡(luò)細(xì)節(jié)

DBL:指Darknetconv2d_BN_Leaky。
resn:指:n代表數(shù)字,有res1,res2, … ,res8等等,表示這個(gè)res_block里含有多少個(gè)res_unit,使用殘差結(jié)構(gòu)可以讓網(wǎng)絡(luò)更深。
concat:張量拼接。將darknet中間層和后面的某一層的上采樣進(jìn)行拼接。拼接的操作和殘差層add的操作是不一樣的,拼接會(huì)擴(kuò)充張量的維度,而add只是直接相加不會(huì)導(dǎo)致張量維度的改變。(解決SSD 使用 conv4_3 低級(jí) feature 去檢測(cè)小目標(biāo),而低級(jí)特征卷積層數(shù)少,存在特征提取不充分的問題?)
在YOLO-v3網(wǎng)絡(luò)中沒有池化層和全連接層,那么張量尺寸的變化是通過改變卷積核步長(zhǎng)來實(shí)現(xiàn)。同YOLO-v2一樣,輸出尺寸為輸入尺寸的1/32,即:一般要求輸入圖像尺寸是32的倍數(shù)。
三、Anchor Free 類別的目標(biāo)檢測(cè)算法
8.centernet: object as point
原理簡(jiǎn)單優(yōu)雅,不明覺厲。backbone還有一些實(shí)現(xiàn)細(xì)節(jié)還要從源碼閱讀
1.整體架構(gòu)

2.Backbone

a:Hourglass 沙漏網(wǎng)絡(luò),文中未對(duì)其修改
b:帶轉(zhuǎn)置卷積的resnet, 同時(shí)增加了deformable conv
c:原始的DLA-34語義分割網(wǎng)絡(luò)
d:文中用到的修改過的DLA-34,增加了FPN結(jié)構(gòu)
由于采用全卷積網(wǎng)絡(luò)直接得到4倍下采樣的熱力圖,所以不需要提前設(shè)定anchors, 所以大大減少了網(wǎng)絡(luò)參數(shù)量和計(jì)算量。熱力圖的通道數(shù)等于要檢測(cè)的目標(biāo)類別數(shù),熱力圖的前100個(gè)峰值作為網(wǎng)絡(luò)提取的目標(biāo)中心點(diǎn),然后設(shè)定一個(gè)閾值進(jìn)行篩選得到最終的目標(biāo)中心點(diǎn)。
Centernet 中所有的上采樣前都有deformable卷積,這種卷積的作用就是使得網(wǎng)絡(luò)的感受野變得更加精確,而不是限定為3*3的矩形卷積框內(nèi)。同時(shí)4倍的下采樣feature map 比一般網(wǎng)絡(luò)的分辨率高很多,所有不需要進(jìn)行多尺度預(yù)測(cè)和特征金字塔也可以同時(shí)較好的檢測(cè)大小目標(biāo)。
Centernet 不需要NMS,因?yàn)樗袡z測(cè)的中心點(diǎn)是由熱力圖的峰值得到的,這樣就已經(jīng)有一個(gè)非極大值抑制的過程,而且NMS是十分耗時(shí)的,所以Centernet才能又好又快。
Centernet 采用編碼解碼的全卷積骨干網(wǎng)絡(luò),上采樣用到的是轉(zhuǎn)置卷積,與一般上采樣中的雙線性差值有很大區(qū)別,轉(zhuǎn)置卷積可以更好的還原圖像的語義信息和位置信息。
3.思路
與基于錨點(diǎn)的one-stage方法相近。中心點(diǎn)可看成形狀未知的錨點(diǎn)(見圖3)。但存在幾個(gè)重要差別(本文創(chuàng)新點(diǎn)):
第一,我們分配的錨點(diǎn)僅僅是放在位置上,沒有尺寸框。沒有手動(dòng)設(shè)置的閾值做前后景分類。(像Faster RCNN會(huì)將與GT IOU >0.7的作為前景,<0.3的作為背景,其他不管);
第二,每個(gè)目標(biāo)僅僅有一個(gè)正的錨點(diǎn),因此不會(huì)用到NMS,我們提取關(guān)鍵點(diǎn)特征圖上局部峰值點(diǎn)(local peaks);
第三,CenterNet 相比較傳統(tǒng)目標(biāo)檢測(cè)而言(縮放16倍尺度),使用更大分辨率的輸出特征圖(縮放了4倍),因此無需用到多重特征圖錨點(diǎn);
在推理的時(shí)候,我們分別提取熱力圖上每個(gè)類別的峰值點(diǎn)。如何得到這些峰值點(diǎn)呢?做法是將熱力圖上的所有響應(yīng)點(diǎn)與其連接的8個(gè)臨近點(diǎn)進(jìn)行比較,如果該點(diǎn)響應(yīng)值大于或等于其八個(gè)臨近點(diǎn)值則保留,最后我們保留所有滿足之前要求的前100個(gè)峰值點(diǎn)。目標(biāo)的寬高信息由熱力圖分布回歸得到。
參考文章鏈接:
https://blog.csdn.net/weixin_38632246/article/details/90450264
https://blog.csdn.net/f290131665/article/details/81012556
https://blog.csdn.net/qq_27825451/article/details/89137697
http://www.itdecent.cn/p/f87be68977cb
http://www.itdecent.cn/p/d5d7cd7ad200
https://segmentfault.com/a/1190000017509636?utm_source=tag-newest
http://baijiahao.baidu.com/s?id=1598999301741831102&wfr=spider&for=pc
https://blog.csdn.net/qq_41007606/article/details/89572824
等,感謝以上博文的資料整理,對(duì)我的學(xué)習(xí)帶來了極大的幫助