目标检测之Faster RCNN理论概述

Faster RCNN

  • 1、简介
  • 2、RCNN
  • 3、Fast-RCNN
  • 4、Faster-RCNN
        • (1) 特征提取模块
        • (2) RPN模块
        • (3) RoI Pooling模块
        • (4) RCNN模块
  • 5、总结

1、简介

在2014年RCNN算法问世之后,经历了众多版本的改进,但具有里程碑式意义的当属Fast RCNN与Faster RCNN算法,下面就这三个算法,按照时间顺序进行介绍。

2、RCNN

在RCNN出现之前,常用的物体检测流程如下:
(1)首先,将图像作为输入,然后切分成不同的区域;
(2)然后讲每个区域视为单独的图像,将所有这些区域传递给卷积神经网络(CNN)中,并将它们进行分类。
(3)一旦将每个区域划分为相应的类后,就可以组合所有这些区域来获取具有检测到的对象的原始图像
       使用这种方法会面临的问题在于,图像中的对象可以具有不同的宽高比和空间位置。例如,在某些情况下,对象可能覆盖了大部分图像,而在其他情况下,对象可能只覆盖图像的一小部分,并且对象的形状也可能不同。基于此,因为划分大量的区域会花费大量的计算时间。因此,为了解决这个问题并减少区域数量,可以使用基于区域的CNN,它使用提议方法选择区域。
       RCNN仍然延续传统物体检测的思想,将物体检测当做分类问题处理,即先提取一系列的候选区域,然后对候选区域进行分类,RCNN算法流程如下所示:
目标检测之Faster RCNN理论概述_第1张图片
(图片来源:深度学习Pytorch物体检测与实战)

其具体过程包括以下四步:
  (1)候选区域生成。采用Region Proposal提取候选区域,例如Selective Search算法,先将图像分割成小区域,然后合并包含同一物体可能性高的区域,并输出,在这一步需要提取约2000个候选区域。在提取完后,还需要将每一个区域进行归一化处理,得到固定大小的图像。
  (2)CNN特征提取。将上述固定大小的图像,利用CNN网络得到固定维度的特征输出。
  (3)SVM分类器。使用线性二分类器对输出的特征进行分类,得到是否属于此类的结果,并采用难样本挖掘来平衡正负样本的不平衡。
  (4)位置精修。通过一个回归器,对特征进行边界回归以得到更为精确的目标区域。

目标检测之Faster RCNN理论概述_第2张图片

(图片来自RCNN论文)

RCNN虽然显著提升了物体检测的效果,但仍存在3个较大的问题。首先RCNN需要多步训练,步骤烦琐且训练速度较慢;其次,由于涉及分类中的全连接网络,因此输入尺寸是固定的,造成了精度的降低;最后,候选区域需要提前提取并保存,占用空间较大。

3、Fast-RCNN

    在2015年,Ross Girshick独自提出了更快、更强的Fast RCNN算法,不仅训练的步骤可以实现端到端,而且算法基于VGG16网络,在训练速度上比RCNN快了近9倍,在测试速度上快了213倍,并在VOC 2012数据集上达到了68.4%的检测率。
    相比RCNN,主要有3点改进:
(1)共享卷积:将整幅图送到卷积网络中进行区域生成,而不是像RCNN那样一个个的候选区域,虽然仍采用Selective Search方法,但共享卷积的优点使得计算量大大减少。
(2)RoI Pooling:利用特征池化(RoI Pooling)的方法进行特征尺度变换,这种方法可以有任意大小图片的输入,使得训练过程更加灵活、准确。
(3)多任务损失:将分类与回归网络放到一起训练,并且为了避免SVM分类器带来的单独训练与速度慢的缺点,使用了Softmax函数进行分类。
目标检测之Faster RCNN理论概述_第3张图片
缺点:Fast RCNN算法虽然取得了显著的成果,但在该算法中,SelectiveSearch需要消耗2~3秒,而特征提取仅需要0.2秒,因此这种区域生成方法限制了Fast RCNN算法的发挥空间,这也为后来的Faster RCNN算法提供了改进方向。

4、Faster-RCNN

        Faster RCNN算法发表于NIPS 2015,该算法最大的创新点在于提出了RPN(Region Proposal Network)网络,利用Anchor机制将区域生成与卷积网络联系到一起,将检测速度一举提升到了17 FPS(Frames Per Second),并在VOC 2012测试集上实现了70.4%的检测结果。
        Faster R-CNN是截止目前,RCNN系列算法的最杰出产物,two-stage中最为经典的物体检测算法。推理第一阶段先找出图片中待检测物体的anchor矩形框(对背景、待检测物体进行二分类),第二阶段对anchor框内待检测物体进行分类。从功能模块来讲,主要包括4部分:特征提取网络RPN模块RoI Pooling(Region of Interest)模块与RCNN模块。如下图所示:
目标检测之Faster RCNN理论概述_第4张图片
(图片来源:Faster-RCNN论文)
目标检测之Faster RCNN理论概述_第5张图片
(图片来源:深度学习Pytorch物体检测与实战)

下面对各个模块进行介绍:

(1) 特征提取模块

        即backbone,目的是共享基础卷积层,提取整张图片的特征。例如:VGG16或Resnet101,去除其中的全连接层,只留下卷积层,输出的是下采样后的特征图。在此以VGGNet为例,假设输入图像的维度为3×600×800,由于VGGNet包含4个Pooling层(物体检测使用VGGNet时,通常不使用第5个Pooling层),下采样率为16,因此输出的feature map的维度为512×37×50。

(2) RPN模块

        区域生成模块,其作用是生成较好的建议框,即Proposal,这里用到了强先验的Anchor。RPN包含5个子模块:
①Anchor生成:RPN对feature map上的每一个点都对应了9个Anchors,这9个Anchors大小宽高不同,对应到原图基本可以覆盖所有可能出现的物体。因此,有了数量庞大的Anchors,RPN接下来的工作就是从中筛选,并调整出更好的位置,得到Proposal。
②RPN卷积网络:与上面的Anchor对应,由于feature map上每个点对应了9个Anchors,因此可以利用1×1的卷积在feature map上得到每一个Anchor的预测得分与预测偏移值。
③计算RPN loss:这一步只在训练中,将所有的Anchors与标签进行匹配,匹配程度较好Anchors赋予正样本,较差的赋予负样本,得到分类与偏移的真值,与第二步中的预测得分与预测偏移值进行loss的计算。
④生成Proposal:利用第二步中每一个Anchor预测的得分与偏移量,可以进一步得到一组较好的Proposal,送到后续网络中。
⑤筛选Proposal得到RoI:在训练时,由于Proposal数量还是太多(默认是2000),需要进一步筛选Proposal得到RoI(默认数量是256)。在测试阶段,则不需要此模块,Proposal可以直接作为RoI,默认数量为300。

(3) RoI Pooling模块

RoI Pooling模块:这部分承上启下,接受卷积网络提取的featuremap和RPN的RoI,输出送到RCNN网络中。由于RCNN模块使用了全连接网络,要求特征的维度固定,而每一个RoI对应的特征大小各不相同,无法送入到全连接网络,因此RoI Pooling将RoI的特征池化到固定的维度,方便送到全连接网络中。

(4) RCNN模块

将RoI Pooling得到的特征送入全连接网络,预测每一个RoI的分类,并预测偏移量以精修边框位置,并计算损失,完成整个Faster RCNN过程。主要包含3部分:
①RCNN全连接网络:将得到的固定维度的RoI特征接到全连接网络中,输出为RCNN部分的预测得分与预测回归偏移量。
②计算RCNN的真值:对于筛选出的RoI,需要确定是正样本还是负样本,同时计算与对应真实物体的偏移量。在实际实现时,为实现方便,这一步往往与RPN最后筛选RoI那一步放到一起。
③RCNN loss:通过RCNN的预测值与RoI部分的真值,计算分类与回归loss。

5、总结

以上大致介绍了Faster-RCNN的原理,要求有一定的基础,当前我也正在复现Faster-RCNN,空闲时间我会把细节以及代码实现(Pytorch平台)更新出来。

参考:
1、《深度学习Pytorch物体检测与实战》
2、深度学习目标检测系列:RCNN系列算法图解
3、RCNN论文
4、Faster-RCNN论文

你可能感兴趣的:(机器学习,深度学习,pytorch,机器学习)