网络进化历程:
R-CNN------Fast-RCNN------Faster-RCNN
R-CNN是利用深度学习进行目标检测的开山之作
SVM是二分类算法
将候选框输入到深度网络之前,首先进行一个Resize处理,统一缩放成227*227的大小
每一个候选框与4096*20的权值矩阵相乘,都会得到一个概率向量
假设第一列类别为猫
那么2000*20矩阵的第一列就对应的是所有候选框为猫的概率
第一列的第一个元素就对应的是第一个候选框为猫的概率。。。
非极大值抑制算法(NMS)
对于每一个类别,
首先去寻找得分最高的目标
然后计算其他目标与该目标的iou值,再对每一个边界框与最高得分边界框的iou值进行一个判断
如果该iou值大于我们给定的阈值的话,那我们就删除它,将最高得分的目标给存起来
在剩下的边界框中再去寻找得分最高的目标
然后重复这个过程
如上图所示。通过SS算法得到了一系列的边界框,然后通过SVM算法之后,上面的花在这些边界框当中概率最高的是0.98的候选框,另外一个的评分是0.86
然后计算这两个边界框的交并比,如果他们计算之后的iou大于我们给定的阈值,就认为这两个目标是同一个目标,这样我们就把该概率较低的0.86边界框给删掉
最终我们所期望的就是一个完美的边界框。
对NMS处理之后剩余的边界框进一步筛选的理解:
去保留那些与我们真实标注的目标边界框(Ground Truth)有相交并且iou要大于某一阈值
不满足条件的就对他进行删除。
建议框(Region Proposal)
实际标注框(Ground Truth)
预测框(Bounding Box)
R-CNN分为以下4个模块
Fast-RCNN
与R-CNN一样,Backbone使用的都是VGG16
之前的RCNN是将每一个候选区域分别送入网络,得到特征向量
Fast-RCNN直接将整幅图像输入到CNN网络中,得到相应的特征图,然后将候选框映射到特征图上面,来得到特征矩阵
ROI(Region of interest)感兴趣区域
训练数据并不是把2000个候选框全都训练一遍,只需要其中的一小部分就可以了
而且采样分为正样本和负样本
正样本就是我们候选框中确实存在我们检测目标的样本(iou>0.5)
负样本就简单理解为背景,里面没有我们检测的目标
有了训练样本之后,我们再将训练样本的候选框,通过Roi Pooling层缩放到统一的尺寸
Roi pooling layer工作原理
将得到的矩阵划分为7*7,再对每一个区域进行max pooling
最后就得到了一个7*7的特征矩阵
无论输入的特征矩阵是什么尺寸,都统一缩放为7*7大小
缩放统一尺寸之后,进行一个展平处理,再通过两个全连接层得到 Roi feature vector(ROI特征向量)
然后并联两个全连接层
其中一个全连接层用于我们的目标概率的预测
这个分类器会输出N+1个类别的概率,第一个概率就是当前候选框为背景的概率,剩下20个就对应类别的概率
另外一个全连接层用于我们边界框回归参数的预测
绿色的是Ground Truth(真实边界框) 黄色的是通过SS算法生成的候选边界框,红色的是预测边界框
Fast-RCNN的损失函数
R-CNN或者Fast-RCNN耗时过长是因为SS算法
Faster-RCNN将通过RPN来生成候选框
RPN结构
每个anchor生成了两个概率,一个是背景的概率,一个是前景的概率
所以K个anchor生成了2K个scores
每个anchor又会生成4个边界框参数
所以K个anchor生成4K coordinates
anchor就是下图黄色的方框
每个地方会生成9个anchor
滑动窗口实际上就用3*3的卷积(stride=1 padding=1)来处理的
intermediate layer(中间层)
正样本:
1.iou大于0.7
2.最大的iou(都没有达到0.7的情况下)
RPN损失函数