摘要: 本文簡要介紹圖像檢測中經常使用的深度學習方法——RCNN家族系列算法,以圖像講解形式,便於理解。算法
在生活中,常常會遇到這樣的一種狀況,上班要出門的時候,忽然找不到一件東西了,好比鑰匙、手機或者手錶等。這個時候通常在房間翻一遍各個角落來尋找不見的物品,最後忽然一拍大腦,想到在某一個地方,在整個過程當中有時候是很着急的,而且越着急越找不到,真是使人沮喪。可是,若是一個簡單的計算機算法能夠在幾毫秒內就找到你要找的物品,你的感覺如何?是否是很驚奇!這就是對象檢測算法(object detection)的力量。雖然上述舉的生活例子只是一個很簡單的例子,但對象檢測的應用範圍很廣,跨越多個不一樣的行業,從全天候監控到智能城市的實時車輛檢測等。簡而言之,物體檢測是強大的深度學習算法中的一個分支。
在本文中,咱們將深刻探討能夠用於對象檢測的各類算法。首先從屬於RCNN系列算法開始,即RCNN、 Fast RCNN和 Faster RCNN。在以後的文章中,將介紹更多高級算法,如YOLO、SSD等。網絡
下圖說明了對象檢測算法是如何工做。圖像中的每一個對象,從人到風箏都以必定的精度進行了定位和識別。ide
下面從最簡單的深度學習方法開始,一種普遍用於檢測圖像中的方法——卷積神經網絡(CNN)。若是讀者對CNN算法有點生疏,建議閱讀此文。
這裏僅簡要總結一下CNN的內部運做方式:性能
首先將圖像做爲輸入傳遞到網絡,而後經過各類卷積和池化層處理,最後以對象類別的形式得到輸出。
對於每一個輸入圖像,會獲得一個相應的類別做爲輸出。所以可使用這種技術來檢測圖像中的各類對象。學習
1.首先,將圖像做爲輸入;spa
2.而後,將圖像分紅不一樣的區域;3d
3.而後,將每一個區域視爲單獨的圖像;對象
4.將全部這些區域傳遞給CNN並將它們分類爲各類類別;blog
5.一旦將每一個區域劃分爲相應的類後,就能夠組合全部這些區域來獲取具備檢測到的對象的原始圖像:開發
使用這種方法會面臨的問題在於,圖像中的對象能夠具備不一樣的寬高比和空間位置。例如,在某些狀況下,對象可能覆蓋了大部分圖像,而在其餘狀況下,對象可能只覆蓋圖像的一小部分,而且對象的形狀也可能不一樣。
基於此,須要劃分大量的區域,這會花費大量的計算時間。所以,爲了解決這個問題並減小區域數量,可使用基於區域的CNN,它使用提議方法選擇區域。
RCNN算法不是在大量區域上工做,而是在圖像中提出了一堆方框,並檢查這些方框中是否包含任何對象。RCNN 使用選擇性搜索從圖像中提取這些框。
下面介紹選擇性搜索以及它如何識別不一樣的區域。基本上四個區域造成一個對象:不一樣的比例、顏色、紋理和形狀。選擇性搜索在圖像中識別這些模式,並基於此提出各類區域。如下是選擇性搜索如何工做的簡要概述:
首先, 將圖像做爲輸入:
而後,它生成初始子分段,以便得到多個區域:
以後,該技術組合類似區域以造成更大的區域(基於顏色類似性、紋理類似性、尺寸類似性和形狀兼容性):
最後,這些區域產生最終的對象位置(感興趣的區域);
下面是RCNN檢測對象所遵循的步驟的簡要總結:
[對上述步驟進行圖解分析](http://www.robots.ox.ac.uk/~tvg/publications/talks/Fast-rcnn-slides.pdf):
首先,將圖像做爲輸入:
而後,使用一些提議方法得到感興趣區域(ROI)(例如,選擇性搜索):
以後,對全部這些區域調整尺寸,並將每一個區域傳遞給卷積神經網絡:
而後,CNN爲每一個區域提取特徵,SVM用於將這些區域劃分爲不一樣的類別:
最後,邊界框迴歸(Bbox reg)用於預測每一個已識別區域的邊界框:
以上就是RCNN檢測物體的所有流程。
從上節內容能夠了解到RCNN是如何進行對象檢測的,但這種技術有其自身的侷限性。如下緣由使得訓練RCNN模型既昂貴又緩慢:
基於選擇性搜索算法爲每一個圖像提取2,000個候選區域;
使用CNN爲每一個圖像區域提取特徵;
RCNN整個物體檢測過程用到三種模型:
這些過程相結合使得RCNN很是慢,對每一個新圖像進行預測須要大約40-50秒,這實際上使得模型在面對巨大的數據集時變得複雜且幾乎不可能應用。
好消息是存在另外一種物體檢測技術,它解決了RCNN中大部分問題。
RCNN的提出者Ross Girshick提出了這樣的想法,即每一個圖像只運行一次CNN,而後找到一種在2,000個區域內共享該計算的方法。在Fast RCNN中,將輸入圖像饋送到CNN,CNN生成卷積特徵映射。使用這些特徵圖提取候選區域。而後,使用RoI池化層將全部建議的區域從新整形爲固定大小,以便將其饋送到全鏈接網絡中。
下面將其分解爲簡化概念的步驟:
所以,Fast RCNN算法中沒有使用三個不一樣的模型,而使用單個模型從區域中提取特徵,將它們分紅不一樣的類,並同時返回所標識類的邊界框。
對上述過程進行可視化講解:
將圖像做爲輸入:
將圖像傳遞給卷積神經網絡t,後者相應地返回感興趣的區域:
而後,在提取的感興趣區域上應用RoI池層,以確保全部區域具備相同的大小:
最後,這些區域被傳遞到一個全鏈接網絡,對其進行分類,並同時使用softmax和線性迴歸層返回邊界框:
上述過程說明了Fast RCNN是如何解決RCNN的兩個主要問題,即將每一個圖像中的1個而不是2,000個區域傳遞給卷積神經網絡,並使用一個模型來實現提取特徵、分類和生成邊界框。
Fast RCNN也存在必定的問題,它仍然使用選擇性搜索做爲查找感興趣區域的提議方法,這是一個緩慢且耗時的過程,每一個圖像檢測對象大約須要2秒鐘。
所以,又開發了另外一種物體檢測算法——Faster RCNN。
Faster RCNN是Fast RCNN的修改版本,兩者之間的主要區別在於,Fast RCNN使用選擇性搜索來生成感興趣區域,而Faster RCNN使用「區域提議網絡」,即RPN。RPN將圖像特徵映射做爲輸入,並生成一組提議對象,每一個對象提議都以對象分數做爲輸出。
如下步驟一般採用Faster RCNN方法:
1.將圖像做爲輸入並將其傳遞給卷積神經網絡,後者返回該圖像的特徵圖;
2.在這些特徵圖上應用RPN,返回提議對象及其分數;
3.在這些提議對象上應用RoI池層,以將全部提案下降到相同的大小;
4.最後,將提議傳遞到全鏈接層,該層在其頂部具備softmax層和線性迴歸層,以對對象的邊界框進行分類和輸出;
這裏簡要解釋一下RPN是如何運做的:
首先,Faster RCNN從CNN獲取特徵圖並將它們傳遞到區域提議網絡。RPN在這些特徵圖上使用滑動窗口,每一個窗口生成不一樣形狀和大小的k個方框( Anchor boxe):
方框是固定尺寸的邊界箱,具備不一樣的形狀和尺寸。對於每一個方框,RPN預測兩件事:
在有了不一樣形狀和大小的邊界框後,將其傳遞到RoI池層。對每一個提案並對其進行裁剪,以便每一個提案都包含一個對象。這就是RoI池層所作的事情,它爲每一個方框提取固定大小的特徵圖:
而後將這些特徵圖傳遞到全鏈接層,該層具備softmax和線性迴歸層,最終對對象進行分類並預測已識別對象的邊界框。
上述討論過的全部對象檢測算法都使用區域來識別對象,且網絡不會一次查看完整圖像,而是按順序關注圖像的某些部分,這樣會帶來兩個複雜性的問題:
下表是總結了本文中介紹的全部算法
算法 | 特徵 | 預測時間 | 限制 |
---|---|---|---|
CNN | 將圖像分紅多個區域,將每一個區域分類爲不一樣的類別 | - | 須要不少區域來準確預測,所以計算時間長 |
RCNN | 使用選擇性搜索生成區域,從每一個圖像中提取大約2000個區域 | 40-50秒 | 每一個區域分別傳遞給CNN的計算時間也很長,且使用三種不一樣的模型進行預測 |
Fast RCNN | 每一個圖像只傳遞一次到CNN,並提取特徵圖。在這些地圖上使用選擇性搜索來生成預測。將RCNN中使用的全部三種模型組合在一塊兒 | 2秒 | 選擇性搜索很慢,所以計算時間仍然很長 |
Faster RCNN | 用區域提議網絡替換選擇性搜索方法,使算法更快 | 0.2秒 | 對象提議須要時間,而且因爲不一樣的系統一個接一個地工做,系統的性能取決於先前系統的表現效果 |