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


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

  • 相关阅读:
    linux __ctype_b_loc
    1.mysql--常用sql(2)
    【21天学习挑战赛】Python学习第二篇:json标准库
    计算机毕业设计SSM电子投票系统【附源码数据库】
    【C++设计模式之责任链模式:行为型】分析及示例
    QT 中 QFileDialog::getOpenFileName 获取到文件路径,并打开这个文件。
    Javaweb之Vue指令的详细解析
    基于 Hexo 从零开始搭建个人博客(二)
    FME&ArcGIS版本兼容性
    持安科技孙维伯:零信任在攻防演练下的最佳实践|DISCConf 2023
  • 原文地址:https://blog.csdn.net/weixin_34910922/article/details/126333984