本文首先介紹目標檢測的任務,然后介紹主流的目標檢測算法或框架,重點為Faster R-CNN,SSD,YOLO三個檢測框架。
ps:由于之后可能會有一系列對象檢測的論文閱讀筆記,在論文閱讀之前,先大致了解一下目前的研究現狀,目標檢測的各種主流方法的大致原理,以助于后面能更順暢看懂論文,后續(xù)再通過論文閱讀進行細節(jié)學習。由于尚未閱讀相關論文原文,若有問題,歡迎指出!先獻上一個RCNN系列的圖(來自知乎:iker peng)。
Objection Detection Tasks
目前計算機視覺(CV,computer vision)與自然語言處理(Natural Language Process, NLP)及語音識別(Speech Recognition)并列為人工智能(AI,artificial intelligence)·機器學習(ML,machine learning)·深度學習(DL,deep learning)方向的三大熱點方向 。
而計算機視覺又有四個基本任務(關于這個任務,說法不一,比如有些地方說到對象檢測detection、對象追蹤tracking、對象分割segmentation,不用拘泥),即圖像分類,對象定位及檢測,語義分割,實例分割。圖示如下:
a)圖像分類:一張圖像中是否包含某種物體
b)物體檢測識別:若細分該任務可得到兩個子任務,即目標檢測,與目標識別,首先檢測是視覺感知得第一步,它盡可能搜索出圖像中某一塊存在目標(形狀、位置)。而目標識別類似于圖像分類,用于判決當前找到得圖像塊得目標具體是什么類別。
c)語義分割:按對象得內容進行圖像得分割,分割的依據是內容,即對象類別。
d)實例分割:按對象個體進行分割,分割的依據是單個目標。
?
不管什么任務,目標檢測應該是計算機視覺領域首先需要掌握的
Methods
傳統的計算機視覺問題的解決思路:圖像——預處理——人工特征(hand-crafted features)提取——分類。大部分研究集中在人工特征的構造和分類算法上,涌現了很多杰出的工作。但存在的問題是人工設計的特征可能適用性并不強,或者說泛化能力較弱,一類特征可能針對某類問題比較好,其他問題就效果甚微。
目前主流的深度學習解決思路:通過深度學習算法,進行端到端的解決,即輸入圖像到輸出任務結果一步完成。但其實內部它還是分stages的,通常是圖像——特征提取網絡——分類、回歸。
這里特征提取網絡即各種深度神經網絡結構,針對這一算法的研究很多,比如說各層的設計細節(jié)(激活函數,損失函數,網絡結構等)、可視化等,為了能提取更加強壯有效的特征,研究者考慮各種問題,如尺度不變性問題(通常用于解決小目標的檢測,如特征金字塔網絡,Feature Pyramid Network,FPN),整個網絡其實是分作兩類的,前N個層為第一部分,用于特征的提取,輸入的圖片,輸出的是特征圖,這與傳統的人工特征提取本質上沒有太大區(qū)別,只是提取特征的算法變成了神經網絡算法。而網絡的后K層是作為第二部分,完成具體的分類或者回歸任務,任務的輸入是前一個部分得到的特征圖,輸出是任務的結果。所以顯然后一部分其實是可以被替代的,也確實有很多框架的第二部分采用其他機器學習的算法替代,如SVM。
所以需要對自己有個認識!是做算法的研究(通常深度學習就是研究神經網絡算法,如何讓它特征提取更強大、分類更準確、速度更快,從網絡結構、loss function、activation function等入手,需要強大的數學理論)?還是解決某個具體的問題(用已有的優(yōu)秀的神經網絡算法,側重于研究解決問題的框架,當然很多時候需要對已有的算法做些微調)?
我粗淺的認為前者更純理論,后者往往以工程為依托。
針對你的任務,如何設計網絡?當面對你的實際任務時,如果你的目標是解決該任務而不是發(fā)明新算法,那么不要試圖自己設計全新的網絡結構,也不要試圖從零復現現有的網絡結構。找已經公開的實現和預訓練模型進行微調。去掉最后一個全連接層和對應softmax,加上對應你任務的全連接層和softmax,再固定住前面的層,只訓練你加的部分。如果你的訓練數據比較多,那么可以多微調幾層,甚至微調所有層。
Algorithms
目標檢測的基本思路:同時解決定位(localization) + 檢測(detection)。?
多任務學習,帶有兩個輸出分支。一個分支用于做圖像分類,即全連接+softmax判斷目標類別,和單純圖像分類區(qū)別在于這里還另外需要一個“背景”類。另一個分支用于判斷目標位置,即完成回歸任務輸出四個數字標記包圍盒位置(例如中心點橫縱坐標和包圍盒長寬),該分支輸出結果只有在分類分支判斷不為“背景”時才使用。
Region Proposal
為什么要有候選區(qū)域?既然目標是在圖像中的某一個區(qū)域,那么最直接的方法就是滑窗法(sliding window approach),就是遍歷圖像的所有的區(qū)域,用不同大小的窗口在整個圖像上滑動,那么就會產生所有的矩形區(qū)域,然后再后續(xù)排查,思路簡單,但開銷巨大。
候選區(qū)域生成算法通?;趫D像的顏色、紋理、面積、位置等合并相似的像素,最終可以得到一系列的候選矩陣區(qū)域。這些算法,如selective search或EdgeBoxes,通常只需要幾秒的CPU時間,而且,一個典型的候選區(qū)域數目是2k,相比于用滑動窗把圖像所有區(qū)域都滑動一遍,基于候選區(qū)域的方法十分高效。另一方面,這些候選區(qū)域生成算法的查準率(precision)一般,但查全率(recall)通常比較高,這使得我們不容易遺漏圖像中的目標。
Selective Search
“Segmentation as selective search for object recognition?”,ICCV,2011.
“Selective search for object recognition.” International journal of computer vision ,2013
論文應該是有兩部分內容,一部分是Selective Search的方法尋找候選區(qū)域,第二部分為該區(qū)域上的特征提取及后續(xù)的分類。由于目前特征提取和分類都采用了深度學習方法,所以只是借鑒其候選區(qū)尋找算法Selective Search。
將圖像劃分成很多的小區(qū)域(regions)
如何將圖像劃分成很多的小區(qū)域? 劃分的方式應該有很多種,比如:
1)等間距劃分grid cell,這樣劃分出來的區(qū)域每個區(qū)域的大小相同,但是每個區(qū)域里面包含的像素分布不均勻,隨機性大;同時,不能滿足目標多尺度的要求(當然,可以用不同的尺度劃分grid cell,這稱為Exhaustive Search, 計算復雜度太大)!
2)使用邊緣保持超像素劃分;
3)使用本文提出的Selective Search(SS)的方法來找到最可能的候選區(qū)域;
其實這一步可以看做是對圖像的過分割,都是過分割,本文SS方法的過人之處在于預先劃分的區(qū)域什么大小的都有(滿足目標多尺度的要求),而且對過分割的區(qū)域還有一個合并的過程(區(qū)域的層次聚類),最后剩下的都是那些最可能的候選區(qū)域,然后在這些已經過濾了一遍的區(qū)域上進行后續(xù)的識別等處理,這樣的話,將會大大減小候選區(qū)域的數目,提供了算法的速度.
下圖說明目標的多尺度:
總體思路:假設現在圖像上有n個預分割的區(qū)域,表示為R={R1, R2, …, Rn}, 計算每個region與它相鄰region(注意是相鄰的區(qū)域)的相似度,這樣會得到一個n*n的相似度矩陣(同一個區(qū)域之間和一個區(qū)域與不相鄰區(qū)域之間的相似度可設為NaN),從矩陣中找出最大相似度值對應的兩個區(qū)域,將這兩個區(qū)域合二為一,這時候圖像上還剩下n-1個區(qū)域; 重復上面的過程(只需要計算新的區(qū)域與它相鄰區(qū)域的新相似度,其他的不用重復計算),重復一次,區(qū)域的總數目就少1,知道最后所有的區(qū)域都合并稱為了同一個區(qū)域(即此過程進行了n-1次,區(qū)域總數目最后變成了1).算法的流程圖如下圖所示:
step0:生成區(qū)域集R,具體參見論文《Efficient Graph-Based Image Segmentation》,基于圖的圖像分割,也就是說起點還是圖像分割
step1:計算區(qū)域集R里每個相鄰區(qū)域的相似度S={s1,s2,…}
step2:找出相似度最高的兩個區(qū)域,將其合并為新集,添加進R
step3:從S中移除所有與step2中有關的子集
step4:計算新集與所有子集的相似度
step5:跳至step2,直至S為空
相似度計算:論文從四個方面考慮相似度度量——顏色、紋理、尺寸和空間交疊
EdgeBoxes
Edge Boxes: Locating Object Proposals from Edges ,ECCV2014
文章沒有涉及到“機器學習”,采用的是純圖像的方法。
研究方法:利用邊緣信息(Edge),確定box內的輪廓個數和與box邊緣重疊的edge個數(知道一個box內完全包含的輪廓個數,那么目標有很大可能性,就在這個box中),基于此對box進行評分,進一步根據得分的高低順序確定proposal信息(由大小,長寬比,位置構成)。而后續(xù)工作就是在proposal內部運行相關檢測算法。
matlab 代碼:https://github.com/pdollar/edges
建議參考博客:《Edge Boxes: Locating Object Proposals from Edges》讀后感 :https://blog.csdn.net/wsj998689aa/article/details/39476551
R-CNN
“Rich feature hierarchies for accurate object detection and semantic segmentation.” CVPR 2014
卷積神經網絡進入目標識別的里程碑,R-CNN,直接看圖了解其結構!?
?
流程:原圖——Selective Search得到2K Proposal Regions —— Warpped image region(?) —— ConvNet —— 分類(svm) + 回歸(bounding box regression)?。
這里的Warpped Image Region應該是一種類似resize的操作,將不同大小的proposal region統一到相同的尺寸,用以輸入相同的ConvNet,上面的Convnet是相同的,但SVM分類器是針對每一個類別單獨訓練好的,是不同的分類器。
R-CNN,是基于這樣一種非常簡單的想法,對于輸入圖像,通過selective search方法,先確定出例如2000個最有可能包含物體的窗口,對于這2000個窗口,我們希望它能夠對待檢測物體達到非常高的召回率。然后對這2000個中的每一個去用CNN進行特征提取和分類。對這2000個區(qū)域都要去跑一次CNN,那么它的速度是非常慢的,即使每次只需要0.5秒,2000個窗口的話也是需要1000秒,為了加速2014年的時候何凱明提出了SPP-net,其做法是對整個圖跑一次CNN,而不需要每一個窗口單獨做,但是這樣有一個小困難,就是這2000個候選窗口每一個的大小都不一樣,為了解決這個問題,SPP-net設計了spatial pyramid pooling,使得不同大的小窗口具有相同維度的特征。這個方法使得檢測時不需要對每一個候選窗口去計算卷積,但是還是不夠快,檢測一張圖像還是需要幾秒的時間。
存在的不足:
1)多個候選區(qū)域對應的圖像需要預先提取,占用較大的磁盤空間;
2)針對傳統CNN需要固定尺寸的輸入圖像,crop/warp(歸一化)產生物體截斷或拉伸,會導致輸入CNN的信息丟失;
3)每一個ProposalRegion都需要進入CNN網絡計算,上千個Region存在大量的范圍重疊,重復的特征提取帶來巨大的計算浪費。
SPP-Net
Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition,ECCV 2014,Kaiming He
各個Proposal Region大小不一,全圖只卷積一次的話,就不需要經過Wrapp,在特征圖上找這些Region的時候還是存在大小不一的問題,由于維度不同,后面的全連接層FC的輸入無法統一,故采用SPP,空間金字塔池化,這樣不同尺寸的Region通過不同金字塔池化層,從而得到統一維度的輸出,加速算法同時,兼顧了尺度問題。
在R-CNN中,要求輸入固定大小的圖片,因此需要對圖片進行crop、wrap變換,改變尺寸引起的形變影響檢測效果。此外,對每一個圖像中每一個proposal進行一遍CNN前向特征提取,如果是2000個propsal,需要2000次前向CNN特征提取,這無疑將浪費很多時間。
該論文對R-CNN中存在的缺點進行了改進,基本思想是,輸入整張圖像,提取出整張圖像的特征圖,然后利用空間關系從整張圖像的特征圖中,在spatial pyramid pooling layer提取各個region proposal的特征。
1)取消了crop/warp圖像歸一化過程,解決圖像變形導致的信息丟失以及存儲問題;
2)采用空間金字塔池化(SpatialPyramid Pooling )替換了 全連接層之前的最后一個池化層(上圖top),翠平說這是一個新詞,我們先認識一下它。
SPP主要有兩個特點:
結合空間金字塔方法實現CNNs的對尺度輸入。?
一般CNN后接全連接層或者分類器,他們都需要固定的輸入尺寸,因此不得不對輸入數據進行crop或者warp,這些預處理會造成數據的丟失或幾何的失真。SPP Net的第一個貢獻就是將金字塔思想加入到CNN,實現了數據的多尺度輸入。
如下圖所示,在卷積層和全連接層之間加入了SPP layer。此時網絡的輸入可以是任意尺度的,在SPP layer中每一個pooling的filter會根據輸入調整大小,而SPP的輸出尺度始終是固定的。
只對原圖提取一次卷積特征
在R-CNN中,每個候選框先resize到統一大小,然后分別作為CNN的輸入,這樣是很低效的。所以SPP Net根據這個缺點做了優(yōu)化:只對原圖進行一次卷積得到整張圖的feature map,然后找到每個候選框在feature map上的映射patch,將此patch作為每個候選框的卷積特征輸入到SPP layer和之后的層。節(jié)省了大量的計算時間,比R-CNN有一百倍左右的提速。
存在的不足:
1)和RCNN一樣,訓練過程仍然是隔離的,提取候選框 | 計算CNN特征| SVM分類 | Bounding Box回歸獨立訓練,大量的中間結果需要轉存,無法整體訓練參數;
2)SPP-Net在無法同時Tuning在SPP-Layer兩邊的卷積層和全連接層,很大程度上限制了深度CNN的效果;
3)在整個過程中,Proposal Region仍然很耗時。
Fast R-CNN
“Fast r-cnn.” ICCV 2015. Girshick, Ross.
R-CNN的進階版Fast R-CNN就是在RCNN的基礎上采納了SPP Net方法,對RCNN作了改進,使得性能進一步提高。
Fast R-CNN借鑒了SPP-net的做法,在全圖上進行卷積,然后采用ROI-pooling得到定長的特征向量,例如不管窗口大小是多少,轉換成7x7這么大。Fast R-CNN還引入了一個重要的策略,在對窗口進行分類的同時,還會對物體的邊框進行回歸,使得檢測框更加準確。前面我們說候選窗口會有非常高的召回率,但是可能框的位置不是很準,例如一個人體框可能是缺胳膊缺腿,那么通過回歸就能夠對檢測框進行校準,在初始的位置上求精。Fast R-CNN把分類和回歸放在一起來做,采用了多任務協同學習的方式。
ROI Pooling(region of interest pooling?)
興趣區(qū)域匯合旨在由任意大小的候選區(qū)域對應的局部卷積特征提取得到固定大小的特征,這是因為下一步的兩分支網絡由于有全連接層,需要其輸入大小固定。其做法是,先將候選區(qū)域投影到卷積特征上,再把對應的卷積特征區(qū)域空間上劃分成固定數目的網格(數目根據下一步網絡希望的輸入大小確定,例如VGGNet需要7×7的網格),最后在每個小的網格區(qū)域內進行最大匯合,以得到固定大小的匯合結果。和經典最大匯合一致,每個通道的興趣區(qū)域匯合是獨立的。?
Faster R-CNN
Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks,NIPS 2015
之前的Fast R-CNN已經基本實現端到端的檢測,而主要的速度瓶頸是在Selective Search算法實現的Region Proposal,故到了Faster R-CNN,主要是解決Region Proposal問題,以實現Real-Time檢測。Faster R-CNN的主要思路是,既然檢測工作是在卷積的結果Feature Map上做的,那么候選區(qū)域的選取是否也能在Feature Map上做?于是RPN網絡(Region Proposal Network)應運而生。
候選框提取不一定要在原圖上做,特征圖上同樣可以,低分辨率特征圖意味著更少的計算量,基于這個假設,MSRA的任少卿等人提出RPN(RegionProposal Network),整體架構如下圖所示
通過添加額外的RPN分支網絡,將候選框提取合并到深度網絡中,這正是Faster-RCNN里程碑式的貢獻 !
RPN引入了所謂anchor box的設計,具體來說,RPN在最后一個卷積層輸出的特征圖上,先用3x3的卷積得到每個位置的特征向量,然后基于這個特征向量去回歸9個不同大小和長寬比的窗口,如果特征圖的大小是40x60,那么總共就會有大約2萬多個窗口,把這些窗口按照信度進行排序,然后取前300個作為候選窗口,送去做最終的分類 。
Faster實現了端到端的檢測,并且?guī)缀踹_到了效果上的最優(yōu),但小物體的識別還存在問題,故SSD算法誕生;速度方向的改進仍有余地,于是YOLO誕生了。
SSD
SSD算法是一種直接預測目標類別和bounding box的多目標檢測算法。與faster rcnn相比,該算法沒有生成 proposal 的過程,這就極大提高了檢測速度。針對不同大小的目標檢測,傳統的做法是先將圖像轉換成不同大?。▓D像金字塔),然后分別檢測,最后將結果綜合起來(NMS)。而SSD算法則利用不同卷積層的?feature map?進行綜合也能達到同樣的效果。算法的主網絡結構是VGG16,將最后兩個全連接層改成卷積層,并隨后增加了4個卷積層來構造網絡結構。對其中5種不同的卷積層的輸出(feature map)分別用兩個不同的?3×3?的卷積核進行卷積,一個輸出分類用的confidence,每個default box?生成21個類別confidence;一個輸出回歸用的?localization,每個?default box?生成4個坐標值(x, y, w, h)。此外,這5個feature map還經過?PriorBox?層生成?prior box(生成的是坐標)。上述5個feature map中每一層的default box的數量是給定的(8732個)。最后將前面三個計算結果分別合并然后傳給loss層。
YOLO
2015年出現了一個名為YOLO的方法,其最終發(fā)表在CVPR 2016上。這是一個蠻奇怪的方法,對于給定的輸入圖像,YOLO不管三七二十一最終都劃分出7x7的網格,也就是得到49個窗口,然后在每個窗口中去預測兩個矩形框。這個預測是通過全連接層來完成的,YOLO會預測每個矩形框的4個參數和其包含物體的信度,以及其屬于每個物體類別的概率。YOLO的速度很快,在GPU上可以達到45fps。
YOLO的處理步驟為:把輸入圖片縮放到448×448大??;運行卷積網絡;對模型置信度卡閾值,得到目標位置與類別。對VOC數據集來說,YOLO就是把圖片統一縮放到448×448,然后每張圖平均劃分為7×7=49個小格子,每個格子預測2個矩形框及其置信度,以及20種類別的概率。舍棄了Region proposal階段,加快了速度,但是定位精度比較低,與此同時帶來的問題是,分類的精度也比較低。在各類數據集上的平均表現大概為54.5%mAP。
總結一下RCNN系列算法的步驟:
RCNN
在圖像中確定約1000-2000個候選框 (使用選擇性搜索)
每個候選框內圖像塊縮放至相同大小,并輸入到CNN內進行特征提取
對候選框中提取出的特征,使用分類器判別是否屬于一個特定類
對于屬于某一特征的候選框,用回歸器進一步調整其位置
Fast RCNN
在圖像中確定約1000-2000個候選框 (使用選擇性搜索)
對整張圖片輸進CNN,得到feature map
找到每個候選框在feature map上的映射patch,將此patch作為每個候選框的卷積特征輸入到SPP layer和之后的層
對候選框中提取出的特征,使用分類器判別是否屬于一個特定類
對于屬于某一特征的候選框,用回歸器進一步調整其位置
Faster RCNN
對整張圖片輸進CNN,得到feature map
卷積特征輸入到RPN,得到候選框的特征信息
對候選框中提取出的特征,使用分類器判別是否屬于一個特定類
對于屬于某一特征的候選框,用回歸器進一步調整其位置
三者比較
方法 | 創(chuàng)新 | 缺點 | 改進 |
---|---|---|---|
R-CNN (Region-based Convolutional Neural Networks) | 1、SS提取RP;2、CNN提取特征;3、SVM分類;4、BB盒回歸。 | 1、 訓練步驟繁瑣(微調網絡+訓練SVM+訓練bbox);2、 訓練、測試均速度慢 ;3、 訓練占空間 | 1、 從DPM HSC的34.3%直接提升到了66%(mAP);2、 引入RP+CNN |
Fast R-CNN (Fast Region-based Convolutional Neural Networks) | 1、SS提取RP;2、CNN提取特征;3、softmax分類;4、多任務損失函數邊框回歸。 | 1、 依舊用SS提取RP(耗時2-3s,特征提取耗時0.32s);2、 無法滿足實時應用,沒有真正實現端到端訓練測試;3、 利用了GPU,但是區(qū)域建議方法是在CPU上實現的。 | 1、 由66.9%提升到70%;2、 每張圖像耗時約為3s。 |
Faster R-CNN (Fast Region-based Convolutional Neural Networks) | 1、RPN提取RP;2、CNN提取特征;3、softmax分類;4、多任務損失函數邊框回歸。 | 1、 還是無法達到實時檢測目標;2、 獲取region proposal,再對每個proposal分類計算量還是比較大。 | 1、 提高了檢測精度和速度;2、 真正實現端到端的目標檢測框架;3、 生成建議框僅需約10ms。 |
編輯:黃飛
?
評論
查看更多