在目標檢測、目標跟蹤領域,提取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方法中,我們使用window對整幅圖像進行遍歷,然後利用目標識別算法所有的patches進行檢查。這實際上就是一個窮舉的過程。此外,在遍歷搜索過程中,我們不僅僅要遍歷單個尺度的window,還有對多尺度的window進行檢測。 因此,sliding window策略是非常消耗時間的。還有就是,sliding window算法對固定比例patches提取非常適合,但是由於projection的時間原因,固定的比例是很難保證的。 如果要將不同比例考慮進去,sliding window的時間效益又將大打折扣。
- region proposal algorithm
sliding window (受平移、尺度、比例影響)存在的根本問題就是漫無目的性的搜索, 恰恰region proposal algorithm就是爲了解決這個問題。候選區域提取算法將圖像作爲輸入,並輸出邊界框BoundingBox,該邊界框對應於圖像中最有可能是對象的所有patches。這些BoundingBox可能存在噪聲、重疊,也可能偏離了目標,但是大多數候選區域應該與圖像中的目標非常接近。這樣,我們在後面直接對這些BoundingBox進行目標識別就好了。 在所有的region proposal algorithms中, selective search based 非常有代表性(快,有很高的召回率recall),進而提取BoundingBox。
- selective search
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中倆千左右)。
- 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。示例結果如下:
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。
這篇論文在當時也引起了轟動,主要在於兩個方面:
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選出的可能是紅色的框,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個比例。
做到這裏了,其實感覺已經很完美了。但是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)的意思。如下圖所示:
這裏可能會產生一個問題,爲什麼不直接計算預測框和真值框的誤差,而是要通過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,從所有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:
- Objectness measure:http://groups.inf.ed.ac.uk/calvin/objectness/
- CPMC: Constrained Parametric Min-Cuts for Automatic Object Segmentation: http://www.maths.lth.se/matematiklth/personal/sminchis/code/cpmc/index.html
- Category Independent Object Proposals:http://vision.cs.uiuc.edu/proposals/
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的第一批改進算法:
- SSPNet: Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition | ECCV2014 + PAMI2015
- Fast R-CNN | ICCV2015 https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=7410526
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