论文笔记 "PFDet: 2nd Place Solution to Open Images Challenge 2018 Object Detection Track"

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lanadeus/article/details/82557688

原文地址

仔细一看是iwi神的文章.吓死了.

#概要

PFDet获得了Google AI Open Images Object Detection Track 2018 on Kaggle的第二名.

本文有三个贡献.

  • 规模可变训练(Training at Scale): 展示了使用batchsize=512,使用ChanerMN,在512个GPU上训练物体检测器(object detctor)的可行性.

  • 共现loss(Co-occurrence Loss):
    提出了同现loss来忽略被错误标注为假阴性(false negative)的物体实例(instances). 同现loss使用了预先提取的类内(class-wise)关系.

  • 专家模型(Expert Models):
    展示了使用专家模型的有效性. 这对数据集里的一些罕见类别特别有效.

#方法

##基本架构

  • 基于2-stage的Faster R-CNN框架.

  • 使用SE-ResNeXt / SENet作为backbone feature extractor.

  • 为了更好地利用global context information, 使用了FPN(Feature Pyramid Networks) 和 PSP(Pyramid Spatial Pooling)模块.

  • 为了增强context information,在把RoI放大为两倍然后提取特征,并在全连接层之前与原始RoI的特征concat.

  • 将原始FPN的4种scale增加至5种,以更好地聚合global context information
    (***笔者吐槽: FPN的原始paper里面明明就是5种scale,fpn2~fpn6,fpn6的scale最小,由fpn5下采样而来. Detectron里也是这么实现的啊. 弟弟,你怎么回事!***).

  • BN (Batch normalization) 来加速网络收敛. 加在head和backbone之类的地方.
    除此之外,为了增强BN效果,我们在FPN的top-down path中也加了BN层.
    (笔者的贴心注释:head指除了backbone的网络部分,比如faster head,fast head…)

  • 我们首先泛化一下ground truth标签, 然后训练CNN. 泛化(expand)的方法是,将某个类别看做是OID中的semantic hierarchy(语义层级)上的所有ancestor(祖先)类.
    接着,我们把这个数据集看成是multi-label(多标签)的, 对每一个类都用sigmoid交叉熵来搞搞.
    当ground truth的类不是semantic hierarchy的叶子节点,我们就不用计算它的后代节点的sigmoid交叉熵loss了.
    (笔者的脑补:sementic hierachy其实就是一个语义树,类似wordnet/imagenet. 所有祖先类指的是某一个节点的所有祖先节点.比如交通工具其实就是汽车的祖先节点.)

  • 在测试时使用non-maximum weighted (NMW) suppression以去除重复的框. (笔者的幻想:就是nms的带权版)

##同现loss

在OID数据集中, 标注比较随意.虽然标注都是正确的,但是只有"verified"的instances会被标注.
也就是说:有很多阳性样本没有被标注出来!

看下图.

这里写图片描述

右边的那个人没有被标注身体部位,尽管"身体部位"存在于图片中.
这就会带来一个问题: 这个人的身体部位就会在训练时被当成人脸的负样本,这种标注的矛盾会造成模型的混乱,起码会使得性能下降.

为了减轻这个问题,文章引入了同现loss.

这个loss的主要思想是: 对于类A, 若它和类B的关系已经非常(由很强的先验知识)确定了,那么我们就可以简单地在训练中忽略这些负样本.

举个例子.

如果我们有一个ground truth的bbox,类别是人,那么我们有很强的自信说这个bbox里面有人脸(笔者的注释:原文如此.我觉得是起码有人头吧.)

这个神奇的loss要如何实现呢?

我们需要找到一些两两成对的类别,使得这些类别对满足:

“在类别为X的ground truth bbox内部,可以忽略所有Y类的阴性proposal”.

如果一个类Y往往作为X类instances的附属物存在,我们就可以考虑选择这样的类别对.
比如(视觉上来看): 轮胎是汽车的一部分, 牛仔裤往往是人的一部分.

##专家模型

OID中,类别极为不均衡. 这提高了模型学习一些罕见类的难度.
比如, 有238个类的标注少于1000张图片. 然而, 最常见的类,也就是人,有807k张标注过的图片. 我们fine-tune(微调)已在整个数据集上训练过的模型来得到专家模型. 每个专家模型都是在所有类别的一个很小的子集上微调的.

##集成

最后的提交中,使用了在500个类上训练的模型以及专家模型.我们取了所有模型输出的并集然后再进行suppression.

各个模型各有擅长,我们根据验证集的分数来分配各个模型在集成时的权重.

对每个模型 m m 和类别 c c ,我们计算验证集上 m m c c 这个类的分数,据此计算模型的权重 w c m w_c^m .这个权重是用来乘上这个模型的分数输出以得到加权输出.

设所有模型在 c c 类的平均得分为 μ c \mu_c .

w c m = α w_c^m=\alpha ,若模型 m m c c 上的得分低于 μ c \mu_c ;
否则,我们在 α \alpha 和1之间进行线性插值.
也就是说, w c m = s c m μ c t c μ c + α t c s c m t c μ c w_c^m={s_c^m-\mu_c\over t_c-\mu_c}+\alpha{t_c-s_c^m\over t_c-\mu_c} ,其中 s c m s_c^m 是模型 m m 对类别 c c 在验证集上得分, t c t_c 是所有模型中最高的 c c 类得分.

#结果

这里写图片描述

猜你喜欢

转载自blog.csdn.net/lanadeus/article/details/82557688