1. 程式人生 > >Deep Learning回顧之基於深度學習的目標檢測

Deep Learning回顧之基於深度學習的目標檢測

轉自:https://www.52ml.net/20287.html

引言

普通的深度學習監督演算法主要是用來做分類,如圖1(1)所示,分類的目標是要識別出圖中所示是一隻貓。而在ILSVRC(ImageNet Large Scale Visual Recognition Challenge)競賽以及實際的應用中,還包括目標定位和目標檢測等任務。其中目標定位是不僅僅要識別出來是什麼物體(即分類),而且還要預測物體的位置,位置一般用邊框(bounding box)標記,如圖1(2)所示。而目標檢測實質是多目標的定位,即要在圖片中定位多個目標物體,包括分類和定位。比如對圖1(3)進行目標檢測,得到的結果是好幾只不同動物,他們的位置如圖3中不同顏色的框所示。

 picture1  picture2  picture3

(1)目標分類

(2)目標定位

(3)目標檢測

圖1 目標分類、定位、檢測示例

簡單來說,分類、定位和檢測的區別如下:

  1. 分類:是什麼?
  2. 定位:在哪裡?是什麼?(單個目標)
  3. 檢測:在哪裡?分別是什麼?(多個目標)

目標檢測對於人類來說並不困難,通過對圖片中不同顏色模組的感知很容易定位並分類出其中目標物體,但對於計算機來說,面對的是RGB畫素矩陣,很難從影象中直接得到狗和貓這樣的抽象概念並定位其位置,再加上有時候多個物體和雜亂的背景混雜在一起,目標檢測更加困難。但這難不倒科學家們,在傳統視覺領域,目標檢測就是一個非常熱門的研究方向,一些特定目標的檢測,比如人臉檢測和行人檢測已經有非常成熟的技術了。普通的目標檢測也有過很多的嘗試,但是效果總是差強人意。

傳統的目標檢測一般使用滑動視窗的框架,主要包括三個步驟:

  1. 利用不同尺寸的滑動視窗框住圖中的某一部分作為候選區域;
  2. 提取候選區域相關的視覺特徵。比如人臉檢測常用的Harr特徵;行人檢測和普通目標檢測常用的HOG特徵等;
  3. 利用分類器進行識別,比如常用的SVM模型。

傳統的目標檢測中,多尺度形變部件模型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)等。

深度學習相關的目標檢測方法也可以大致分為兩派:

  1. 基於區域提名的,如R-CNN、SPP-net、Fast R-CNN、Faster R-CNN、R-FCN;
  2. 端到端(End-to-End),無需區域提名的,如YOLO、SSD。

目前來說,基於區域提名的方法依然佔據上風,但端到端的方法速度上優勢明顯,後續的發展拭目以待。

1.1 相關研究

本文作為目標檢測的一篇回顧,先來看看目標檢測中廣泛使用的區域提名——選擇性搜尋,以及用深度學習做目標檢測的早期工作——Overfeat 。

1.1.1 選擇性搜尋

目標檢測的第一步是要做區域提名(Region Proposal),也就是找出可能的感興趣區域(Region Of Interest, ROI)。區域提名類似於光學字元識別(OCR)領域的切分,OCR切分常用過切分方法,簡單說就是儘量切碎到小的連通域(比如小的筆畫之類),然後再根據相鄰塊的一些形態學特徵進行合併。但目標檢測的物件相比OCR領域千差萬別,而且圖形不規則,大小不一,所以一定程度上可以說區域提名是比OCR切分更難的一個問題。

區域提名可能的方法有:

一、滑動視窗。滑動視窗本質上就是窮舉法,利用不同的尺度和長寬比把所有可能的大大小小的塊都窮舉出來,然後送去識別,識別出來概率大的就留下來。很明顯,這樣的方法複雜度太高,產生了很多的冗餘候選區域,在現實當中不可行。

二、規則塊。在窮舉法的基礎上進行了一些剪枝,只選用固定的大小和長寬比。這在一些特定的應用場景是很有效的,比如拍照搜題APP小猿搜題中的漢字檢測,因為漢字方方正正,長寬比大多比較一致,因此用規則塊做區域提名是一種比較合適的選擇。但是對於普通的目標檢測來說,規則塊依然需要訪問很多的位置,複雜度高。

三、選擇性搜尋。從機器學習的角度來說,前面的方法召回是不錯了,但是精度差強人意,所以問題的核心在於如何有效地去除冗餘候選區域。其實冗餘候選區域大多是發生了重疊,選擇性搜尋利用這一點,自底向上合併相鄰的重疊區域,從而減少冗餘。

區域提名並不只有以上所說的三種方法,實際上這塊是非常靈活的,因此變種也很多,有興趣的讀者不妨參考一下文獻[12]。

選擇性搜尋的具體演算法細節[8]如演算法1所示。總體上選擇性搜尋是自底向上不斷合併候選區域的迭代過程。

輸入: 一張圖片

輸出:候選的目標位置集合L

演算法:

1: 利用過切分方法得到候選的區域集合= {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 = r 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中所有區域對應的邊框

演算法1 選擇性搜尋演算法

從演算法不難看出,R中的區域都是合併後的,因此減少了不少冗餘,相當於準確率提升了,但是別忘了我們還需要繼續保證召回率,因此演算法1中的相似度計算策略就顯得非常關鍵了。如果簡單採用一種策略很容易錯誤合併不相似的區域,比如只考慮輪廓時,不同顏色的區域很容易被誤合併。選擇性搜尋採用多樣性策略來增加候選區域以保證召回,比如顏色空間考慮RGB、灰度、HSV及其變種等,相似度計算時既考慮顏色相似度,又考慮紋理、大小、重疊情況等。

總體上,選擇性搜尋是一種比較樸素的區域提名方法,被早期的基於深度學習的目標檢測方法(包括Overfeat和R-CNN等)廣泛利用,但被當前的新方法棄用了。

1.1.2 OverFeat

OverFeat[7][9]是用CNN統一來做分類、定位和檢測的經典之作,作者是深度學習大神之一————Yann Lecun在紐約大學的團隊。OverFeat也是ILSVRC 2013任務3(分類+定位)的冠軍得主[10]

OverFeat的核心思想有三點:

  1. 區域提名:結合滑動視窗和規則塊,即多尺度(multi-scale)的滑動視窗;
  2. 分類和定位:統一用CNN來做分類和預測邊框位置,模型與AlexNet[12]類似,其中1-5層為特徵抽取層,即將圖片轉換為固定維度的特徵向量,6-9層為分類層(分類任務專用),不同的任務(分類、定位、檢測)公用特徵抽取層(1-5層),只替換6-9層;
  3. 累積:因為用了滑動視窗,同一個目標物件會有多個位置,也就是多個視角;因為用了多尺度,同一個目標物件又會有多個大小不一的塊。這些不同位置和不同大小塊上的分類置信度會進行累加,從而使得判定更為準確。

OverFeat的關鍵步驟有四步:

  1. 利用滑動視窗進行不同尺度的區域提名,然後使用CNN模型對每個區域進行分類,得到類別和置信度。從圖2中可以看出,不同縮放比例時,檢測出來的目標物件數量和種類存在較大差異;

picture2

圖2 Overfeat關鍵步驟一

  1. 利用多尺度滑動視窗來增加檢測數量,提升分類效果,如圖3所示;

picture3
圖3 Overfeat關鍵步驟二

  1. 用迴歸模型預測每個物件的位置,從圖4中來看,放大比例較大的圖片,邊框數量也較多;

picture4
圖4 Overfeat關鍵步驟三

  1. 邊框合併。

picture5
圖5 Overfeat關鍵步驟四

Overfeat是CNN用來做目標檢測的早期工作,主要思想是採用了多尺度滑動視窗來做分類、定位和檢測,雖然是多個任務但重用了模型前面幾層,這種模型重用的思路也是後來R-CNN系列不斷沿用和改進的經典做法。

當然Overfeat也是有不少缺點的,至少速度和效果都有很大改進空間,後面的R-CNN系列在這兩方面做了很多提升。

1.2 基於區域提名的方法

本小節主要介紹基於區域提名的方法,包括R-CNN、SPP-net、Fast R-CNN、Faster R-CNN、R-FCN。

1.2.1  R-CNN

如前面所述,早期的目標檢測,大都使用滑動視窗的方式進行視窗提名,這種方式本質是窮舉法,R-CNN[1,2,3]採用的是Selective Search。

以下是R-CNN的主要步驟:

  1. 區域提名:通過Selective Search從原始圖片提取2000個左右區域候選框;
  2. 區域大小歸一化:把所有侯選框縮放成固定大小(原文采用227×227);
  3. 特徵提取:通過CNN網路,提取特徵;
  4. 分類與迴歸:在特徵層的基礎上新增兩個全連線層,再用SVM分類來做識別,用線性迴歸來微調邊框位置與大小,其中每個類別單獨訓練一個邊框迴歸器。

其中目標檢測系統的結構如圖6所示,注意,圖中的第2步對應步驟中的1、2步,即包括區域提名和區域大小歸一化。

picture6

圖6 R-CNN框架

Overfeat可以看做是R-CNN的一個特殊情況,只需要把Selective Search換成多尺度的滑動視窗,每個類別的邊框迴歸器換成統一的邊框迴歸器,SVM換為多層網路即可。但是Overfeat實際比R-CNN快9倍,這主要得益於卷積相關的共享計算。

事實上,R-CNN有很多缺點:

  1. 重複計算:R-CNN雖然不再是窮舉,但依然有兩千個左右的候選框,這些候選框都需要進行CNN操作,計算量依然很大,其中有不少其實是重複計算;
  2. SVM模型:而且還是線性模型,在標註資料不缺的時候顯然不是最好的選擇;
  3. 訓練測試分為多步:區域提名、特徵提取、分類、迴歸都是斷開的訓練的過程,中間資料還需要單獨儲存;
  4. 訓練的空間和時間代價很高:卷積出來的特徵需要先存在硬碟上,這些特徵需要幾百G的儲存空間;
  5. 慢:前面的缺點最終導致R-CNN出奇的慢,GPU上處理一張圖片需要13秒,CPU上則需要53秒[2]

當然,R-CNN這次是衝著效果來的,其中ILSVRC 2013資料集上的mAP由Overfeat的24.3%提升到了31.4%,第一次有了質的改變。

1.2.2  SPP-net

SPP-net[4,19]是MSRA何愷明等人提出的,其主要思想是去掉了原始影象上的crop/warp等操作,換成了在卷積特徵上的空間金字塔池化層(Spatial Pyramid Pooling,SPP),如圖7所示。為何要引入SPP層 ,主要原因是CNN的全連線層要求輸入圖片是大小一致的,而實際中的輸入圖片往往大小不一,如果直接縮放到同一尺寸,很可能有的物體會充滿整個圖片,而有的物體可能只能佔到圖片的一角。傳統的解決方案是進行不同位置的裁剪,但是這些裁剪技術都可能會導致一些問題出現,比如圖7中的crop會導致物體不全,warp導致物體被拉伸後形變嚴重,SPP就是為了解決這種問題的。SPP對整圖提取固定維度的特徵,再把圖片均分成4份,每份提取相同維度的特徵,再把圖片均分為16份,以此類推。可以看出,無論圖片大小如何,提取出來的維度資料都是一致的,這樣就可以統一送至全連線層了。SPP思想在後來的R-CNN模型中也被廣泛用到。

picture7

圖7 傳統crop/warp結構和空間金字塔池化網路的對比

SPP-net的網路結構如圖8所示,實質是最後一層卷積層後加了一個SPP層,將維度不一的卷積特徵轉換為維度一致的全連線輸入。

picture8

圖8 SPP-net網路結構

SPP-net做目標檢測的主要步驟為:

  1. 區域提名:用Selective Search從原圖中生成2000個左右的候選視窗;
  2. 區域大小縮放:SPP-net不再做區域大小歸一化,而是縮放到min(wh)=s,即統一長寬的最短邊長度,s選自{480,576,688,864,1200}中的一個,選擇的標準是使得縮放後的候選框大小與224×224最接近;
  3. 特徵提取:利用SPP-net網路結構提取特徵;
  4. 分類與迴歸:類似R-CNN,利用SVM基於上面的特徵訓練分類器模型,用邊框迴歸來微調候選框的位置。

SPP-net解決了R-CNN區域提名時crop/warp帶來的偏差問題,提出了SPP層,使得輸入的候選框可大可小,但其他方面依然和R-CNN一樣,因而依然存在不少問題,這就有了後面的Fast R-CNN。

1.2.3  Fast R-CNN

Fast R-CNN是要解決R-CNN和SPP-net兩千個左右候選框帶來的重複計算問題,其主要思想為:

  1. 使用一個簡化的SPP層 —— RoI(Region of Interesting) Pooling層,操作與SPP類似;
  2. 訓練和測試是不再分多步:不再需要額外的硬碟來儲存中間層的特徵,梯度能夠通過RoI Pooling層直接傳播;此外,分類和迴歸用Multi-task的方式一起進行;
  3. SVD:使用SVD分解全連線層的引數矩陣,壓縮為兩個規模小很多的全連線層。

如圖9所示,Fast R-CNN的主要步驟如下:

  1. 特徵提取:以整張圖片為輸入利用CNN得到圖片的特徵層;
  2. 區域提名:通過Selective Search等方法從原始圖片提取區域候選框,並把這些候選框一一投影到最後的特徵層;
  3. 區域歸一化:針對特徵層上的每個區域候選框進行RoI Pooling操作,得到固定大小的特徵表示;
  4. 分類與迴歸:然後再通過兩個全連線層,分別用softmax多分類做目標識別,用迴歸模型進行邊框位置與大小微調。

picture9

圖9 Fast R-CNN框架

Fast R-CNN比R-CNN的訓練速度(大模型L)快8.8倍,測試時間快213倍,比SPP-net訓練速度快2.6倍,測試速度快10倍左右。

picture10

圖10 Fast R-CNN, R-CNN, SPP-net的執行時間比較

1.2.4 Faster R-CNN

Fast R-CNN使用Selective Search來進行區域提名,速度依然不夠快。Faster R-CNN則直接利用RPN(Region Proposal Networks)網路來計算候選框。RPN以一張任意大小的圖片為輸入,輸出一批矩形區域提名,每個區域對應一個目標分數和位置資訊。Faster R-CNN中的RPN接面構如圖11所示。

picture11

圖11 Region Proposal Network(RPN)

Faster R-CNN的主要步驟如下:

  1. 特徵提取:同Fast R-CNN,以整張圖片為輸入,利用CNN得到圖片的特徵層;
  2. 區域提名:在最終的卷積特徵層上利用k個不同的矩形框(Anchor Box)進行提名,k一般取9;
  3. 分類與迴歸:對每個Anchor Box對應的區域進行object/non-object二分類,並用k個迴歸模型(各自對應不同的Anchor Box)微調候選框位置與大小,最後進行目標分類。

總之,Faster R-CNN拋棄了Selective Search,引入了RPN網路,使得區域提名、分類、迴歸一起共用卷積特徵,從而得到了進一步的加速。但是,Faster R-CNN需要對兩萬個Anchor Box先判斷是否是目標(目標判定),然後再進行目標識別,分成了兩步。

1.2.5 R-FCN

前面的目標檢測方法都可以細分為兩個子網路:

  1. 共享的全卷積網路;
  2. 不共享計算的ROI相關的子網路(比如全連線網路)。

R-FCN則將最後的全連線層之類換為了一個位置敏感的的卷積網路,從而讓所有計算都可以共享。具體來說,先把每個提名區域劃分為k×k個網格,比如R-FCN原文中k的取值為3,則對應的九個網格分別表示:左上top-left,上中top-center,……,右下bottom-right,對應圖12中的九宮格及圖13中的不同顏色的塊,每個Grid都有對應的編碼,但預測時候會有C+1個輸出,C表示類別數目,+1是因為有背景類別,全部的輸出通道數量為k2×(C+1)。

picture12

圖12 R-FCN的person分類視覺化過程

picture13

圖13 R-FCN

需要注意的是,圖12、13中不同位置都存在一個九宮格,但是Pooling時候只有一個起作用,比如bottom-right層只有右下角的小塊起作用。那麼問題來了,這一層其他的8個框有什麼作用呢?答案是它們可以作為其他ROI(偏左或偏上一些的ROI)的右下角。

R-FCN的步驟為:

  1. 區域提名:使用RPN(Region Proposal Network,區域提名網路),RPN本身是全卷積網路結構;
  2. 分類與迴歸:利用和RPN共享的特徵進行分類。當做bbox迴歸時,則將C設定為4。

1.3 端到端的方法

本小節介紹端到端(End-to-End)的目標檢測方法,這些方法無需區域提名,包括YOLO和SSD。

1.3.1 YOLO

YOLO的全拼是You Only Look Once,顧名思義就是隻看一次,進一步把目標判定和目標識別合二為一,所以識別效能有了很大提升,達到每秒45幀,而在快速版YOLO(Fast YOLO,卷積層更少)中,可以達到每秒155幀。

網路的整體結構如圖14所示,針對一張圖片,YOLO的處理步驟為:

  1. 把輸入圖片縮放到448×448大小;
  2. 運行卷積網路;
  3. 對模型置信度卡閾值,得到目標位置與類別。

picture14

圖14 YOLO檢測系統

網路的模型如圖15所示,將448×448大小的圖切成S×S的網格,目標中心點所在的格子負責該目標的相關檢測,每個網格預測B個邊框及其置信度,以及C種類別的概率。YOLO中S=7,B=2,C取決於資料集中物體類別數量,比如VOC資料集就是C=20。對VOC資料集來說,YOLO就是把圖片統一縮放到448×448,然後每張圖平均劃分為7×7=49個小格子,每個格子預測2個矩形框及其置信度,以及20種類別的概率。

picture15

圖15 YOLO模型

YOLO簡化了整個目標檢測流程,速度的提升也很大,但是YOLO還是有不少可以改進的地方,比如S×S的網格就是一個比較啟發式的策略,如果兩個小目標同時落入一個格子中,模型也只能預測一個;另一個問題是Loss函式對不同大小的bbox未做區分。

1.3.2 SSD

SSD[17,23]的全拼是Single Shot MultiBox Detector,衝著YOLO的缺點來的。SSD的框架如圖16所示,圖16(a)表示帶有兩個Ground Truth邊框的輸入圖片,圖16(b)和(c)分別表示8×8網格和4×4網格,顯然前者適合檢測小的目標,比如圖片中的貓,後者適合檢測大的目標,比如圖片中的狗。在每個格子上有一系列固定大小的Box(有點類似前面提到的Anchor Box),這些在SSD稱為Default Box,用來框定目標物體的位置,在訓練的時候Ground Truth會賦予給某個固定的Box,比如圖16(b)中的藍框和圖16(c)中的紅框。

picture16

圖16 SSD框架

SSD的網路分為兩部分,前面的是用於影象分類的標準網路(去掉了分類相關的層),後面的網路是用於檢測的多尺度特徵對映層,從而達到檢測不同大小的目標。SSD和YOLO的網路結構對比如圖17所示。

picture17

圖17 SSD和YOLO的網路結構對比

SSD在保持YOLO高速的同時效果也提升很多,主要是借鑑了Faster R-CNN中的Anchor機制,同時使用了多尺度。但是從原理依然可以看出,Default Box的形狀以及網格大小是事先固定的,那麼對特定的圖片小目標的提取會不夠好。

1.4 總結

基於深度學習的目標檢測總體上分為兩派:

  1. 基於區域提名的R-CNN系列;
  2. 無需區域提名的YOLO、SSD系列。

表1大致對比了各種方法的效能(Fps,每秒幀數)和VOC 2007上的MAP對比。注意相關資料蒐集自不同的paper,由於評測硬體和環境等區別,資料僅供參考,不具有絕對對比意義。

表1 不同目標檢測演算法的指標對比

注:資料取自各自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%

基於深度學習的目標檢測的研究目前依然非常火熱,圖18為VOC2012目標檢測排行榜[25](2016-10-18結果),很高興看到很多華人和國內同仁在這方面各領風騷。

picture18

圖18 VOC2012目標檢測排行榜

當然,目標檢測還有很長的路要走,比如業界公認較難的小目標檢測問題。

小試身手,來一張實際的三里屯照片,YOLO的檢測結果如圖19所示,可以看出漏檢了不少目標。

picture19

圖19 YOLO檢測結果

再來看看圖20中SSD的效果,看起來效果好不少,但被遮擋的人還是漏檢了。

picture20

圖20 SSD檢測結果

期待未來基於深度學習的目標檢測的進一步突破!

參考文獻

[1] R. Girshick, J. Donahue, T. Darrell, J. Malik.