Faster RCNN总结
faster RCNN選自2015年 NIPS, Faster R-CNN: Towards Real-Time Object Detection withRegion Proposal Networks
正如上圖所示,檢測不同尺度(scale),不同長寬比(aspect ratios)的目標物通常的3種做法。
(a)Pyramids of images,縮放圖像來達到不同的scale,傳統機器學習常用的方法
(b)Pyramids of filters,也就是sliding window的思想,也是傳統機器學習常用的方法
(c)Pyramids of anchors,fast rcnn提出,Faster rcnn正式命名為RPN(region proposal network),并且從fast rcnn的cpu移植到了fasterrcnn的gpu上。可以實現不同不同scale和不同aspect ratios的檢測,使得檢測效果更佳準確完美啊。
整個網絡結構如上圖的左圖所示,分為2個網絡結構,一個RPN網絡和一個FastRCNN網絡,兩個網絡共享了特征圖這一層。由于是2個網絡結構,訓練過程也有點不一樣,作者論文中給出了3個訓練的方法,
(1)Alternating training,先從pretrained VGG16中導入初始參數,然后有了參數后,先訓練RPN,然后RPN將結果送給Fast RCNN,在訓練一把Fast RCNN訓練完畢后更新卷積層,然后,RPN在從卷基層提取數據,如此不斷循環往復。開源的matlab版本就是這種訓練方法。
(2)Approximate joint training,就是2個網絡一起訓練,但是該方法忽略了wrt導數,開源的python版本就是這么訓練的,可以減少25-50%的訓練時間。為什么呢?因為caffe中所有層都是c++實現的,所以python_layer就沒有進行back_ward,當然訓練的時候必須顯式指定loss_weight:1。
(3)Non-approximate joint training,作者沒有實現。
?
上圖中的右圖詳細說明了RPN的實現細節。
首先,作者提出了Anchor這個概念,其實就是feature map上的一個像素,以該Anchor為中心,可以生成k種 anchor boxes,簡單理解就是不同大小和尺度的滑動框,例如本文中的k為9,則生成3個scales和1:1,1:2,2:1,3種aspect ratios。然后使用不同的anchor boxes進行滑動,整個feature map中IOU最高的和每個anchor中,IOU>0.7的將被激活,置為1,IOU<0.3的將被置為0,從而實現了hard negative mining,滑動完畢后將生成256維的向量,然后分別經過2個1*1的卷基層(classification layer,regression layer),分別生成2k scores(是物體,不是物體)和4k coordinates(x,y,w,h)。從而實現了物體的檢測,最后經過softmax,實現物體的分類。安裝步驟:
[plain] view plaincopy測試:
下面測試顯卡為TitanX
使用VGG16的測試,
使用ZFnet的測試,
windows c++版本
?
這里所使用的windows caffe為https://github.com/Microsoft/caffe,
可以參考http://blog.csdn.net/qq_14845119/article/details/52415090這篇文章進行編譯。
一個注意事項,在編譯之前,在libcaffe下面的cu,include,src下面分別添加,roi_pooling_layer.cu,roi_pooling_layer.hpp,roi_pooling_layer.cpp。
?
這里的程序為根據matlab版本的faster-rcnn改寫。
?
運行效果:
pets數據集上運行效果如下,1050Ti下運行時間為100ms的樣子
這里分析一下,目標檢測的框架為什么faster-RCNN要比SSD對小目標更好,而RFCN又比faster-RCNN更好些呢?
?
首先看一下,幾個框架讀取圖片傳進網絡前做的處理,
?
faster-RCNN的處理:
???????? faster-RCNN對讀取的圖片進行了scale處理,首先假設,im_size原始圖片大小,target_size為目標圖片大小,max_size為目標圖片最長邊允許的最大長度。
那么在縮放的過程中,首先,定義scale大小為( target_size ) / im_size_min,如果這個scale的時候,長邊的長度超過max_size,就將scale定義為( target_size) / im_size_min,否則就還是用原來的scale。這樣做的好處就是輸入的圖片相對SSD300*300,SSD500*500都大點,最終對小目標也許效果就會更好,當然這樣做的話也會使得運行速度變慢,顯存使用增加,對于不同ratio(長寬比)的圖片運行時間也有差別。使用作者的原始參數,target_size=600 ,max_size=1000也許是對精度,速度,顯存占用的一個很好的折中吧。
???????? 這里為什么faster-RCNN可以輸入Blob不同ratio的數據,這就是RPN網絡的亮點,全卷基層的設計,當然不受ratio的影響。[plain] view plaincopy
SSD的處理:
直接進行縮放處理,這樣做雖然會使圖像變形,但是保證了輸入的整個圖像都是有效的像素。
[plain] view plaincopyYOLOV2的處理:
YOLO的處理也保證了圖片的ratio,比如tiny-yolo的輸入尺寸為416*416,在對圖片進行保證ratio的縮放后,對其他區域進行127像素的填充,這樣做的好處就是保證了ratio,不足之處就是當輸入圖片的ratio比較大的時候,就會填充好多無效的127像素,一個圖中,無效區域比有效區域還大,當然對小目標的檢測就還不如SSD奏效了。[plain] view plaincopy
RFCN的處理:
???????? RFCN的處理主要是在網絡卷積參數的設計上,引入了dilation參數,也就是所謂的hole algorithms,可以有效的增大map,提高對小目標的檢測。
???????? 如下圖所示,假設第一個為原始的map(3*3),第二個為dilation: 2時得到的map(7*7),第三個為在第二個的基礎上,dilation: 4得到的map(15*15)。[plain] view plaincopy
這里用KITTI的一張圖片進行測試說明,
The End!
總結
以上是生活随笔為你收集整理的Faster RCNN总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ImportError: No modu
- 下一篇: R-FCN/Faster-rcnn使用s