☀️教程:霹雳吧啦Wz
☀️链接:https://www.bilibili.com/video/BV1af4y1m7iL?p=1&vd_source=c7e390079ff3e10b79e23fb333bea49d
一、R-CNN
R-CNN(Region with CNN feature)是由Ross Girshick在2014年提出的,在PASCAL VOC目标检测竞赛中获得冠军,是利用深度学习进行目标检测的开山之作。
1.1 R-CNN算法流程
(1)候选区域的生成
(2)深度网络提取候选框特征
得到的特征图展平后不经过全连接层
(3)将特征向量送入所有的SVM分类器,判定类别
SVM分类器是一个二分类的分类器,所以每一个分类器只能判定一个类别,对于PASCAL VOC来说一共20个类别,所以共20个SVM分类器。
得到的2000×20的矩阵,每一行表示一个候选框,每一列代表是某个类别的概率。
利用非极大值抑止(NMS)算法,剔除重叠建议框:
其中,IoU是交并比(A与B的交集除以A与B的并集),交并比越大,重叠部分越多。
NMS算法是根据每一个类别来应用到所有的候选框上的,举例,第一个类别是猫,那么就对所有候选框预测为猫的概率值进行NMS,第二个类别是狗,那么就对所有候选框预测为狗的概率值进行NMS,如下图所示,是按照每一列来依次进行处理的:
NMS算法的流程是:
- 寻找该类得分最高的目标
- 计算其他目标与该目标的IoU值
- 删除所有IoU值大于给定阈值的目标
这样下来,每一个类别都会剩下N个候选框。
(4)使用回归器精细修正候选框位置
对NMS处理后的建议框进一步筛选,我的理解是接着剔除掉那些概率低的候选框,原论文中说的是保留那些与真实边界框(Ground Truth)有相交并且IoU大于某个阈值的候选框。
接下来同样使用CNN提取所有候选框的特征向量,对其进行回归,得到偏移量。
1.2 R-CNN框架
1.3 R-CNN存在的问题
针对第二点,训练速度慢,是因为四个部分的训练是相互独立的,进而导致了第三点训练所需空间大的问题。
二、Fast R-CNN
Fast R-CNN是在2015年Ross Girshick继R-CNN后的又一力作。同样使用VGG16作为backbone,与R-CNN相比训练时间快了9倍,推理时间快213倍,准确率从62%提升到66%(在PASCAL VOC数据集)
2.1 Fast R-CNN算法流程
(1)候选区域的生成
与R-CNN方法相同
(2)一次性计算整张图像的特征,并根据候选框的区域来投射到特征图上获得相应特征矩阵
关于数据采样的问题:
在Fast R-CNN训练过程中,并不是使用SS算法提供的全部候选框,而是使用其中的一小部分,而且对采样的数据分正负样本,正样本存在我们想要检测的东西,负样本可以理解为背景,里面没有想要检测的目标。这样的做法是防止网络在训练过程中偏向于正样本的结果(数据不平衡导致的)。
论文中的方法是对于每张图片,从2K个候选框中采样64个候选区域,64个候选区域中一部分是正样本一部分是负样本。正样本的定义是候选框与真实框的IoU大于0.5,负样本的定义是与所有真实框IoU值最大在0.1-0.5之间的候选框。
(3)采样完样本之后,对于每个样本,将其区域投射到整张图像特征图中得到其区域特征图,再经过RoI Pooling层调整到统一的7×7尺寸,输入进分类网络和回归网络完成该候选框的分类和预测。
RoI Pooling Layer的实现原理:
其实就是将候选框划分为7×7的49个区域,再对这些区域进行最大池化,完成特征尺寸的调整。这样一来就不限制候选框图像的输入尺寸了(R-CNN需要将输入图像调整到227×227再进行操作)。
接下来,将最大池化后的特征图经过两个全连接层得到RoI Feature Vector,再输入进分类器与回归器(两个是并联的)
针对分类器:实际上是一个全连接层
分类器将会输出N+1个类别的概率,多出来的1预测的是背景概率。
针对边界框回归器:实际上是一个全连接层
针对每一个类别都将输出一个边界框回归参数。每一个边界框回归参数由中心点坐标x,y与宽和高w,h组成。所以最终输出的是(N+1)×4个值。
这个边界框回归参数是你要根据这些参数去调整候选框的位置的,而不是直接预测出来最终的边界框位置。
针对根据边界框回归参数修正候选框:
2.2 Fast R-CNN损失计算
其中,分类损失使用的就是交叉熵损失函数:
其中,边界框回归损失:
λ \lambda λ是一个权衡分类损失与边界框回归损失的系数。
[ u > = 1 ] [u>=1] [u>=1]表示当 u u u小于1的时候,代表这是背景(即负样本),没有边界框回归损失,取值为0。当 u u u大于等于1的时候,代表检测类别,计算边界框回归损失,取值为1。
其中: L l o c ( t u , v ) = ∑ i = x , y , w , h s m o o t h L i ( t i u − v i ) L_{loc}(t^u,v)=\sum_{i={x,y,w,h}}smooth_{L_i}(t_i^u-v_i) Lloc(t