5、从RCNN到FasterRCNN(各模块独立训练到端到端检测框架)

发布于:2023-01-18 ⋅ 阅读:(622) ⋅ 点赞:(0)

1、RCNN

        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、每一步都是独立的,操作太过繁琐。

2、SPPNet

        裁剪会导致信息的丢失,变形会导致位置信息的扭曲,就会影响识别的精度。另外,一个预先定义好的尺寸在物体是缩放可变的时候就不适用了。SPP层对特征进行池化,并产生固定长度的输出,这样就实现了权值共享。

空间金字塔池化层:

        金字塔池化层,对输入特征图进行不同规格的池化,然后将输出的特征图拉成向量,固定拼接,形成固定长度的输出。

优点:

        1、SPPNet将整图送入网络,紧接着从特征图上提取相应的候选区域,这些候选区域的特征不再重复计算;

        2、不同输入大小,最后都可获得相同大小的输出,从此开启的网络的多尺度训练;

3、Fast RCNN

        Fast RCNN算法训练过程可分为以下三步:

        step1、对于训练样本集中,每一张图生成1~2k个候选区域(使用Selective Search);

        step2、将图像输入网络得到相应的特征图,将SS算法生成的候选框投影到特征图上获得相应的特征矩阵;

        这里的网络已经不是分类网络+SVM了,而是下面图像以外的其它网络结构,已经接近两阶段的检测Header。

        step3、将每个特征矩阵通过ROI pooling层缩放到7x7大小的特征图,接着讲特征图展平通过一系列全连接层得到预测结果。

3.1、正负样本选择细节

        每次输入两张图,SS提取候选区域。分类网络在训练时,更偏向以样本多的类别,所以尽可能的保证正负样本的比例。从每张图中选择64个候选区域(batch=2,两张图就是128个候选区域)。其中,候选区域真值的IOU>0.5的为正样本,小于0.5的为负样本。正负样本比为1:3。

3.2、ROI Pooling层

具体步骤(这里网上例子很多,摘抄一段经典示例):

        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、每个格子内取最大池化作为最终值。

3.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算法,是一个不完整的检测框架。

4、Faster RCNN

        Faster RCNN算法训练过程可分为以下三步:

        step1、将图像输入网络得到相应的特征图;

        step2、使用RPN结构生成候选框,将RPN生成的候选框投影到特征图上得到相应的特征矩阵;

        step3、将每个特征矩阵通过ROI pooling层缩放到7x7大小的特征图,接着讲特征图展平通过一些列全连接层得到预测结果。

        可以看成是:RPN + Fast RCNN。

4.1、RPN的几个关键问题

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一样。

4.2、Faster 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 系列方法介绍(文末附源码) - 知乎