機器視覺目標檢測補習貼之R-CNN系列—R-CNN,Fast R-CNN,Faster R-CNN
作者:David
網址:http://nooverfit.com/wp/
深度學習無疑在近年來使機器視覺和目標檢測上了一個新台階。初識目標檢測領域,當然先要了解下面這些框架:
RCNN
Fast RCNN
Faster RCNN
Yolo
SSD
附一張發表RCNN並開啟目標檢測深度學習浪潮的Ross B. Girshick(rbg)男神:
無論如何,目標檢測屬於應用範疇,有些機器學習基礎上手還是很快的,所以讓我們馬上來補習一下!
首先什麼是目標檢測?目標檢測對人類是如此簡單:
把存在的目標從圖片中找出來,就是那麼簡單!
在計算機中,傳統目標檢測方法大致分為如下三步:
如上圖所示,首先在給定的圖像上選擇一些候選的區域,然後對這些區域提取特徵,最後使用訓練的分類器進行分類。下面我們對這三個階段分別進行介紹。
(1) 區域選擇
這一步是為了對目標的位置進行定位。由於目標可能出現在圖像的任何位置,而且目標的大小、長寬比例也不確定,所以最初採用滑動窗口的策略對整幅圖像進行遍歷,而且需要設置不同的尺度,不同的長寬比。
這種窮舉的策略雖然包含了目標所有可能出現的位置,但是缺點也是顯而易見的:時間複雜度太高,產生冗餘窗口太多,這也嚴重影響後續特徵提取和分類的速度和性能。
(實際上由於受到時間複雜度的問題,滑動窗口的長寬比一般都是固定的設置幾個,所以對於長寬比浮動較大的多類別目標檢測,即便是滑動窗口遍歷也不能得到很好的區域)
(2) 特徵提取
由於目標的形態多樣性,光照變化多樣性,背景多樣性等因素使得設計一個魯棒的特徵並不是那麼容易。然而提取特徵的好壞直接影響到分類的準確性。(這個階段常用的特徵有SIFT、HOG等)
(3) 分類器
主要有SVM, Adaboost等。
總結:傳統目標檢測存在的兩個主要問題:一個是基於滑動窗口的區域選擇策略沒有針對性,時間複雜度高,窗口冗餘;二是手工設計的特徵對於多樣性的變化並沒有很好的魯棒性。
深度學習特別是CNN的出現使得上述第2,3步可以合併在一起做:
上圖就是有名的R-CNN (Region-based Convolution Networks for Accurate Object detection and Segmentation)。
訓練流程:
(1) 輸入測試圖像
(2) 利用selective search演算法在圖像中提取2000個左右的region proposal(候選區)。
(3) 將每個region proposal縮放(warp)成227×227的大小並輸入到CNN,將CNN的fc7層的輸出作為特徵。
(4) 將每個region proposal提取到的CNN特徵輸入到SVM進行分類。
針對上面的框架給出幾點解釋:
* 上面的框架圖是測試的流程圖,要進行測試我們首先要訓練好提取特徵的CNN模型,以及用於分類的SVM:使用在ImageNet上預訓練的模型(AlexNet/VGG16)進行微調得到用於特徵提取的CNN模型,然後利用CNN模型對訓練集提特徵訓練SVM。
* 對每個region proposal縮放到同一尺度是因為CNN全連接層輸入需要保證維度固定。
* 上圖少畫了一個過程——對於SVM分好類的region proposal做邊框回歸(bounding-box regression),邊框回歸是對region proposal進行糾正的線性回歸演算法,為了讓region proposal提取到的窗口跟目標真實窗口更吻合。
因為region proposal提取到的窗口不可能跟人手工標記那麼准,如果region proposal跟目標位置偏移較大,即便是分類正確了,但是由於IoU(region proposal與Ground Truth的窗口的交集比並集的比值)低於0.5,那麼相當於目標還是沒有檢測到。
小結:R-CNN在PASCAL VOC2007上的檢測結果從DPM HSC的34.3%直接提升到了66%(mAP)。如此大的提升使我們看到了region proposal+CNN的巨大優勢。
但是R-CNN框架也存在著很多問題:
(1) 訓練分為多個階段,步驟繁瑣: 微調網路+訓練SVM+訓練邊框回歸器
(2) 訓練耗時,佔用磁碟空間大:5000張圖像產生幾百G的特徵文件
(3) 速度慢: 使用GPU, VGG16模型處理一張圖像需要47s。
Fast R-CNN(ICCV2015)
Fast R-CNN較R-CNN有兩點重要改進:
1. 最後一個卷積層後加了一個ROI pooling (Region of Interes pooling) layer。
2. 損失函數使用了多任務損失函數(multi-task loss),將邊框回歸直接加入到CNN網路中訓練。
這兩個改進使得CNN在應用時更渾然一體,節省時間開銷。
如果你的輸入圖片如下:
那麼區域候選可能如下:
最後一層卷積輸出的所有通道就可能如下:
Fast R-CNN中,我們會對每個輸出通道做ROI pooling,比如對於如上小綠框做pooling:
就會有一下兩個輸出:
Fast R-CNN使得最後一層卷積後的網路得到了很大的優化,但是很大的缺陷是它依然依賴region proposal給出的結果, 而計算region proposal本身會消耗很多時間。
Faster R-CNN(NIPS2015)
(Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks)
對於Region Proposal的劣勢,Faster R-CNN給出了改進,如果找到一種方法只提取幾百個或者更少的高質量的預選窗口,而且召回率很高,這不但能加快目標檢測速度,還能提高目標檢測的性能(假陽例少)。
RPN(Region Proposal Networks)網路應運而生。
RPN的核心思想是使用卷積神經網路直接產生region proposal:
使用的方法本質上就是滑動窗口。
RPN的設計比較巧妙,RPN只需在最後的卷積層上滑動一遍,因為anchor機制和邊框回歸可以得到多尺度多長寬比的region proposal:
3*3滑窗對應的每個特徵區域同時預測輸入圖像3種尺度(128,256,512),3種長寬比(1:1,1:2,2:1)的region proposal,這種映射的機制稱為anchor:
總的來說,從R-CNN, Fast R-CNN, Faster R-CNN一路走來,基於深度學習目標檢測的流程變得越來越精簡,精度越來越高,速度也越來越快。可以說基於region proposal的R-CNN系列目標檢測方法是當前目標最主要的一個分支。
然而,對於實時訓練,R-CNN系列依然不能做到,而YOLO這類目標檢測方法的出現讓實時性也變的成為可能。且待David 9下回分解。
參考文獻:
http://note.youdao.com/share/?id=92ca896a56afdc7cc18a097b2b428323&type=note#/
http://blog.csdn.net/he_is_all/article/details/56485921
https://arxiv.org/pdf/1611.10012.pdf
https://www.zhihu.com/question/35887527
https://www.koen.me/research/selectivesearch/
https://leonardoaraujosantos.gitbooks.io/artificial-inteligence/content/object_localization_and_detection.html
GIF
△祝您消化順暢