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

原文地址

仔细一看是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

  • 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 m和类别 c c c,我们计算验证集上 m m m c c c这个类的分数,据此计算模型的权重 w c m w_c^m wcm.这个权重是用来乘上这个模型的分数输出以得到加权输出.

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

w c m = α w_c^m=\alpha wcm=α,若模型 m m m c c c上的得分低于 μ c \mu_c μ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} wcm=tcμcscmμc+αtcμctcscm,其中 s c m s_c^m scm是模型 m m m对类别 c c c在验证集上得分, t c t_c tc是所有模型中最高的 c c c类得分.

#结果

这里写图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值