一、簡介
- 發展的過程大體可以概括為R-CNN——Fast R-CNN——Faster R-CNN——Mask R-CNN,都是將神經網絡應用於目標檢測的典型代表,首先是R-CNN將CNN應用於目標檢測中取得了較大的成效,后面幾個網絡都是在前面的基礎上進行了改進,在速度和准確率方面都有了很大的提升。
- 個人的見解就是所有的改進的原則都是盡可能將任務都交給神經網絡來完成,這樣的話不僅在檢測速度上會有很大的提升,而且由於神經網絡處理數據的能力也比其他方法優秀很多,准確率上也會有提升。
二、參考文獻
- CVPR2014: Rich feature hierarchies for accurate object detection and semantic segmentation
論文下載: http://export.arxiv.org/pdf/1311.2524
參考博客: https://blog.csdn.net/liumingpei/article/details/80386685 - 2015 ICCV:Fast R-CNN
論文:https://arxiv.org/abs/1504.08083
博客:https://blog.csdn.net/CSDNbaiduyun/article/details/81239454 - 2015 NIPS:Faster R-CNN--Towards Real-Time Object Detection with Region Proposal Networks
論文:http://arxiv.org/abs/1506.01497v3
博客:https://blog.csdn.net/u011718701/article/details/53758927
三、R-CNN
四步:
1、提取region proposals。論文采用的是SS(選擇性搜索方法),提取的的proposals數目為2000個。
2、將2000個proposals變形為227*227大小輸入AlexNet中得到4096維的特征,形成一個2000*4096維特征矩陣。
3、將提取的特征輸入SVM(二分類)進行分類,假設有20類物體,則得到2000*20的得分矩陣,其中行表示2000個候選框,列表示20類目標,值為得分。
4、對每一列進行非極大值抑制(NMS),最終得到的proposals就是最后得到該類別的目標候選框,即從2000個中選擇得分高的且不重疊的proposal,最后再進行邊界回歸優化檢測框。
四、Fast R-CNN
1、采取SS方法提取2000個region proposals,然后將整張圖片輸入網絡得到一個特征圖(conv feature map)
2、將2000個region proposal從原圖映射到特征圖上,映射方法是按比例映射,再利用ROI Pooling得到2000個相同大小的feature map(對應於2000個region proposals在conv feature map上的映射)
3、將最終得到的feature map輸入到兩個全連接層提取特征向量,再分別用於分類和邊界回歸。
改進:
1、引入特征圖,大大簡化了對region proposals提取特征的運算
2、引入roi pooling,較之前的直接變形更完整地保留了原圖的信息
3、除了region proposals提取,其它步驟都實現了end-to-end的聯合訓練
五、Faster R-CNN
1、將proposals的提取整合到了網絡中,即引入了RPN網絡,其它的和Fast R-CNN基本一致。
RPN網絡:
1、RPN網絡的作用就是將region proposals的提取整合到了網絡中,而且RPN網絡和Fast R-CNN網絡共用了卷積網絡,幾乎沒有增加計算量。
2、RPN提取候選框的方法是對conv feature map上的每個點為中心取9種不同比例大小的anchors,再按照比例映射到原圖中即為提取的region proposals。具體的實現方法如上圖,先用一個256維的3*3卷積核以步長為1進行特征提取,這樣就可以得到一個256*1的特征向量,將這個256長度的特征向量分別輸入兩個全連接層,其中一個輸出長度為2*9=18表示9個anchors是物體和不是物體的概率(不太懂為什么兩個概率都要預測),另一個輸出長度為4*9=36表示每個proposals的四個坐標。
3、在得到了概率和bbox的坐標之后映射到原圖中得到region proposals,再進行一次NMS得到最終輸入Fast R-CNN網絡的proposals。
4、訓練方式有三種,一般采取交替訓練的方法,即RPN網絡和Fast R-CNN網絡交替訓練
1) 使用在ImageNet上預訓練的模型初始化共享卷積層並訓練RPN。
2) 使用上一步得到的RPN參數生成RoI proposal。再使用ImageNet上預訓練的模型初始化共享卷積層,訓練Fast R-CNN部分(分類器和RoI邊框修訂)。
3) 將訓練后的共享卷積層參數固定,同時將Fast R-CNN的參數固定,訓練RPN。(從這一步開始,共享卷積層的參數真正被兩大塊網絡共享)
4) 同樣將共享卷積層參數固定,並將RPN的參數固定,訓練Fast R-CNN部分。
六、一些解釋
1、為何要在softmax前后都接一個reshape layer?
其實只是為了便於softmax分類,至於具體原因這就要從caffe的實現形式說起了。在caffe基本數據結構blob中以如下形式保存數據:blob=[batch_size, channel,height,width] 對應至上面的保存bg/fg anchors的矩陣,其在caffe blob中的存儲形式為[1, 2x9, H, W]。 而在softmax分類時需要進行fg/bg二分類,所以reshape layer會將其變為[1, 2, 9xH, W]大小, 即單獨“騰空”出來一個維度以便softmax分類,之后再reshape回復原狀。貼一段caffe softmax_loss_layer.cpp的reshape函數的解釋,非常精辟: "Number of labels must match number of predictions; " "e.g., if softmax axis == 1 and prediction shape is (N, C, H, W), " "label count (number of labels) must be N*H*W, " "with integer values in {0, 1, ..., C-1}."; 綜上所述,RPN網絡中利用anchors和softmax初步提取出foreground anchors作為候選區域。
2、 NMS算法
其實特別簡單,就是從一堆proposals中先選出一個得分最高的proposal,然后計算剩余的proposals與這個得分最高proposal的IOU,高於一定的閾值的就直接舍去,這樣就剩下了與被選中的proposal重疊區域不多的proposals,再重復這個操作就行。
3、ROI pooling與RoIAlign Pooling
roi pooling:每次都向下取整,然后采用max pooling
roialign pooling:不進行取整操作,保留浮點數,最后進行對每個小區域進行采樣操作(一般為2*2效果最好),采樣點的值由雙線性差值計算得到,最后再進行max pooling操作。對小目標的檢測效果影響較大。