1、简介算法
- 发展的过程大致能够归纳为R-CNN——Fast R-CNN——Faster R-CNN——Mask R-CNN,都是将神经网络应用于目标检测的典型表明,首先是R-CNN将CNN应用于目标检测中取得了较大的成效,后面几个网络都是在前面的基础上进行了改进,在速度和准确率方面都有了很大的提高。
- 我的的看法就是全部的改进的原则都是尽量将任务都交给神经网络来完成,这样的话不只在检测速度上会有很大的提高,并且因为神经网络处理数据的能力也比其余方法优秀不少,准确率上也会有提高。
2、参考文献网络
- 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
3、R-CNN数据结构
四步:函数
一、提取region proposals。论文采用的是SS(选择性搜索方法),提取的的proposals数目为2000个。优化
二、将2000个proposals变形为227*227大小输入AlexNet中获得4096维的特征,造成一个2000*4096维特征矩阵。url
三、将提取的特征输入SVM(二分类)进行分类,假设有20类物体,则获得2000*20的得分矩阵,其中行表示2000个候选框,列表示20类目标,值为得分。spa
四、对每一列进行非极大值抑制(NMS),最终获得的proposals就是最后获得该类别的目标候选框,即从2000个中选择得分高的且不重叠的proposal,最后再进行边界回归优化检测框。.net
4、Fast R-CNNblog
一、采起SS方法提取2000个region proposals,而后将整张图片输入网络获得一个特征图(conv feature map)图片
二、将2000个region proposal从原图映射到特征图上,映射方法是按比例映射,再利用ROI Pooling获得2000个相同大小的feature map(对应于2000个region proposals在conv feature map上的映射)
三、将最终获得的feature map输入到两个全链接层提取特征向量,再分别用于分类和边界回归。
改进:
一、引入特征图,大大简化了对region proposals提取特征的运算
二、引入roi pooling,较以前的直接变形更完整地保留了原图的信息
三、除了region proposals提取,其它步骤都实现了end-to-end的联合训练
5、Faster R-CNN
一、将proposals的提取整合到了网络中,即引入了RPN网络,其它的和Fast R-CNN基本一致。
RPN网络:
一、RPN网络的做用就是将region proposals的提取整合到了网络中,并且RPN网络和Fast R-CNN网络共用了卷积网络,几乎没有增长计算量。
二、RPN提取候选框的方法是对conv feature map上的每一个点为中心取9种不一样比例大小的anchors,再按照比例映射到原图中即为提取的region proposals。具体的实现方法如上图,先用一个256维的3*3卷积核以步长为1进行特征提取,这样就能够获得一个256*1的特征向量,将这个256长度的特征向量分别输入两个全链接层,其中一个输出长度为2*9=18表示9个anchors是物体和不是物体的几率(不太懂为何两个几率都要预测),另外一个输出长度为4*9=36表示每一个proposals的四个坐标。
三、在获得了几率和bbox的坐标以后映射到原图中获得region proposals,再进行一次NMS获得最终输入Fast R-CNN网络的proposals。
四、训练方式有三种,通常采起交替训练的方法,即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部分。
6、一些解释
一、为什么要在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做为候选区域。
二、 NMS算法
其实特别简单,就是从一堆proposals中先选出一个得分最高的proposal,而后计算剩余的proposals与这个得分最高proposal的IOU,高于必定的阈值的就直接舍去,这样就剩下了与被选中的proposal重叠区域很少的proposals,再重复这个操做就行。
三、ROI pooling与RoIAlign Pooling
roi pooling:每次都向下取整,而后采用max pooling
roialign pooling:不进行取整操做,保留浮点数,最后进行对每一个小区域进行采样操做(通常为2*2效果最好),采样点的值由双线性差值计算获得,最后再进行max pooling操做。对小目标的检测效果影响较大。