在前面幾節中,咱們已經介紹了什麼是目標檢測,以及如何進行目標檢測,還說起了滑動窗口,bounding box、以及IOU,非極大值抑制等概念。php
這裏將會綜述一下當前目標檢測的研究成果,並對幾個經典的目標檢測算法進行概述,本文內容來自基於深度學習的目標檢測,在後面幾節裏,會具體講解每一種方法。html
在深度度學習的目標檢測算法興起以前,傳統的目標檢測算法是怎樣的呢?git
傳統的目標檢測通常使用滑動窗口的框架,主要包括三個步驟:github
傳統的目標檢測中,多尺度形變部件模型DPM(Deformable Part Model)[13]是出類拔萃的,連續得到VOC(Visual Object Class)2007到2009的檢測冠軍,2010年其做者Felzenszwalb Pedro被VOC授予」終身成就獎」。DPM把物體當作了多個組成的部件(好比人臉的鼻子、嘴巴等),用部件間的關係來描述物體,這個特性很是符合天然界不少物體的非剛體特徵。DPM能夠看作是HOG+SVM的擴展,很好的繼承了二者的優勢,在人臉檢測、行人檢測等任務上取得了不錯的效果,可是DPM相對複雜,檢測速度也較慢,從而也出現了不少改進的方法。正當你們熱火朝天改進DPM性能的時候,基於深度學習的目標檢測橫空出世,迅速蓋過了DPM的風頭,不少以前研究傳統目標檢測算法的研究者也開始轉向深度學習。算法
基於深度學習的目標檢測發展起來後,其實效果也一直難以突破。好比文獻[6]中的算法在VOC 2007測試集合上的mAP只能30%多一點,文獻[7]中的OverFeat在ILSVRC 2013測試集上的mAP只能達到24.3%。2013年R-CNN誕生了,VOC 2007測試集的mAP被提高至48%,2014年時經過修改網絡結構又飆升到了66%,同時ILSVRC 2013測試集的mAP也被提高至31.4%。網絡
R-CNN是Region-based Convolutional Neural Networks的縮寫,中文翻譯是基於區域的卷積神經網絡,是一種結合區域提名(Region Proposal)和卷積神經網絡(CNN)的目標檢測方法。Ross Girshick在2013年的開山之做《Rich Feature Hierarchies for Accurate Object Detection and Semantic Segmentation》[1]奠基了這個子領域的基礎,這篇論文後續版本發表在CVPR 2014[2],期刊版本發表在PAMI 2015[3]。框架
其實在R-CNN以前已經有不少研究者嘗試用Deep Learning的方法來作目標檢測了,包括OverFeat[7],但R-CNN是第一個真正能夠工業級應用的解決方案,這也和深度學習自己的發展相似,神經網絡、卷積網絡都不是什麼新概念,但在本世紀忽然真正變得可行,而一旦可行以後再迅猛發展也不足爲奇了。機器學習
R-CNN這個領域目前研究很是活躍,前後出現了R-CNN[1,2,3,18]、SPP-net[4,19]、Fast R-CNN[14, 20] 、Faster R-CNN[5,21]、R-FCN[16,24]、YOLO[15,22]、SSD[17,23]等研究。Ross Girshick做爲這個領域的開山鼻祖老是神同樣的存在,R-CNN、Fast R-CNN、Faster R-CNN、YOLO都和他有關。這些創新的工做其實不少時候是把一些傳統視覺領域的方法和深度學習結合起來了,好比選擇性搜索(Selective Search)和圖像金字塔(Pyramid)等。函數
深度學習相關的目標檢測方法也能夠大體分爲兩派:post
目前來講,基於區域提名的方法依然佔據上風,但端到端的方法速度上優點明顯,後續的發展拭目以待。
本文做爲目標檢測的一篇回顧,先來看看目標檢測中普遍使用的區域提名——選擇性搜索,以及用深度學習作目標檢測的早期工做——Overfeat 。
目標檢測的第一步是要作區域提名(Region Proposal),也就是找出可能的感興趣區域(Region Of Interest, ROI)。區域提名相似於光學字符識別(OCR)領域的切分,OCR切分經常使用過切分方法,簡單說就是儘可能切碎到小的連通域(好比小的筆畫之類),而後再根據相鄰塊的一些形態學特徵進行合併。但目標檢測的對象相比OCR領域千差萬別,並且圖形不規則,大小不一,因此必定程度上能夠說區域提名是比OCR切分更難的一個問題。
區域提名可能的方法有:
區域提名並不僅有以上所說的三種方法,實際上這塊是很是靈活的,所以變種也不少,有興趣的讀者不妨參考一下文獻[12]。
選擇性搜索的具體算法細節[8]如算法1所示。整體上選擇性搜索是自底向上不斷合併候選區域的迭代過程。
輸入: 一張圖片 輸出:候選的目標位置集合L 算法: 1: 利用過切分方法獲得候選的區域集合R = {r1,r2,…,rn} 2: 初始化類似集合S = ϕ 3: foreach 鄰居區域對(ri,rj) do 4: 計算類似度s(ri,rj) 5: S = S ∪ s(ri,rj) 6: while S not=ϕ do 7: 獲得最大的類似度s(ri,rj)=max(S) 8: 合併對應的區域rt = ri ∪ rj 9: 移除ri對應的全部類似度:S = S\s(ri,r*) 10: 移除rj對應的全部類似度:S = S\s(r*,rj) 11: 計算rt對應的類似度集合St 12: S = S ∪ St 13: R = R ∪ rt 14: L = R中全部區域對應的邊框
從算法不難看出,R中的區域都是合併後的,所以減小了很多冗餘,至關於準確率提高了,可是別忘了咱們還須要繼續保證召回率,所以算法1中的類似度計算策略就顯得很是關鍵了。若是簡單採用一種策略很容易錯誤合併不類似的區域,好比只考慮輪廓時,不一樣顏色的區域很容易被誤合併。選擇性搜索採用多樣性策略來增長候選區域以保證召回,好比顏色空間考慮RGB、灰度、HSV及其變種等,類似度計算時既考慮顏色類似度,又考慮紋理、大小、重疊狀況等。
整體上,選擇性搜索是一種比較樸素的區域提名方法,被早期的基於深度學習的目標檢測方法(包括Overfeat和R-CNN等)普遍利用,但被當前的新方法棄用了。
OverFeat[7][9]是用CNN統一來作分類、定位和檢測的經典之做,做者是深度學習大神之一————Yann Lecun在紐約大學的團隊。OverFeat也是ILSVRC 2013任務3(分類+定位)的冠軍得主[10]。
OverFeat的核心思想有三點:
OverFeat的關鍵步驟有四步:
Overfeat是CNN用來作目標檢測的早期工做,主要思想是採用了多尺度滑動窗口來作分類、定位和檢測,雖然是多個任務但重用了模型前面幾層,這種模型重用的思路也是後來R-CNN系列不斷沿用和改進的經典作法。
固然Overfeat也是有很多缺點的,至少速度和效果都有很大改進空間,後面的R-CNN系列在這兩方面作了不少提高。
本小節主要介紹基於區域提名的方法,包括R-CNN、SPP-net、Fast R-CNN、Faster R-CNN、R-FCN。
如前面所述,早期的目標檢測,大都使用滑動窗口的方式進行窗口提名,這種方式本質是窮舉法,R-CNN[1,2,3]採用的是Selective Search。
如下是R-CNN的主要步驟:
其中目標檢測系統的結構以下圖所示,注意,圖中的第2步對應步驟中的一、2步,即包括區域提名和區域大小歸一化。
Overfeat能夠看作是R-CNN的一個特殊狀況,只須要把Selective Search換成多尺度的滑動窗口,每一個類別的邊框迴歸器換成統一的邊框迴歸器,SVM換爲多層網絡便可。可是Overfeat實際比R-CNN快9倍,這主要得益於卷積相關的共享計算。
事實上,R-CNN有不少缺點:
固然,R-CNN此次是衝着效果來的,其中ILSVRC 2013數據集上的mAP由Overfeat的24.3%提高到了31.4%,第一次有了質的改變。
SPP-net[4,19]是MSRA何愷明等人提出的,其主要思想是去掉了原始圖像上的crop/warp(裁切/扭曲)等操做,換成了在卷積特徵上的空間金字塔池化層(Spatial Pyramid Pooling,SPP),以下圖所示。爲什麼要引入SPP層 ,主要緣由是CNN的全鏈接層要求輸入圖片是大小一致的,而實際中的輸入圖片每每大小不一,若是直接縮放到同一尺寸,極可能有的物體會充滿整個圖片,而有的物體可能只能佔到圖片的一角。傳統的解決方案是進行不一樣位置的裁剪,可是這些裁剪技術均可能會致使一些問題出現,好比下圖中的crop會致使物體不全,warp致使物體被拉伸後形變嚴重,SPP就是爲了解決這種問題的。SPP對整圖提取固定維度的特徵,再把圖片均分紅4份,每份提取相同維度的特徵,再把圖片均分爲16份,以此類推,注意這裏提取固定維度的特徵,是經過對每一個網格中的每一個通道,都取出其最大值,換句話說,就是最每一個網格內的特徵作最大值池化。能夠看出,不管圖片大小如何,提取出來的維度數據都是一致的,這樣就能夠統一送至全鏈接層了。SPP思想在後來的R-CNN模型中也被普遍用到。
SPP-net的網絡結構以下圖所示,實質是最後一層卷積層後加了一個SPP層,將維度不一的卷積特徵轉換爲維度一致的全鏈接輸入。
SPP-net作目標檢測的主要步驟爲:
SPP-net解決了R-CNN區域提名時crop/warp帶來的誤差問題,提出了SPP層,使得輸入的候選框可大可小,但其餘方面依然和R-CNN同樣,於是依然存在很多問題,這就有了後面的Fast R-CNN。
Fast R-CNN是要解決R-CNN和SPP-net兩千個左右候選框帶來的重複計算問題,其主要思想爲:
以下圖所示,Fast R-CNN的主要步驟以下:
Fast R-CNN比R-CNN的訓練速度(大模型L)快8.8倍,測試時間快213倍,比SPP-net訓練速度快2.6倍,測試速度快10倍左右。
Fast R-CNN使用Selective Search來進行區域提名,速度依然不夠快。Faster R-CNN則直接利用RPN(Region Proposal Networks)網絡來計算候選框。RPN以一張任意大小的圖片爲輸入,輸出一批矩形區域提名,每一個區域對應一個目標分數和位置信息。Faster R-CNN中的RPN結構以下圖所示。
Faster R-CNN的主要步驟以下:、
總之,Faster R-CNN拋棄了Selective Search,引入了RPN網絡,使得區域提名、分類、迴歸一塊兒共用卷積特徵,從而獲得了進一步的加速。可是,Faster R-CNN須要對兩千個Anchor Box先判斷是不是目標(目標斷定),而後再進行目標識別,分紅了兩步。
前面的目標檢測方法均可以細分爲兩個子網絡:
R-FCN則將最後的全鏈接層換爲了一個位置敏感的的卷積網絡,從而讓全部計算均可以共享。具體來講,先把每一個提名區域劃分爲k×k個網格,好比R-FCN原文中k的取值爲3,則對應的九個網格分別表示:左上top-left,上中top-center,,右下bottom-right,對應下面第一張圖中的九宮格及第二張圖中的不一樣顏色的塊,每一個Grid都有對應的編碼,但預測時候會有C+1個輸出,C表示類別數目,+1是由於有背景類別,所有的輸出通道數量爲k2×(C+1)。
須要注意的是,上面兩張圖中不一樣位置都存在一個九宮格,可是Pooling時候只有一個起做用,好比bottom-right層只有右下角的小塊起做用。那麼問題來了,這一層其餘的8個框有什麼做用呢?答案是它們能夠做爲其餘ROI(偏左或偏上一些的ROI)的右下角。
R-FCN的步驟爲:
本小節介紹端到端(End-to-End)的目標檢測方法,這些方法無需區域提名,包括YOLO和SSD。
YOLO的全拼是You Only Look Once,顧名思義就是隻看一次,進一步把目標斷定和目標識別合二爲一,因此識別性能有了很大提高,達到每秒45幀,而在快速版YOLO(Fast YOLO,卷積層更少)中,能夠達到每秒155幀。
網絡的總體結構如圖所示,針對一張圖片,YOLO的處理步驟爲:
網絡的模型如圖所示,將448×448大小的圖切成S×S的網格,目標中心點所在的格子負責該目標的相關檢測,每一個網格預測B個邊框及其置信度,以及C種類別的機率。YOLO中S=7,B=2,C取決於數據集中物體類別數量,好比VOC數據集就是C=20。對VOC數據集來講,YOLO就是把圖片統一縮放到448×448,而後每張圖平均劃分爲7×7=49個小格子,每一個格子預測2個矩形框及其置信度,以及20種類別的機率。
YOLO簡化了整個目標檢測流程,速度的提高也很大,可是YOLO仍是有很多能夠改進的地方,好比S×S的網格就是一個比較啓發式的策略,若是兩個小目標同時落入一個格子中,模型也只能預測一個;另外一個問題是Loss函數對不一樣大小的bbox未作區分。
SSD[17,23]的全拼是Single Shot MultiBox Detector,衝着YOLO的缺點來的。SSD的框架如圖所示,圖(a)表示帶有兩個Ground Truth邊框的輸入圖片,圖(b)和(c)分別表示8×8網格和4×4網格,顯然前者適合檢測小的目標,好比圖片中的貓,後者適合檢測大的目標,好比圖片中的狗。在每一個格子上有一系列固定大小的Box(有點相似Anchor Box),這些在SSD稱爲Default Box,用來框定目標物體的位置,在訓練的時候Ground Truth會賦予給某個固定的Box,好比圖(b)中的藍框和圖(c)中的紅框。
SSD的網絡分爲兩部分,前面的是用於圖像分類的標準網絡(去掉了分類相關的層),後面的網絡是用於檢測的多尺度特徵映射層,從而達到檢測不一樣大小的目標。SSD和YOLO的網絡結構對好比圖所示。
SSD在保持YOLO高速的同時效果也提高不少,主要是借鑑了Faster R-CNN中的Anchor機制,同時使用了多尺度。可是從原理依然能夠看出,Default Box的形狀以及網格大小是事先固定的,那麼對特定的圖片小目標的提取會不夠好。
基於深度學習的目標檢測整體上分爲兩派:
下表大體對比了各類方法的性能(Fps,每秒幀數)和VOC 2007上的MAP對比。注意相關數據蒐集自不一樣的paper,因爲評測硬件和環境等區別,數據僅供參考,不具備絕對對比意義。
注:數據取自各自paper,因爲評測硬件和環境等區別,數據並不具備絕對對比意義,僅供參考。
Fps | VOC 2007 | |
Overfeat | 0.5 | |
R-CNN | 0.077 | 48-66% |
SPP-net | 63.1-82.4% | |
Fast R-CNN | 66.9%-70% | |
Faster R-CNN | 15(ZF Model) | 73.2%-85.6% |
R-FCN | 6 | 83.6% |
YOLO | 45-150 | 58.8% |
SSD | 58-72 | 75.1% |
基於深度學習的目標檢測的研究目前依然很是火熱,下圖爲VOC2012目標檢測排行榜[25](2016-10-18結果),很高興看到不少華人和國內同仁在這方面各領風騷。
固然,目標檢測還有很長的路要走,好比業界公認較難的小目標檢測問題。
小試身手,來一張實際的三里屯照片,YOLO的檢測結果如圖所示,能夠看出漏檢了很多目標。
再來看看下圖中SSD的效果,看起來效果好很多,但被遮擋的人仍是漏檢了。
參考文章:
[1] R. Girshick, J. Donahue, T. Darrell, J. Malik. Rich feature hierarchies for accurate object detection and semantic segmentation. ImageNet Large-Scale Visual Recognition Challenge workshop, ICCV, 2013.(R-CNN)
[3] R. Girshick, J. Donahue, T. Darrell, J. Malik. Region-Based Convolutional Networks for Accurate Object Detection and Segmentation. IEEE Transactions on Pattern Analysis and Machine Intelligence, May. 2015.(R-CNN)
[8] J.R. Uijlings, K.E. vandeSande, T. Gevers, and A.W. Smeulders. Selective search for object recognition. IJCV, 2013.(Selective Search)
[10] ILSVRC 2013 results
[12] J. Hosang, R. Benenson, P. Dolla ́r, and B. Schiele. What makes for effective detection proposals? TPAMI, 2015.(Selective Search)
[14] Girshick, R. Fast R-CNN. ICCV 2015.(R-CNN)
[18] R-CNN(代碼)
[19] SPP-net(代碼)
[20] Fast R-CNN(代碼)
[21] Faster R-CNN代碼
[22] YOLO
[23] SSD(代碼):https://pjreddie.com/darknet/yolo/(使用)
[24] R-FCN(代碼)
[25] Detection Results: VOC2012 Competition – 「comp4」 (train on own data):
[27]基於深度學習的目標檢測技術演進:R-CNN、Fast R-CNN、Faster R-CNN(強烈推薦)
[28]基於深度學習的圖像目標檢測(上)
[29]基於深度學習的圖像目標檢測(下)
[30]You Only Look Once: Unified, Real-Time Object Detection 中文版 中英文對照(YOLO)
[31]]SSD: Single Shot MultiBox Detector 中文版 中英文對照(SSD)
[32]YOLO9000: Better, Faster, Stronger 中文版 中英文對照(YOLO9000)
[33]Deformable Convolutional Networks 中文版 中英文對照(Deformable-ConvNets)
[34]Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks 中文版 中英文對照(Faster R-CNN)
[35]R-FCN: Object Detection via Region-based Fully Convolutional Networks 中文版 中英文對照(R-FCN)
[36]Feature Pyramid Networks for Object Detection 中文版 中英文對照(FPN)
[37]目標檢測論文整理