Region Proposal by Guided Anchoring 论文笔记

Region Proposal by Guided Anchoring

论文:https://arxiv.org/abs/1901.03278

代码:https://github.com/open-mmlab/mmdetection(作者表示后续会公开在github)

概述

众所周知,anchor策略是目标检测领域的基石。很多目标检测算法的高精度检测都依赖于密集的anchor策略,也就是在空间域上以预设的尺度和宽高比做均匀采样。但是,由于anchor策略产生大量冗余的anchor box,生成数目巨大的低质量负样本,导致正负样本严重失衡,而且还有IoU阈值设置、超参数设计困难等一系列问题。

文章提出了一种新的 anchor 生成方法 —— Guided Anchoring,即通过图像特征来指导 anchor 的生成。通过预测 anchor 的位置和形状,来生成稀疏而且形状任意的 anchor,并且设计了 Feature Adaption 模块来修正特征图使之与 anchor 形状更加匹配。在使用 ResNet-50-FPN 作为 backbone 的情况下,Guided Anchoring 将 RPN 的 recall(AR@1000) 提高了 9.1 个点,将其用于不同的物体检测器上Fast-RCNN、Faster R-CNN以及RetinaNet,可以提高 mAP 1.2 到 2.7 个点不等。

和传统 RPN 的性能和速度对比,可以看到要显著优于传统 RPN。

背景

Anchor 是物体检测中的一个重要概念,通常是人为设计的一组框,作为分类(classification)和框回归(bounding box regression)的基准框。无论是单阶段(single-stage)检测器还是两阶段(two-stage)检测器,都广泛地使用了 anchor。例如,两阶段检测器的第一阶段通常采用 RPN 生成 proposal,是对 anchor 进行分类和回归的过程,即 anchor -> proposal -> detection bbox;大部分单阶段检测器是直接对 anchor 进行分类和回归,也就是 anchor -> detection bbox。

常见的生成 anchor 的方式是滑窗(sliding window),也就是首先定义 k 个特定尺度(scale)和长宽比(aspect ratio)的 anchor,然后在全图上以一定的步长滑动。这种方式在 Faster R-CNN,SSD,RetinaNet 等经典检测方法中被广泛使用。

Motivation

通过 sliding window 生成 anchor 的办法简单可行,但也不是完美的。首先,anchor 的尺度和长宽比需要预先定义,这是一个对性能影响比较大的超参,而且对于不同数据集和方法需要单独调整。如果尺度和长宽比设置不合适,可能会导致 recall 不够高,或者 anchor 过多影响分类性能和速度。一方面,大部分的 anchor 都分布在背景区域,对 proposal 或者检测不会有任何正面作用;另一方面,预先定义好的 anchor 形状不一定能满足极端大小或者长宽比悬殊的物体。所以我们期待的是稀疏,形状根据位置可变的 anchor。

(好搞笑哦,把这张图也放上)

Formulation

预定义的anchor尺度和宽高比对于不同的数据集和算法需要单独调整。怎样生成稀疏且形状自适应的anchor呢?注意到目标在图像中的分布不均匀,而且目标的尺度也与图像内容、场景的位置和几何形状密切相关。因此分两步生成稀疏的子区域:首先识别可能包含对象的子区域,然后确定不同位置的尺度和宽高比。

我们通常使用 4 个数 (x, y, w, h) 来描述一个 anchor,即中心点坐标和宽高。将 anchor 的分布 formulate 成如下公式。

TB1o_VOJjDpK1RjSZFrXXa78VXa.jpg

从上面公式可以发现:给定一幅图像I,目标可能只存在于确定的区域;目标的形状与它的位置密切相关。Anchor 的概率分布被分解为两个条件概率分布,也就是给定图像特征之后 anchor 中心点的概率分布,和给定图像特征和中心点之后的形状概率分布,这也是论文标题中 Guided Anchoring 的由来。Sliding window 可以看成是p(x,y}I)是均匀分布而p(w,h|x,y,I)是冲激函数的一个特例。

根据上面的公式,anchor 的生成过程可以分解为两个步骤,anchor 位置预测和形状预测。

Guided Anchoring

Guided Anchoring框架如图1所示:

如图所示,在原始 RPN 的特征图基础上,我们采用两个分支分别预测 anchor 位置和形状,然后结合在一起得到 anchor。之后采用一个 Feature Adaption 模块进行 anchor 特征的调整,得到新的特征图供之后的预测(anchor 的分类和回归)使用。整个方法可以 end-to-end training,而且相比之前只是增加了 3 个 1x1 conv 和一个 3x3 deformable conv,带来的模型参数量的变化很小。

位置预测

anchor预测分支产生一个与feature map FI大小相同的概率图,每个p(i, j | FI)对应图像I的坐标((i + 0.5)s, (j + 0.5)s),其中s是feature map的步长。对基础feature map先通过1*1卷积,然后逐元素Sigmoid转换为概率值。然后根据阈值筛选,可以过滤掉90%的区域而保持相同的召回率。

位置预测分支的目标是预测哪些区域应该作为中心点来生成 anchor,是一个二分类问题。不同于 RPN 或者 segmentation 的分类,这里我们并不是预测每个点是前景还是背景,而是预测是不是物体的中心。1代表有效位置,0代表无效位置。中心附近的anchor应该较多,而远离中心的anchor数目应该少一些。

我们将整个 feature map 的区域分为物体中心区域,外围区域和忽略区域,大概思路就是将 ground truth 框的中心一小块对应在 feature map 上的区域标为物体中心区域,在训练的时候作为正样本,其余区域按照离中心的距离标为忽略或者负样本。

具体的:

假定R(x, y, w, h)表示以(x, y)为中心,w和h分别为宽高的矩形区域。将groundtruth的bbox(xg, yg, wg, hg)映射到feature map的尺度得到(x'g, y'g, w'g, h'g)。

a.定义中心区域CR=R(x'g, y'g, σ1w', σ1h'),CR区域内的像素标记为正样本;

b.定义ignore区域IR=R(x'g, y'g, σ2w', σ2h')\CR,该区域的像素标记为ignore;

c.其余区域标记为外部区域OR,该区域所有像素标记为负样本。

考虑到基于FPN利用了多层feature,所以只有当feature map与目标的尺度范围匹配时才标记为CR,而临近层相同区域标记为IR,如图2所示。文中使用Focal Loss来训练定位分支。

通过位置预测,我们可以筛选出一小部分区域作为 anchor 的候选中心点位置,使得 anchor 数量大大降低。在 inference 的时候,预测完位置之后,我们可以采用 masked conv 替代普通的 conv,只在有 anchor 的地方进行计算,可以进行加速。

形状预测

给定一个feature map FI,预测每个位置的最优形状(w, h),也就是与最近的groundtruth的bounding box的IoU最大的shape。考虑到w和h的取值范围较大,所以先做如下转化:

其中s是步长,σ是经验尺度因子(文中取8)。可以将[0, 1000]压缩至[-1, 1]。该分支输出dw和dh。首先通过1*1卷积层产生两个通道的map(包括dw和dh的值),然后经过逐元素转换层实现w和h的转化。

得益于任意形状的anchor,所以对于宽高比夸张的目标也具有更好的效果(比如火车等)。

形状预测分支的目标是给定 anchor 中心点,预测最佳的长和宽,这是一个回归问题。按照往常做法,当然是先算出 target,也就是该中心点的 anchor 最优的 w 和 h,然后用 L1/L2/Smooth L1 这类 loss 来监督。然而这玩意的 target 并不好计算,而且实现起来也会比较困难,所以我们直接使用 IoU 作为监督,来学习 w 和 h。既然我们算不出来最优的 w 和 h,而计算 IoU 又是可导的操作,那就让网络自己去优化使得 IoU 最大吧。后来改用了 bounded IoU Loss,但原理是一样的。

这里面还有个问题,就是对于某个 anchor,应该优化和哪个 ground truth 的 IoU,也就是说应该把这个 anchor 分配给哪个 ground truth。对于以前常规的 anchor,我们可以直接计算它和所有 ground truth 的 IoU,然后将它分配给 IoU 最大的那个 gt。但是很不幸现在的 anchor 的 w 和 h 是不确定的,是一个需要预测的变量。我们将这个 anchor 和某个 gt 的 IoU 表示为

TB1BvX2JgHqK1RjSZJnXXbNLpXa.png

(这里没明白,w,h不是通过网络预测出来了吗,那就可以计算IOU了啊,怎么说是不确定的呢?好像是:先通过采样9个尺寸,确定这个点上的anchor对应的ground truth,然后再网络预测这个anchor的长宽,计算anchor与ground truth的IOU,通过优化IOU来优化网络参数)

当然我们不可能真的把所有可能的 w 和 h 遍历一遍然后求 IoU 的最大值,所以采用了近似的方法,也就是 sample 一些可能的 w 和 h。理论上 sample 得越多,近似效果越好,但出于效率的考虑,我们 sample 了常见的 9 组 w 和 h。我们通过实验发现,最终结果对 sample 的组数这个超参并不敏感,也就是说不管 sample 多少组,近似效果已经足够。

生成 anchor

在得到 anchor 位置和中心点的预测之后,我们便可以生成 anchor 了,如下图所示。这时的 anchor 是稀疏而且每个位置不一样的。采用生成的 anchor 取代 sliding window,AR (Average Recall) 已经可以超过普通 RPN 4 个点了,代价仅仅是增加两个 1x1 conv。

TB1iMh0JhTpK1RjSZFMXXbG_VXa.jpg

Feature Adaption

故事本可以就此结束,我们用生成的 anchor 和之前的特征图来进行 anchor 的分类和回归,涨点美滋滋。但是我们发现一个不合理的地方,大家都是同一层 conv 的特征,凭啥我就可以比别人优秀一些,代表一个又长又大的 anchor,你就只能代表一个小小的 anchor。

不合理的原因一方面在于,在同一层 conv 的不同位置,feature 的 receiptive field 是相同的,在原来的 RPN 里面,大家都表示相同形状的 anchor,所以相安无事,但是现在每个 anchor 都有自己独特的形状大小,和 feature 就不是特别好地 match。由于每个位置的形状不同,大的anchor应该对应较大感受野,小的anchor对应小的感受野。另一方面,对原本的特征图来说,它并不知道形状预测分支预测的 anchor 形状,但是接下来的分类和回归却是基于预测出的 anchor 来做的,可能会比较懵逼。

我们增加了一个 Feature Adaption 模块来解决这种问题。思路很简单,就是把 anchor 的形状信息直接融入到特征图中,这样新得到的特征图就可以去适应每个位置 anchor 的形状。我们利用一个 3x3 的 deformable convolution 来修正原始的特征图,而 deformable convolution 的 offset 是通过 anchor 的 w 和 h 经过一个 1x1 conv 得到的。(此处应该划重点,如果是像正常的 deformable convolution 一样,用特征图来预测 offset,则提升有限,因为没有起到根据 anchor 形状来 adapt 的效果

利用变形卷积的思想,根据形状对各个位置单独进行转换:

其中,fi是第i个位置的特征,(wi, hi)是对应的anchor形状。NT通过3*3的变形卷积实现。首先通过形状预测分支预测offset field(体现用anchor形状来adapt),然后对带偏移的原始feature map做变形卷积获得adapted features。之后进一步做分类和bounding box回归。

通过这样的操作,达到了让 feature 的有效范围和 anchor 形状更加接近的目的,同一个 conv 的不同位置也可以代表不同形状大小的 anchor 了。从表格可以看到,Feature Adaption 还是很给力的,带来了接近 5 个点的提升。

故事到这里其实也可以结束了,但是我们遇到了和之前一些改进 proposal 的 paper 里相同的问题,那就是 proposal 质量提升很多(如下图),但是在 detector 上性能提升比较有限。在不同的检测模型上,使用 Guided Anchoring 可以提升 1 个点左右。明明有很好的 proposal,但是 mAP 却没有涨很多,让人十分难受。

严格的IOU阈值

经过一番探究,我们发现了以下两点:1. 减少 proposal 数量,2. 增大训练时正样本的 IoU 阈值(这个更重要)。既然在 top300 里面已经有了很多高 IoU 的 proposal,那么何必用 1000 个框来训练和测试,既然 proposal 们都这么优秀,那么让 IoU 标准严格一些也未尝不可。

通过这两个改进,在 Faster R-CNN 上的涨点瞬间提升到了 2.7 个点(没有加任何 trick),其他方法上也有大幅提升。

TB1aaNUJkvoK1RjSZPfXXXPKFXa.jpg

Training

采用多任务loss进行端到端的训练,损失函数为:

 Anchor 设计准则

我们在 paper 里提到了 anchor 设计的两个准则,alignment(中心对齐) 和 consistency(特征一致)。其中 alignment 是指 anchor 的中心点要和 feature 的位置对齐,consistency 是指 anchor 的特征要和形状匹配。

Alignment

由于每个 anchor 都是由 feature map 上的一个点表示,那么这个 anchor 最好是以这个点为中心,否则位置偏了的话,这个点的 feature 和这个 anchor 就不是非常好地对应起来,用该 feature 来预测 anchor 的分类和回归会有问题。我们设计了类似 cascade/iterative RPN 的实验来证明这一点,对 anchor 进行两次回归,第一次回归采用常规做法,即中心点和长宽都进行回归,这样第一次回归之后,anchor 中心点和 feature map 每一个像素的中心就不再完全对齐。我们发现这样的两次 regress 提升十分有限。所以我们在形状预测分支只对 w 和 h 做预测,而不回归中心点位置。

Consistency

这条准则是我们设计 feature adaption 的初衷,由于每个位置 anchor 形状不同而破坏了特征的一致性,我们需要通过 feature adaption 来进行修正。这条准则本质上是对于如何准确提取 anchor 特征的讨论。对于两阶段检测器的第二阶段,我们可以通过 RoI Pooling 或者 RoI Align 来精确地提取 RoI 的特征。但是对于 RPN 或者单阶段检测器的 anchor 来说,由于数量巨大,我们不可能通过这种 heavy 的方法来实现特征和框的精确 match,还是只能用特征图上一个点,也就是 512x1x1 的向量来表示。那么 Feature Adaption 起到了一个让特征和 anchor 对应更加精确的作用,这种设计在其他地方也有可以借鉴之处。

效果

 

 

实验

数据集:MS COCO 2017

backbone:ResNet-50+FPN

image scale:1333*800,σ1 = 0.2,σ2 = 0.5,λ1 = 1, λ2 = 0.1,batchsize:16

 

 

各个模块的对照实验(其中AR*表示每幅图像*个proposal的平均召回率,ARS、ARM、ARL是在100 proposal计算的):

下图显示了滑窗法、GA以及gt产生的anchor的尺度和宽高比分布情况:

可见,GA方法产生的anchor分布更接近groundtruth。 

总结

  1. 在 anchor 设计中,alignment 和 consistency 这两个准则十分重要。
  2. 采用两个 branch 分别预测 anchor 的位置和形状,不需要预先定义。
  3. 利用 anchor 形状来 adapt 特征图。
  4. 高质量 proposal 可以使用更少的数量和更高的 IoU 进行训练。
  5. 即插即用,无缝替换。

 

参考链接:

https://www.cnblogs.com/cieusy/p/10477167.html

https://yq.aliyun.com/articles/691726  ;论文原作者笔记,推荐

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值