1. 程式人生 > >基於深度學習的目標檢測演算法綜述(一)

基於深度學習的目標檢測演算法綜述(一)

前言

目標檢測(Object Detection)是計算機視覺領域的基本任務之一,學術界已有將近二十年的研究歷史。近些年隨著深度學習技術的火熱發展,目標檢測演算法也從基於手工特徵的傳統演算法轉向了基於深度神經網路的檢測技術。從最初2013年提出的R-CNN、OverFeat,到後面的Fast/Faster R-CNN,SSD,YOLO系列,再到2018年最近的Pelee。短短不到五年時間,基於深度學習的目標檢測技術,在網路結構上,從two stage到one stage,從bottom-up only到Top-Down,從single scale network到feature pyramid network,從面向PC端到面向手機端,都湧現出許多好的演算法技術,這些演算法在開放目標檢測資料集上的檢測效果和效能都很出色。

本篇綜述的出發點一方面是希望給檢測方向的入門研究人員提供一個技術概覽,幫助大家快速瞭解目標檢測技術上下文;另一方面是給工業界應用人員提供一些參考,通過本篇綜述,讀者可以根據實際業務場景,找到合適的目標檢測方法,在此基礎上改進、優化甚至是進一步創新,解決實際業務問題。

本文對其中的26篇論文進行介紹,這26篇論文涵蓋了2013以來,除SSD,YOLO和R-CNN系列之外的,所有引用率相對較高或是筆者認為具有實際應用價值的論文。R-CNN系列,SSD和YOLO相關的論文詳解資源已經非常多,所以本文不再贅述。下圖對這些方法進行了分類概括。

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

一、 背景

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

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

本篇綜述將主要分為三個部分:

1. Two/One stage演算法改進。這部分將主要總結在two/one stage經典網路上改進的系列論文,包括Faster R-CNN、YOLO、SSD等經典論文的升級版本。

2. 解決方案。這部分論文對物體檢測中遇到的各類問題進行了分析並提出瞭解決方案。

3. 擴充套件應用、綜述。這部分將就特殊物體檢測和檢測演算法在其他領域的應用等方面進行介紹。

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

二、創新內容、改進方向

1.Two/One stage演算法改進

1.1 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的思想,對物體檢測迴歸框的精度提升有一定效果,故將此論文也將介紹了本篇綜述中。

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

論文連結:

https://arxiv.org/abs/1605.06409

開原始碼:

https://github.com/daijifeng001/R-FCN

錄用資訊: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)來增強網路對於位置資訊的表達能力,提高檢測效果。

二. 網路設計

2.1position-sensitive score map

上圖展示的是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分別對應每個類別的不同位置。每個通道分別負責某一類的特定位置的特徵提取工作。

2.2 Position-sensitive RoI pooling

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

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

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

2.3 position-sensitive regression

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

三. 網路訓練

3.1 position-sensitive score map高響應值區域

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

3.2 訓練和測試過程

使用如上的損失函式,對於任意一個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去除冗餘的預測框。

演算法效果:

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

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

論文連結:

https://arxiv.org/pdf/1712.01802.pdf

開原始碼:無

錄用資訊:無

論文目標:

與YOLO9000(本論述後文會具體介紹YOLO9000)類似,本文的目標也是面向實際應用場景的大規模類別物體的實時檢測。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*K*SC個通道。由於SC遠遠小於C,因此可大大降低運算複雜度。特別地,論文提出,當只使用一個超類時,檢測效果依然不錯。演算法網路結構如下:

上圖可以看出,與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進行物體檢測時具有較強的通用性,當使用足夠多的類別進行訓練時,對未知類別的物體檢測時,仍能檢測出該物體位置。如下圖:

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

1.1.3 Mask R-CNN

論文連結:

https://arxiv.org/abs/1703.06870

開原始碼:

https://github.com/TuSimple/mx-maskrcnn

錄用資訊: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結構如下圖:

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

三、Mask R-CNN詳細改進

1. RoIAlign

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

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

RoIPooling

RoIAlign

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

2.多工損失函式

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

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

1. mask branch 預測K個種類的M x M二值掩膜輸出。

2. 依據種類預測分支(Faster R-CNN部分)預測結果:當前RoI的物體種類為i。

3.RoI的平均二值交叉損失熵(對每個畫素點應用Sigmoid函式)即為損失Lmask。

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

演算法效果:

體現了在COCO資料集上的表現效果。

1.2 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這兩篇論文。

1.2.1 YOLO9000: better, faster, stronger

論文連結:

https://arxiv.org/pdf/1612.08242.pdf

開原始碼:

https://github.com/pjreddie/darknet

https://github.com/zhreshold/mxnet-YOLO MXNet實現

錄用資訊:CVPR2017

論文目標:

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

核心思想:

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

一、更好

準確率提升。相比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在準確率和執行效能上都更勝一籌(圖中左邊第一個藍圈)。

1.2.2 YOLOv3: an incremental improvement

論文連結:

https://arxiv.org/abs/1804.02767

開原始碼:

https://github.com/pjreddie/darknet

錄用資訊:無。原文是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綜合性能更好的分類網路。

1.2.3 Object detection at 200 Frames Per Second

論文連結:

https://arxiv.org/abs/1805.06361

開原始碼:無

錄用資訊:無

論文目標:

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

核心思想:

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

一、網路結構

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

說明一下,本文的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的示意圖如下:

三、訓練資料

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

演算法效果:

1.2.4 DSSD: Deconvolutional Single Shot Detector

論文連結:

https://arxiv.org/pdf/1701.06659.pdf

開原始碼:

https://github.com/MTCloudVision/mxnet-DSSD 綜述筆者實現版本

錄用資訊:未被會議收錄

論文目標:

大小物體通吃。使用Top-Down網路結構,解決小物體檢測的問題。

DSSD論文的詳細解讀可以參見https://zhuanlan.zhihu.com/p/33036037。

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是將這七層特徵圖拿出六層(去掉尺寸為的特徵圖)輸入到反捲積模型裡,輸出修正的特徵圖金字塔,形成一個由特徵圖組成的沙漏結構。最後經預測模組輸入給框迴歸任務和分類任務做預測。

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

二、DSSD之於FPN和TDM

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

演算法效果:

DSSD 當輸入為513x513的時候在VOC2007資料集賞達到了80.0%mAP。

更詳細的實驗復現和結果對比見:

https://zhuanlan.zhihu.com/p/33036037

1.2.5 DSOD : learning deeply supervised object detectors from scratch

論文連結:

https://arxiv.org/pdf/1708.01241.pdf

開原始碼:

https://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構成,用來提取特徵。如下圖所示:

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

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

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

以第一個連結結構為例,該結構的輸入一半為上一層的降取樣的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,結果反而沒有從零開始訓練效果好,未來可能去探究一下。