前言
我很長一段時間一直都在做自動駕駛的物體檢測性能調優,所以想總結整理一些小網絡和檢測框架的經驗。
文章會分成三個部分:
第一部分將參照知乎@YaqiLYU 對小網絡(經典網絡)的分析並且結合的自己的理解。
第二部分詳細介紹目前state-of-art的主流檢測框架。
第三部分介紹了目標檢測的問題及解決方案,目標檢測在其他領域的拓展應用
目標檢測(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相關的論文詳解資源已經非常多,所以本文不再贅述。下圖對這些方法進行了分類概括。
一、 背景
物體檢測的任務是找出圖像或視頻中的感興趣物體,同時檢測出它們的位置和大小,是機器視覺領域的核心問題之一。
物體檢測過程中有很多不確定因素,如圖像中物體數量不確定,物體有不同的外觀、形狀、姿態,加之物體成像時會有光照、遮擋等因素的干擾,導致檢測算法有一定的難度。進入深度學習時代以來,物體檢測發展主要集中在兩個方向: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.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
也就是扣取特征圖的過程。最原始的RoIPooling比較暴力。如左圖所示,中間較小的紅色虛線框是MegDet給出的ROI,由於浮點數的影響,這個框並不能完全對齊到綠色的特征圖格點上。現有的計算邏輯是把紅色的虛線框拉伸到外圍紅色虛線框,然后計算框中部分特征格點。最近,Mask-RCNN的提出將這個“硬”過程軟化成了插值流程,即計算格點附近四個點的平均結果。
Faster R-CNN采用的RoIPooling,這樣的操作可能導致feature map在原圖的對應位置與真實位置有所偏差。如下圖:
[From Face++]
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而不是歐氏距離來作為距離度量方式。
Dimension clusters
之前Anchor Box的尺寸是手動選擇的,所以尺寸還有優化的余地。 為了優化,在訓練集(training set)Bounding Boxes上跑了一下k-means聚類,來找到一個比較好的值。
如果我們用標准的歐式距離的k-means,尺寸大的框比小框產生更多的錯誤。因為我們的目的是提高IOU分數,這依賴於Box的大小,所以距離度量的使用:
通過分析實驗結果(Figure 2),左圖:在model復雜性與high recall之間權衡之后,選擇聚類分類數K=5。右圖:是聚類的中心,大多數是高瘦的Box。
Table1是說明用K-means選擇Anchor Boxes時,當Cluster IOU選擇值為5時,AVG IOU的值是61,這個值要比不用聚類的方法的60.9要高。選擇值為9的時候,AVG IOU更有顯著提高。總之就是說明用聚類的方法是有效果的。
5.預測‘候選框相對於圖像的內部偏移’。以往RPN網絡,通過回歸候選框相對於當前anchor box的偏移來定位候選框的位置,由於偏移相對於anchor box外部,所以取值范圍是不受限的,導致訓練的時候難以收斂。因此YOLO9000采用與YOLO類似的方式,預測候選框相對於圖像左上角的位置偏移,並將偏移量歸一化到0-1區間,解決了訓練難收斂問題。
用Anchor Box的方法,會讓model變得不穩定,尤其是在最開始的幾次迭代的時候。大多數不穩定因素產生自預測Box的(x,y)位置的時候。按照之前YOLO的方法,網絡不會預測偏移量,而是根據YOLO中的網格單元的位置來預測坐標,這就讓Ground Truth的值介於0到1之間。而為了讓網絡的結果能落在這一范圍內,網絡使用一個 Logistic Activation來對於網絡預測結果進行限制,讓結果介於0到1之間。 網絡在每一個網格單元中預測出5個Bounding Boxes,每個Bounding Boxes有五個坐標值tx,ty,tw,th,t0,他們的關系見下圖(Figure3)。假設一個網格單元對於圖片左上角的偏移量是cx,cy,Bounding Boxes Prior的寬度和高度是pw,ph,那么預測的結果見下圖右面的公式:
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僅用於更新與分類相關的網絡層模型參數。這樣以來,檢測數據集訓練網絡學到如何檢測出物體(是否是物體,位置),而分類數據集使得網絡識別出物體類別。
在訓練的過程中,當網絡遇到一個來自檢測數據集的圖片與標記信息,那么就把這些數據用完整的YOLO v2 loss功能反向傳播這個圖片。當網絡遇到一個來自分類數據集的圖片和分類標記信息,只用整個結構中分類部分的loss功能反向傳播這個圖片。
遇到一個來自分類數據集的圖片和分類標記信息,只用整個結構中分類部分的loss功能反向傳播這個圖片。
但是檢測數據集只有粗粒度的標記信息,像“貓“、“ 狗”之類,而分類數據集的標簽信息則更細粒度,更豐富。比如狗這一類就包括”哈士奇“”牛頭梗“”金毛狗“等等。所以如果想同時在監測數據集與分類數據集上進行訓練,那么就要用一種一致性的方法融合這些標簽信息。
再者,用於分類的方法,大多是用softmax layer方法,softmax意味着分類的類別之間要互相獨立的。而盲目地混合數據集訓練,就會出現比如:檢測數據集的分類信息中”狗“這一分類,在分類數據集合中,就會有的不同種類的狗”哈士奇“”牛頭梗“”金毛“這些分類,這兩種數據集之間的分類信息不相互獨立。所以使用一種多標簽的model來混合數據集,假設一個圖片可以有多個分類信息,並假定分類信息必須是相互獨立的規則可以被忽略。
訓練一個Extremely Large Scale檢測器。所以訓練的時候使用WordTree混合了COCO檢測數據集與ImageNet中的Top9000類,混合后的數據集對應的WordTree有9418個類。另一方面,由於ImageNet數據集太大了,作者為了平衡一下兩個數據集之間的數據量,通過過采樣(oversampling)COCO數據集中的數據,使COCO數據集與ImageNet數據集之間的數據量比例達到1:4。
為了評估這一方法,使用ImageNet Detection Task對訓練結果進行評估。
評估結果:
YOLO9000取得19.7mAP。
在未學習過的156個分類數據上進行測試,mAP達到16.0。
YOLO9000的mAP比DPM高,而且YOLO有更多先進的特征,YOLO9000是用部分監督的方式在不同訓練集上進行訓練,同時還能檢測9000個物體類別,並保證實時運行。
算法效果:
下圖給出了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的綜合性能(准確率&速度)仍然很是最好的。但總的來說,文章的改進主要還是修修補補,換換網絡,沒有特別的突出創新點。
YOLOv3在Pascal Titan X上處理608x608圖像速度達到20FPS,在 COCO test-dev 上 mAP@0.5 達到 57.9%,與RetinaNet(FocalLoss論文所提出的單階段網絡)的結果相近,並且速度快4倍.
YOLO v3的模型比之前的模型復雜了不少,可以通過改變模型結構的大小來權衡速度與精度。
速度對比如下:
分類器-類別預測:
YOLOv3不使用Softmax對每個框進行分類,主要考慮因素有兩個:
- Softmax使得每個框分配一個類別(score最大的一個),而對於
Open Images
這種數據集,目標可能有重疊的類別標簽,因此Softmax不適用於多標簽分類。 - Softmax可被獨立的多個logistic分類器替代,且准確率不會下降。
分類損失采用binary cross-entropy loss.
多尺度預測
每種尺度預測3個box, anchor的設計方式仍然使用聚類,得到9個聚類中心,將其按照大小均分給3中尺度.
- 尺度1: 在基礎網絡之后添加一些卷積層再輸出box信息.
- 尺度2: 從尺度1中的倒數第二層的卷積層上采樣(x2)再與最后一個16x16大小的特征圖相加,再次通過多個卷積后輸出box信息.相比尺度1變大兩倍.
- 尺度3: 與尺度2類似,使用了32x32大小的特征圖.
基礎網絡 Darknet-53
仿ResNet, 與ResNet-101或ResNet-152准確率接近,但速度更快.對比如下:
網絡結構如下:
YOLOv3在 mAP0.5mAP0.5 及小目標 APSAPS 上具有不錯的結果,但隨着IOU的增大,性能下降,說明YOLOv3不能很好地與ground truth切合.
邊框預測
作者嘗試了常規的預測方式(Faster R-CNN),然而並不奏效: x,y的偏移作為box的長寬的線性變換.
算法效果:
對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容易過擬合。
基於特征的NMS算法(feature map NMS或者簡寫成FM-NMS)
NMS是object detection算法中常用的后處理算法,用來去除重復預測框,傳統的NMS算法和網絡結構的訓練是獨立的。如果不做NMS,直接將teacher network的預測框輸出給student network,則會導致student network接收到的object相關的loss會非常大,這樣訓練幾輪以后就會對這些object過擬合了。因此這里采取了類似NMS算法的feature map NMS進行重復框進行去除。
首先在Yolo算法中,最后的輸出層中每個grid cell的維度是1*1*(N*(K + 5)),也就是圖中的藍色或綠色三維矩形條,矩形條的長度就是N*(K + 5),其中N表示bbox的數量,K表示分類的類別數,5表示4個坐標值和1個objectness score。grid cell的數量就是輸出層的feature map的寬高乘積。FM-NMS算法的假設是假如幾個相鄰的grid cell所預測bbox的類別一樣,那么這些bbox極有可能預測的是同一個object。基於這樣的假設或者說是觀察到的現象,FM-NMS算法的做法是:每次取3*3個相鄰的grid cell,對這9個grid cell中預測類別相同的bbox的得分(objectness value)進行排序,最后只選擇得分最高的那個bbox傳給后續的student network。Figure4是對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
未完待續----