论文地址:Guided Anchoring网络
不得不佩服自媒体,直接找到了论文做者之一写了篇解析文章,这里给出连接,本文将引用一部分原做者的解析,减小个人打字量,也方便结合比照理解。ide
常见的生成 anchor 的方式是滑窗(sliding window),也就是首先定义 k 个特定尺度(scale)和长宽比(aspect ratio)的 anchor,而后在全图上以必定的步长滑动。anchor 的尺度和长宽比须要预先定义,这是一个对性能影响比较大的超参,并且对于不一样数据集和方法须要单独调整。若是尺度和长宽比设置不合适,可能会致使 recall 不够高:函数
一方面,大部分的 anchor 都分布在背景区域,对 proposal 或者检测不会有任何正面做用性能
另外一方面,预先定义好的 anchor 形状不必定能知足极端大小或者长宽比悬殊的物体学习
并且 anchor 数目过多影响将网络性能和速度。因此咱们期待的是稀疏,形状根据位置可变的 anchor。测试
本段引用做者本身的解释:优化
Alignmentui
因为每一个 anchor 都是由 feature map 上的一个点表示,那么这个 anchor 最好是以这个点为中心,不然位置偏了的话,这个点的 feature 和这个 anchor 就不是很是好地对应起来,用该 feature 来预测 anchor 的分类和回归会有问题。咱们设计了相似 cascade/iterative RPN 的实验来证实这一点,对 anchor 进行两次回归,第一次回归采用常规作法,即中心点和长宽都进行回归,这样第一次回归以后,anchor 中心点和 feature map 每个像素的中心就再也不彻底对齐。咱们发现这样的两次 regress 提高十分有限。因此咱们在形状预测分支只对 w 和 h 作预测,而不回归中心点位置。spa
Consistency设计
这条准则是咱们设计 feature adaption 的初衷,因为每一个位置 anchor 形状不一样而破坏了特征的一致性,咱们须要经过 feature adaption 来进行修正。这条准则本质上是对于如何准确提取 anchor 特征的讨论。对于两阶段检测器的第二阶段,咱们能够经过 RoI Pooling 或者 RoI Align 来精确地提取 RoI 的特征。可是对于 RPN 或者单阶段检测器的 anchor 来讲,因为数量巨大,咱们不可能经过这种 heavy 的方法来实现特征和框的精确 match,仍是只能用特征图上一个点,也就是 512x1x1 的向量来表示。那么 Feature Adaption 起到了一个让特征和 anchor 对应更加精确的做用,这种设计在其余地方也有能够借鉴之处。
一、提出了一种新的 anchor 生成方法:Guided Anchoring,即经过图像特征来指导 anchor 的生成,经过预测 anchor 的位置和形状,来生成稀疏并且形状任意的 anchor
二、设计了 Feature Adaption 模块来修正特征图使之与 anchor 形状更加匹配
这篇 paper 的方法用在了 COCO Challenge 2018 检测任务的冠军方法中,在极高的 baseline 上涨了 1 个点。
GA的逻辑图如上,网络分为3块:NL、NS、NT
NL 生成等大的单通道特征,表示每个像素位置为一个 anchor 中心的几率(1*1卷积+sigmoid)
NS 生成等大的双通道特征,表示每个 anchor 中心对应的 h、w 值(1*1卷积+转换运算)
NT 做者提出的 Feature adaption 模块,逻辑上属于 backbone 的特征提取,应用了可变形卷积,附加了 anchor 的信息,生成的 F' 将能够直接回归、分类对应的 anchor
NS 转换运算公式以下:
将 dw 和 dh 转换为 w 和 h,原文说可将 [-1,1] 放缩到 [0,1000],方便学习,因此推测在1*1后应该还有一个sigmoid层。
NT 的提出是由于自学习的 anchor 长宽并不会受特征层的感觉野指导,因此问题就来了:同一层的特征感觉野相同,但 anchor 差别巨大,每个特征点使用一样大小的感觉野表明不一样大小的 anchor,这不合理,因此做者在 NS 后添加了1*1卷积输出 offset,设计了 NT 这个仅包含一层3*3可变形卷积的结构,使得输出特征的每一个特征点表明一个 anchor 的特征信息。
损失函数由四部分组成:
其后两项为传统的分类回归损失函数,前两项为anchor的定位、形状损失函数。
定位标签按照 NL 输出来看很容易发现仅须要一张 mask 图像便可,可是这样定位正样本比例会太低,且负样本中会有不少误导项(临近真实点的像素都做为负样本的话会有很强的干扰性),因此做者提出了几个概念:CR、IR、OR,原文解释以下(“x′g” 表示的是 x 上标为 ' 下标为 g,其余符号同理):
(1) The center region CR=R(x′g, y′g, σ1w′, σ1h′) defines the center area of the box. Pixels in CR are assigned aspositive samples.
(2) The ignore region IR=R(x′g, y′g ,σ2w′, σ2h′) \ CR is a larger (σ2> σ1) region excluding CR. Pixels in IR are marked as“ignore”and exluded during training.
(3) The outside region OR is the whole feature map excluding CR and IR. Pixels in OR are regarded as negative samples.
即 CR 区域(真实中心附近的矩形范围像素)的样本均视为正样本,CR 区域外围的环形区域 IR 不参与损失函数的贡献,防止混淆,再外面的像素 OR 才视为负样本。
对于应用 FPN 结构做者作出了进一步的规范:
结合上面的规则,示意图以下:
原文本部分涉及两个问题:损失函数的选择 & gt 的选择。
先看 gt 选择,因为咱们的 anchor 没有预先的形状,因此咱们很差判断 anchor 属于哪一个 gt,做者的处理手段也很传统:预先定义9组宽高,将9组宽高和特定 gt 的 IOU 计算出来并保留最大的记为 vIOU,将其和不一样 gt 的 vIOU 横向比较,选最大的 vIOU 对应的 gt 做为该 anchor 对应的 gt。
损失函数做者在链接文章中说的很明白了,
预测最佳的长和宽,这是一个回归问题。按照往常作法,固然是先算出 target,也就是该中心点的 anchor 最优的 w 和 h,而后用 L1/L2/Smooth L1 这类 loss 来监督。然而这玩意的 target 并很差计算,并且实现起来也会比较困难,因此咱们直接使用 IoU 做为监督,来学习 w 和 h。既然咱们算不出来最优的 w 和 h,而计算 IoU 又是可导的操做,那就让网络本身去优化使得 IoU 最大吧。后来改用了 bounded IoU Loss,但原理是同样的。
论文为: Improving object local-ization with fitness nms and bounded iou loss (2018)。
做者发现 proposal 质量提高不少,可是在 detector 上性能提高比较有限。在不一样的检测模型上,使用 Guided Anchoring 能够提高 1 个点左右。明明有很好的 proposal,可是 mAP 却没有涨不少。做者对该问题的探索以下:
通过一番探究,咱们发现了如下两点:1. 减小 proposal 数量,2. 增大训练时正样本的 IoU 阈值(这个更重要)。既然在 top300 里面已经有了不少高 IoU 的 proposal,那么何须用 1000 个框来训练和测试,既然 proposal 们都这么优秀,那么让 IoU 标准严格一些也何尝不可。
这个正确的打开方式基本是 Jiaqi 独立调出来的,让 performance 一下好看了不少。经过这两个改进,在 Faster R-CNN 上的涨点瞬间提高到了 2.7 个点(没有加任何 trick),其余方法上也有大幅提高。
其余实验部分较为琐碎建议浏览原文。