目標檢測 2—— One Stage目標檢測算法

筆記來源:DeepLearning-500-questions
上次學習了目標檢測的基本概念和一些經典的Two Stage算法:1.目標檢測Two Stage

3. One Stage目標檢測算法

我們將對單次目標檢測器(包括SSD系列和YOLO系列等算法)進行綜述。我們將分析FPN以理解多尺度特徵圖如何提高準確率,特別是小目標的檢測,其在單次檢測器中的檢測效果通常很差。然後我們將分析Focal loss和RetinaNet,看看它們是如何解決訓練過程中的類別不平衡問題的。

3.1 SSD

SSD有哪些創新點?

  1. 基於Faster R-CNN中的Anchor,提出了相似的先驗框(Prior box)
  2. 從不同比例的特徵圖(多尺度特徵)中產生不同比例的預測,並明確地按長寬比分離預測。

不同於前面的R-CNN系列,SSD屬於one-stage方法。SSD使用 VGG16 網絡作爲特徵提取器(和 Faster R-CNN 中使用的 CNN 一樣),將後面的全連接層替換成卷積層,並在之後添加自定義卷積層,並在最後直接採用卷積進行檢測。在多個特徵圖上設置不同縮放比例和不同寬高比的先驗框以融合多尺度特徵圖進行檢測,靠前的大尺度特徵圖可以捕捉到小物體的信息,而靠後的小尺度特徵圖能捕捉到大物體的信息,從而提高檢測的準確性和定位的準確性。如下圖是SSD的網絡結構圖。
在這裏插入圖片描述

1. 怎樣設置default boxes?
SSD中default box的概念有點類似於Faster R-CNN中的anchor。不同於Faster R-CNN只在最後一個特徵層取anchor, SSD在多個特徵層上取default box,可以得到不同尺度的default box。在特徵圖的每個單元上取不同寬高比的default box,一般寬高比在{1,2,3,1/2,1/3}中選取,有時還會額外增加一個寬高比爲1但具有特殊尺度的box。如下圖所示,在8x8的feature map和4x4的feature map上的每個單元取4個不同的default box。原文對於300x300的輸入,分別在conv4_3, conv7,conv8_2,conv9_2,conv10_2,conv11_2的特徵圖上的每個單元取4,6,6,6,4,4個default box. 由於以上特徵圖的大小分別是38x38,19x19,10x10,5x5,3x3,1x1,所以一共得到38x38x4+19x19x6+10x10x6+5x5x6+
3x3x4+1x1x4=8732個default box.對一張300x300的圖片輸入網絡將會針對這8732個default box預測8732個邊界框。
在這裏插入圖片描述
2. 怎樣對先驗框進行匹配?
SSD在訓練的時候只需要輸入圖像和圖像中每個目標對應的ground truth. 先驗框與ground truth 的匹配遵循兩個原則:

(1)對圖片中的每個ground truth, 在先驗框中找到與其IOU最大的先驗框,則該先驗框對應的預測邊界框與ground truth 匹配。

(2)對於(1)中每個剩下的沒有與任何ground truth匹配到的先驗框,找到與其IOU最大的ground truth,若其與該ground truth的IOU值大於某個閾值(一般設爲0.5),則該先驗框對應的預測邊界框與該ground truth匹配。

按照這兩個原則進行匹配,匹配到ground truth的先驗框對應的預測邊界框作爲正樣本,沒有匹配到ground truth的先驗框對應的預測邊界框作爲負樣本。儘管一個ground truth可以與多個先驗框匹配,但是ground truth的數量相對先驗框還是很少,按照上面的原則進行匹配還是會造成負樣本遠多於正樣本的情況。爲了使正負樣本儘量均衡(一般保證正負樣本比例約爲1:3),SSD採用hard negative mining, 即對負樣本按照其預測背景類的置信度進行降序排列,選取置信度較小的top-k作爲訓練的負樣本。

3. 怎樣得到預測的檢測結果?

最後分別在所選的特徵層上使用3x3卷積核預測不同default boxes所屬的類別分數及其預測的邊界框location。由於對於每個box需要預測該box屬於每個類別的置信度(假設有c類,包括背景,例如20class的數據集合,c=21)和該box對應的預測邊界框的location(包含4個值,即該box的中心座標和寬高),則每個box需要預測c+4個值。所以對於某個所選的特徵層,該層的卷積核個數爲(c+4)x 該層的default box個數.最後將每個層得到的卷積結果進行拼接。對於得到的每個預測框,取其類別置信度的最大值,若該最大值大於置信度閾值,則最大值所對應的類別即爲該預測框的類別,否則過濾掉此框。對於保留的預測框根據它對應的先驗框進行解碼得到其真實的位置參數(這裏還需注意要防止預測框位置超出圖片),然後根據所屬類別置信度進行降序排列,取top-k個預測框,最後進行NMS,過濾掉重疊度較大的預測框,最後得到檢測結果。

SSD優勢是速度比較快,整個過程只需要一步,首先在圖片不同位置按照不同尺度和寬高比進行密集抽樣,然後利用CNN提取特徵後直接進行分類與迴歸,所以速度比較快,但均勻密集採樣會造成正負樣本不均衡的情況使得訓練比較困難,導致模型準確度有所降低。另外,SSD對小目標的檢測沒有大目標好,因爲隨着網絡的加深,在高層特徵圖中小目標的信息丟失掉了,適當增大輸入圖片的尺寸可以提升小目標的檢測效果。

3.2 DSSD

DSSD有哪些創新點?

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

爲了解決SSD算法檢測小目標困難的問題,DSSD算法將SSD算法基礎網絡從VGG-16更改爲ResNet-101,增強網絡特徵提取能力,其次參考FPN算法思路利用去Deconvolution結構將圖像深層特徵從高維空間傳遞出來,與淺層信息融合,聯繫不同層級之間的圖像語義關係,設計預測模塊結構,通過不同層級特徵之間融合特徵輸出預測物體類別信息。

DSSD算法中有兩個特殊的結構:Prediction模塊;Deconvolution模塊。前者利用提升每個子任務的表現來提高準確性,並且防止梯度直接流入ResNet主網絡。後者則增加了三個Batch Normalization層和三個3×3卷積層,其中卷積層起到了緩衝的作用,防止梯度對主網絡影響太劇烈,保證網絡的穩定性。

SSD和DSSD的網絡模型如下圖所示:

在這裏插入圖片描述

Prediction Module

SSD直接從多個卷積層中單獨引出預測函數,預測量多達7000多,梯度計算量也很大。MS-CNN方法指出,改進每個任務的子網可以提高準確性。根據這一思想,DSSD在每一個預測層後增加殘差模塊,並且對於多種方案進行了對比,如下圖所示。結果表明,增加殘差預測模塊後,高分辨率圖片的檢測精度比原始SSD提升明顯。
在這裏插入圖片描述
Deconvolution模塊

爲了整合淺層特徵圖和deconvolution層的信息,作者引入deconvolution模塊,如下圖所示。作者受到論文Learning to Refine Object Segments的啓發,認爲用於精細網絡的deconvolution模塊的分解結構達到的精度可以和複雜網絡一樣,並且更有效率。作者對其進行了一定的修改:其一,在每個卷積層後添加批歸一化(batch normalization)層;其二,使用基於學習的deconvolution層而不是簡單地雙線性上採樣;其三,作者測試了不同的結合方式,元素求和(element-wise sum)與元素點積(element-wise product)方式,實驗證明元素點積計算能得到更好的精度。

在這裏插入圖片描述

3.3 YOLOv1

YOLOv1有哪些創新點?

  1. 將整張圖作爲網絡的輸入,直接在輸出層迴歸bounding box的位置和所屬的類別
  2. 速度快,one stage detection的開山之作

YOLOv1介紹

YOLO(You Only Look Once: Unified, Real-Time Object Detection)是one-stage detection的開山之作。之前的物體檢測方法首先需要產生大量可能包含待檢測物體的先驗框, 然後用分類器判斷每個先驗框對應的邊界框裏是否包含待檢測物體,以及物體所屬類別的概率或者置信度,同時需要後處理修正邊界框,最後基於一些準則過濾掉置信度不高和重疊度較高的邊界框,進而得到檢測結果。這種基於先產生候選區再檢測的方法雖然有相對較高的檢測準確率,但運行速度較慢。

YOLO創造性的將物體檢測任務直接當作迴歸問題(regression problem)來處理,將候選區和檢測兩個階段合二爲一。只需一眼就能知道每張圖像中有哪些物體以及物體的位置。下圖展示了各物體檢測系統的流程圖。
在這裏插入圖片描述
事實上,YOLO也並沒有真正的去掉候選區,而是直接將輸入圖片劃分成7x7=49個網格,每個網格預測兩個邊界框,一共預測49x2=98個邊界框。可以近似理解爲在輸入圖片上粗略的選取98個候選區,這98個候選區覆蓋了圖片的整個區域,進而用迴歸預測這98個候選框對應的邊界框。

1. 網絡結構是怎樣的?

YOLO網絡借鑑了GoogLeNet分類網絡結構,不同的是YOLO使用1x1卷積層和3x3卷積層替代inception module。如下圖所示,整個檢測網絡包括24個卷積層和2個全連接層。其中,卷積層用來提取圖像特徵,全連接層用來預測圖像位置和類別概率值。
在這裏插入圖片描述
2. YOLO的輸入、輸出、損失函數分別是什麼?

前面說到YOLO將輸入圖像分成7x7的網格,最後輸出是7x7xk的張量。YOLO網絡最後接了兩個全連接層,全連接層要求輸入是固定大小的,所以YOLO要求輸入圖像有固定大小,論文中作者設計的輸入尺寸是448x448。

YOLO將輸入圖像分成7x7的網格,每個網格預測2個邊界框。若某物體的ground truth的中心落在該網格,則該網格中與這個ground truth IOU最大的邊界框負責預測該物體。對每個邊界框會預測5個值,分別是邊界框的中心x,y(相對於所屬網格的邊界),邊界框的寬高w,h(相對於原始輸入圖像的寬高的比例),以及這些邊界框的confidencescores(邊界框與ground truth box的IOU值)。同時每個網格還需要預測c個類條件概率 (是一個c維向量,表示某個物體object在這個網格中,且該object分別屬於各個類別的概率,這裏的c類物體不包含背景)。論文中的c=20,則每個網格需要預測2x5+20=30個值,這些值被映射到一個30維的向量。
爲了讓邊界框座標損失、分類損失達到很好的平衡,損失函數設計如下圖所示。
在這裏插入圖片描述
如上圖所示,損失函數分爲座標預測(藍色框)、含有物體的邊界框的confidence預測(紅色框)、不含有物體的邊界框的confidence預測(黃色框)、分類預測(紫色框)四個部分。

由於不同大小的邊界框對預測偏差的敏感度不同,小的邊界框對預測偏差的敏感度更大。爲了均衡不同尺寸邊界框對預測偏差的敏感度的差異。作者巧妙的對邊界框的w,h取均值再求L2 loss. YOLO中更重視座標預測,賦予座標損失更大的權重,記爲 coord,在pascal voc訓練中coodd=5 ,classification error部分的權重取1。

某邊界框的置信度定義爲:某邊界框的confidence = 該邊界框存在某類對象的概率pr(object)*該邊界框與該對象的ground truth的IOU值 ,若該邊界框存在某個對象pr(object)=1 ,否則pr(object)=0 。由於一幅圖中大部分網格中是沒有物體的,這些網格中的邊界框的confidence置爲0,相比於有物體的網格,這些不包含物體的網格更多,對梯度更新的貢獻更大,會導致網絡不穩定。爲了平衡上述問題,YOLO損失函數中對沒有物體的邊界框的confidence error賦予較小的權重,記爲 noobj,對有物體的邊界框的confidence error賦予較大的權重。在pascal VOC訓練中noobj=0.5 ,有物體的邊界框的confidence error的權重設爲1.

3. YOLO怎樣預測?

YOLO最後採用非極大值抑制(NMS)算法從輸出結果中提取最有可能的對象和其對應的邊界框。

輸入一張圖片到YOLO網絡將輸出一個7730的張量表示圖片中每個網格對應的可能的兩個邊界框以及每個邊界框的置信度和包含的對象屬於各個類別的概率。由此可以計算某對象i屬於類別 同時在第j個邊界框中的得分:
在這裏插入圖片描述
每個網格有20個類條件概率,2個邊界框置信度,相當於每個網格有40個得分,7x7個網格有1960個得分,每類對象有1960/20=98個得分,即98個候選框。

NMS步驟如下:

1.設置一個Score的閾值,一個IOU的閾值;

2.對於每類對象,遍歷屬於該類的所有候選框,

①過濾掉Score低於Score閾值的候選框;

②找到剩下的候選框中最大Score對應的候選框,添加到輸出列表;

③進一步計算剩下的候選框與②中輸出列表中每個候選框的IOU,若該IOU大於設置的IOU閾值,將該候選框過濾掉,否則加入輸出列表中;

④最後輸出列表中的候選框即爲圖片中該類對象預測的所有邊界框

3.返回步驟2繼續處理下一類對象。

YOLO將識別與定位合二爲一,結構簡便,檢測速度快,更快的Fast YOLO可以達到155FPS。相對於R-CNN系列, YOLO的整個流程中都能看到整張圖像的信息,因此它在檢測物體時能很好的利用上下文信息,從而不容易在背景上預測出錯誤的物體信息。同時YOLO可以學習到高度泛化的特徵,能將一個域上學到的特徵遷移到不同但相關的域上,如在自然圖像上做訓練的YOLO,在藝術圖片上可以得到較好的測試結果。

由於YOLO網格設置比較稀疏,且每個網格只預測2個邊界框,其總體預測精度不高,略低於Fast RCNN。其對小物體的檢測效果較差,尤其是對密集的小物體表現比較差。

3.4 YOLOv2

YOLOv2 有哪些創新點?

YOLOv1雖然檢測速度快,但在定位方面不夠準確,並且召回率較低。爲了提升定位準確度,改善召回率,YOLOv2在YOLOv1的基礎上提出了幾種改進策略,如下圖所示,可以看到,一些改進方法能有效提高模型的mAP。

  1. 大尺度預訓練分類
  2. New Network:Darknet-19
  3. 加入anchor
    在這裏插入圖片描述
    YOLOv2 介紹

(1)Batch Normalization

YOLOv2中在每個卷積層後加Batch Normalization(BN)層,去掉dropout. BN層可以起到一定的正則化效果,能提升模型收斂速度,防止模型過擬合。YOLOv2通過使用BN層使得mAP提高了2%。
(2)High Resolution Classifier

目前的大部分檢測模型都會使用主流分類網絡(如vgg、resnet)在ImageNet上的預訓練模型作爲特徵提取器,
而這些分類網絡大部分都是以小於256x256的圖片作爲輸入進行訓練的,低分辨率會影響模型檢測能力。YOLOv2將輸入圖片的分辨率提升至448x448,爲了使網絡適應新的分辨率,YOLOv2先在ImageNet上以448x448的分辨率對網絡進行10個epoch的微調,讓網絡適應高分辨率的輸入。通過使用高分辨率的輸入,YOLOv2的mAP提升了約4%。

(3)Convolutional With Anchor Boxes

YOLOv1利用全連接層直接對邊界框進行預測,導致丟失較多空間信息,定位不準。YOLOv2去掉了YOLOv1中的全連接層,使用Anchor Boxes預測邊界框,同時爲了得到更高分辨率的特徵圖,YOLOv2還去掉了一個池化層。由於圖片中的物體都傾向於出現在圖片的中心位置,若特徵圖恰好有一箇中心位置,利用這個中心位置預測中心點落入該位置的物體,對這些物體的檢測會更容易。所以總希望得到的特徵圖的寬高都爲奇數。YOLOv2通過縮減網絡,使用416x416的輸入,模型下采樣的總步長爲32,最後得到13x13的特徵圖,然後對13x13的特徵圖的每個cell預測5個anchor boxes,對每個anchor box預測邊界框的位置信息、置信度和一套分類概率值。使用anchor
boxes之後,YOLOv2可以預測13x13x5=845個邊界框,模型的召回率由原來的81%提升到88%,mAP由原來的69.5%降低到69.2%.召回率提升了7%,準確率下降了0.3%。

(4)Dimension Clusters

在Faster R-CNN和SSD中,先驗框都是手動設定的,帶有一定的主觀性。YOLOv2採用k-means聚類算法對訓練集中的邊界框做了聚類分析,選用boxes之間的IOU值作爲聚類指標。綜合考慮模型複雜度和召回率,最終選擇5個聚類中心,得到5個先驗框,發現其中中扁長的框較少,而瘦高的框更多,更符合行人特徵。通過對比實驗,發現用聚類分析得到的先驗框比手動選擇的先驗框有更高的平均IOU值,這使得模型更容易訓練學習。

(5)New Network:Darknet-19

YOLOv2採用Darknet-19,其網絡結構如下圖所示,包括19個卷積層和5個max pooling層,主要採用3x3卷積和1x1卷積,這裏1x1卷積可以壓縮特徵圖通道數以降低模型計算量和參數,每個卷積層後使用BN層以加快模型收斂同時防止過擬合。最終採用global avg pool 做預測。採用YOLOv2,模型的mAP值沒有顯著提升,但計算量減少了。
在這裏插入圖片描述
(6)Direct location prediction

Faster R-CNN使用anchor boxes預測邊界框相對先驗框的偏移量,由於沒有對偏移量進行約束,每個位置預測的邊界框可以落在圖片任何位置,會導致模型不穩定,加長訓練時間。YOLOv2沿用YOLOv1的方法,根據所在網格單元的位置來預測座標,則Ground Truth的值介於0到1之間。網絡中將得到的網絡預測結果再輸入sigmoid函數中,讓輸出結果介於0到1之間。設一個網格相對於圖片左上角的偏移量是cx,cy。先驗框的寬度和高度分別是pw和ph,則預測的邊界框相對於特徵圖的中心座標(bx,by)和寬高bw、bh的計算公式如下圖所示。
在這裏插入圖片描述
YOLOv2結合Dimention Clusters, 通過對邊界框的位置預測進行約束,使模型更容易穩定訓練,這種方式使得模型的mAP值提升了約5%。

(7)Fine-Grained Features

YOLOv2借鑑SSD使用多尺度的特徵圖做檢測,提出pass through層將高分辨率的特徵圖與低分辨率的特徵圖聯繫在一起,從而實現多尺度檢測。YOLOv2提取Darknet-19最後一個max pool層的輸入,得到26x26x512的特徵圖。經過1x1x64的卷積以降低特徵圖的維度,得到26x26x64的特徵圖,然後經過pass through層的處理變成13x13x256的特徵圖(抽取原特徵圖每個2x2的局部區域組成新的channel,即原特徵圖大小降低4倍,channel增加4倍),再與13x13x1024大小的特徵圖連接,變成13x13x1280的特徵圖,最後在這些特徵圖上做預測。使用Fine-Grained Features,YOLOv2的性能提升了1%.

(8)Multi-Scale Training

YOLOv2中使用的Darknet-19網絡結構中只有卷積層和池化層,所以其對輸入圖片的大小沒有限制。YOLOv2採用多尺度輸入的方式訓練,在訓練過程中每隔10個batches,重新隨機選擇輸入圖片的尺寸,由於Darknet-19下采樣總步長爲32,輸入圖片的尺寸一般選擇32的倍數{320,352,…,608}。採用Multi-Scale Training, 可以適應不同大小的圖片輸入,當採用低分辨率的圖片輸入時,mAP值略有下降,但速度更快,當採用高分辨率的圖片輸入時,能得到較高mAP值,但速度有所下降。

YOLOv2借鑑了很多其它目標檢測方法的一些技巧,如Faster R-CNN的anchor boxes, SSD中的多尺度檢測。除此之外,YOLOv2在網絡設計上做了很多tricks,使它能在保證速度的同時提高檢測準確率,Multi-Scale Training更使得同一個模型適應不同大小的輸入,從而可以在速度和精度上進行自由權衡。

YOLOv2的訓練

YOLOv2的訓練主要包括三個階段。
第一階段:先在ImageNet分類數據集上預訓練Darknet-19,此時模型輸入爲224×224224\times 224,共訓練160個epochs。
第二階段:將網絡的輸入調整爲448×448448\times 448,繼續在ImageNet數據集上finetune分類模型,訓練10個epochs,此時分類模型的top-1準確度爲76.5%,而top-5準確度爲93.3%。
第三個階段:修改Darknet-19分類模型爲檢測模型,並在檢測數據集上繼續finetune網絡。
網絡修改包括(網路結構可視化):移除最後一個卷積層、global avgpooling層以及softmax層,並且新增了三個3×3×20143\times 3 \times 2014卷積層,同時增加了一個passthrough層,最後使用1×11\times 1卷積層輸出預測結果。

3.5 YOLO9000

github:http://pjreddie.com/yolo9000/

YOLO9000是在YOLOv2的基礎上提出的一種聯合訓練方法,可以檢測超過9000個類別的模型。YOLOv2混合目標檢測數據集和分類數據集,用目標檢測數據集及其類別標記信息和位置標註信息訓練模型學習預測目標定位和分類,用分類數據集及其類別標記信息進一步擴充模型所能識別的物體類別同時能增強模型魯棒性。

1. YOLO9000是怎麼組織數據的?

YOLO9000根據各個類別之間的從屬關係建立一種樹結WordTree, 將COCO數據集和ImageNet數據集組織起來。

WordTree的生成方式如下:

①首先遍歷ImageNet中的類別名詞。

②對每個名詞,在WordNet(一種結構化概念及概念之間關係的語言數據庫)上找到從它所在位置到根節點(設根節點爲實體對象physical object)的最短路徑,由於在WordNet中大多數同義詞只有一個路徑,所以先把將該路徑上的詞全都加到樹中。

③迭代地檢查剩下的名詞,取它到根節點的最短路徑,將該最短路徑上的還沒出現在層次樹中的詞加入到樹中。
混合後的數據集形成一個有9418類的WordTree.生成的WordTree模型如下圖所示。另外考慮到COCO數據集相對於ImageNet數據集數據量太少了,爲了平衡兩個數據集,作者進一步對COCO數據集過採樣,使COCO數據集與ImageNet數據集的數據量比例接近1:4。
在這裏插入圖片描述
對於物體的標籤,採用one-hot編碼的形式,數據集中的每個物體的類別標籤被組織成1個長度爲9418的向量,向量中除在WordTree中從該物體對應的名詞到根節點的路徑上出現的詞對應的類別標號處爲1,其餘位置爲0。

2. YOLO9000是怎麼進行聯合訓練的?

YOLO9000採用YOLOv2的結構,anchorbox由原來的5調整到3,對每個anchorbox預測其對應的邊界框的位置信息x,y,w,h和置信度以及所包含的物體分別屬於9418類的概率,所以每個anchorbox需要預測4+1+9418=9423個值。每個網格需要預測3x9423=28269個值。在訓練的過程中,當網絡遇到來自檢測數據集的圖片時,用完整的YOLOv2loss進行反向傳播計算,當網絡遇到來自分類數據集的圖片時,只用分類部分的loss進行反向傳播。

3. YOLO9000是怎麼預測的?

WordTree中每個節點的子節點都屬於同一個子類,分層次的對每個子類中的節點進行一次softmax處理,以得到同義詞集合中的每個詞的下義詞的概率。當需要預測屬於某個類別的概率時,需要預測該類別節點的條件概率。即在WordTree上找到該類別名詞到根節點的路徑,計算路徑上每個節點的概率之積。預測時,YOLOv2得到置信度,同時會給出邊界框位置以及一個樹狀概率圖,沿着根節點向下,沿着置信度最高的分支向下,直到達到某個閾值,最後到達的節點類別即爲預測物體的類別。

YOLO9000使用WordTree混合目標檢測數據集和分類數據集,並在其上進行聯合訓練,使之能實時檢測出超過9000個類別的物體,其強大令人讚歎不已。YOLO9000尤其對動物的識別效果很好,但是對衣服或者設備等類別的識別效果不是很好,可能的原因是與目標檢測數據集中的數據偏向有關。

3.6 YOLOv3

YOLOv3總結了自己在YOLOv2的基礎上做的一些嘗試性改進,有的嘗試取得了成功,而有的嘗試並沒有提升模型性能。其中有兩個值得一提的亮點,一個是使用殘差模型,進一步加深了網絡結構;另一個是使用FPN架構實現多尺度檢測。

YOLOv3有哪些創新點?

  1. 新網絡結構:DarkNet-53
  2. 融合FPN
  3. 用邏輯迴歸替代softmax作爲分類器

1. YOLOv3對網絡結構做了哪些改進?

YOLOv3在之前Darknet-19的基礎上引入了殘差塊,並進一步加深了網絡,改進後的網絡有53個卷積層,取名爲Darknet-53,網絡結構如下圖所示(以256*256的輸入爲例)。
在這裏插入圖片描述
爲了比較Darknet-53與其它網絡結構的性能,作者在TitanX上,採用相同的實驗設置,將256x256的圖片分別輸入以Darknet-19,ResNet-101,ResNet-152和Darknet-53爲基礎網絡的分類模型中,實驗得到的結果如下圖所示。可以看到Darknet-53比ResNet-101的性能更好,而且速度是其1.5倍,Darknet-53與ResNet-152性能相似但速度幾乎是其2倍。注意到,Darknet-53相比於其它網絡結構實現了每秒最高的浮點計算量,說明其網絡結構能更好的利用GPU。
在這裏插入圖片描述
2.YOLOv3中怎樣實現多尺度檢測?

YOLOv3借鑑了FPN的思想,從不同尺度提取特徵。相比YOLOv2,YOLOv3提取最後3層特徵圖,不僅在每個特徵圖上分別獨立做預測,同時通過將小特徵圖上採樣到與大的特徵圖相同大小,然後與大的特徵圖拼接做進一步預測。用維度聚類的思想聚類出9種尺度的anchor box,將9種尺度的anchor box均勻的分配給3種尺度的特徵圖.如下圖是在網絡結構圖的基礎上加上多尺度特徵提取部分的示意圖(以在COCO數據集(80類)上256x256的輸入爲例):
在這裏插入圖片描述
從YOLOv1到YOLOv2再到YOLO9000、YOLOv3, YOLO經歷三代變革,在保持速度優勢的同時,不斷改進網絡結構,同時汲取其它優秀的目標檢測算法的各種trick,先後引入anchor box機制、引入FPN實現多尺度檢測等。

3.7 RetinaNet

研究背景

  • Two-Stage檢測器(如Faster R-CNN、FPN)效果好,但速度相對慢
  • One-Stage檢測器(如YOLO、SSD)速度快,但效果一般
    在這裏插入圖片描述
    作者對one-stage檢測器準確率不高的問題進行探究,發現主要問題在於正負類別不均衡(簡單-難分類別不均衡)。

We discover that the extreme foreground-background class imbalance encountered during training of dense detectors is the central cause.

作者建議通過重新設計標準的交叉熵損失(cross entropy loss)來解決這種類別不平衡(class inbalance)問題,即提出Focal Loss。

We propose to address this class imbalance by reshaping the standard cross entropy loss such that it down-weights the loss assigned to well-classified examples. Our novel Focal Loss focuses training on a sparse set of hard examples and prevents the vast number of easy negatives from overwhelming the detector during training.

結合Focal Loss的one-stage檢測器稱爲RetinaNet,該檢測器在COCO上mAP可以和特徵金字塔網絡(feature pyramid network,FPN)或者Mask R-CNN接近,

問:什麼是類別不均衡(class imbalance)?

答:負樣本的數量極大於正樣本的數量,比如包含物體的區域(正樣本)很少,而不包含物體的區域(負樣本)很多。比如檢測算法在早期會生成一大波的bbox。而一幅常規的圖片中,頂多就那麼幾個object。這意味着,絕大多數的bbox屬於background。

問:樣本的類別不均衡會帶來什麼問題?

答:由於大多數都是簡單易分的負樣本(屬於背景的樣本),使得訓練過程不能充分學習到屬於那些有類別樣本的信息;其次簡單易分的負樣本太多,可能掩蓋了其他有類別樣本的作用(這些簡單易分的負樣本仍產生一定幅度的loss,見下圖藍色曲線,數量多會對loss起主要貢獻作用,因此就主導了梯度的更新方向,掩蓋了重要的信息)

This imbalance causes two problems: (1) training is inefficient as most locations are easy negatives that contribute no useful learning signal; (2) en masse, the easy negatives can overwhelm training and lead to degenerate models.

簡單來說,因爲bbox數量爆炸。 正是因爲bbox中屬於background的bbox太多了,所以如果分類器無腦地把所有bbox統一歸類爲background,accuracy也可以刷得很高。於是乎,分類器的訓練就失敗了。分類器訓練失敗,檢測精度自然就低了。

問:爲什麼在two-stage檢測器中,沒有出現類別不均衡(class imbalamce)問題呢?

答:因爲通過RPN階段可以減少候選目標區域,而在分類階段,可以固定前景與背景比值(foreground-to-background ratio)爲1:3,或者使用OHEM(online hard example mining)使得前景和背景的數量達到均衡。

RetinaNet有哪些創新點?

概述:

  • New loss:提出Focal Loss函數解決class imbalance

FL(pt)=(1pt)γlog(pt)FL(pt)=(1pt)γlog(pt) FL(p_t) = -(1-p_t)^\gamma \log(p_t)FL(pt)=−(1−pt)γlog(pt)

  • New detector:RetinaNet = ResNet + FPN + Two sub-networks + Focal Loss

Focal Loss更加聚焦在困難樣本(hard examples)上的訓練。
在這裏插入圖片描述
將Focal Loss與ResNet-101-FPN backbone結合提出RetinaNet(one-stage檢測器),RetinaNet在COCO test-dev上達到39.1mAP,速度爲5FPS。

RetinaNet檢測器與當時最佳的其它檢測器進行比較,無論是速度上還是準確率上都是最佳:
在這裏插入圖片描述
詳解:

作者提出一種新的損失函數,思路是希望那些hard examples對損失的貢獻變大,使網絡更傾向於從這些樣本上學習。

作者以二分類爲例進行說明:

交叉熵函數CE

首先是我們常使用的交叉熵損失函數:
在這裏插入圖片描述
上式中,y=+1或者y=-1。p∈[0,1]是y=+1的估計概率。作者定義pt爲:

在這裏插入圖片描述
在這裏插入圖片描述
注:對交叉熵函數不瞭解的,可以參考理解交叉熵作爲損失函數在神經網絡中的作用

均衡交叉熵函數

要對類別不均衡問題對loss的貢獻進行一個控制,即加上一個控制權重即可,最初作者的想法即如下這樣,對於屬於少數類別的樣本,增大α即可
在這裏插入圖片描述
但這樣有一個問題,它僅僅解決了正負樣本之間的平衡問題,並沒有區分易分/難分樣本,按作者的話說:

While α balances the importance of positive/negative examples, it does not differentiate between easy/hard examples. Instead, we propose to reshape the loss function to down-weight easy examples and thus focus training on hard negatives.

問:爲什麼公式(3)只解決正負樣本不均衡問題?

答:增加了一個係數αt,跟pt的定義類似,當label=1的時候,αt=a;當label=-1的時候,αt=1-a,a的範圍也是0到1。因此可以通過設定a的值(一般而言假如1這個類的樣本數比-1這個類的樣本數多很多,那麼a會取0到0.5來增加-1這個類的樣本的權重)來控制正負樣本對總的loss的共享權重。

Focal Loss

作者一開始給交叉熵損失函數添加modulating factor:
(1pt)γ(1pt)γ (1-pt)^γ(1−pt)γ
在這裏插入圖片描述
顯然,樣本越易分,pt就越大(pt—>1),modulating factor趨近於0,則貢獻的loss就越小,同樣地,樣本越難分,其pt就越小,modulating factor接近於1,則貢獻的loss不受影響。

問:爲什麼pt越大,FL值越小?

答:根據公式(4)可知,FL與log(pt)中的pt成反比,與1-pt成正比,因此FL與pt的關係成反比。這是交叉熵函數的基本性質。當pt很大時(接近於1),FL值很小;而當pt很小時(接近於0),FL值會很大。

注:這裏有個超參數—focusing parameter γ。

γ 放大了modulating factor的作用。

舉原文中的一個例子,當pt=0.9時,帶有modulating factor的focal loss是CE loss的100分之一,即進一步減小了正確分類的損失。

For instance, with γ = 2, an example classified with pt = 0.9 would have 100× lower loss compared with CE and with pt ≈ 0.968 it would have 1000× lower loss. This in turn increases the importance of correcting misclassified examples (whose loss is scaled down by at most 4× for pt ≤ .5 and γ = 2).

在實際中,作者採用如下公式,即綜合了公式(3)和公式(4)的形式,這樣機能調整正負樣本的權重,又能控制難易分類樣本的權重:
在這裏插入圖片描述
這裏的兩個參數 α和γ 來控制,在實驗中a的選擇範圍也很廣,一般而言當γ增加的時候,a需要減小一點,本文作者採用α=0.25,γ=2效果最好。

RetinaNet Detector

RetinaNet是由backbone網絡和兩個特殊任務的子網絡(subnet)組成(屬於one-stage檢測器)。Backbone用來計算feature map;第一個子網絡用來object classification,第二個子網絡用來bounding box regression。

Feature Pyramid Network Backbone
在這裏插入圖片描述
Anchor

Classification Subnet

Box Regression Subnet

在這裏插入圖片描述

[外鏈圖片轉存失敗(img-AIgbNKO5-1565581483861)(./img/ch8/RetinaNet-12.png)]

RetinaNet結構注意內容:

  1. 訓練時FPN每一級的所有example都被用於計算Focal Loss,loss值加到一起用來訓練;
  2. 測試時FPN每一級只選取score最大的1000個example來做nms;
  3. 整個結構不同層的head部分(上圖中的c和d部分)共享參數,但分類和迴歸分支間的參數不共享;
  4. 分類分支的最後一級卷積的bias初始化成前面提到的-log((1-π)/π);

實驗結果

Table1是關於RetinaNet和Focal Loss的一些實驗結果。(a)是在交叉熵的基礎上加上參數a,a=0.5就表示傳統的交叉熵,可以看出當a=0.75的時候效果最好,AP值提升了0.9。(b)是對比不同的參數γ和a的實驗結果,可以看出隨着γ的增加,AP提升比較明顯。(d)通過和OHEM的對比可以看出最好的Focal Loss比最好的OHEM提高了3.2AP。這裏OHEM1:3表示在通過OHEM得到的minibatch上強制positive和negative樣本的比例爲1:3,通過對比可以看出這種強制的操作並沒有提升AP。(e)加入了運算時間的對比,可以和前面的Figure2結合起來看,速度方面也有優勢!注意這裏RetinaNet-101-800的AP是37.8,當把訓練時間擴大1.5倍同時採用scale jitter,AP可以提高到39.1,這就是全文和table2中的最高的39.1AP的由來。

在這裏插入圖片描述
在這裏插入圖片描述

3.8 RFBNet

RFBNet有哪些創新點?

  1. 提出RF block(RFB)模塊

RFBNet主要想利用一些技巧使得輕量級模型在速度和精度上達到很好的trade-off的檢測器。靈感來自人類視覺的感受野結構Receptive Fields (RFs) ,提出了新奇的RF block(RFB)模塊,來驗證感受野尺寸和方向性的對提高有鑑別魯棒特徵的關係。RFBNet是以主幹網絡(backbone)爲VGG16的SSD來構建的,主要是在Inception的基礎上加入了dilated卷積層(dilated convolution),從而有效增大了感受野(receptive field)。整體上因爲是基於SSD網絡進行改進,所以檢測速度還是比較快,同時精度也有一定的保證。

RFB介紹

RFB是一個類似Inception模塊的多分支卷積模塊,它的內部結構可分爲兩個組件:多分支卷積層和dilated卷積層。如下圖:

在這裏插入圖片描述

1.多分支卷積層
​ 根據RF的定義,用多種尺寸的卷積核來實現比固定尺寸更好。具體設計:1.瓶頸結構,1x1-s2卷積減少通道特徵,然後加上一個nxn卷積。2.替換5x5卷積爲兩個3x3卷積去減少參數,然後是更深的非線性層。有些例子,使用1xn和nx1代替nxn卷積;shortcut直連設計來自於ResNet和Inception ResNet V2。3.爲了輸出,卷積經常有stride=2或者是減少通道,所以直連層用一個不帶非線性激活的1x1卷積層。

2.Dilated 卷積層

設計靈感來自Deeplab,在保持參數量和同樣感受野的情況下,用來獲取更高分辨率的特徵。下圖展示兩種RFB結構:RFB和RFB-s。每個分支都是一個正常卷積後面加一個dilated卷積,主要是尺寸和dilated因子不同。(a)RFB。整體結構上借鑑了Inception的思想,主要不同點在於引入3個dilated卷積層(比如3x3conv,rate=1),這也是RFBNet增大感受野的主要方式之一;(b)RFB-s。RFB-s和RFB相比主要有兩個改進,一方面用3x3卷積層代替5x5卷積層,另一方面用1x3和3x1卷積層代替3x3卷積層,主要目的應該是爲了減少計算量,類似Inception後期版本對Inception結構的改進。
在這裏插入圖片描述
RFBNet300的整體結構如下圖所示,基本上和SSD類似。RFBNet和SSD不同的是:1、主幹網上用兩個RFB結構替換原來新增的兩層。2、conv4_3和conv7_fc在接預測層之前分別接RFB-s和RFB結構。
在這裏插入圖片描述

3.9 M2Det

M2Det有哪些創新點?

  1. 提出了多層次特徵金字塔網絡(MLFPN)來構建更有效的特徵金字塔,用於檢測不同尺度的對象。

M2Det的整體架構如下所示。M2Det使用backbone和多級特徵金字塔網絡(MLFPN)從輸入圖像中提取特徵,然後類似於SSD,根據學習的特徵生成密集的邊界框和類別分數,最後是非最大抑制(NMS)操作以產生最終結果。 MLFPN由三個模塊組成:特徵融合模塊(FFM),簡化的U形模塊(TUM)和按基於尺度的特徵聚合模塊(SFAM)。 FFMv1通過融合骨幹網絡的特徵圖,將語義信息豐富爲基本特徵。每個TUM生成一組多尺度特徵,然後交替連接的TUM和FFMv2提取多級多尺度特徵。此外,SFAM通過按比例縮放的特徵連接操作和自適應注意機制將特徵聚合到多級特徵金字塔中。下面介紹有關M2Det中三個核心模塊和網絡配置的更多詳細信息。

在這裏插入圖片描述

FFMs

FFM融合了M2Det中不同層次的特徵,這對於構建最終的多級特徵金字塔至關重要。它們使用1x1卷積層來壓縮輸入特徵的通道,並使用連接操作來聚合這些特徵圖。特別是,由於FFMv1以backbone中不同比例的兩個特徵圖作爲輸入,因此它採用一個上採樣操作,在連接操作之前將深度特徵重新縮放到相同的尺度。同時,FFMv2採用基本特徵和前一個TUM的最大輸出特徵圖 - 這兩個具有相同的比例 - 作爲輸入,併產生下一個TUM的融合特徵。 FFMv1和FFMv2的結構細節分別如下圖(a)和(b)所示。
在這裏插入圖片描述

TUMs

TUM不同於FPN和RetinaNet,TUM採用簡化的U形結構,如上圖(c)所示。編碼器是一系列3x3,步長爲2的卷積層.並且解碼器將這些層的輸出作爲其參考特徵集,而原始FPN選擇ResNet主幹網絡中每個階段的最後一層的輸出。此外,在解碼器分支的上採樣層後添加1x1卷積層和按元素求和的操作,以增強學習能力並保持特徵的平滑性。每個TUM的解碼器中的所有輸出形成當前級別的多尺度特徵。整體而言,堆疊TUM的輸出形成多層次多尺度特徵,而前TUM主要提供淺層特徵,中間TUM提供中等特徵,後TUM提供深層特徵。

SFAM

SFAM旨在將由TUM生成的多級多尺度特徵聚合成多級特徵金字塔,如下圖所示。SFAM的第一階段是沿着信道維度將等效尺度的特徵連接在一起。聚合特徵金字塔可以表示爲X=[X1,X2,...,Xi,...,XL]X = [X_1,X_2,...,X_i,...,X_L],其中
Xi=Concat(X1i,X2i,....,XLi)RWi×Hi×CX_i = Concat(X_{1i}, X_{2i}, ...., X_{Li}) \in R^{W_i \times H_i \times C}
指的是尺度第i個最大的特徵。這裏,聚合金字塔中的每個比例都包含來自多級深度的特徵。但是,簡單的連接操作不太適合。在第二階段,引入了通道注意模塊,以促使特徵集中在最有益的通道。在SE區塊之後,使用全局平均池化來在擠壓步驟中生成通道統計z∈RC。

在這裏插入圖片描述

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