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

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

導言
目標檢測的任務是找出影象中所有感興趣的目標(物體),確定它們的位置和大小,是機器視覺領域的核
心問題之一。由於各類物體有不同的外觀,形狀,姿態,加上成像時光照,遮擋等因素的干擾,目標檢測
一直是機器視覺領域最具有挑戰性的問題。本文將針對目標檢測(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特徵計算複雜,計算速度慢;其次,人工特徵對於旋轉、拉伸、視角變化的物體檢測效果差。這些弊端很大程度上限制了演算法的應用場景。

                                                                                                   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 檢測框架圖

SPPNet和R-CNN一樣,它的訓練要經過多個階段,中間特徵也要進行儲存;backbone網路引數沿用了分類網路的初始引數,沒有針對檢測問題進行優化。

Fast RCNN

Ross Girshick 針對SPPNet做了進一步改進提出的FRCNN ,其主要創新是RoI Pooling 層,它將不同大小候選框的卷積特徵圖統一取樣成固定大小的特徵。ROI池化層的做法和SPP層類似,但只使用一個尺度進行網格劃分和池化。該層可以直接求導,訓練時直接將梯度傳導到backbone網路進行優化。FRCNN針對R-CNN和SPPNet在訓練時是多階段的和訓練的過程中很耗費時間空間的問題進行改進。將深度網路和後面的SVM分類兩個階段整合到一起,使用一個新的網路直接做分類和迴歸。使得網路在Pascal VOC上的訓練時間從R-CNN的84小時縮短到9.5小時,檢測時間更是從45秒縮短到0.32秒。