【重磅】基於深度學習的目標檢測演算法綜述
CVer推薦來源: SigAI
作者: AI學習與實踐平台
Amusi一直想推關於「目標檢測」方向的系列文章,如one-stage和two-stage兩大類,R-CNN和YOLO系列等。還沒來得及整理,我就發現了一篇巨硬巨硬的文章,於是就厚著臉皮聯繫了SigAI公眾號的管理人員。哈哈,順利拿下轉載資格。接下來,請大家一定要耐心再耐心地閱讀完此文,相信一定會有收穫。乾貨滿滿,請慢慢咬文嚼字
正文
導言:目標檢測的任務是找出圖像中所有感興趣的目標(物體),確定它們的位置和大小,是機器視覺領域的核心問題之一。由於各類物體有不同的外觀,形狀,姿態,加上成像時光照,遮擋等因素的干擾,目標檢測一直是機器視覺領域最具有挑戰性的問題。本文將針對目標檢測(Object Detection)這個機器視覺中的經典任務進行解析,拋磚引玉。如對文中的內容持不同觀點,歡迎到SIGAI公眾號發消息給我們,一起探討!
什麼是目標檢測?
目標檢測的任務是找出圖像中所有感興趣的目標(物體),確定它們的位置和大小,是機器視覺領域的核心問題之一。由於各類物體有不同的外觀,形狀,姿態,加上成像時光照,遮擋等因素的干擾,目標檢測一直是機器視覺領域最具有挑戰性的問題。
計算機視覺中關於圖像識別有四大類任務:
分類-Classification:解決「是什麼?」的問題,即給定一張圖片或一段視頻判斷裡面包含什麼類別的目標。
定位-Location:解決「在哪裡?」的問題,即定位出這個目標的的位置。
檢測-Detection:解決「是什麼?在哪裡?」的問題,即定位出這個目標的的位置並且知道目標物是什麼。
分割-Segmentation:分為實例的分割(Instance-level)和場景分割(Scene-level),解決「每一個像素屬於哪個目標物或場景」的問題。
目標檢測要解決的核心問題
除了圖像分類之外,目標檢測要解決的核心問題是:
1.目標可能出現在圖像的任何位置。
2.目標有各種不同的大小。
3.目標可能有各種不同的形狀。
如果用矩形框來定義目標,則矩形有不同的寬高比。由於目標的寬高比不同,因此採用經典的滑動窗口+圖像縮放的方案解決通用目標檢測問題的成本太高。
目標檢測的應用
目標檢測在很多領域都有應用需求。其中被廣為研究的是人臉檢測,行人檢測,車輛檢測等重要目標的檢測。人臉檢測在SIGAI上一篇文章「人臉識別演算法演化史」中已經簡單介紹,後面我們會針對這個問題撰寫綜述文章。
行人檢測
行人檢測在視頻監控,人流量統計,自動駕駛中都有重要的地位,後續也會有相關綜述文章。
車輛檢測
車輛檢測在智能交通,視頻監控,自動駕駛中有重要的地位。車流量統計,車輛違章的自動分析等都離不開它,在自動駕駛中,首先要解決的問題就是確定道路在哪裡,周圍有哪些車、人或障礙物。
其他應用
交通標誌如交通燈、行駛規則標誌的識別對於自動駕駛也非常重要,我們需要根據紅綠燈狀態,是否允許左右轉、掉頭等標誌確定車輛的行為。
除了這些常見目標的檢測之外,很多領域裡也需要檢測自己感興趣的目標。比如工業中材質表面的缺陷檢測,硬刷電路板表面的缺陷檢測等。
農業中農作物表面的病蟲害識別也需要用到目標檢測技術:
人工智慧在醫學中的應用目前是一個熱門的話題,醫學影像圖像如MRI的腫瘤等病變部位檢測和識別對於診斷的自動化,提供優質的治療具有重要的意義。
目標檢測相關演算法
DPM演算法
與人臉、行人等特定類型的目標檢測不同,通用目標檢測要同時檢測出圖像中的多類目標,難度更大。處理這一問題的經典方法是DPM(Deformable Part Model),正如其名,這是可變形的組件模型,是一種基於組件的檢測演算法。該模型由Felzenszwalb在2008年提出,並發表了一系列的CVPR,NIPS文章,蟬聯三屆PASCAL VOC目標檢測冠軍,拿下了2010年PASCAL VOC的「終身成就獎」。
在深度卷積神經網路(DCNN)出現之前,DPM演算法一直是目標檢測領域最優秀的演算法,它的基本思想是先提取DPM人工特徵(如下圖所示),再用latentSVM分類。這種特徵提取方式存在明顯的局限性,首先,DPM特徵計算複雜,計算速度慢;其次,人工特徵對於旋轉、拉伸、視角變化的物體檢測效果差。這些弊端很大程度上限制了演算法的應用場景。
Alexnet
現代深度神經網路的想法早在2006年就被 Geoffrey Hinton 提出,直到2012年,Alex Krizhevsky憑藉著名的Alexnet卷積神經網路模型以領先第二名10%的成績奪得ILSVRC2012圖像分類比賽冠軍,深度學習技術才真正走進主流學術界和工業界的視野。深度神經網路的出現顛覆了傳統的特徵提取方式,憑藉其強大的表達能力,通過豐富的訓練數據和充分的訓練能夠自主學習有用的特徵。這相比傳統的人工發現特徵並根據特徵設計演算法的方式是質的飛躍。
通過卷積神經網路可以學到物體在各個層次的抽象表達(關於卷積神經網路的原理以及為什麼會有效,SIGAI會在接下來的文章中介紹):
OverFeat
2013年紐約大學Yann LeCun團隊中Zhang xiang等提出的OverFeat在ILSVRC2013比賽中獲得了多項第一,他們改進了Alexnet,提出了使用同一個卷積網路完成了多個任務的方法。該方法充分利用了卷積神經網路的特徵提取功能,它把分類過程中提取到的特徵同時又用於定位檢測等各種任務,只需要改變網路的最後幾層,就可以實現不同的任務,而不需要從頭開始訓練整個網路的參數。這充分體現和發掘了CNN特徵共享的優點。
該文主要的亮點是:
1.共享卷基層用於多任務學習。
2.全卷積網路思想。
3.在特徵層進行滑窗操作(Sliding Window)避免大量重複運算,這也是後來的系列演算法不斷沿用和改進的經典做法。
OverFeat幾個明顯的缺陷:
1.採用了多尺度貪婪的劃窗策略,導致計算量還是很大 。
2.由於當時並沒有太優秀的backbone網路,共享特徵層的表徵能力不是太強,沒有考慮多尺度特徵融合,對小目標效果差,整體的檢測效果不盡如人意。ILSVRC 2013數據集上的mAP(可以簡單的理解為檢測準確率)為24.3%。
經典的卷積神經網路有一個問題是它只能接受固定大小的輸入圖像,這是因為第一個全連接層和它之前的卷積層之間的權重矩陣大小是固定的,而卷積層、全連接層本身對輸入圖像的大小並沒有限制。而在做目標檢測時,卷積網路面臨的輸入候選區域圖像大小尺寸是不固定的。
下面用一個例子說明怎麼讓一個已經設計好的DCNN模型,可以支持任意大小圖片輸入,其中一種方案是全卷積網路(FCN),即去掉所有全連接層,全部由卷積層來替代:
FCN並不是把5×5的圖片展平成一維向量再進行計算,而是直接採用5×5的卷積核對一整張圖片進行卷積運算。比如16×16大小的特徵圖片,那麼會是什麼樣的結果?請看下面的示意圖:
這個時候就會發現,網路最後的輸出是一張2×2大小的特徵圖片。可以發現採用FCN網路,可以輸入任意大小的圖片。需要注意的是網路最後輸出的特徵圖片大小不再總是1×1而是一個與輸入圖片大小相關。
OverFeat有很多創新,但是不能算是目標檢測典型的Pipeline,所以我們單獨提了出來。下面將從R-CNN開始介紹目前基於DCNN物體檢測發展脈絡。
卷積神經網路用於目標檢測之後,進展神速,在短期內大幅度的提高了演算法的精度,推動這一技術走向實用。
R-CNN
Region CNN(簡稱R-CNN)由Ross Girshick
(江湖人稱RBG大神,Felzenszwalb的學生)提出,是利用深度學習進行目標檢測的里程碑之作,奠定了這個子領域的基礎。這篇文章思路清奇,在DPM方法經歷多年瓶頸期後,顯著提升了檢測率(ILSVRC 2013數據集上的mAP為31.4%)。RBG是這個領域神一樣的存在,後續的一些改進方法如Fast R-CNN、Faster R-CNN、YOLO等相關工作都和他有關。
R-CNN檢測時的主要步驟為:
1.使用Selective Search演算法從待檢測圖像中提取2000個左右的區域候選框,這些候選框可能包含要檢測的目標。
2.把所有侯選框縮放成固定大小(原文採用227×227)。
3.用DCNN提取每個候選框的特徵,得到固定長度的特徵向量。
4.把特徵向量送入SVM進行分類得到類別信息,送入全連接網路進行回歸得到對應位置坐標信息。
R-CNN不採用滑動窗口方案的原因一是計算成本高,會產生大量的待分類窗口;另外不同類型目標的矩形框有不同的寬高比,無法使用統一尺寸的窗口對圖像進行掃描。用於提取特徵的卷積網路有5個卷積層和2個全連接層,其輸入是固定大小的RGB圖像,輸出為4096維特徵向量。對候選區域的分類採用線性支持向量機,對每一張待檢測圖像計算所有候選區域的特徵向量,送入支持向量機中進行分類;同時送入全連接網路進行坐標位置回歸。
R-CNN雖然設計巧妙,但仍存在很多缺點:
1.重複計算。R-CNN雖然不再是窮舉,但通過Proposal(Selective Search)的方案依然有兩千個左右的候選框,這些候選框都需要單獨經過backbone網路提取特徵,計算量依然很大,候選框之間會有重疊,因此有不少其實是重複計算。
2.訓練測試不簡潔。候選區域提取、特徵提取、分類、回歸都是分開操作,中間數據還需要單獨保存。
3.速度慢。前面的缺點最終導致R-CNN出奇的慢,GPU上處理一張圖片需要十幾秒,CPU上則需要更長時間。
4.輸入的圖片Patch必須強制縮放成固定大小(原文採用227×227),會造成物體形變,導致檢測性能下降。
SPPNet
此後MSRA的Kaiming He等人在R-CNN的基礎上提出了SPPNet,該方法雖然還依賴候選框的生成,但將提取候選框特徵向量的操作轉移到卷積後的特徵圖上進行,將R-CNN中的多次卷積變為一次卷積,大大降低了計算量(這一點參考了OverFeat)。
R-CNN的卷積網路只能接受固定大小的輸入圖像。為了適應這個圖像尺寸,要麼截取這個尺寸的圖像區域,這將導致圖像未覆蓋整個目標;要麼對圖像進行縮放,這會產生扭曲。在卷積神經網路中,卷積層並不要求輸入圖像的尺寸固定,只有第一個全連接層需要固定尺寸的輸入,因為它和前一層之間的權重矩陣是固定大小的,其他的全連接層也不要求圖像的尺寸固定。如果在最後一個卷積層和第一個全連接層之間做一些處理,將不同大小的圖像變為固定大小的全連接層輸入就可以解決問題。
SPPNet引入了Spatial Pyramid pooling層,對卷積特徵圖像進行空間金字塔採樣獲得固定長度的輸出,可對特徵層任意長寬比和尺度區域進行特徵提取。具體做法是對特徵圖像區域進行固定數量的網格劃分,對不同寬高的圖像,每個網格的高度和寬度是不規定的,對劃分的每個網格進行池化,這樣就可以得到固定長度的輸出。下圖是SPP操作示意圖:
相比R-CNN,SPPNet的檢測速度提升了30倍以上。下圖是R-CNN和SPPNet 檢測流程的比較:
下圖是SPPNet的原理:
SPPNet和R-CNN一樣,它的訓練要經過多個階段,中間特徵也要進行存儲;backbone網路參數沿用了分類網路的初始參數,沒有針對檢測問題進行優化。
Fast RCNNRoss Girshick 針對SPPNet做了進一步改進提出的FRCNN ,其主要創新是RoI Pooling 層,它將不同大小候選框的卷積特徵圖統一採樣成固定大小的特徵。ROI池化層的做法和SPP層類似,但只使用一個尺度進行網格劃分和池化。該層可以直接求導,訓練時直接將梯度傳導到backbone網路進行優化。FRCNN針對R-CNN和SPPNet在訓練時是多階段的和訓練的過程中很耗費時間空間的問題進行改進。將深度網路和後面的SVM分類兩個階段整合到一起,使用一個新的網路直接做分類和回歸。使得網路在Pascal VOC上的訓練時間從R-CNN的84小時縮短到9.5小時,檢測時間更是從45秒縮短到0.32秒。
重要的是Fast RCNN的backbone網路也可以參與訓練了!!!
Faster RCNN
SPPNet和Faster RCNN都需要獨立的候選區域生成模塊,這個模塊計算量很大,而且不易用GPU加速。針對這個問題,Shaoqin Ren 等人在Faster RCNN基礎上提出Faster R-CNN ,在主幹網路中增加了RPN (Region Proposal Network)網路,通過一定規則設置不同尺度的錨點(Anchor)在RPN的卷積特徵層提取候選框來代替Selective Search等傳統的候選框生成方法,實現了網路的端到端訓練。候選區域生成、候選區域特徵提取、框回歸和分類全過程一氣呵成,在訓練過程中模型各部分不僅學習如何完成自己的任務,還自主學習如何相互配合。這也是第一個真正意義上的深度學習目標檢測演算法。
註:Shaoqin Ren實現的matlab版本中RPN階段和FRCNN階段是分開訓練的,但是在實際的實踐中(RBG實現的Python版本)發現二者可以一起優化訓練,而且精度沒有損失,可以說Faster RCNN真正實現了端到端的訓練。
R-FCN
由於現在的主流網路層數越來越多,基於Faster RCNN檢測框架的方法的計算量受到了3個因素的影響:
1.基礎網路的複雜度
2.候選框數量的多少
3.分類和位置回歸子網路的複雜度(每個候選框的box都會獨立進行前向計算)。
一般來說直接優化前兩點性價比不太高。如果直接優化RoI-wise subnetwork是否可行呢,將子網路的深度儘可能減少?分類是要增加物體的平移不變性(不同的位置都是同一個物體);目標檢測時減少物體的平移變化(目標檢測需要得到物體所在的位置)。通常我們所用的網路都是ImageNet的分類任務訓練得到的,在目標檢測的時候進行Finetune。由於得到的初始模型基於分類任務,那麼會偏向於平移不變性,這和目標檢測就出現了矛盾。
MSRA的Jifeng Dai等人提出了R-FCN,通過position-positive score maps(位置敏感得分圖)來解決這個矛盾。位置敏感得分圖通過預測RoI中不同部位的類別投票表決產生該RoI的類別預測。引用原文中的例子,「如果我們的演算法要識別嬰兒,那麼把一個目標區域分成九宮格,其中演算法認為其中五個格子中的區域分別像嬰兒的頭、四肢和軀幹,那麼根據投票機制,就認為這個目標區域里的是一個嬰兒。這很符合我們人類的判斷邏輯。」
R-FCN沿用了 Faster RCNN 的框架結構,不同的是在Faster R-CNN的基礎上通過引入位置敏感得分圖,將RoI-wise subnetwork消滅了,直接在位置敏感得分圖上利用ROI Pooling進行信息採樣融合分類和位置信息。
Mask R-CNN
2017年Kaiming He等提出了Mask R-CNN ,並獲得ICCV2017 Best Paper Award。作者指出,Faster R-CNN在做下採樣和RoI Pooling時都對特徵圖大小做了取整操作,這種做法對於分類任務基本沒有影響,但對檢測任務會有一定影響,對語義分割這種像素級任務的精度影響則更為嚴重。為此,作者對網路中涉及特徵圖尺寸變化的環節都不使用取整操作,而是通過雙線性差值填補非整數位置的像素。這使得下游特徵圖向上游映射時沒有位置誤差,不僅提升了目標檢測效果,還使得演算法能滿足語義分割任務的精度要求。
以上介紹的檢測方法都屬於two-stage的方案,即分為候選區域生成和區域分類兩步,接下來我們將介紹幾種single-stage的經典方法。
YOLO系列
2015年,隨著YOLO演算法的出現,深度學習目標檢測演算法開始有了兩步(two-stage)和單步(single-stage)之分。區別於R-CNN系列為代表的兩步檢測演算法,YOLO捨去了候選框提取分支(Proposal階段),直接將特徵提取、候選框回歸和分類在同一個無分支的卷積網路中完成,使得網路結構變得簡單,檢測速度較Faster R-CNN也有近10倍的提升。這使得深度學習目標檢測演算法在當時的計算能力下開始能夠滿足實時檢測任務的需求。
演算法將待檢測圖像縮放到統一尺寸,為了檢測不同位置的目標,將圖像等分成的網格,如果某個目標的中心落在一個網格單元中,此網格單元就負責預測該目標。
YOLOv1只針對最後7x7的特徵圖進行分析,使得它對小目標的檢測效果不佳,當多個目標出現在一個Grid Cell時不容易區分。
YOLOv2改進了YOLOv1的網路結構,除加入時下熱門的批量歸一化層以及殘差網路結構以外,還針對性的訓練了一個高解析度的分類網路(448x448)然後利用該網路訓練檢測網路,單單通過提升輸入的解析度,mAP獲得了4%的提升。YOLOv1利用單個grid cell拼接成全連接層完成邊框的預測,導致丟失較多的空間信息,定位不準,作者在這一版本中進行了優化改進:
1.借鑒了Faster R-CNN中的Anchor思想,但是作者在實踐中發現用基於規則選擇的Anchor效果並沒有得到提升,實驗中作者對Pascal VOC和COCO的數據集進行了統計分析(聚類分析)選擇針對行的Anchor的尺寸性能的到了明顯提升。
2.作者在使用anchor boxes時發現模型收斂不穩定,尤其是在早期迭代的時候。大部分的不穩定現象出現在預測box的 (x,y) 坐標的優化上。因此作者就沒有採用直接預測offset的方法,而使用了預測相對於grid cell的坐標位置的辦法,利用logistic函數把ground truth歸一化到0到1之間,坐標值被歸一化後,模型優化會更穩定。
YOLOv3在YOLOv2的基礎上使用了全新設計的Darknet53殘差網路並結合FPN網路結構,在網路後兩個特徵圖上採樣後於網路前期相應尺寸的特徵圖聚合再經過卷積網路後得到預測結果。這些改進使得YOLOv3用三分之一的時間達到與SSD相當的精確度。在 COCO test-dev 上 mAP@0.5 達到 57.9%,與RetinaNet(FocalLoss論文所提出的單階段網路)的結果相近,但速度快4倍。
YOLOv3的模型比之前的版本複雜了不少,可以通過改變模型結構的大小來權衡速度與精度。
YOLOv3的改進點:
1. 多尺度預測(FPN)
2. 更好的Backbone網路(Darknet53殘差網路)
3. 分類損失採用binary cross-entropy損失函數替換Softmax損失函數(Softmax會選擇分數最高的類別判定為當前框所屬的類別,而現實中一個目標可能屬於多個類別標籤)
SSD
SSD對YOLO進行了改進,達到了和兩階段方法相當的精度,同時又保持了較快的運行速度。SSD也採用了網格劃分的思想,和Faster RCNN不同的是它將所有的操作整合在一個卷積網路中完成。為了檢測不同尺度的目標,SSD對不同卷積層的特徵圖像進行滑窗掃描;在前面的卷積層輸出的特徵圖像中檢測小的目標,在後面的卷積層輸出的特徵圖像中檢測大的目標。它的主要特點是:
1.基於多尺度特徵圖像的檢測:在多個尺度的卷積特徵圖上進行預測,以檢測不同大小的目標,一定程度上提升了小目標物體的檢測精度。
2.借鑒了Faster R-CNN中的Anchor boxes思想,在不同尺度的特徵圖上採樣候選區域,一定程度上提升了檢測的召回率以及小目標的檢測效果。下圖是SSD的原理:
FPN
FPN(Feature Pyramid Network)方法同時利用低層特徵高解析度和高層特徵的高語義信息,通過融合這些不同層的特徵達到提升預測的效果的作用。FPN中預測是在每個融合後的特徵層上單獨進行的,這和常規的特徵融合方式有所不同。
FPN 網路結構如下圖d(其中YOLO使用b結構,SSD使用c結構)所示,它的結構具有相當的靈活性,可以和各種特徵提取網路結合作為檢測演算法的基礎網路。在後文中會看到,目前大多數state-of-art的模型都採用了這種結構。其中RetinaNet在FPN的基礎上使用了ResNet網路提取特徵,並用Focal Loss損失改善單步目標檢測演算法中普遍存在的前景類和背景類損失不均衡的問題。這些基於FPN結構的檢測演算法能夠在增加網路深度、獲取更豐富語義信息的同時從淺層特徵圖中獲取更豐富且高解析度的圖像特徵,這使得這種網路結構在實際應用中表現出優異的性能。
目前主流檢測框架有4種使用特徵的形式:
1.圖像金字塔。即將圖像縮放到不同的大小,然後不同大小的圖像生成對應的特徵。這種方法的缺點是增加了時間成本。有些演算法會在檢測時採用這種圖像金字塔的方案。
2.單一尺度特徵層。SPPNet,Fast RCNN,Faster RCNN採用這種方式,即僅採用網路最後一層卷積層的特徵。
3.SSD採用這種多尺度特徵融合的方式,但是沒有上採樣過程,即從網路不同層抽取不同尺度的特徵做預測,這種方式不會增加額外的計算量。SSD演算法中沒有用到足夠低層的特徵(在SSD中,最低層的特徵是VGG網路的conv4_3),而足夠低層的特徵對於檢測小物體是很有幫助的。
4.FPN採用bottom-up與top-down的結構,實現了低層特徵和高層語義特徵的融合,提高了特徵映射的信息密度和解析度,提高了小目標物體的檢測效果;區別於SSD,FPN每層都是獨立預測的。
COCO2017排行榜
最後我們來看通用目標檢測演算法的最新進展。下圖是MSCOCO 2017年目標檢測競賽的領先演算法:
其中排名第一的模型為曠視科技(face++)提交的MegDet。他們的方案沒有在檢測演算法方面做過多優化(採用的是ResNet50+FPN),而是在並行訓練規模上做了優化。訓練硬體環境是由128個GPU組成的集群,通過改進跨GPU批量歸一化演算法和學習率變化策略,將batch size增大到256張,這使得批量歸一化層中使用的批均值和方差更能夠反應總體特徵,有效提升了歸一化效果,從而大幅提升訓練速度並且得到了非常好的結果。
排名第二的方案PAN改進了FPN演算法,如下圖所示。它在FPN的基礎上不僅增加了一個降採樣網路(b),還聚合使用了多個不同尺度特徵圖上的預測候選框(c)。該模型不僅在這一屆的COCO目標檢測競賽中名列第二,而且取得了語義分割任務的冠軍。
第三名的模型出自MSRA之手,他們同樣沒有對檢測演算法本身做過多改進,在FPN基礎上使用了Xception網路結構和SoftNMS,但與以往不同的是使用了可變卷積層DCN(deformable convnet)替代了傳統卷積,使得卷積層能夠根據圖片的語義信息調整卷積核感受點的位置,達到提升網路特徵提取能力的目的。下圖是可變卷積層的原理:
排名第四的結果是用以FPN+ResNeXt網路為作為基礎網路的Mask R-CNN演算法得到的。後面大多數成績優異的模型都是R-FCN、FPN、Faster-RCNN等經典模型結合DCN、Attention機制、先進分類網路結構和模型融合等技術而形成的演算法。
本文為CVer轉載 已授權轉載自SigAI
推薦文章
[1] 重磅:吳恩達最新的機器學習書籍《Machine Learning Yearning》
[2] 你現在應該閱讀的7本最好的深度學習書籍
[3] 重磅:TensorFlow實現YOLOv3(內含福利)
-------我是可愛的分割線-------
若喜歡Amusi推送的文章,請掃描下方二維碼關注CVer公眾號!
http://weixin.qq.com/r/NioZAUbEpRvarQJi938k (二維碼自動識別)
-------我還是可愛的分割線-------
喜歡CVer的文章,記得點贊哦!
閱讀原文
推薦閱讀:
※Caffe2 教程--5. A Toy Regression
※如何學習OpenCV
※【論文筆記】Unlabeled Samples Generated by GAN Improve the Person Re-identification Baseline in
※相關濾波之基礎框架——MOSSE
※深入理解GoogLeNet結構(原創)
TAG:深度學習DeepLearning | 目標檢測 | 計算機視覺 |