1. 程式人生 > >深度學習中目標檢測演算法 RCNN、Fast RCNN、Faster RCNN 的基本思想

深度學習中目標檢測演算法 RCNN、Fast RCNN、Faster RCNN 的基本思想

前言

影象分類檢測分割是計算機視覺領域的三大任務。即影象理解的三個層次:

  1. 分類(Classification),即是將影象結構化為某一類別的資訊,用事先確定好的類別(string)或例項ID來描述圖片。這一任務是最簡單、最基礎的影象理解任務,也是深度學習模型最先取得突破和實現大規模應用的任務。其中,ImageNet是最權威的評測集,每年的ILSVRC催生了大量的優秀深度網路結構,為其他任務提供了基礎。在應用領域,人臉、場景的識別等都可以歸為分類任務。
  2. 檢測(Detection)。分類任務關心整體,給出的是整張圖片的內容描述,而檢測則關注特定的物體目標,要求同時獲得這一目標的類別資訊位置資訊
    。相比分類,檢測給出的是對圖片前景背景的理解,我們需要從背景中分離出感興趣的目標,並確定這一目標的描述(類別和位置),因而,檢測模型的輸出是一個列表,列表的每一項使用一個數據組給出檢出目標的類別和位置(常用矩形檢測框的座標表示)。
  3. 分割(Segmentation)。分割包括語義分割(semantic segmentation)和例項分割(instance segmentation),前者是對前背景分離的拓展,要求分離開具有不同語義的影象部分,而後者是檢測任務的拓展,要求描述出目標的輪廓(相比檢測框更為精細)。分割是對影象的畫素級描述,它賦予每個畫素類別(例項)意義,適用於理解要求較高的場景,如無人駕駛中對道路和非道路的分割。

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

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

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

傳統目標檢測

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

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

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

目標檢測模型的主要效能指標是檢測準確度速度,對於準確度,目標檢測要考慮物體的定位準確度,而不單單是分類準確度。一般情況下,two-stage演算法在準確度上有優勢,而one-stage演算法在速度上有優勢。準確度(accuracy)和速度(speed)是一對矛盾體,如何更好地平衡它們一直是目標檢測演算法研究的一個重要方向。

基於“Region proposal”的目標檢測演算法

Region Proposal(候選區域),預先找出圖中目標可能出現的位置,利用影象中的紋理、邊緣、顏色等資訊,保證在選取較少視窗(幾千甚至幾百個)的情況下保持較高的召回率(IoU,Intersection-over-Union)。

  • IoU 的定義

物體檢測需要定位出物體的bounding box,如下圖所示,不僅要定位出車輛的bounding box,還要識別出bounding box裡面的物體就是車輛。由於演算法不可能百分百跟人工標註的資料完全匹配,故存在一個定位精度評價公式:IoU(介於0-1之間)用於評價 bounding box 的定位精度。IoU越高,預測框的位置越準確。因而,在評估預測框時,通常會設定一個IoU閾值(如0.5),只有當預測框與真實框的IoU值大於這個閾值時,該預測框才被認定為真陽性(True Positive, TP),反之就是假陽性(False Positive,FP)。

IoU定義了兩個bounding box的重疊度,如下圖所示:

矩形框A、B的重合度 IoU 計算公式為:

                                                            IoU=(A\cap B)/(A\cup B)

也就是矩形框A、B的重疊面積佔A、B 並集的面積比例:

                                                            IoU=S_{I}/(S_{A}+S_{B}+S_{I})

Region Proposal 方法比傳統的滑動視窗方法獲取的質量要更高。

常用的Region Proposal 方法有:Selective Search(SS,選擇性搜尋)、Edge Boxes(EB)。

基於Region Proposal 目標檢測演算法的步驟如下:

目標檢測的第一步是要做區域提名(Region Proposal),也就是找出可能的感興趣區域(Region Of Interest, ROI)。

邊框迴歸(Bouding Box Regression):是對RegionProposal進行糾正的線性迴歸演算法,目的是為了讓Region Proposal提取到的視窗與目標視窗(Ground Truth)更加吻合。

區域提名可能的方法有:

  1. 滑動視窗。滑動視窗本質上就是窮舉法,利用不同的尺度和長寬比把所有可能的大大小小的塊都窮舉出來,然後送去識別,識別出來概率大的就留下來。很明顯,這樣的方法複雜度太高,產生了很多的冗餘候選區域,在現實當中不可行。
  2. 規則塊。在窮舉法的基礎上進行了一些剪枝,只選用固定的大小和長寬比。這在一些特定的應用場景是很有效的,比如拍照搜題APP小猿搜題中的漢字檢測,因為漢字方方正正,長寬比大多比較一致,因此用規則塊做區域提名是一種比較合適的選擇。但是對於普通的目標檢測來說,規則塊依然需要訪問很多的位置,複雜度高。
  3. 選擇性搜尋。從機器學習的角度來說,前面的方法召回是不錯了,但是精度差強人意,所以問題的核心在於如何有效地去除冗餘候選區域。其實冗餘候選區域大多是發生了重疊,選擇性搜尋利用這一點,自底向上合併相鄰的重疊區域,從而減少冗餘。

區域提名並不只有以上所說的三種方法,實際上這塊是非常靈活的,因此變種也很多。

#選擇性搜尋演算法
輸入: 一張圖片 
輸出:候選的目標位置集合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

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

OverFeat的核心思想有三點:

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

OverFeat的關鍵步驟有四步:

  1. 利用滑動視窗進行不同尺度的區域提名,然後使用CNN模型對每個區域進行分類,得到類別和置信度。不同縮放比例時,檢測出來的目標物件數量和種類存在較大差異;
  2. 利用多尺度滑動視窗來增加檢測數量,提升分類效果;
  3. 用迴歸模型預測每個物件的位置,從圖4中來看,放大比例較大的圖片,邊框數量也較多;
  4. 邊框合併。

Overfeat是CNN用來做目標檢測的早期工作,主要思想是採用了多尺度滑動視窗來做分類、定位和檢測,雖然是多個任務但重用了模型前面幾層,這種模型重用的思路也是後來R-CNN系列不斷沿用和改進的經典做法。當然Overfeat也是有不少缺點的,至少速度和效果都有很大改進空間,後面的R-CNN系列在這兩方面做了很多提升。

深度學習的目標檢測演算法主要分為兩類,如下圖: 

R-CNN: R-CNN系列的開山之作

R-CNN的基本流程

Fast R-CNN: 共享卷積運算

fast R-CNN的基本流程

注意:Fast R-CNN的 Region Proposal 是在feature map之後做的,這樣可以不用對所有的區域進行單獨的CNN Forward步驟。

Fast R-CNN框架如下圖:

Fast R-CNN框架與R-CNN有兩處不同:

  1. 最後一個卷積層後加了一個ROI pooling layer;
  2. 損失函式使用了multi-task loss(多工損失)函式,將邊框迴歸直接加到CNN網路中訓練。分類Fast R-CNN直接用softmax替代R-CNN用的SVM進行分類。

Fast R-CNN是端到端(end-to-end)的。

Faster R-CNN: 兩階段模型的深度化

Faster R-CNN可以簡單地看做“區域生成網路RPNs + Fast R-CNN”的系統,用區域生成網路代替FastR-CNN中的Selective Search方法。Faster R-CNN這篇論文著重解決了這個系統中的三個問題:
1. 如何設計區域生成網路;
2. 如何訓練區域生成網路;
3. 如何讓區域生成網路和Fast RCNN網路共享特徵提取網路。

在整個Faster R-CNN演算法中,有三種尺度:

  1. 原圖尺度:原始輸入的大小。不受任何限制,不影響效能。
  2.  歸一化尺度:輸入特徵提取網路的大小,在測試時設定,原始碼中opts.test_scale=600。anchor在這個尺度上設定。這個引數和anchor的相對大小決定了想要檢測的目標範圍。
  3.  網路輸入尺度:輸入特徵檢測網路的大小,在訓練時設定,原始碼中為224*224。

Faster-R-CNN演算法由兩大模組組成:

  1. PRN候選框提取模組;
  2. Fast R-CNN檢測模組。

其中,RPN是全卷積神經網路,用於提取候選框;Fast R-CNN基於RPN提取的proposal檢測並識別proposal中的目標。


 

拖了兩天終於寫完了,歡迎批評,虛心接受~

stay hungry, stay foolish~