R-CNN史上最全讲解

慈云数据 2024-03-12 技术支持 81 0

文章目录

  • 一:初识R-CNN
      • [网络结构]
      • 二:训练步骤
        • 1.RP的确定
        • 2.模型pre-training
        • 3.Fine-Tunning
        • 4.提取并保存RP的特征向量
        • 5.SVM的训练
        • 6.bbox regression的训练
        • 三:测试步骤
          • step1:Region proposal的确定
          • step2:RP的Features提取
          • step3:SVM分类
          • step4:BoundingBox-Regression
          • step5:Non-maximum suppression处理
          • 四:R-CNN存在的问题

            一:初识R-CNN

            R-CNN系列论文(R-CNN,fast-RCNN,faster-RCNN)是使用深度学习进行物体检测的鼻祖论文,其中fast-RCNN 以及faster-RCNN都是沿袭R-CNN的思路。

            R-CNN全称region with CNN features,其实它的名字就是一个很好的解释。用CNN提取出Region Proposals中的featues,然后进行SVM分类与bbox的回归。

            [网络结构]

            在这里插入图片描述

            接下来我从 训练阶段 和 测试阶段 分别讲解R-CNN中的核心思路。

            二:训练步骤

            1.RP的确定

            首先介绍一下Selective Search算法,训练过程中用于从输入图像中搜索出2000个Region Proposal。Selective Search算法主要步骤:

            • 使用一种过分割手段,将图像分割成小区域 (1k~2k 个)
            • 计算所有邻近区域之间的相似性,包括颜色、纹理、尺度等
            • 将相似度比较高的区域合并到一起
            • 计算合并区域和临近区域的相似度
            • 重复3、4过程,直到整个图片变成一个区域

              在每次迭代中,形成更大的区域并将其添加到区域提议列表中。这种自下而上的方式可以创建从小到大的不同scale的Region Proposal,如图所示:

              在这里插入图片描述

              2.模型pre-training

              在实际测试的时候,模型需要通过CNN提取出RP中的特征,用于后面的分类与回归。所以,如何训练好CNN成为重中之重。

              由于物体标签训练数据少,如果要直接采用随机初始化CNN参数的方法是不足以从零开始训练出一个好的CNN模型。基于此,采用有监督的预训练,使用一个大的数据集(ImageNet ILSVC 2012)来训练AlexNet,得到一个1000分类的预训练(Pre-trained)模型。

              在这里插入图片描述

              3.Fine-Tunning

              因为R-CNN模型实际测试时,是通过CNN对VOC测试集中每张输入图像上搜索到的2000个Region Proposal提取特征的。而RP大小都不相同,且AlexNet要求输入图像大小是227×227,所以需要对RP进行resize操作,将它们变形为227×227。变形之前,我们先在候选框周围加上16的padding,再进行各向异性缩放。 这种形变使得mAp提高了3到5个百分点。

              而原CNN模型针对ImageNet数据集且无变形的图像来提取特征,现在却是针对VOC检测数据集且变形的图像来提取特征。所以,为了让我们的CNN适应新的任务(即检测任务)和新的领域(变形后的推荐窗口),需要对CNN做特定领域的参数调优,也就是fine-tunning。用的是从每张VOC训练图像中搜索到的Region Proposal进行微调的。

              ( 备注:还有一个原因,如果不针对特定任务进行fine-tuning,而是把CNN当做特征提取器,卷积层所学到的特征其实就是基础的共享特征提取层,就类似于SIFT算法一样,可以用于提取各种图片的特征,而f6、f7所学习到的特征是用于针对特定任务的特征。打个比方:对于人脸性别识别来说,一个CNN模型前面的卷积层所学习到的特征就类似于学习人脸共性特征,然后全连接层所学习的特征就是针对性别分类的特征了)

              首先对 PASCAL VOC数据集 进行Selective Search,搜索到2000个Region Proposal对Pre-trained模型进行fine-tuning。将原来预训练模型最后的1000-way的全连接层(分类层)换成21-way的分类层(20类物体+背景),然后计算每个region proposal和ground truth 的IoU,对于IoU>0.5的region proposal被视为正样本,否则为负样本(即背景)。另外,由于对于一张图片的多有候选区域来说,负样本是远远大于正样本数,所以需要将正样本进行上采样来保证样本分布均衡。在每次迭代的过程中,选择层次采样,每个mini-batch中采样两张图像,从中随机选取32个正样本和96个负样本组成一个mini-batch(128,正负比:1:3)。我们使用0.001的学习率和SGD来进行训练。

              在这里插入图片描述

              4.提取并保存RP的特征向量

              提取特征的CNN网络经过了预训练和微调后不再训练,就固定不变了,只单纯的作为一个提特征的工具了。虽然文中训练了CNN网络对region proposal进行分类,但是实际中,这个CNN的作用只是提取每个region proposal的feature。

              所以,我们输入VOC训练数据集,SS搜索出2000个RP后输入进CNN进行前向传播,然后保存AlexNet的FC7层4096维的features,以供后续的SVM分类使用。

              5.SVM的训练

              作者使用SVM进行分类。对于每一类都会训练一个SVM分类器,所以共有N(21)个分类器,我们来看一下是如何训练和使用SVM分类器的。

              在这里插入图片描述

              在SVM分类过程中,IOU

微信扫一扫加客服

微信扫一扫加客服

点击启动AI问答
Draggable Icon