ECCV2020:probabilistic anchor assignment (PAA)

ECCV2020:probabilistic anchor assignment (PAA)

论文阅读:Probabilistic Anchor Assignment with IoU Prediction for Object Detection

文章代码:

论文地址:

这篇文章主要是针对当下anchor-based model中anchor标签的分配问题加以改进,传统的方法是计算bounding box与target box之间的IOU,如果这个值大于正阈值,那么将其作为正样本,小于负样本阈值则将其作为负样本,其余的忽略。这样做有几个缺陷

  • 忽视了bounding box本身的内容,bbx和target的交集本身可能会包含大量的背景噪声。
  • 在测试阶段是没有target,无法计算IOU,造成了测试阶段和训练阶段的不一致。

这篇文章针对存在的问题提出了一个给anchor分配标签的概率模型,和一个后处理的方法,主要优势如下:

  1. 分配标准取决于分类精度和IOU的组合,而不单单取决于IOU,这对model的增益更大(focus分类精度使得这个metric可以考虑box本身的内容)。
  2. 通过混合高斯分布对正负样本进行建模,可解释性强。
  3. 丢掉了IOU阈值,正样本数目等超参数,模型更稳定。
  4. 通过修改网络结构对box与GT的IOU进行预测,训练阶段有真实的IOU作为label,测试阶段可以预测IOU,使得训练和测试阶段保持一致。

接下来从各个部分对文章进行刨析

Probabilistic Anchor Assignment Algorithm

这一部分是文章的重点,使用如下公式计算每一个anchor的得分情况

S_{cls},S_{loc},f_\theta,a,x,g 分别是分类,定位得分,参数为 \theta 的model,anchor,输入图片,ground truth。也就是说这个得分公式其实是和model的参数有关的。分类得分很容易算(就是分类分支的输出),定位得分通过IOU计算,然后使用最大似然进行优化

得到分类损失和定位损失,前者通过二元交叉熵损失计算,后者通过IOU损失计算(1-IOU)。

我们将anchor的分数(实际上在源码中传入的是anchor的cls损失和bbx损失的加权和,也就相当于score的反面吧,不过对于GMM来说二者差别不大)作为从概率分布中抽取的样本,并最大化分数的最大似然(通过调整分布的参数),然后对每个anchor我们就能得到它属于正,负样本的概率了。

最基本的一维二元高斯混合模型,给定一组anchor的分数,这个GMM的可能性可以使用期望最大化(EM)算法进行优化,可能有些同志不熟悉EM算法(就像我这种菜鸡),所以这里简单写一下步骤

  1. 输入一组anchor,他们各自有个分数,给negative,positive的高斯模型分别初始化参数。(至于输入的anchor)
  2. 计算每个anchor的分数分别属于negative,positive分布的概率 P_{neg}(a,\theta,g),P_{pos}(a,\theta,g) (Expectation)。
  3. 通过概率加权和重新计算每个分布的参数,比如 m_1=\frac{\sum_{i}^nP^{pos}_iS_i}{\sum_{i}^nP^{pos}_i} (Maximization)

当EM确定了GMM的参数的时候,就可以用上图中的四种方法确定每个anchor是正还是负了,算法整体如下,总结为

  1. 对每一个GT,先选一组anchor
  2. 对每个选择的anchor,使用确定好的GMM计算属于正负样本的概率
  3. 基于概率值将样本对分为正,负,忽略三个部分。

3.2 IoU Prediction as Localization Quality

这一段比较有启发性,但是很简单,就是在RPN网络加上一个头部,也就是红框所示的部分加上一个iou预测分支,注意这里每个pixel只使用一个anchor。

        if self.use_iou_pred:
            self.iou_pred = nn.Conv2d(
                in_channels, num_anchors * 1, kernel_size=3, stride=1,
                padding=1
            )
            all_modules.append(self.iou_pred)

有一个比较有趣的地方(我这种菜鸡经常理解错的地方),无论是one/two stage,凡是用到anchor的,先将feature map输入,获得上图中的对每个pixel的类别和bbx偏移量的预测,然后再生成anchor(anchor并没有作为输入去预测pred_box和类别)。虽然没有用到anchor作为输入,但是上图的 W*H*4A 是和每个anchor一一对应的,anchor起到的作用只是之后来预测标签进行监督学习而已。

  • 在此之后,one-stage将anchor和GT进行匹配,即根据IOU信息给他分配标签和回归目标,然后计算分类和回归损失即可,训练即可。
  • two-stage的算法生成anchor之后,根据IOU信息分配前景/背景标签和回归目标,然后RPN网络就可以计算LOSS了。Then,对anchor利用pred_box做回归;提取positive score最大的N个anchor;剔除异常anchor;对剩余anchor进行NMS,最后留下的anchor生成proposal这里就是one/two-stage最大差别(是否生产proposal),proposal再进入后续网络对类别进行预测,并再次regression。

3.3 Score Voting

这里引入了一个稍作改进的后处理的方法(压根没做改进,本来是这篇two-stage文章在NMS过程中的改进),当然对于one-stage算法,train阶段是不需要后处理的,这里只是测试阶段可以使用。所谓的得分投票,就是根据bbx自身和她的邻居给bbx重新计算出一个新的x,y,w,h,作者也验证了这样做确实有好处( s_i 是上面公式计算出的bbx的得分)。

4 Experiments

消融实验:可以看到,三种对混合高斯分布进行分割的方法其实差别不大。而PAA相对于IOU确实有提升(为啥不和novel的GIOU/CIOU比),IOU Pred也有一个点的提升

在COCO的 minival dataset 和其余三个模型的对比

和SOTA的比较

编辑于 2020-09-21 23:48