【ML Notes】 2019-11-28 目標檢測算法梳理

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


目標檢測近年來已經取得了很重要的進展,主流的算法主要分為兩個類型:(1)two-stage方法,如R-CNN系算法,其主要思路是先通過啟發式方法(selective search)或者CNN網絡(RPN)產生一系列稀疏的候選框,然后對這些候選框進行分類與回歸,two-stage方法的優勢是準確度高;(2)one-stage方法,如Yolo和SSD,其主要思路是均勻地在圖片的不同位置進行密集抽樣,抽樣時可以采用不同尺度和長寬比,然后利用CNN提取特征后直接進行分類與回歸,整個過程只需要一步,所以其優勢是速度快,但是均勻的密集采樣的一個重要缺點是訓練比較困難,這主要是因為正樣本與負樣本(背景)極其不均衡(參見Focal Loss),導致模型準確度稍低。不同算法的性能如圖1所示,可以看到兩類方法在準確度和速度上的差異。(3)Anchor free方法。如:centernet



一、Two-stage類別的目標檢測算法

如R-CNN系列算法,其主要思路是先通過啟發式方法(selective search)或者 CNN 網絡(RPN)產生一系列稀疏的候選框,然后對這些候選框進行分類(classification)與回歸(bounding box regression),two-stage方法的優勢是準確度高;

圖源鏈接:https://blog.csdn.net/gaoyu1253401563/article/details/86485851

基本流程


發展


1.R-CNN

論文地址

代碼地址



主要思想:

1.輸入一張圖像

2.(Selective Search)選擇性搜索從圖像中生成2000個左右的區域建議框。

不使用暴力方法,而是用候選區域方法(region proposal method)創建目標檢測的感興趣區域(ROI)。在選擇性搜索(selective search,SS)中,我們首先將每個像素作為一組。然后,計算每一組的紋理,并將兩個最接近的組結合起來。但是為了避免單個區域吞噬其他區域,我們首先對較小的組進行分組。我們繼續合并區域,直到所有區域都結合在一起。下圖第一行展示了如何使區域增長,第二行中的藍色矩形代表合并過程中所有可能的 ROI。

3.將每一個區域建議框轉換為固定大小的圖像,并分別饋送到卷積神經網絡中。該網絡架構后面會跟幾個全連接層,提取特征,并組合特征。

4.使用線性SVM分類器對每個區域建議框分類

5.通過邊界框回歸算法重新定義目標邊界框

局限性:

1.目標候選區域的重疊使CNN特征提取存在很大冗余,如果我們有 2000 個候選區域,且每一個都需要獨立地饋送到 CNN 中,那么對于不同的 ROI,我們需要重復提取 2000 次特征。

2.crop/warp導致圖片的信息缺失或變形,影響識別精度。


2.Fast R-CNN

論文地址

代碼地址


主要思想:

1.生成建議窗口,Fast R-CNN用(Selective Search)方法生成建議窗口,每張圖片大約2000張。

2.Fast R-CNN 使用特征提取器(CNN)先提取整個圖像的特征,而不是從頭開始對每個圖像塊提取多次。Fast R-CNN將建議窗口映射到CNN的最后一層卷積feature map上。

3.ROI Pooling 將不同尺寸的特征圖塊轉換為固定的大小,并饋送到全連接層進行分類和定位

????因為 Fast R-CNN 使用全連接層,所以我們應用 ROI Pooling 將不同大小的 ROI 轉換為固定大小。

????ROI Pooling 借鑒了spp的思想,可理解為單尺度的SPP層。

????為簡潔起見,我們先將 8×8 特征圖轉換為預定義的 2×2 大小。

左上角:特征圖。右上角:將 ROI(藍色區域)與特征圖重疊。左下角:將 ROI 拆分為目標維度。例如,對于 2×2 目標,我們將 ROI?????分割為 4 個大小相似或相等的部分。右下角:找到每個部分的最大值,得到變換后的特征圖。

????輸入特征圖(左上),輸出特征圖(右下),ROI (右上,藍色框)。

????按上述步驟得到一個 2×2 的特征圖塊,可以饋送至分類器和邊界框回歸器中

4.送入全連接層和softmax計算每個候選框具體屬于哪個類別,輸出類別的得分

5. Smooth L1 Loss 生成邊框回歸


將候選區域直接應用于特征圖,并使用 ROI 池化將其轉化為固定大小的特征圖塊。

解決R-CNN問題:

1.Fast R-CNN直接將圖像歸一化后接CNN,然后在最后一層特征圖上增加區域建議框,相比R-CNN要將每個區域建議框使用CNN提取特征要節省很多計算量,因此速度得到顯著提升。

2.對特征圖塊進行ROI Pooling取代 R-CNN中crop/warp圖像的操作

3.Fast R-CNN還引入了一個重要的策略,在對窗口進行分類的同時,還會對物體的邊框進行回歸,使得檢測框更加準確。前面我們說候選窗口會有非常高的召回率,但是可能框的位置不是很準,例如一個人體框可能是缺胳膊缺腿,那么通過回歸就能夠對檢測框進行校準,在初始的位置上求精。Fast R-CNN把分類和回歸放在一起來做,把R-CNN的SVM和邊框回歸去掉,采用了多任務協同學習的方式由CNN直接得到類別和邊框。?


3.Faster R-CNN

論文地址

代碼

算法詳解(anchor機制)



之前的Fast R-CNN已經基本實現端到端的檢測,而主要的速度瓶頸是在Selective Search算法實現的Region Proposal,故到了Faster R-CNN,主要是解決Region Proposal問題,以實現Real-Time檢測。Faster R-CNN的主要思路是,既然檢測工作是在卷積的結果Feature Map上做的,那么候選區域的選取是否也能在Feature Map上做?于是RPN網絡(Region Proposal Network)應運而生。

候選框提取不一定要在原圖上做,特征圖上同樣可以,低分辨率特征圖意味著更少的計算量,基于這個假設,MSRA的任少卿等人提出RPN(RegionProposal Network),整體架構如下圖所示


Faster R-CNN 采用Region proposal Network,直接生成建議框,只有300個。RPN分支網絡共享特征圖,大幅提升目標檢測速度。


主要思想:

1.Faster R-CNN 目標檢測分為4個部分(候選區域生成,特征提取,分類,和Bounding box回歸)

2.候選區域由RPN完成,其它三個部分沿用Fast R-CNN


Faster R-CNN 的流程圖與 Fast R-CNN 相同

RPN

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


ZF模型


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

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

錨點偏移量

要對每個位置進行 k 個預測,我們需要以每個位置為中心的 k 個錨點。每個預測與特定錨點相關聯,但不同位置共享相同形狀的錨點。這些錨點是精心挑選的,因此它們是多樣的,且覆蓋具有不同比例和寬高比的現實目標。這使得我們可以以更好的猜想來指導初始訓練,并允許每個預測專門用于特定的形狀。該策略使早期訓練更加穩定和簡便。

Faster R-CNN 部署 9 個錨點框:3 個不同寬高比、不同大小的錨點框。每一個位置使用 9 個錨點,每個位置會生成 2×9 個 objectness 分數和 4×9 個坐標。




二、Anchor based One-stage類別的目標檢測算法


直接通過主干網絡給出類別和位置信息,沒有使用RPN網路。這樣的算法速度更快,但是精度相對Two-stage目標檢測網絡了略低。

目前常用的典型的One-stage目標檢測網絡

? ? ? ? YOLOv1、YOLOv2、YOLOv3

? ? ? ? SSD、DSSD等


思路

基于區域的檢測器是很準確的,但需要付出代價。Faster R-CNN 在 PASCAL VOC 2007 測試集上每秒處理 7 幀的圖像(7 FPS)。

作為替代,我們是否需要一個分離的候選區域步驟?我們可以直接在一個步驟內得到邊界框和類別嗎?

feature_maps = process(image)

results = detector3(feature_maps) # No more separate step for ROIs

讓我們再看一下滑動窗口檢測器。我們可以通過在特征圖上滑動窗口來檢測目標。對于不同的目標類型,我們使用不同的窗口類型。以前的滑動窗口方法的致命錯誤在于使用窗口作為最終的邊界框,這就需要非常多的形狀來覆蓋大部分目標。更有效的方法是將窗口當做初始猜想,這樣我們就得到了從當前滑動窗口同時預測類別的檢測器。


基于滑動窗口進行預測

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


4 個錨點(綠色)和 4 個對應預測(藍色),每個預測對應一個特定錨點

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

使用 3x3 卷積核計算預測。

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


YOLO會預測每個矩形框的4個參數和其包含物體的信度,以及其屬于每個物體類別的概率



共SxS個位置,每個位置做出 B 個預測



4.YOLO v1

v1論文地址

代碼


主要思想:

1.將整個圖像分成S*S個格子

2.將整張圖像送入CNN,預測每一個格子是否存在目標、(預測目標邊界框和目標的類別)

3.將預測的邊界框做非最大值抑制(NMS),得到最終結果。

可以看出,這個網絡中主要采用了1x1卷積后跟著3x3卷積的方式。

特征提取網絡采用了前20個卷積層,加一個avg-pooling層和一個全連接層,對ImageNet2012進行分類,top-5正確率為88%,輸入分辨率為224x224。

檢測時,將輸入分辨率改為448x448,因為網絡結構是全卷積的,所以輸入分辨率可以改變,整個網絡輸出為7x7x30維的tensor。

YOLO算法主要有以下優點:

1.檢測速度達到實時幀檢測,在Titan X GPU上每秒可檢測45幀,快速版每秒能做到150幀

2.YOLO 是對整張圖進行檢測,采取回歸的方式檢測目標的位置和類別,是一種全新的檢測方式

缺點:

1.定位精度差,沒有區域建議算法高,主要由于該算法對圖像做回歸而不是滑動窗口檢測

2.對小目標,或目標之間位置接近的情況下檢測效果不好

Trick:

模型首先會將ImageNet作為訓練集預訓練模型,最終達到88%精度,然后使用遷移學習將預訓練的模型應用到當前標注的訓練集進行訓練。ImageNet分辨率為224x224。檢測時,將輸入分辨率改為448x448,因為網絡結構是全卷積的,所以輸入分辨率可以改變,整個網絡輸出為7x7x30維的tensor。

模型輸出5維信息(x,y,w,h,score),使用Leaky Relu作為激活函數,全連接層后添加Dropout層防止過擬合。在得到輸出值之后,我們需要計算每個box與ground true的Iou值,然后通過非極大值抑制篩選box。



5.SSD

論文地址

代碼


SSD在YOLO的基礎上改進了三點:多尺度特征圖,利用卷積進行檢測,設置先驗框。

SSD 使用 VGG19 網絡作為特征提取器(和 Faster R-CNN 中使用的 CNN 一樣),在該網絡之后添加自定義卷積層(藍色),并使用卷積核(綠色)執行預測。


同時對類別和位置執行單次預測

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


使用多尺度特征圖用于檢測

(1)采用多尺度特征圖用于檢測

所謂多尺度采用大小不同的特征圖,CNN網絡一般前面的特征圖比較大,后面會逐漸采用stride=2的卷積或者pool來降低特征圖大小,這正如圖3所示,一個比較大的特征圖和一個比較小的特征圖,它們都用來做檢測。這樣做的好處是比較大的特征圖來用來檢測相對較小的目標,而小的特征圖負責檢測大目標,如圖4所示,8x8的特征圖可以劃分更多的單元,但是其每個單元的先驗框尺度比較小。


(2)采用卷積進行檢測

與Yolo最后采用全連接層不同,SSD直接采用卷積對不同的特征圖來進行提取檢測結果。對于形狀為m×n×p的特征圖,只需要采用3×3×p這樣比較小的卷積核得到檢測值。 對于一個大小m×n的特征圖,共有mn個單元,每個單元設置的先驗框數目記為k,每個現驗框有(c+4)個檢測值,那么每個單元共需要(c+4)k個預測值,所有的單元共需要(c+4)kmn個預測值,由于SSD采用卷積做檢測,所以就需要(c+4)k個卷積核完成這個特征圖的檢測過程。

(3)設置先驗框?

SSD采用了不同尺度和長寬比的先驗框(Prior boxes, Default boxes,在Faster R-CNN中叫做錨,Anchors)

在Yolo中,每個單元預測多個邊界框,但是其都是相對這個單元本身(正方塊),但是真實目標的形狀是多變的,Yolo需要在訓練過程中自適應目標的形狀。而SSD借鑒了Faster R-CNN中anchor的理念,每個單元設置尺度或者長寬比不同的先驗框,預測的邊界框(bounding boxes)是以這些先驗框為基準的,在一定程度上減少訓練難度。一般情況下,每個單元會設置多個先驗框,其尺度和長寬比存在差異,如圖5所示,可以看到每個單元使用了4個不同的先驗框,圖片中貓和狗分別采用最適合它們形狀的先驗框來進行訓練,后面會詳細講解訓練過程中的先驗框匹配原則。


SSD的先驗框

SSD的檢測值也與Yolo不太一樣。對于每個單元的每個先驗框,其都輸出一套獨立的檢測值,對應一個邊界框,主要分為兩個部分。第一部分是各個類別的置信度或者評分,值得注意的是SSD將背景也當做了一個特殊的類別,如果檢測目標共有c個類別,SSD其實需要預測c+1個置信度值,其中第一個置信度指的是不含目標或者屬于背景的評分。后面當我們說c個類別置信度時,請記住里面包含背景那個特殊的類別,即真實的檢測類別只有c?1個。在預測過程中,置信度最高的那個類別就是邊界框所屬的類別,特別地,當第一個置信度值最高時,表示邊界框只包含背景。第二部分就是邊界框的location,包含4個值(cx,cy,w,h),分別表示邊界框的中心坐標以及寬高(通過預測偏移量而不是坐標值能夠簡化問題,所以是邊界框相對于先驗框的轉換值offset)。

在訓練過程中,首先要確定訓練圖片中的ground truth(真實目標)與哪個先驗框來進行匹配,與之匹配的先驗框所對應的邊界框將負責預測它。在Yolo中,ground truth的中心落在哪個單元格,該單元格中與其IOU最大的邊界框負責預測它。但是在SSD中卻完全不一樣,SSD的先驗框與ground truth的匹配原則主要有兩點。首先,對于圖片中每個ground truth,找到與其IOU最大的先驗框,該先驗框與其匹配,這樣,可以保證每個ground truth一定與某個先驗框匹配。通常稱與ground truth匹配的先驗框為正樣本,反之,若一個先驗框沒有與任何ground truth進行匹配,那么該先驗框只能與背景匹配,就是負樣本。一個圖片中ground truth是非常少的, 而先驗框卻很多,如果僅按第一個原則匹配,很多先驗框會是負樣本,正負樣本極其不平衡,所以需要第二個原則。第二個原則是:對于剩余的未匹配先驗框,若某個ground truth的IOU大于某個閾值(一般是0.5),那么該先驗框也與這個ground truth進行匹配。這意味著某個ground truth可能與多個先驗框匹配,這是可以的。但是反過來卻不可以,因為一個先驗框只能匹配一個ground truth,如果多個ground truth與某個先驗框IOU大于閾值,那么先驗框只與IOU最大的那個先驗框進行匹配。第二個原則一定在第一個原則之后進行,仔細考慮一下這種情況,如果某個ground truth所對應最大IOU小于閾值,并且所匹配的先驗框卻與另外一個ground truth的IOU大于閾值,那么該先驗框應該匹配誰,答案應該是前者,首先要確保某個ground truth一定有一個先驗框與之匹配。但是,這種情況我覺得基本上是不存在的。由于先驗框很多,某個ground truth的最大IOU肯定大于閾值,所以可能只實施第二個原則既可以了。


綠色的GT是ground truth,紅色為先驗框,FP表示負樣本,TP表示正樣本

盡管一個ground truth可以與多個先驗框匹配,但是ground truth相對先驗框還是太少了,所以負樣本相對正樣本會很多。為了保證正負樣本盡量平衡,SSD采用了hard negative mining,就是對負樣本進行抽樣,抽樣時按照置信度誤差(預測背景的置信度越小,誤差越大)進行降序排列,選取誤差的較大的top-k作為訓練的負樣本,以保證正負樣本比例接近1:3

(4)NMS

在 SSD 算法中,NMS 至關重要。因為多個 feature map 最后會產生大量的 bounding boxes,即最終檢測結果。然而在這些bounding boxes中存在著大量的錯誤的、重疊的、不準確的樣本,這不僅造成了巨大的計算量,如果處理不好會影響算法的性能。僅僅依賴于IOU 是不現實的,IOU值設置的太大,可能就會丟失一部分檢測的目標,即會出現大量的漏檢情況;IOU值設置的太小,則會出現大量的重疊檢測,會大大影響檢測器的性能。

? ? ? 即使在IOU處理掉大部分的bounding boxes之后,仍然會存在大量的錯誤的、重疊的、不準確的bounding boxes(如圖14),這就需要NMS進行迭代優化。

上圖中展示了重疊的、IoU無法剔除的bounding boxes


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


trick:

數據擴增技術很重要,對于mAP的提升很大;

使用不同長寬比的先驗框可以得到更好的結果;

優點:

? 運行速度超過YOLO,精度超過Faster R-CNN(一定條件下,對于稀疏場景的大目標而言)。

缺點:

(1)需要人工設置default boxes的初始尺度和長寬比的值。網絡中default boxes的基礎大小和形狀不能直接通過學習獲得,而是需要手工設置。而網絡中每一層 feature使用的default box大小和形狀恰好都不一樣,導致調試過程非常依賴經驗。

(2)對小尺寸的目標識別仍比較差,還達不到 Faster R-CNN 的水準。因為 SSD 使用 conv4_3 低級 feature 去檢測小目標,而低級特征卷積層數少,存在特征提取不充分的問題。




6.YOLO V2

YOLO-v2在YOLO-v1的版本上做了一些改進。

(1)添加了BN層,map提高了2%。

隨著神經網絡的訓練,網絡層的輸入分布會發生變動,逐漸向激活函數取值兩端靠攏,如:sigmoid激活函數,此時會進入飽和狀態,梯度更新緩慢,對輸入變動不敏感,甚至梯度消失導致模型難以訓練。BN,在網絡層輸入激活函數輸入值之前加入,可以將分布拉到均值為0,標準差為1的正態分布,從而使激活函數處于對輸入值敏感的區域,從而加快模型訓練。

BN的地位:與激活函數層、卷積層、全連接層、池化層一樣,BN(Batch Normalization)也屬于網絡的一層。

BN的本質原理:在網絡的每一層輸入的時候,又插入了一個歸一化層,也就是先做一個歸一化處理(歸一化至:均值0、方差為1),然后再進入網絡的下一層。但是不像我們想象的那么簡單,它是一個可學習、有參數(γ、β)的網絡層。

BN的作用:

? ? ? ?1)改善流經網絡的梯度

? ? ? ?2)允許更大的學習率,大幅提高訓練速度:

? ? ? ? ? ??你可以選擇比較大的初始學習率,讓你的訓練速度飆漲。以前還需要慢慢調整學習率,甚至在網絡訓練到一半的時候,還需要想著學習率進一步調小的比例選擇多少比較合適,現在我們可以采用初始很大的學習率,然后學習率的衰減速度也很大,因為這個算法收斂很快。當然這個算法即使你選擇了較小的學習率,也比以前的收斂速度快,因為它具有快速訓練收斂的特性;

? ? ? ?3)減少對初始化的強烈依賴

? ? ? ?4)改善正則化策略:作為正則化的一種形式,輕微減少了對dropout的需求

你再也不用去理會過擬合中drop out、L2正則項參數的選擇問題,采用BN算法后,你可以移除這兩項了參數,或者可以選擇更小的L2正則約束參數了,因為BN具有提高網絡泛化能力的特性;

? ? ? ?5)再也不需要使用使用局部響應歸一化層了(局部響應歸一化是Alexnet網絡用到的方法,搞視覺的估計比較熟悉),因為BN本身就是一個歸一化網絡層;

? ? ? ?6)可以把訓練數據徹底打亂(防止每批訓練的時候,某一個樣本都經常被挑選到,文獻說這個可以提高1%的精度)。

(2)用448x448的輸入分辨率在ImageNet上進行參數微調,map提高了4%。

(3)把全連接層取消,使用anchor boxes來預測目標方框;使用anchor boxes的話就把分類置信度和空間位置分離了,所以對每個預測方框都可以回歸一個方框置信度和分類置信度。不用anchor box時map是69.5%,召回率是81%,使用了之后map是69.2%召回率是88%。

(4)用k-means來選擇好的方框先驗。

(5)對于每個方格,預測5個方框。

(6)把26x26x512的feature-map,相鄰特征分到不同的channel中,因此得到13x13x2048的feature-map,與后面層進行concat,使得map提高了1%。這里主要是添加了一個層:passthrough layer。這個層的作用就是將前面一層的26*26的feature map和本層的13*13的feature map進行連接,有點像ResNet。這樣做的原因在于雖然13*13的feature map對于預測大的object以及足夠了,但是對于預測小的object就不一定有效。通過這個passthrough layer把高分辨率特征與低分辨率特征聯系在了一起,聯系起來的方法是把相鄰的特征堆積在不同的 Channel(通道) 中,這一方法類似與 Resnet(殘缺網絡) 的 Identity Mapping(恒等映射),從而把 26*26*512 變成 13*13*2048。YOLO 中的檢測器位于擴展后(expanded )的特征圖的上方,所以他能取得細粒度的特征信息,這提升了 YOLO 1% 的性能。

(7)多scale的訓練,因為網絡為全卷積層,所以同樣的網絡可以預測不同分辨率的輸入,每10個batch隨機選擇一個新的image size。

遷移學習之前,在介紹YOLO-v1的時候我們說到,模型需要先在ImageNet上預訓練模型,因此,此時圖像輸入為224x224,使用遷移學習訓練后我們的圖像輸入是448x448,因此模型需要適應圖像分辨率的改變。在YOLO-v2中,我們在預訓練模型中先224x224訓練160個epoch,然后將輸入調整到448x448,再跑10個epoch,也就是在ImageNet數據集中兩種分辨率跑兩次。YOLO大神作者實現表明,這樣操作可以提高4%的map

訓練階段,采用32的倍數作為圖像尺寸動態輸入,如【320,352。。。608】。這種網絡訓練方式使得相同網絡可以對不同分辨率的圖像做detection。

(8)新的分類網絡Darknet-19


(9)分類和檢測聯合訓練Joint classification and detection

使用1000類的ImageNet進行訓練,為了建立WordtTree 1K,把所有中間詞匯加入到WordTree上,把標簽空間從1000擴大到了1369。在訓練過程中,如果有一個圖片的標簽是”Norfolk terrier“,那么這個圖片還會獲得”狗“(dog)以及“哺乳動物”(mammal)等標簽。總之現在一張圖片是多標記的,標記之間不需要相互獨立。?


如圖所示,之前的ImageNet分類是使用一個大softmax進行分類。而現在,WordTree只需要對同一概念下的同義詞進行softmax分類。


用WordTree 把數據集合中的類別映射到分層樹中的同義詞上,例如上右圖,WordTree混合ImageNet與COCO。


YOLO-v2利用WordTree,將分類和檢測任務進行聯合訓練,對于沒有方框標注的物體也能預測出其方框,能夠對詞典中9000個概念進行預測。YOLO-v2也叫做YOLO9000。

訓練一個Extremely Large Scale檢測器。所以訓練的時候使用WordTree混合了COCO檢測數據集與ImageNet中的Top9000類,混合后的數據集對應的WordTree有9418個類。另一方面,由于ImageNet數據集太大了,作者為了平衡一下兩個數據集之間的數據量,通過過采樣(oversampling)COCO數據集中的數據,對COCO過采樣的方式進行數據集擴增,使COCO數據集與ImageNet數據集之間的數據量比例達到1:4。

YOLO9000的訓練基于YOLO v2的構架,但是使用3priors而不是5來限制輸出的大小。當網絡遇到檢測數據集中的圖片時則正常地反方向傳播,當遇到分類數據集圖片的時候,只使用分類的loss功能進行反向傳播。同時作者假設IOU最少為 .3。最后根據這些假設進行反向傳播(有點迷)。

使用聯合訓練法,YOLO9000使用COCO檢測數據集學習檢測圖片中的物體的位置,使用ImageNet分類數據集學習如何從大量的類別中進行分類。

為了評估這一方法,使用ImageNet Detection Task對訓練結果進行評估。

評估結果:

YOLO9000取得19.7mAP。

在未學習過的156個分類數據上進行測試,mAP達到16.0。

YOLO9000的mAP比DPM高,而且YOLO有更多先進的特征,YOLO9000是用部分監督的方式在不同訓練集上進行訓練,同時還能檢測9000個物體類別,并保證實時運行。



7.YOLO V3

YOLO-v3在YOLO-v2的基礎上進行了一些改進。

(1)用logistic regression對方框置信度進行回歸,對先驗與實際方框IOU大于0.5的作為正例,與SSD不同的是,若有多個先驗滿足目標,只取一個IOU最大的先驗。

(2)類別預測由softmax改為logistic(使用sigmoid):用于處理預測物體之間存在包含關系問題,解決多標簽對象支持。比如woman和person,softmax輸出:person,logistic輸出兩者。

(3)利用多個scale進行預測,實際使用3個不同的scale。將前兩層的feature-map進行上采樣,與開始的feature-map進行concat起來,加一些卷積層,然后進行預測。


使用多尺度特征預測物體

(4)新的特征提取網絡Darkent-53


Darknet-53和Resnet-152正確率相同,但速度是2倍

(5)網絡細節


DBL:指Darknetconv2d_BN_Leaky。

resn:指:n代表數字,有res1,res2, … ,res8等等,表示這個res_block里含有多少個res_unit,使用殘差結構可以讓網絡更深。

concat:張量拼接。將darknet中間層和后面的某一層的上采樣進行拼接。拼接的操作和殘差層add的操作是不一樣的,拼接會擴充張量的維度,而add只是直接相加不會導致張量維度的改變。(解決SSD 使用 conv4_3 低級 feature 去檢測小目標,而低級特征卷積層數少,存在特征提取不充分的問題?)

在YOLO-v3網絡中沒有池化層和全連接層,那么張量尺寸的變化是通過改變卷積核步長來實現。同YOLO-v2一樣,輸出尺寸為輸入尺寸的1/32,即:一般要求輸入圖像尺寸是32的倍數。



、Anchor Free 類別的目標檢測算法


8.centernet: object as point

原理簡單優雅,不明覺厲。backbone還有一些實現細節還要從源碼閱讀

1.整體架構

512*512 input resolution

2.Backbone

a:Hourglass 沙漏網絡,文中未對其修改

b:帶轉置卷積的resnet, 同時增加了deformable conv

c:原始的DLA-34語義分割網絡

d:文中用到的修改過的DLA-34,增加了FPN結構

由于采用全卷積網絡直接得到4倍下采樣的熱力圖,所以不需要提前設定anchors, 所以大大減少了網絡參數量和計算量。熱力圖的通道數等于要檢測的目標類別數,熱力圖的前100個峰值作為網絡提取的目標中心點,然后設定一個閾值進行篩選得到最終的目標中心點。

Centernet 中所有的上采樣前都有deformable卷積,這種卷積的作用就是使得網絡的感受野變得更加精確,而不是限定為3*3的矩形卷積框內。同時4倍的下采樣feature map 比一般網絡的分辨率高很多,所有不需要進行多尺度預測和特征金字塔也可以同時較好的檢測大小目標。

Centernet 不需要NMS,因為所有檢測的中心點是由熱力圖的峰值得到的,這樣就已經有一個非極大值抑制的過程,而且NMS是十分耗時的,所以Centernet才能又好又快。

Centernet 采用編碼解碼的全卷積骨干網絡,上采樣用到的是轉置卷積,與一般上采樣中的雙線性差值有很大區別,轉置卷積可以更好的還原圖像的語義信息和位置信息。

3.思路

與基于錨點的one-stage方法相近。中心點可看成形狀未知的錨點(見圖3)。但存在幾個重要差別(本文創新點):

第一,我們分配的錨點僅僅是放在位置上,沒有尺寸框。沒有手動設置的閾值做前后景分類。(像Faster RCNN會將與GT IOU >0.7的作為前景,<0.3的作為背景,其他不管);

第二,每個目標僅僅有一個正的錨點,因此不會用到NMS,我們提取關鍵點特征圖上局部峰值點(local peaks);

第三,CenterNet 相比較傳統目標檢測而言(縮放16倍尺度),使用更大分辨率的輸出特征圖(縮放了4倍),因此無需用到多重特征圖錨點;

在推理的時候,我們分別提取熱力圖上每個類別的峰值點。如何得到這些峰值點呢?做法是將熱力圖上的所有響應點與其連接的8個臨近點進行比較,如果該點響應值大于或等于其八個臨近點值則保留,最后我們保留所有滿足之前要求的前100個峰值點。目標的寬高信息由熱力圖分布回歸得到。

參考文章鏈接:

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.lxweimin.com/p/f87be68977cb

http://www.lxweimin.com/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

等,感謝以上博文的資料整理,對我的學習帶來了極大的幫助

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。