我们从region based物体检测器 (Faster R-CNN, R-FCN, FPN)中能学到些什么?

点击上方“AI公园”,关注公众号


作者:Jonathan Hui

编译:ronghuaiyang

在这个系列中,我们会进行一次物体检测之旅。在第一部分,我们会讲到region based物体检测器,包括Fast R-CNN, Faster R-CNN, R-FCN和FPN,在第二部分,我们会学习一阶段的检测器。在第三部分,我们会讲到性能和一些实现的细节。通过这些学习,我们会学到在物体检测中,什么在起作用,什么是重要的,哪里可以提升。希望能够通过我们如何走到这一步的这些过程,可以给我们一些前进的方向的提示。

今天,我们来看第一部分,我们从region based物体检测器 (Faster R-CNN, R-FCN, FPN)中能学到些什么?

滑动窗口检测器

自从AlexNet赢得了 2012 ILSVRC的比赛,在分类领域,CNN完全处于主导地位。物体检测的一个简单粗暴的方法就是使用从左到右,从上到下的滑动窗口,通过分来的确认物体。为了检测不同距离,不同类型的物体,我们使用了不同尺寸,不同比例的窗口。

640?wx_fmt=jpeg

我们根据滑动窗口切割出图像块。这些块需要进行缩放,因为多数的分类器只能使用固定尺寸的图像。不过,这并不会影响分类的准确率,因为分类器本来就是使用这些缩放的图像进行训练的。

640?wx_fmt=jpeg

缩放后的图像输入到CNN的分类器中,提取了4096维的特征向量。然后使用一个SVM的分类器来确定类别,使用另外的一个线性回归器来得到边界框。

640?wx_fmt=png

下面的是伪代码,我们创建了许多的窗口来进行不同形状,不同位置的物体的检测。为了提升性能,一个很显然的方案就是减少窗口的数量。

 
 

Selective Search

为了替代这种简单粗暴的方法,我们使用了一个建议区域的方法来得到感兴趣的区域(ROIs)来进行物体检测。在selective search中,我们从每个独立的像素开始,每个像素都有自己的一个群。然后,我们计算每个群的纹理,然后把拥有相近纹理的群组合并在一起。为了防止单个群合并的太大,我们优先合并小的群。我们一直进行区域合并,知道所有的都组合在了一起。下面的第一行,我们展示了区域是如何生存的,第二行中蓝色的矩形展示了合并过程找那个可能的ROIs。

640?wx_fmt=png

R-CNN

R-CNN利用了建议区域的方法创建了约2000个ROIs(感兴趣区域)。这些区域缩放到相同的尺寸然后独立的送到CNN的分类器中,然后接一个全连接层来进行分类以及精细调整边界框。

640?wx_fmt=jpeg

这里是系统的流程:

640?wx_fmt=png

使用了更少,但是质量更高的ROIs(感兴趣区域),R-CNN比滑动窗口的方法运行更快,更准确。

 
 
边界框回归器

建议区域的提取方法非常吃计算资源。为了加速这个过程,我们往往选择一个计算量小一点的建议区域提取方法来生成ROIs,然后接一个线性回归器(全连接层),来精细调整边界框。

640?wx_fmt=jpeg

Fast R-CNN

R-CNN需要很多的建议区域才能准确,这些区域之间很多都是有重合的。R-CNN的训练和推理都是很慢的,如果有2000个建议区域,每个都需要经过CNN处理一次,我们需要对不同的ROIs重复2000次的特征提取。

为了不用对每个图像块都从头进行一次特征提取,我们使用了一个特征提取器(一个CNN)来提取整幅图像的特征。我们还使用了一个外部的建议区域生成的方法,类似于selective search,来生成ROIs,然后和对应的特征图结合起来生成不同的特征块来进行物体检测。我们使用ROI pooling的方法把这些特征块缩放到固定的尺寸,然后送到一个全连接层进行分类和定位(检测物体的位置)。这样就不用重复进行特征提取了,Fast R-CNN显著的降低了处理的时间。

640?wx_fmt=jpeg

下面是网络的流程:

640?wx_fmt=jpeg

在下面的伪代码中,最耗时的特征提取已经被移动到循环外面了,这样可以显著的提升速度,不用再处理2000个ROIs了。Fast R-CNN比R-CNN训练快10倍,推理快150倍。

 
 

Fast R-CNN的一个主要的卖点是整个网络(特征提取器,分类器,边界框回归器)可以端到端的训练,使用多任务的loss(分类和定位),这样也提升了准确率。

ROI Pooling

由于Fast R-CNN使用了全连接层,我们使用ROI pooling将不同的ROIs缩放到同一个尺寸。

让我们简单的讨论一下将8x8的特征图变换到2x2的尺寸。

  • 左上角:我们的特征图

  • 右上角:我们将ROI和特征图进行重合

  • 左下角:我们将ROIs分成和目标相同的维度。例如,我们的目标是2x2,我们就将ROIs分成4个部分,每个部分同样的尺寸。

  • 右下角:找到每个部分的最大值作为结果,就是缩放后的特征图。

640?wx_fmt=png

所以我们会得到一个2x2的特征块,然后送到分类器和回归器中。

Faster R-CNN

Fast R-CNN依赖于外部的建议区域的生成方法,如selective search。然而,这些方法是跑在CPU上的,非常的慢。在测试的时候,Fast R-CNN需要花2.3秒的时间来进行预测,其中2s的时间是用来生成2000个ROIs。

 
 

Faster R-CNN使用了和Fast R-CNN同样的设计,除了将生成建议区域的方法替换成了使用网络来做,ROIs是通过特征图得到的。新的建议区域生成网络(RPN)更加的高效生成ROIs的时候,每张图像只需要10ms。

640?wx_fmt=jpeg

网络流程很相似,但是建议区域生成替换成了卷积网络(RPN)。

640?wx_fmt=png

Region proposal network

建议区域生成网络(RPN)以第一个卷积网络的输出的特征图为输入。使用3x3的卷积核在特征图上滑动,使用一个像ZF网络的卷积神经网络来生成不区分类别的建议区域(下图)。其他的深度网络如VGG或者ResNet也可以用来得到更加复杂的特征提取,当然也会牺牲一些速度。ZF网络输出256维特征,然后送到2个独立的全连接层预测边界框和2个物体存在的得分、物体存在衡量的是这个框中是否包含物体。我们可以简单的使用回归器来计算单个的物体存在得分,Faster R-CNN使用了一个分类器得到了2个可能的类别:一个是“有物体”类别,另外一个是“没有物体”(背景)类别。

640?wx_fmt=jpeg

对于特征图的每一个位置,RPN得到k个猜测。这样的话RPN每个位置输出4xk个坐标和2xk个得分。下面的图展示了8x8的特征图使用3x3的卷积核,输出是8x8x3个ROIs(k=3)。右边的图使用单个位置得到了3个建议区域。

640?wx_fmt=jpeg

这里,我们得到3个猜测,我们后面会精调我们的猜测。既然我们想要变的更加准确,如果我们的初始猜测具有不同的尺寸和形状的话,就更好了。所以,Faster R-CNN 并不是随机的生成建议边界框的。而是预测一些叫做anchors的参考框,距离这些参考框左上角的?x, ?y。我们对这些偏移量进行约束,所以我们的猜测仍然和anchors类似。

640?wx_fmt=png

为了进行每个位置k个预测,我们需要k个anchors,以每个位置为中心。每个预测和一个特定的anchor想关联,不同的位置共享相同的anchor尺寸。

640?wx_fmt=png

这些anchors仔细的预选选取过,可以覆盖现实生活中的不同尺寸,不同比例的物体。这样的初始化使得猜测更加的准确,而且可以让每个anchor趋向于预测特定形状的物体。这种策略让早期的训练更加的稳定和容易。

Faster R-CNN用的anchors更多,使用了9个anchors,3个不同的尺寸和3个不同的比例。每个位置使用了9个不同的anchors,产生了2x9个物体存在得分和4x9个坐标。

640?wx_fmt=png

Anchors在不同的文章中又叫做先验框或者默认边界框

R-CNN系列方法的性能

如下所示,Faster R-CNN更加快速:

640?wx_fmt=jpeg

基于区域的全卷积网络(R-FCN)

我们假设一下,我们用一个特征图来检测脸上的右眼。我们可以用它来定位整个脸吗?应该可以,因为右眼应该在整个脸的左上角区域,我们可以用这个信息来定位整个脸。

640?wx_fmt=jpeg

如果有另外一些特征图,用来检测左眼,鼻子或者嘴巴,我们可以将这些都综合起来,更好的定位整个脸。

所以说,我们为什么要那么麻烦呢,在Faster R-CNN中,检测器使用了多个全连接层来进行预测,对于2000个ROIs,这个很耗时。

 
 

R-FCN通过减少每个ROI的工作量来进行加速。基于区域的特征图对于每个ROIs是独立的,可以在每个ROI以外预先计算好。剩下来的就简单多了,所以说R-FCN比Faster R-CNN要快得多。

 
 

我们来考虑一个5x5的特征图M,里面有一个蓝色的方块物体。我们将整个方块物体平均分成3x3个区域。现在我们从M中创建一个新的特征图来只检测左上角的块。新的特征图看起来像最右边的那样。只有黄色的网格是激活的。

640?wx_fmt=png

既然我们将整个方块分成了9个部分,我们可以生成9个特征图,每个检测对应的部分。这些特征图叫做位置敏感的得分图,因为每个图检测的是物体的一个子区域。

640?wx_fmt=png

下面的红色虚线是一个ROI建议区域。我们将它分成3x3个子区域,然后问他每个子区域包含这个物体的对应部分的可能性。例如,左上角区域包含左眼的可能性多少?我们将结果存在3x3的投票数组中,右边的图。例如,vote_array[0][0]包含了否找到方块物体的左上角区域的可能性得分。

640?wx_fmt=jpeg

这种生成得分图的映射操作以及ROIs到投票数组的映射操作叫做位置敏感的ROI-pooling。这种操作和ROI pool非常相似,我们这里不展开讲。

640?wx_fmt=png

在计算了所有的位置敏感ROI pool的值之后,类别的得分就是所有元素的均值。

640?wx_fmt=png

如果我们有C个类别需要检测,我们需要扩展到C+1个类别,包括背景类别。每个类别有自己的3x3个得分图,一共是 (C+1) × 3 × 3个得分图。使用自己的得分图,我们预测每个类别的类别得分。然后在这些得分上使用一个softmax来计算每个类别的概率。

下面是数据流图,我们的例子中k=3。

640?wx_fmt=png

目前为止我们的旅程

我们从基本的滑动窗口算法开始。

 
 

然后我们试着减少窗口的数量,将尽可能多的工作移到循环外面。

在第二部分,我们会进一步的更加彻底的解决掉for循环。一阶段的检测器让物体检测一步完成,不需要建议区域的生成。


本文可以任意转载,转载时请注明作者及原文地址。

640?wx_fmt=jpeg

请长按或扫描二维码关注我们


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值