透徹理解RPN: 從候選區域搜索到候選區域提取網絡

          在目標檢測、目標跟蹤領域,提取region proposal都是最基本環節。本文概述了從 sliding window 到 selective search, 然後升級到 region proposal network的過程。 核心在於理解 selective search算法 和 region proposal network的設計思想。

1. 從sliding window 到 selective search 的候選區域提取

  • 目標檢測 vs. 目標識別
直接作爲圖像識別算法的輸入
直接作爲圖像識別算法的輸入

         目標識別算法是指在一張給定的圖像中識別出給定的物體。他將整張圖像作爲輸入,然後輸出類別的標籤並給出圖像中出現物體的概率。如上圖,直接輸入objection recognition算法中,算法會反饋圖像的類別dog, confident score 0.9987.

目標檢測返回類別和邊界框

          目標檢測任務不僅僅要返回圖像中主要包含那些物體,而且還要返回該圖像中包含了多少物體? 他們在哪裏(一般用BoundingBox進行標註)?

          目標識別算法是所有目標檢測算法的核心。假設我們已經擁有了非常強大的目標識別算法,但是該算法也僅僅能夠告訴我們目標(如狗)是什麼, 卻不能告訴我們目標在哪裏? 有多少個目標?

          爲了完成目標檢測任務,我們需要選擇一個更小的區域(sub-regions,patches),然後利用目標識別算法去識別各個patches是否包含high confident score的objections。

          因此,一個非常基礎但很重要的環節在於:如何從一張圖像中又快又好地提取出這樣的patches?其實最直接的方法提取region proposal(候選區域)的方式就是採用滑窗方法。但是sliding window方法非常消耗時間,因此研究學者提出了基於selective search策略的區域候選算法。

note1:提取patches算法更學術一點叫做region proposal algorithm

note2:好,指的是patches中儘可能恰好包括objects

note3:快,指的是有效速度。因爲不同目標之前存在位置和尺度差異,如果採用遍歷法,明顯就是不合理的。

  • Sliding window 滑窗技術
Sliding window 示例

         使用sliding window方法中,我們使用window對整幅圖像進行遍歷,然後利用目標識別算法所有的patches進行檢查。這實際上就是一個窮舉的過程。此外,在遍歷搜索過程中,我們不僅僅要遍歷單個尺度的window,還有對多尺度的window進行檢測。 因此,sliding window策略是非常消耗時間的。還有就是,sliding window算法對固定比例patches提取非常適合,但是由於projection的時間原因,固定的比例是很難保證的。 如果要將不同比例考慮進去,sliding window的時間效益又將大打折扣。

  • region proposal algorithm
候選區域提取。綠框:真陽性 true positive  藍框:假陽性 false positive

          sliding window (受平移、尺度、比例影響)存在的根本問題就是漫無目的性的搜索, 恰恰region proposal algorithm就是爲了解決這個問題。候選區域提取算法將圖像作爲輸入,並輸出邊界框BoundingBox,該邊界框對應於圖像中最有可能是對象的所有patches。這些BoundingBox可能存在噪聲、重疊,也可能偏離了目標,但是大多數候選區域應該與圖像中的目標非常接近。這樣,我們在後面直接對這些BoundingBox進行目標識別就好了。 在所有的region proposal algorithms中, selective search based 非常有代表性(快,有很高的召回率recall),進而提取BoundingBox。

  • selective search
  原始的輸入圖像                         採用graph-based適當分割結果             採用graph-based過分割結果

          selective search最核心的點在於通過顏色、文理、形狀或者大小等 將原始的輸入圖像劃分成等級區域(實質就是分割,如上圖所示)。但是直接分割的圖片不能用來做物體檢測,原因有二:

1 大多數物體包含倆種以上的顏色(尤其受到光照影響,一個物體可能包含更豐富的顏色信息)

2 如果物體之間有重疊,這種方法無法處理,比如杯子放在盤子上的情況

          爲了更好地解決上面的兩個問題,自然而然的我們想到了使用更好的分割方法,但是這並不是我們的目標(圖像分割本來就是一個非常大的領域)。 我們這裏需要的是一個不錯的分割結果就好,至少需要滿足分割後的區域可以儘可能的覆蓋原圖像中的物體。所以,selective search中使用了[1]中的分割算法進行過分割(如上圖所示)。selective search將過分割圖像作爲初始輸入,並執行以下步驟:

step 1:根據論文[1]分割的圖片畫出多個框,把所有框放入列表Region中

step 2:根據相似程度(顏色,紋理,大小,形狀等),計算Region中框之間的倆倆形似度,把相似度放入列表A中

step 3:從列表A中找出相似度最大的倆個框a,b並且合併

Step 4:把合併的框加入列表Region中,從A中刪除和a,b相關的相似度,重複步驟2,直至清空A

最終只需要對Region中的框進行圖片分類,就可以得到原圖的檢測結果。候選框從數十萬降到幾千(R-CNN中倆千左右)。

graph-base過分割後形成Hierarchy - bottom-up 策略。它顯示了等級分割過程的初始、中間和最後一步
綠框:生成的真陽性邊界框 true positive BoundingBox 藍框:生成的假陽性邊界框 false positive BoundingBox
  • selective search 區域歸併

          那麼如何計算兩個區域之間的相似性? selective search運用了基於顏色、文理、形狀、大小進行相似性度量。

          顏色相似性:A color histogram of 25 bins is calculated for each channel of the image and histograms for all channels are concatenated to obtain a color descriptor resulting into a 25×3 = 75-dimensional color descriptor. 對於圖像的每一個通道我們需要計算25bin的顏色直方圖,然後每一個顏色通道的直方圖拼接在一起,形成顏色描述子(75維)。

         紋理相似性:對於圖像的每個通道,利用高斯差分對8個方向進行計算提取紋理特徵。對於每個顏色通道的每個方向,利用10-bin直方圖進行表示,這樣便形成了紋理描述子(10*8*3=240維)。

         尺寸相似性:尺度相似性鼓勵更小的區域早日合併。它確保在圖像的所有部分形成所有尺度的候選區域。如果沒有考慮這個相似度測度,那麼一個區域會一個一個地吞噬所有較小的相鄰區域,那麼,多個比例的候選區域將只在特定的位置產生。

         形狀兼容性相似性:兩個區域重合比例程度。

兩個區域之間的最終相似度定義爲上述4個相似點的線性組合。

Python+OpenCV的代碼實現:https://download.csdn.net/download/shenziheng1/10751868。示例結果如下:

selective search採用graph-based過分割生成的候選區域(region proposal):  降低了時間消耗,提升了候選區域的質量
selective search採用graph-based過分割生成的候選區域(region proposal):  降低了時間消耗,提升了候選區域的質量

 

2. 從selective search 到 region proposal network的候選區域提取

  • CNN對目標識別算法的革新

          2012年論文[6]再次引燃神經網絡並且開啓以深度學習爲主導的人工智能時代。[6]提出的AlexNet網絡結構在ImageNet ILSVRC圖片分類的比賽中奪得冠軍,top-1的準確率達到57.1%,top-5 達到80.2%,突然之間手工設計的特徵提取方法顯得羸弱不堪,用卷積神經網絡(CNN)來做特徵提取成了大家的共識。 受到AlexNet影響[7]把CNN引入物體檢測的領域,爲了方便,研究學者把[7]方法簡稱爲regions with CNN features,也就是R-CNN。

Region-CNN 目標檢測框架示意圖
對輸入的圖片進行區域提取,文中用selective search。然後對每一塊提取出來的區域縮放到統一的大小,輸出CNN特徵向量,用分類器(SVM,討論了softmax的可行性)判斷該區域是不是某類物體,接着對選出的區域做了框迴歸(bounding box regression)處理得到最後的結果:物體種類和框的位置。

這篇論文在當時也引起了轟動,主要在於兩個方面:

1.利用CNN代替傳統的手工特徵,並證明了不同的CNN結構對檢測效果很非常大的影響。如VGG-16的檢測性能要比AlexNet效果好得多。

2.加入了根據CNN特徵對邊界框進行迴歸的方法。對比表明在SVM分類的結果上做框迴歸之後會把mAP再提高4個百分點。

網絡訓練採用的還是分段訓練(這爲後來的fast-RCNN 和 faster-RCNN提供了研究方向):

1.在ImageNet上pre-train一個圖片分類的CNN(也可以用別人提供的比如AlexNet)

2.替換訓練好的CNN分類層,比如從AlexNet的1000 類物體換成VOC的20+1類,繼續fine tune訓練

3.針對每一類目標物體訓練一個one vs rest的SVM

4.使用CNN的輸出做輸入,訓練一組參數做bounding-box regressor修正位置

關於爲什麼用SVM而不是直接採用Softmax進行分類?作者是利用大量的實驗進行證明,但是由於起初訓練沒有關注正負樣本均衡,所以在後面的Fast-RCNN算法中,直接又用Softmax替代了SVM,性能更好。

  • BoundingBox迴歸

          這裏可能會好奇,講了RCNN變更了目標識別算法,又講到了BoundingBox迴歸網絡,怎麼還不講Region Proposal Network? 其實,算法領域都是基於一個baseline進行一步一步改進的。所以非常有必要理解一下BoundingBox優化。

          如果不BoundingBox Regression,輸出的位置就是selective search選出的那個區域的位置,實際中是會存在偏差的如下圖所示:

紅框: selective search 提供的 候選區域,該區域經過目標識別算法得到的置信值最大。 綠框:我們期待的結果,也是真實標註與selective search之間的差別。 改圖說明了BoundingBox Regression模塊的重要性。

          selective search選出的可能是紅色的框,ground truth是綠色的框,判斷是否正確是用IoU的值來判斷,輸出紅色框會影響到結果判斷,但是已經把飛機檢測出來了只要對紅色框做線性變換(縮放+平移),就可以了。[7]認爲,CNN輸出的特徵向量裏包含了信息,所以在CNN輸出的特徵向量上做了一個loss計算,調整原來框的位置(相當於對原來的框加上縮放和平移操作)。所以每一個種類都設計了邊界框迴歸BoundingBox Regression,只要設計一個好的loss函數,能學習到一組參數使loss收斂就可以啊。因此,loss的設計是關鍵。對於BoundingBox Regression 迴歸的具體做法,會單獨研究。

  • RCNN的弊端和改進方案

         通過上面分析,我們就會發現,RCNN和之前的目標檢測方法相比已經取得了長足的發展,但是仍然存在模型訓練不合理、檢測速度慢弊端。對於這樣一個新奇的策略,必定會引起很多研究學者跟進。緊跟着就出現了SSPNet和Fast-RCNN的改進算法。

SSPnet:很好的解決了不同尺寸圖像的訓練問題,但是很可惜,該網絡不能反向傳播,所以前面的特徵提取層和後圈的全連接分類層都需要單獨訓練。所以,SPP Net的設計讓特徵提取的時間成百上千倍的加快,缺點就是訓練步驟麻煩。

Fast R-CNN:主要在訓練步驟上做了優化,主要是倆個方面: 根據SPPNet 中的spp層改進設計了RoI Pooling,使用muti-task loss同時訓練物體種類和位置。之前提到spp層不能進行反向傳播,是由於金字塔的結構,Fast R-CNN就化用了SPPNet的方法,使用RoI Pooling,其實就是隻用spp中金字塔的一層做池化,這樣也能產生固定長度的特徵向量,用來做分類。而且只用金字塔的一層做池化,就是一個池化操作了,那就可以做反向傳播了。Fast R-CNN最大的貢獻在於將目標分類和邊界框迴歸一起做,用作者的觀點就是:multi-task 。 核心還在如何設計 multi-task loss。 分類直接在原來CNN的基礎上加入FC層和softmax即可; 框迴歸是讓CNN的輸出直接是bounding box regressor需要的4個比例。

Fast R-CNN 檢測:分類與位置同時執行的多任務框架

做到這裏了,其實感覺已經很完美了。但是2015年,很多學者意識到 Most algorithms can benefit from end-to-end training. 其實這是很好理解的,深度學習本身就是基於數據驅動完成了算法的性能提升。如果算法框架是End-to-End的,那麼各組分(諸如區域候選提取、特徵提取、邊界框迴歸等)應該耦合的更緊密。

回頭看看,無論是SSP net 還是 Fast R-CNN改進,都沒有對區域候選環節Region Proposal進行改變,都不約而同的採用了Selective search算法。以現在的眼光去比喻,有點像造好了一輛汽車(CNN),但是在用馬(selective search)拉着跑的感覺。因爲selective search的計算太慢了,想讓物體檢測達到實時,就得改造候選框提取的方法。 這都是Faster CNN要做的,統一區域候選提取、分類和邊界框迴歸,實現檢測算法的End-to-End.

  •  錨點機制和區域候選網絡設計

          Faster RCNN[10]提出了一種方法,在網絡中設計一個模塊來提取候選框(region proposal networks),爲什麼要用網絡實現?因爲最初作者就抱着和分類網絡共用部分CNN的目的。[10]有個很重要的概念:錨點。理解RPN的關鍵也就在錨點上。

          錨點,字面理解就是標定位置的固定的點。在提框機制中,是預先設定好一些固定的點(anchor)和框(anchor box)的意思。如下圖所示:

Faster R-CNN中anchor的解釋:假設圖像上設定4個錨點(2x2),那麼就可以看作2x2的格子,每個格子的中心叫做錨點。以錨點爲中心,給定倆個寬高比(1:2, 2:1),畫倆個框。綠色和紅色的框就是錨點框(anchor box)。也就是說,每一個錨點都可以產生倆個錨點框,這些框就是固定在這裏存在的,不會變也不會動。
當模型輸出的預測位置是棕色虛線框時,計算預測框和每一個錨點框的誤差。方法是:首先用bounding box regression的方法計算每一個anchor box 到真值框的偏移量t1,每一個scale的anchor box都需要bounding box regressor; 再計算預測框到每一個anchor box的偏移量t2 , 最後使迴歸損失L1(t1-t2)最小。

          這裏可能會產生一個問題,爲什麼不直接計算預測框和真值框的誤差,而是要通過anchor作爲中間傳導呢?這和模型的輸出有關係,RPN的輸出位置信息並不是框的位置 (x, y, w, h),而是錨點框的偏移量 t2。因此需要學習 t2和 t1的誤差最小。以上圖爲例,全圖共4個錨點,每個錨點產生2個錨點框。所以一張圖產生4×2=8個錨點框,RPN的輸出是對每一個錨點框輸出種類(前景後景)置信度 + 位置偏移量 t2,共8×(2+4)個值。

          所以整個Fast R-CNN的算法流程爲:

Faster R-CNN檢測框架流圖: 整個網絡分爲兩個部分RPN + Detection。1. 輸入圖像,用CNN提特徵,在CNN輸出的特徵圖(feature map)上做anchor處理。2. 假設特徵圖通道數是256。那麼特徵圖的尺寸就相當於設定了多少個錨點。例如,特徵圖長寬是13x13, 那就有169個錨點,每一個錨點按照論文中的說法可以產生9個錨點框,這9個錨點框共用一組1×256的特徵,即錨點所在位置上所有通道的數據,接一個1×1的卷積核控制維度,做位置迴歸和前後景判斷,這就是RPN的輸出。3. 在RPN的輸出基礎上,對所有anchor box的前景置信度排序,挑選出前top-N的框作爲預選框proposal, 繼續CNN做進一步特徵提取,最後再進行位置迴歸和物體種類判斷。

Faster R-CNN的訓練方法有好幾種,主要分爲拆分訓練和端到端訓練。

拆分訓練:先訓練RPN,從所有anchor box中隨機挑選256個,保持正樣本負樣本比例1:1(正樣本不夠時用負樣本補);再從RPN的輸出中,降序排列所有anchor box的前景置信度,挑選top-N個候選框叫做proposal, 做分類訓練。

端到端訓練:理論上可以做端到端的訓練,但是由於anchor box提取的候選框中負樣本佔大多數,有的圖中負樣本和正樣本的比例可以是1000:1, 導致直接訓練難度很大。真正的端到端的目標檢測網絡還是有的,例如one-stage中代表的YOLO、SSD算法。速度很快,但是精度差了點。

Faster R-CNN最核心的工作在於在提取特徵的過程中完成候選框提取的操作,大大加快了物體檢測的速度。

3. 參考資料

1. 基於圖的高效分割算法:Efficient Graph-Based Image Segmentation | IJCV2004

2. selective search 策略用於目標識別:Selective Search for Object Recognition | IJCV2013

3. selective search策略用於目標檢測:Selective Search for Object Detection | LearnOpenCV2017

4. sliding window策略用於目標檢測:Sliding Windows for Object Detection | PyimageSearch2015

5. 其他常用的region proposal algorithms:

6. 神經網絡邁向深度學習的大作:ImageNet Classification with Deep Convolution Neural Network | NIPS2012

7. RCNN用於目標檢測論文:Rich features hierarchies for accurate object detection and semantic segmentation | CVPR2014

8. BoundingBox Regression:http://caffecn.cn/?/question/160

9. RCNN的第一批改進算法:

10. End-to-End檢測框架: Faster R-CNN | NIPS2016

  • https://dl.acm.org/citation.cfm?id=2969239.2969250
  • YOLO v1: You Only Look Once: Unified, Real-Time Object Detection | CVPR2016
  • YOLO v2: YOLO9000: Better, Faster, Stronger | CVPR2017
  • YOLO v3: YOLOv3: An Incremental Improvement | CVPR2018
  • SSD: SSD: Single Shot MultiBox Detector | ECCV2016
  • FPN: Feature Pyramid Networks for Object Detection | CVPR2017
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章