RCNN算法训练过程可分为以下四步:
step1、对于训练样本集中,每一张图生成1~2k个候选区域(使用Selective Search);
step2、对于每个候选区域,使用深度网络提取特征;
这里使用分类网络(VGG16分类)对每一个候选区域类别训练,假设20类目标,取最后的FC层的4096向量当做该候选区域的特征向量。
step3、特征送入每一类的SVM分类器,判断是否属于该类;
这里的每个SVM分类器,只判断是否是该类目标,最终检测多少类目标就有多少个SVM分类器。这里是20个SVM分类器。训练分类器时对每一类进行非极大值抑制,剔除重复的建议框,用去重后得分比较高的框去训练每一类的SVM分类器。NMS_th=0.3。
step4、使用回归器精细修正候选框位置;
对NMS处理后的剩余的建议框进一步筛选。接着分别用20个回归器修正建议框的大小和位置(这里的修正使用最小二乘)。NMS_th=0.5。
决策过程:
使用训练好的分类网络、SVM分类器,输入一张图,首先SS提取1~2k个候选区域,之后所有候选区域图像进去分类器提取4096维特征,然后SVM判断是否是该类别目标,之后对每个类别NMS,最后使用类别回归器进行位置修正。
优点:
1、使用CNN提取特征;
2、按类别的位置回归修正。
不足:
1、第一步的候选区域图像、第二步的特征、第三步的SVM都要缓存在硬盘,占空间;
2、每一步都是独立的,操作太过繁琐。
裁剪会导致信息的丢失,变形会导致位置信息的扭曲,就会影响识别的精度。另外,一个预先定义好的尺寸在物体是缩放可变的时候就不适用了。SPP层对特征进行池化,并产生固定长度的输出,这样就实现了权值共享。
空间金字塔池化层:
金字塔池化层,对输入特征图进行不同规格的池化,然后将输出的特征图拉成向量,固定拼接,形成固定长度的输出。
优点:
1、SPPNet将整图送入网络,紧接着从特征图上提取相应的候选区域,这些候选区域的特征不再重复计算;
2、不同输入大小,最后都可获得相同大小的输出,从此开启的网络的多尺度训练;
Fast RCNN算法训练过程可分为以下三步:
step1、对于训练样本集中,每一张图生成1~2k个候选区域(使用Selective Search);
step2、将图像输入网络得到相应的特征图,将SS算法生成的候选框投影到特征图上获得相应的特征矩阵;
这里的网络已经不是分类网络+SVM了,而是下面图像以外的其它网络结构,已经接近两阶段的检测Header。
step3、将每个特征矩阵通过ROI pooling层缩放到7x7大小的特征图,接着讲特征图展平通过一系列全连接层得到预测结果。
每次输入两张图,SS提取候选区域。分类网络在训练时,更偏向以样本多的类别,所以尽可能的保证正负样本的比例。从每张图中选择64个候选区域(batch=2,两张图就是128个候选区域)。其中,候选区域真值的IOU>0.5的为正样本,小于0.5的为负样本。正负样本比为1:3。
具体步骤(这里网上例子很多,摘抄一段经典示例):
1、根据输入image,将ROI映射到feature map对应位置;
2、将映射后的区域划分为相同大小的sections(sections数量与输出的维度相同);
3、对每个sections进行max pooling操作。
ROI pooling example:
1、我们有一个8*8大小的feature map,一个ROI,以及输出大小为2*2。对ROI按照Int,转到(0,3,7,8)。
2、将ROI区域分为2*2个格子,此处格子并不均匀。
3、每个格子内取最大池化作为最终值。
FC层最终分成两个独立的分支:
1、分类器
输出N+1个类别的概率(N为检测类别的种类数,1为背景),共N+1个节点。类别损失则使用交叉熵。
2、边界回归器
输出对应N+1个类别的候选边界框回归参数(dx, dy,dw, dh),共(N+1)*4个节点。
3、多任务损失
参数说明:
分类损失:
p是分类器预测的softmax概率分布:p = (p0, ..., pt)。u对应目标真实类别的标签。分类损失:
回归损失:
具体函数可查看pytorch官方文档:torch.nn — PyTorch 1.10 documentation
决策过程:
首先SS提取1~2k个候选区域,之后经过Fast RCNN网络结构,输出预测的类别及回归结果。最终,对目标检测结果取大于阈值的为目标,接NMS后为最终检测结果。
优点:
1、使用CNN提取特征,并与分类回归一块训练;
2、现代检测任务训练框架的雏形。
不足:
1、还是没有去掉前面的SS算法,是一个不完整的检测框架。
Faster RCNN算法训练过程可分为以下三步:
step1、将图像输入网络得到相应的特征图;
step2、使用RPN结构生成候选框,将RPN生成的候选框投影到特征图上得到相应的特征矩阵;
step3、将每个特征矩阵通过ROI pooling层缩放到7x7大小的特征图,接着讲特征图展平通过一些列全连接层得到预测结果。
可以看成是:RPN + Fast RCNN。
4.1.1、anchor boxes
每个特征图上的点预测9中不同的anchor。三种尺度(面积){128^2,256^2,512^2},三种比例{1:1, 1:2, 2:1},每个位置(每个滑动窗口)在原图上都对应有3x3=9个anchor。
对于一张1000x600x3的图像,大约有60x40x9(20k)个anchor,忽略跨越边界的anchor后,剩下约6k个anchor。对于RPN生成的候选框之间存在大量重叠,基于候选框的cls得分,采用非极大值抑制,IoU设置为0.7,这样每张图片只剩2k个候选框。最后按照正负样本比1:1随机采样256个anchor用于训练Fast RCNN。
4.1.2、正负样本
正样本:1)anchor与gtbox的iou最大的那个;2)anchor与gtbox的iou>0.7。
负样本:与所有真值的iou
其它的样本则丢弃。
4.1.3、RPN多任务损失
RPN的损失与Fast RCNN一样。
直接采用RPN Loss + Fast R-CNN Loss的联合训练方法(原论文中分开训练)。
1)利用ImageNet预训练分类模型初始化前置卷积网络层参数,并开始单独训练RPN网络参数;
2)固定RPN网络的卷积层和全连接层参数,再利用ImageNet预训练分类模型初始化前置卷积网络参数,并利用RPN网络生成的目标建议框去训练Fast RCNN网络参数;
3)固定利用Fast RCNN训练好的前置卷积网络层参数,去微调RPN网络独有的卷积层及全连接层参数;
4)固定前置卷积网络层参数,微调Fast RCNN网络的全连接层参数。最后RPN网络与Fast RCNN网络共享前置卷积网络层参数,构成一个统一网络。
拓展阅读:
1、RoI Pooling 系列方法介绍(文末附源码)
RoI Pooling 系列方法介绍(文末附源码) - 知乎