美圖雲視覺技術部

本篇綜述的出發點一方面是希望給檢測方向的入門研究人員提供一個技術概覽,幫助大家快速瞭解目標檢測技術上下文;另一方面是給工業界應用人員提供一些參考,通過本篇綜述,讀者可以根據實際業務場景,找到合適的目標檢測方法,在此基礎上改進、優化甚至是進一步創新,解決實際業務問題。本文對其中的 27 篇論文進行介紹,這 27 篇論文涵蓋了 2013 以來,除 SSD、YOLO 和 R-CNN 系列之外的,所有引用率相對較高或是筆者認為具有實際應用價值的論文。R-CNN 系列、SSD 和 YOLO 相關的論文詳解資源已經非常多,所以本文不再贅述。下圖對這些方法進行了分類概括。

圖1

下文中,我們針對每篇文章,從論文目標,即要解決的問題,演算法核心思想以及演算法效果三個層面進行概括。同時,我們也給出了每篇論文的出處,錄用信息以及相關的開源代碼鏈接,其中代碼鏈接以作者實現和 mxnet 實現為主。

背 景

圖2

物體檢測的任務是找出圖像或視頻中的感興趣物體,同時檢測出它們的位置和大小,是機器視覺領域的核心問題之一。

物體檢測過程中有很多不確定因素,如圖像中物體數量不確定,物體有不同的外觀、形狀、姿態,加之物體成像時會有光照、遮擋等因素的幹擾,導致檢測演算法有一定的難度。進入深度學習時代以來,物體檢測發展主要集中在兩個方向:two stage 演算法如 R-CNN 系列和 one stage 演算法如 YOLO、SSD 等。兩者的主要區別在於 two stage 演算法需要先生成 proposal(一個有可能包含待檢物體的預選框),然後進行細粒度的物體檢測。而 one stage 演算法會直接在網路中提取特徵來預測物體分類和位置。

圖3

基於深度學習的目標檢測演算法綜述分為三部分:

  1. Two/One stage 演算法改進。 這部分將主要總結在 two/one stage 經典網路上改進的系列論文,包括 Faster R-CNN、YOLO、SSD 等經典論文的升級版本。
  2. 解決方案。 這部分我們歸納總結了目標檢測的常見問題和近期論文提出的解決方案。
  3. 擴展應用、綜述。 這部分我們會介紹檢測演算法的擴展和其他綜述類論文。

本綜述分三部分,本文介紹第一部分。

創新內容、改進方向Two/One stage 演算法改進Two stage

Faster R-CNN 網路包括兩個步驟:1. 使用 RPN(region proposal network) 提取 proposal 信息;2. 使用 R-CNN 對候選框位置進行預測和物體類別識別。本文主要介紹在 Faster R-CNN 基礎上改進的幾篇論文:R-FCN、R-FCN3000 和 Mask R-CNN。R-FCN 系列提出了 Position Sensitive(ps) 的概念,提升了檢測效果。另外需要註明的是,雖然 Mask R-CNN 主要應用在分割上,但該論文和 Faster R-CNN 一脈相承,而且論文提出了 RoI Align 的思想,對物體檢測回歸框的精度提升有一定效果,故本篇綜述也介紹了這篇論文。

R-FCN: Object Detection via Region-based Fully Convolutional Networks

論文鏈接:arxiv.org/abs/1605.0640

開源代碼:github.com/daijifeng001錄用信息:CVPR2017

論文目標

對預測特徵圖引入位置敏感分數圖提增強徵位置信息,提高檢測精度。

核心思想背景

Faster R-CNN 是首個利用 CNN 來完成 proposals 的預測的,之後的很多目標檢測網路都是藉助了 Faster R-CNN 的思想。而 Faster R-CNN 系列的網路都可以分成 2 個部分:

  1. Fully Convolutional subnetwork before RoI Layer
  2. RoI-wise subnetwork

第 1 部分就是直接用普通分類網路的卷積層來提取共享特徵,後接一個 RoI Pooling Layer 在第 1 部分的最後一張特徵圖上進行提取針對各個 RoIs 的特徵圖,最後將所有 RoIs 的特徵圖都交由第 2 部分來處理(分類和回歸)。第二部分通常由全連接層組層,最後接 2 個並行的 loss 函數:Softmax 和 smoothL1,分別用來對每一個 RoI 進行分類和回歸。由此得到每個 RoI 的類別和歸回結果。其中第 1 部分的基礎分類網路計算是所有 RoIs 共享的,只需要進行一次前向計算即可得到所有 RoIs 所對應的特徵圖。

第 2 部分的 RoI-wise subnetwork 不是所有 RoIs 共享的,這一部分的作用就是給每個 RoI 進行分類和回歸。在模型進行預測時基礎網路不能有效感知位置信息,因為常見的 CNN 結構是根據分類任務進行設計的,並沒有針對性的保留圖片中物體的位置信息。而第 2 部分的全連階層更是一種對於位置信息非常不友好的網路結構。由於檢測任務中物體的位置信息是一個很重要的特徵,R-FCN 通過提出的位置敏感分數圖(position sensitive score maps)來增強網路對於位置信息的表達能力,提高檢測效果。

網路設計

position-sensitive score map

圖4

圖 4 展示的是 R-FCN 的網路結構圖,展示了位置敏感得分圖 (position-sensitive score map) 的主要設計思想。如果一個 RoI 含有一個類別 c 的物體,則將該 RoI 劃分為 k x k 個區域,分別表示該物體的各個相應部位。其每個相應的部位都由特定的特徵圖對其進行特徵提取。R-FCN 在 、共享卷積層的最後再接上一層卷積層,而該卷積層就是位置敏感得分圖 position-sensitive score map。其通道數 channels=k x k x (C+1)。C 表示物體類別種數再加上 1 個背景類別,每個類別都有 k x k 個 score maps 分別對應每個類別的不同位置。每個通道分別負責某一類的特定位置的特徵提取工作。

Position-sensitive RoI pooling

位置敏感 RoI 池化操作了(Position-sensitive RoI pooling)如下圖所示:

圖5

該操作將每個 RoIs 分為 k x k 個小塊。之後提取其不同位置的小塊相應特徵圖上的特徵執行池化操作,下圖展示了池化操作的計算方式。

圖6

得到池化後的特徵後,每個 RoIs 的特徵都包含每個類別各個位置上的特徵信息。對於每個單獨類別來講,將不同位置的特徵信息相加即可得到特徵圖對於該類別的響應,後面即可對該特徵進行相應的分類。

position-sensitive regression

在位置框回歸階段仿照分類的思路,將特徵通道數組合為 4 x k x k 的形式,其中每個小塊的位置都對應了相應的通道對其進行位置回歸的特徵提取。最後將不同小塊位置的四個回歸值融合之後即可得到位置回歸的響應,進行後續的位置回歸工作。

網路訓練

position-sensitive score map 高響應值區域

在訓練的過程中,當 RoIs 包涵物體屬於某類別時,損失函數即會使得該 RoIs 不同區域塊所對應的響應通道相應位置的特徵響應儘可能的大,下圖展示了這一過程,可以明顯的看出不同位置的特徵圖都只對目標相應位置的區域有明顯的響應,其特徵提取能力是對位置敏感的。

圖 7

訓練和測試過程

使用如上的損失函數,對於任意一個 RoI,計算它的 Softmax 損失,和當其不屬於背景時的回歸損失。因為每個 RoI 都被指定屬於某一個 GT box 或者屬於背景,即先讓 GT box 選擇與其 IoU 最大的那個 RoI,再對剩餘 RoI 選擇與 GT box 的 IoU>0.5 的進行匹配,而剩下的 RoI 全部為背景類別。當 RoI 有了 label 後 loss 就可以計算出來。這裡唯一不同的就是為了減少計算量,作者將所有 RoIs 的 loss 值都計算出來後,對其進行排序,並只對最大的 128 個損失值對應的 RoIs 進行反向傳播操作,其它的則忽略。並且訓練策略也是採用的 Faster R-CNN 中的 4-step alternating training 進行訓練。在測試的時候,為了減少 RoIs 的數量,作者在 RPN 提取階段就將 RPN 提取的大約 2W 個 proposals 進行過濾:

  1. 去除超過圖像邊界的 proposals
  2. 使用基於類別概率且閾值 IoU=0.3 的 NMS 過濾
  3. 按照類別概率選擇 top-N 個 proposals

在測試的時候,一般只剩下 300 個 RoIs。並且在 R-FCN 的輸出 300 個預測框之後,仍然要對其使用 NMS 去除冗餘的預測框。

演算法效果

圖 8

圖 8 比較了 Faster-R-CNN 和 R-FCN 的 mAP 值和監測速度,採用的基礎網路為 ResNet-101,測評顯卡為 Tesla K40。

R-FCN-3000 at 30fps: Decoupling Detection and Classification

論文鏈接:arxiv.org/abs/1712.0180

開源代碼:/錄用信息:/

論文目標

YOLO9000 將檢測數據集和分類數據集合併訓練檢測模型,但 r-fcn-3000 僅採用具有輔助候選框信息的 ImageNet 數據集訓練檢測分類器。

如果使用包含標註輔助信息(候選框)的大規模分類數據集,如 ImageNet 數據集,進行物體檢測模型訓練,然後將其應用於實際場景時,檢測效果會是怎樣呢?how would an object detector perform on "detection"datasets if it were trained on classification datasets with bounding-box supervision?

核心思想

r-fcn-3000 是對 r-fcn 的改進。上文提到,r-fcn 的 ps 卷積核是 per class 的,假設有 C 個物體類別,有 K*K 個 ps 核,那麼 ps 卷積層輸出 K*K*C 個通道,導致檢測的運算複雜度很高,尤其當要檢測的目標物體類別數較大時,檢測速度會很慢,難以滿足實際應用需求。

為解決以上速度問題,r-fcn-3000 提出,將 ps 卷積核作用在超類上,每個超類包含多個物體類別,假設超類個數為 SC,那麼 ps 卷積層輸出 K*KSC 個通道。由於 SC 遠遠小於 C,因此可大大降低運算複雜度。特別地,論文提出,當只使用一個超類時,檢測效果依然不錯。演算法網路結構如下:

圖 9

上圖可以看出,與 r-fcn 類似,r-fcn-3000 也使用 RPN 網路生成候選框(上圖中虛線迴路);相比 r-fcn,r-fcn-3000 的網路結構做了如下改進:

  1. r-fcn-3000 包含超類(上圖中上半部分)和具體類(上圖中下半部分)兩個卷積分支。
  2. 超類卷積分支用於檢測超類物體,包含分類(超類檢測)和回歸(候選框位置改進)兩個子分支;注意上圖中沒有畫出用於候選框位置改進的 bounding-box 回歸子分支;回歸分支是類別無關的,即只確定是否是物體。
  3. 具體類卷積分支用於分類物體的具體類別概率,包含兩個普通 CNN 卷積層。
  4. 最終的物體檢測輸出概率由超類卷積分支得到的超類類概率分別乘以具體類卷積分支輸出的具體類別概率得到。引入超類和具體類兩個卷積分支實現了「物體檢測」和「物體分類」的解耦合。超類卷積分支使得網路可以檢測出物體是否存在,由於使用了超類,而不是真實物體類別,大大降低了運算操作數。保證了檢測速度;具體類分支不檢測物體位置,只分類具體物體類別。

超類生成方式:對某個類別 j 的所有樣本圖像,提取 ResNet-101 最後一層 2018 維特徵向量,對所有特徵項向量求均值,作為該類別的特徵表示。得到所有類別的特徵表示進行 K-means 聚類,確定超類。

演算法效果

在 imagenet 數據集上,檢測 mAP 值達到了 34.9%。使用 nvidia p6000 GPU,對於 375x500 圖像,檢測速度可以達到每秒 30 張。在這種速度下,r-fcn-3000 號稱它的檢測準確率高於 YOLO 18%。

此外,論文實驗表明,r-fcn-3000 進行物體檢測時具有較強的通用性,當使用足夠多的類別進行訓練時,對未知類別的物體檢測時,仍能檢測出該物體位置。如下圖:

圖 10

在訓練類別將近 3000 時,不使用目標物體進行訓練達到的通用預測 mAP 為 30.7%,只比使用目標物體進行訓練達到的 mAP 值低 0.3%。

Mask R-CNN

論文鏈接:

arxiv.org/abs/1703.0687開源代碼:github.com/TuSimple/mx-錄用信息:CVPR2017

論文目標

  1. 解決 RoIPooling 在 Pooling 過程中對 RoI 區域產生形變,且位置信息提取不精確的問題。
  2. 通過改進 Faster R-CNN 結構完成分割任務。

核心思想

  1. 使用 RoIAlign 代替 RoIPooling,得到更好的定位效果。
  2. 在 Faster R-CNN 基礎上加上 mask 分支,增加相應 loss,完成像素級分割任務。

概述

Mask R-CNN 是基於 Faster R-CNN 的基礎上演進改良而來,不同於 Faster R-CNN,Mask R-CNN 可以精確到像素級輸出,完成分割任務。此外他們的輸出也有所不同。Faster R-CNN 輸出為種類標籤和 box 坐標,而 Mask R-CNN 則會增加一個輸出,即物體掩膜 (object mask)。

網路結構介紹

Mask R-CNN 結構如下圖:

圖 11

Mask R-CNN 採用和 Faster R-CNN 相同的兩個階段,具有相同的第一層 (即 RPN),第二階段,除了預測種類和 bbox 回歸,並且並行的對每個 RoI 預測了對應的二值掩膜 (binary mask)。

Mask R-CNN 詳細改進

RoIAlign

Faster R-CNN 採用的 RoIPooling,這樣的操作可能導致 feature map 在原圖的對應位置與真實位置有所偏差。如下圖:

圖 12

而通過引入 RoIAlign 很大程度上解決了僅通過 Pooling 直接採樣帶來的 Misalignment 對齊問題。

圖 13:RoIPooling

圖 14:RoIAlign

RoIPooling 會對區域進行拉伸, 導致區域形變。RoIAlign 可以避免形變問題。具體方式是先通過雙線性插值到 14 x 14,其次進行雙線性插值得到藍點的值,最後再通過 max Pooling 或 average pool 到 7 x 7。

圖 15

多任務損失函數

Mask R-CNN 的損失函數可表示為:

掩膜分支針對每個 RoI 產生一個 K x M xM 的輸出, 即 K 個 M x M 的二值的掩膜輸出。其中 K 為分類物體的類別數目。依據預測類別輸出,只輸出該類對應的二值掩膜,掩膜分支的損失計算如下示意圖:

圖 16

  1. mask branch 預測 K 個種類的 M x M 二值掩膜輸出。
  2. 依據種類預測分支 (Faster R-CNN 部分) 預測結果:當前 RoI 的物體種類為 i。
  3. RoI 的平均二值交叉損失熵(對每個像素點應用 Sigmoid 函數)即為損失 。

此外作者發現使用 Sigmoid 優於 Softmax ,Sigmoid 可以避免類間競爭。

演算法效果

圖 17

體現了在 COCO 數據集上的表現效果。

One stage

提到 one stage 演算法就必須提到 OverFeat,OverFeat 網路將分類、定位、檢測功能融合在一個網路之中。隨後的 YOLO 和 SSD 網路,都是很經典的 one stage 檢測演算法。

YOLO 論文作者對原始 YOLO 網路進行了改進,提出了 YOLO9000 和 YOLOv3。YOLO9000 號稱可以做到更好,更快,更強。其創新點還包括用小規模(指類別)檢測標註數據集 + 大規模分類標註數據集訓練通用物體檢測模型。YOLOv3 是作者的一個 technical report,主要的工作展示作者在 YOLO9000 上的改進。另外本綜述還將介紹新論文 Object detection at 200 Frames Per Second,這篇論文在 YOLO 的基礎上進行創新,能在不犧牲太多準確率的情況下達到 200FPS(使用 GTX1080)。

SSD 演算法是一種直接預測 bounding box 的坐標和類別的 object detection 演算法,利用不同解析度卷積層的 feature map,可以針對不同 scale 的物體進行檢測。本篇綜述中主要介紹 DSSD(原始作者的改進版本)和 DSOD 這兩篇論文。

YOLO9000: better, faster, stronger

論文鏈接:

arxiv.org/abs/1612.0824開源代碼:github.com/pjreddie/dargithub.com/zhreshold/mx(MXNet 實現)錄用信息:CVPR2017

論文目標

論文目標是要解決包含大規模物體類別的實際應用場景中的實時目標檢測。實際應用場景中,目標檢測應滿足兩個條件:1. 檢測速度滿足實際場景需求;2. 覆蓋物體類別滿足實際場景需求。實際場景包含很多類別的物體,而這些類別物體的標註數據很難拿到,本論文提出使用小規模(指類別)檢測標註數據集 + 大規模分類標註數據集訓練通用物體檢測模型。

核心思想

YOLO9000 是在 YOLO 基礎上的改進,相比 YOLO,YOLO9000 號稱可以做到更好,更快,更強。下面從這三個方面介紹 YOLO9000 如何做到這三點。YOLO 相關的論文解讀可以參考:zhuanlan.zhihu.com/p/25

更好

準確率提升。相比 R-CNN 系列,YOLOv1 的召回率和物體位置檢測率較低,YOLO9000 做了如下七點改進對其進行提升。

  1. 加入 BN 層。在所有的卷積層後加入 BN 操作,去掉所有 dropout 層。
  2. 使用高解析度訓練得到的分類模型 pretrain 檢測網路。YOLOv1 使用 224x224 訓練得到的分類模型 pretrain,而 YOLO9000 直接使用 448x448 訓練得到的分類模型 pretrain 檢測網路。
  3. 使用卷積層預測 anchor box 位置。YOLOv1 基於輸入圖像的物理空間劃分成 7x7 的網格空間,每個網格最多對應兩個候選預測框,因此每張圖像最多有 98 個 bounding box,最後接入全連接層預測物體框位置。而 YOLO9000 移除全連接層,使用 anchor box 預測候選框位置,大大增加了每張圖片的候選框個數。這個改進將召回率由 81% 提高到 88%,mAP 由 69.5% 稍微降低到 69.2%。同時,由於去掉了全連接層,YOLO9000 可以支持檢測時不同解析度的圖像輸入。
  4. kmeans 聚類確定候選框形狀。使用 k-means 對訓練數據集中的物體框的解析度和比例進行聚類,確定 anchor box 的形狀。為避免物體大小引起的統計誤差,YOLO9000 使用 IoU 而不是歐氏距離來作為距離度量方式。
  5. 預測「候選框相對於圖像的內部偏移」。以往 RPN 網路,通過回歸候選框相對於當前 anchor box 的偏移來定位候選框的位置,由於偏移相對於 anchor box 外部,所以取值範圍是不受限的,導致訓練的時候難以收斂。因此 YOLO9000 採用與 YOLO 類似的方式,預測候選框相對於圖像左上角的位置偏移,並將偏移量歸一化到 0-1 區間,解決了訓練難收斂問題。
  6. 使用更精細的特徵。YOLOv1 提取 13x13 的特徵層進行後續物體檢測,對於小物體的檢測效果並不友好。為解決這個問題,YOLO9000 將前一層 26x26 的特徵與 13x13 層的特徵進行通道 concatenation。如 26x26x512 的 feature map 被拆分成 13x13x2048,然後同後面的 13x13 特徵層進行 concatenation。mAP 提升 1%。
  7. 多尺度圖像訓練。YOLO9000 採用不同解析度的圖像進行模型迭代訓練,增強模型對多尺度圖像的預測魯棒性。

更快

YOLOv1 的 basenet 基於 GoogleNet 改進得到,計算複雜度大概是 VGG16 的 1/4,但在 imagenet 上 224x224 圖像的 top-5 分類準確率比 vgg16 低 2%。YOLO9000 提出一個全新的 basenet,號稱 darknet-19,包含 19 個卷積層和 5 個 max pooling 層,詳細網路結構見論文,計算複雜度比 YOLOv1 進一步減少了 34%,imagenet 上 top-5 準確率提升了 3.2%。

更強

更強是指在滿足實時性需求的前提下,能檢測出的物體類別數更多,範圍更大。YOLO9000 提出使用詞樹「wordtree」,將分類數據集和檢測數據集合併,進行模型訓練。反向傳播時,檢測樣本的訓練 loss 用於計算和更新整個網路的模型參數;而分類樣本的訓練 loss 僅用於更新與分類相關的網路層模型參數。這樣以來,檢測數據集訓練網路學到如何檢測出物體(是否是物體,位置),而分類數據集使得網路識別出物體類別。

演算法效果

下圖給出了 YOLOv2 和對比演算法的準確率和運行時間的綜合性能結果。可以看出 YOLOv2 在保證準確率的同時,可以達到超過 30fps 的圖像檢測速度。相比 SSD512 和 Faster R-CNN(使用 ResNet),YOLOv2 在準確率和運行性能上都更勝一籌(圖中左邊第一個藍圈)。

圖 18

YOLOv3: an incremental improvement

論文鏈接:arxiv.org/abs/1804.0276

開源代碼:github.com/pjreddie/dar錄用信息:/原文是 4 頁 technical report,2018 年 4 月在 arxiv 放出

論文目標

保證準確率同時,更快。

核心思想

YOLOv3 對 YOLO9000 進行了改進,v3 採用的模型比 YOLO9000 更大,進一步提高檢測準確率,但速度比 YOLO9000 稍慢。相比其他檢測演算法,RetinaNet、SSD、DSSD 等演算法,YOLOv3 的綜合性能(準確率 & 速度)仍然很是最好的。但總的來說,文章的改進主要還是修修補補,換換網路,沒有特別的突出創新點。具體改進如下:

  1. 候選框預測時增加「物體性」的預測,即增加對候選框「是否包含物體」的判斷。這條改進借鑒 Faster R-CNN 的做法。區別在於,Faster R-CNN 一個 ground truth 框可能對應多個檢測候選框,而 YOLO9000 每個 ground truth object 最多對應到一個檢測候選框。那麼這會使得很多候選框對應不到 ground truth box,這種候選框在訓練時不會計算坐標或分類誤差,而只會加入對「物體性」的檢測誤差。
  2. 多標籤分類。每個候選框可以預測多個分類,使用邏輯歸二分類器進行分類。
  3. 多尺度預測。借鑒 FPN 思想,在 3 個尺度上進行預測,每個尺度對應 3 個候選框,每個候選框輸出「位置偏移」,是否包含物體以及分類結果。YOLOv3 對小物體的檢測效果比 YOLO9000 有提升,但是對中大物體的檢測準確率卻有降低。文章沒給出具體原因。
  4. 提出新的 basenet。YOLOv3 採用一個 53 層卷積的網路結構,號稱 darknet-53,網路設計只採用 3x3,1x1 的卷積層,借鑒了 ResNet 的殘差網路思想。該 basenet 在 ImageNet 上對 256x256 的 Top-5 分類準確率為 93.5,與 ResNet-152 相同,Top-1 準確率為 77.2%,只比 ResNet-152 低 0.4%。與此同時,darknet-53 的計算複雜度僅為 ResNet-152 的 75%, 實際檢測速度(FPS)是 ResNet-152 的 2 倍。
  5. 除以上改進外,YOLOv3 還做了一些其他嘗試,但效果都不理想。具體見論文,此處不列出。

演算法效果

對 320x320 的輸入圖像,YOLOv3 在保證檢測準確率與 SSD 一致(mAP=28.2)的前提下,處理每張圖像的時間為 22ms,比 SSD 快 3 倍。

值得注意的是,論文提出的 darknet-53,是一個比 ResNet152 綜合性能更好的分類網路。

圖 19

Object detection at 200 Frames Per Second

論文鏈接:arxiv.org/abs/1805.0636

開源代碼:/錄用信息:/

論文目標

為瞭解決檢測演算法計算複雜度過高、內存佔用過大的問題,本文提出了一種快而有效的方法,能夠在保持高檢測率的同時,達到每秒 200 幀的檢測速度。

核心思想

為了實現又快又強的檢測目標,本文從三個方面提出了創新:網路結構、損失函數以及訓練數據。在網路結構中,作者選擇了一種深而窄的網路結構,並探討了不同特徵融合方式帶來的影響。在損失函數設計中,作者提出了蒸餾損失函數以及 FM-NMS 方法以適應 one-stage 演算法的改進。最後,作者在訓練時同時使用了已標註數據和未標註數據。下面具體介紹下本文在這三方面的創新工作。

網路結構

一般來說,網路越深越寬,效果也會越好,但同時計算量和參數量也會隨之增加。為了平衡演算法的效果與速度,作者採用了一個深而窄的網路結構。示意圖如下:

圖 20

說明一下,本文的 baseline 演算法是 Tiny-Yolo(Yolo 9000 的加速版)。

為了實現更窄,作者將卷積的通道數做了縮減,從 Yolo 演算法的 1024 縮減為了 512;為了實現更寬,作者在最後添加了 3 個 1*1 的卷積層。為了加深理解,建議讀者結合 Yolo 的網路結構圖,對比查看。

從上圖中,我們還可以看出,作者採用了特徵融合的方式,將前幾層提取的特徵融合到了後面層的特徵圖中。在融合的過程中,作者並沒有採取對大尺寸特徵圖做 max pooling 然後與小尺寸特徵圖做融合的方式,而是採用了 stacking 方法,即先將大尺寸特徵圖進行 resize 然後再和小尺寸特徵圖做融合。具體到上圖中,對 104*104*64 的特徵圖用卷積核數量為 4,大小為 1*1 的卷積層進行壓縮,得到 104*104*4 的特徵圖,然後做 resize 得到 13

13*256 的輸出。

損失函數

蒸餾演算法是模型壓縮領域的一個分支。簡單來說,蒸餾演算法是用一個複雜網路(teacher network)學到的東西去輔助訓練一個簡單網路(student network)。但直接將蒸餾演算法應用於 one stage 的 Yolo 演算法還存在著一些困難。

困難 1 是對於 two stage 演算法,在第一階段就會去除很多背景 RoI,送入檢測網路的 RoI 相對較少,並且大部分包含 object;而 one stage 演算法,輸出中包含大量背景 RoI。如果直接對輸出進行學習,會導致網路過於關注背景,而忽視了前景。

鑒於此,本文作者提出 objectness scaled distillation,主要考慮了 teacher network 中輸出的 objectness 對損失函數的影響。作者認為只有 objectness 比較大的才應該對損失函數有貢獻。

為了更好地理解作者的思路,我們先回顧一下 Yolo 演算法的損失函數,如下所示:

困難 2 是對於檢測演算法來說,如果不做 NMS,直接將 teacher network 的預測 RoI 輸出給 student network,會因為某些 box 有很多的相關預測 RoI 而導致這些 box 容易過擬合。

鑒於此,本文作者提出 FM-NMS。取 3*3 區域內的相鄰 grid cell,對這 9 個 grid cell 中預測相同類別的 bbox 按照 objectness 進行排序,只選擇得分最高的那個 bbox 傳給 student network。2 個 grid cell 做 FM-NMS 的示意圖如下:

圖 21

訓練數據

鑒於作者使用了蒸餾演算法,在訓練時,可以非常方便地使用已標註數據和未標註數據。如果有標註數據,就使用完整的蒸餾損失函數。如果沒有標註數據,就只使用蒸餾損失函數的 distillation loss 部分。

演算法效果

圖 22

DSSD: Deconvolutional Single Shot Detector

論文鏈接:arxiv.org/abs/1701.0665

開源代碼:github.com/MTCloudVisio(綜述筆者實現版本)錄用信息:/

論文目標

大小物體通喫。使用 Top-Down 網路結構,解決小物體檢測的問題。DSSD 論文的詳細解讀可以參見:zhuanlan.zhihu.com/p/33

DSSD 與 FPN 類似,都是基於 Top-Down 結構解決小物體檢測,不同的是,如 FPN 的網路結構只是針對 ResNet 做了優化,文章中也沒有提及過更換其他的基礎網路的實驗結果,普適度不夠。DSSD 作者提出一種通用的 Top-Down 的融合方法,使用 vgg 和 ResNet 網路將高層的語義信息融入到低層網路的特徵信息中,豐富預測回歸位置框和分類任務輸入的多尺度特徵圖,以此來提高檢測精度。

筆者認為,雖然 Top-Down 結構也許有效,但畢竟 DSSD 比 FPN 放出時間更晚一些,且在網路結構上這並沒有太大創新,也許這就是本文未被會議收錄的原因之一。

核心思想

DSSD 是基於 SSD 的改進,引入了 Top-Down 結構。下文分別從這兩方面出發,介紹 DSSD 思想。

DSSD 之於 SSD

DSSD 相對於 SSD 演算法的改進點,總結如下:

  1. 提出基於 Top-Down 的網路結構,用反捲積代替傳統的雙線性插值上採樣。
  2. 在預測階段引入殘差單元,優化候選框回歸和分類任務輸入的特徵圖。
  3. 採用兩階段訓練方法。

DSSD 的網路結構與 SSD 對比如下圖所示,以輸入圖像尺寸為為例,圖中的上半部分為 SSD-ResNet101 的網路結構,conv3_x 層和 conv5_x 層為原來的 ResNet101 中的卷積層,後面的五層是 SSD 擴展卷積層,原來的 SSD 演算法是將這七層的特徵圖直接輸入到預測階段做框的回歸任務和分類任務。DSSD 是將這七層特徵圖拿出六層(去掉尺寸為的特徵圖)輸入到反捲積模型裏,輸出修正的特徵圖金字塔,形成一個由特徵圖組成的沙漏結構。最後經預測模塊輸入給框回歸任務和分類任務做預測。

圖 23

DSSD 中的 D,即反捲積模型,指的是 DSSD 中高層特徵和低層特徵的融合模塊,其基本結構如下圖所示:

圖 24

DSSD 之於 FPN 和 TDM

同樣是採用 Top-Down 方式,DSSD 與 FPN 和 TDM(這兩篇論文將在本論述後文中詳細介紹)的網路結構區別如下圖。可以看出,TDM 使用的是 concat 操作,讓淺層和深層的特徵圖疊在一起。DSSD 使用的是 Eltw Product(也叫 broadcast mul)操作,將淺層和深層的特徵圖在對應的信道上做乘法運算。FPN 使用的是 Eltw Sum(也叫 broadcast add)操作,將淺層和深層的特徵圖在對應的信道上做加法運算。

圖 25

圖 26

圖 27

演算法效果

DSSD 當輸入為 513x513 的時候在 VOC2007 數據集賞達到了 80.0%mAP。更詳細的實驗復現和結果對比見:zhuanlan.zhihu.com/p/33

DSOD : learning deeply supervised object detectors from scratch

論文鏈接:arxiv.org/abs/1708.0124

開源代碼:github.com/szq0214/DSOD錄用信息:ICCV2017

論文目標

從零開始訓練檢測網路。DSOD 旨在解決以下兩個問題:

  1. 是否可以從零開始訓練檢測模型?
  2. 如果可以從零訓練,什麼樣的設計會讓網路結果更好?

DSOD 是第一個不使用圖像分類預訓練模型進行物體檢測訓練初始化的檢測演算法。此外,DSOD 網路參數只有 SSD 的 1/2,Faster R-CNN 的 1/10。

核心思想從零開始訓練檢測任務

現有的物體檢測演算法如 Faster R-CNN、YOLO、SSD 需要使用在大規模分類數據集上訓練得到的分類模型進行 backbone 網路初始化。比如使用 ImageNet 分類模型。這樣做的優勢在於:1. 可以使用現有的模型,訓練較快;2. 由於分類任務已經在百萬級的圖像上進行過訓練,所以再用做檢測需要的圖片數量會相對較少。

但其缺點也很明顯:1. 很多檢測網路都是分類網路改的。圖像分類網路一般都較大,檢測任務可能不需要這樣的網路。2. 分類和檢測的策略不同,可能其最佳收斂區域也不一樣。3. 分類任務一般都是 RGB 圖像訓練的,但檢測有可能會使用深度圖像、醫療圖像等其他類型的圖像。導致圖像空間不匹配。

為解決以上問題,DSOD 提出從零開始訓練檢測模型。

網路結構

DSOD 網路由 backbone sub-network 和 front-end sub-network 構成,Backbone 的作用在於提取特徵信息,Front-end 網路是檢測模塊,通過對多層信息的融合用於物體檢測。

基礎網路 Backbone sub-network 部分,是一個 DenseNets 的變種, 由一個 stem block, 四個 dense blocks, 兩個 transition layers , 兩個 transition w/o pooling layers 構成, 用來提取特徵。如下圖所示:

圖 28

Stem block 中作者沒有使用 DenseNet 的 7*7 卷積,而是使用了兩個 3*3 的卷積(這點和 Inception-V3 的改進很像)。作者指出這種設計可以減少從原始圖像的信息損失,對檢測任務更有利。其他的模塊和 Densenet 很類似。作者使用了詳細的實驗證明瞭基礎網路的設計部分的規則,如 Densenet 的過渡層 transition layer 通道數不減少、Bottleneck 結構的通道更多、使用 stem block 而非 7*7 卷積對最終的識別率都是有提升的。

圖 29

經過基礎特徵提取後,檢測的網路 Front-end sub-network 有兩種實現方式:Plain Connection 和 Dense Connection。其中 Plain Connection 就是 SSD 的特徵融合方法。注意虛框中的是 Bottlenet 結構,即使用 1*1 的卷積先降維然後再接 3*3 的卷積。

圖 30

筆者認為 Dense Connection 結構就是 DSOD 的主要創新點,這部分也很巧妙的採用了 densenet 的思想,一半的 Feature map 由前一個 scale 學到,剩下的一半是直接 down-sampling 的高層特徵。

圖 31

以第一個鏈接結構為例,該結構的輸入一半為上一層的降採樣的 Feature Map,其中通道的改變由 1*1 的卷積完成。另一半為這個尺度學習到的 feature。經過 Concat 後的輸出是三個部分:1. 經過 1*1 卷積和 3*3 卷積作為下一層的輸入;2. 直接降採樣並修改通道作為下一層的輸入;3. 輸入這一層的 feature 到最後的檢測任務。

演算法效果

DSOD 的檢測速度 (17.4fps) 比 SSD、YOLO2 略差,但在模型準確率和模型大小方面卻更勝一籌,最小的網路只有 5.9M,同時 mAP 也能達 73.6%。作者在實驗部分還使用了 pre-trained model 初始化 DSOD,結果反而沒有從零開始訓練效果好, 未來可能去探究一下。


推薦閱讀:
相關文章