论文抛弃以往根据IoU硬性指定anchor和GT匹配关系的方法,提出FreeAnchor方法来进行更自由的匹配,该方法将目标检测的训练定义为最大似然估计(MLE)过程,端到端地同时学习目标分类、目标检测以及匹配关系,从实验来看,效果十分显著



来源:晓飞的算法工程笔记 公众号

论文: FreeAnchor: Learning to Match Anchors for Visual

Object Detection

Introduction


  常规的目标检测网络基于IoU来进行anchor与GT间的匹配,但会面临以下问题:

  • 对于非中心特征的物体,比如细长的物体,空间上的对齐并不能保证anchor覆盖足够多的物体特征,从而造成分类和检测性能的下降。
  • 当检测目标密集时,以IoU作为匹配的准则是不可行的。

  以上的问题都来源于预先设定的anchor与GT的匹配,没有考虑到网络的输出情况。为此,论文提出基于学习的匹配方法,将匹配过程定义为最大化似然估计的过程,端到端地同时学习目标分类、目标检测以及匹配关系,取得了很不错的效果,论文的主要贡献如下:

  • 将检测算法的训练过程定义为最大似然估计的过程,并将手工设定anchor与GT匹配改为自由的anchor匹配,打破IoU的约束,允许GT根据最大似然的准则选择anchors。
  • 定义检测定制似然,并且实现端到端的检测和分类训练机制,最大化似然能够促进网络学习如何匹配最优的anchor,并保证与NMS算法的兼容。

The Proposed Approach


  为了学习anchor和GT的匹配关系,先将目标检测算法的训练转换为最大似然估计过程,从最大似然地角度优化分类和检测,然后定义检测定制似然,通过保证召回率和准确率进行匹配关系的优化,在训练阶段,将检测定制似然转换为检测定制损失,有效地端到端同时学习目标分类、目标检测以及匹配关系。

Detector Training as Maximum Likelihood Estimation

  常规one-stage检测算法的损失函数如公式1,$\mathcal{L}(\theta){ij}{cls}=BCE(a_j{cls},b_i^{cls}, \theta)$,$\mathcal{L}(\theta){ij}{loc}=SmoothL1(a_j{loc},b_i^{loc}, \theta)$,$\mathcal{L}(\theta){ij}{bg}=BCE(a_j{cls},\vec{0}, \theta)$,$\theta$为网络学习到的参数,$C{i,j}$是指代anchor $a_j$是否匹配GT $b_i$,只有两者的IoU大于阈值才为1,当anchor符合多个GT时,选择IoU最大的Gt,$A_{+}={a_j | \sum_i C_{ij}=1} \in A$,$A_{-}={a_j | \sum_i C_{ij}=0} \in A$。

  从最大似然估计(MLE)的角度来看,将损失函数$\mathcal{L}(\theta)$转换为公式2的似然概率,$\mathcal{P}(\theta){ij}{cls}$和$\mathcal{P}(\theta)_{ij}{bg}$为分类置信度,$\mathcal{P}(\theta){ij}^{loc}$为定位置信度,最小化$\mathcal{L}(\theta)$即最大化似然概率$\mathcal{P}(\theta)$。

  虽然公式2严格从最大似然估计的角度来优化anchor的分类和定位,但是忽略了如何学习匹配矩阵$C_{ij}$,目前的检测算法通过IoU指标进行匹配来解决这一问题,没有考虑优化GT和anchor的匹配关系。

Detection Customized Likelihood

  为了优化GT和anchor间的匹配规则,论文在CNN目标检测框架上加入检测定制似然(detection customized likelihood),揉合准确率和召回率,并保持对NMS的适配。

  首先构造每个GT $b_i$的IoU较高的anchor作为候选集$A_i\in A$,然后学习如何达到最好的匹配的同时最大化检测定制似然。

  为了优化召回率,先保证每个GT都有至少一个对应的anchor,如公式3,选择每个GT的候选集中分类和检测表现最好的anchor。

  为了优化准确率,检测器需要将定位较差的anchor归为背景类,目标函数如公式4,这里意味着top anchor尽可能不为背景。$P{a_j \in A_{-}}=1-max_i P{a_j \to b_i }$为$a_j$与所有GT不匹配的概率,$P{a_j \to b_i }$为anchor $a_j$正确预测GT $b_i$的概率。为了兼容NMS,$P{a_j \to b_i }$需满足以下属性:

  • $P{a_j \to b_i }$为IoU相关的单调递增函数
  • 当anchor与GT小于阈值时,$P{a_j \to b_i }$接近0
  • 对于每个GT,仅存在一个anchor满足$P{a_j \to b_i }=1$

  $P{a_j \to b_i }$的属性可以归纳为Saturated linear函数,即$P{a_j \to b_i }=Saturated linear(IoU_{ij}^{loc}, t, max_j(IoU_{ij}^{loc}))$。

  根据上面的定义,检测定制似然定义如公式5,揉合了召回率和准确率,并且与NMS兼容。通过优化似然,可以同时最大化召回率和准确率,达到自由地匹配GT和anchor。

Anchor Matching Mechanism

  为了有效地学习匹配关系,将公式5的检测定制似然转换成检测定制损失函数,如公式5,$max$函数用来选择每个GT最适合的anchor。在训练期间,从候选集$A_i$中选择一个anchor进行网络参数$\theta$的更新。

  在训练初期,由于随机初始化,每个anchor的置信度都很小,不能代表anchor的好坏,为此使用Mean-max函数进行anchor的选择。

  在训练不充分时,Mean-max函数能够接近均值函数,即几乎所有的anchor都能用于训练,随着训练越充分后,Mean-max函数则接近max函数,最终等同于max函数,即选择最好的anchor用于训练。

  将公式6的max函数替换为Mean-max函数,对第二项加入focal loss,同时,两项分别进行$w_1$和$w_2$加权,最终的检测定制损失函数如公式7,$X_i={\mathcal{P}(\theta){ij}^{cls} \mathcal{P}(\theta){ij}^{loc} | a_j \in A_i}$为候选集$A_i$的似然集,$w_1=\frac{\alpha}{||B||}$,$w_2=\frac{1-\alpha}{n||B||}$,$FL_(p)=-p^{\gamma}log(1-p)$。

  结合检测定制损失函数,检测器的训练过程如算法1。

Experiments


  实验的FreeAnchor实现基于RetinaNet,简单地将损失函数修改为论文提出的检测定制损失函数。

Learning-to-match

Compatibility with NMS

Parameter Setting

  超参数的实验如下:

  • Anchor bag size $n$,对比${40, 50, 60, 100 }$,其中,50的效果最好。
  • Background IoU threshold $t$,$P{a_j \to b_i }$的置信度,对比${0.5, 0.6, 0.7 }$,0.6效果最好。
  • Focal loss parameter,对比$\alpha \in {0.25, 0.5, 0.75 }$和$\gamma \in {1.5, 2.0, 2.5 }$,$\alpha=0.5$和$\gamma=2,0$组合的效果最好。
  • Loss regularization factor $\beta$,公式1的用于平衡分类和定位损失的权重,0.75效果最好。

Detection Performance

CONCLUSION


  论文抛弃以往根据IoU硬性指定anchor和GT匹配关系的方法,提出FreeAnchor方法来进行更自由的匹配,该方法将目标检测的训练定义为最大似然估计(MLE)过程,端到端地同时学习目标分类、目标检测以及匹配关系,从实验来看,效果十分显著。





如果本文对你有帮助,麻烦点个赞或在看呗~

更多内容请关注 微信公众号【晓飞的算法工程笔记】

FreeAnchor:抛弃单一的IoU匹配,更自由的anchor匹配方法 | NIPS 2019的更多相关文章

  1. 任由文字肆意流淌,更自由的开源 Markdown 编辑器

    对于创作平台来说内容编辑器是十分重要的功能,强大的编辑器可以让创作者专注于创作"笔"下生花.而最好取悦程序员创作者的方法之一就是支持 Markdown 写作,因为大多数程序员都是用 ...

  2. [ZZ]39条更好的软件开发方法

    1.重构是程序员的主力技能. 2.工作日志能提升脑容量. 3.先用profiler调查,才有脸谈优化. 4.注释贵精不贵多.杜绝大姨妈般的“例注”.漫山遍野的碎碎念注释,实际就是背景噪音. 5.普通程 ...

  3. qt项目: error LNK2038: 检测到“_MSC_VER”的不匹配项: 值“1900”不匹配值“1800”

    error LNK2038: 检测到“_MSC_VER”的不匹配项:  值“1900”不匹配值“1800” 该错误 网上通常的解释是: 原因:由于你使用了vs2012,相比较vs2010以及之前的vs ...

  4. 【Visual Studio】error LNK2038: 检测到“_MSC_VER”的不匹配项: 值“1600”不匹配值“1800” (转)

    1.案例一 _MSC_VER 定义编译器的版本.下面是一些编译器版本的_MSC_VER值:MS VC++ 10.0 _MSC_VER = 1600MS VC++ 9.0 _MSC_VER = 1500 ...

  5. error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“MTd_StaticDebug”

    今日VS2012 C++编译出现一堆错误: > 正在生成代码... >Code.obj : error LNK2005: "public: __thiscall std::_Co ...

  6. [java] 更好的书写equals方法-汇率换算器的实现(4)

    [java] 更好的书写equals方法-汇率换算器的实现(4) // */ // ]]>   [java] 更好的书写equals方法-汇率换算器的实现(4) Table of Content ...

  7. error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项:值“0”不匹配值“2”

    error: vtkCommon.lib(vtkSmartPointerBase.obj) : error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项:值“0”不 ...

  8. "_ITERATOR_DEBUG_LEVEL"的不匹配项: 值"0"不匹配值"2"

    error: 1>vtkCommon.lib(vtkDebugLeaksManager.obj) : error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项 ...

  9. 【错误总结之(一)】error LNK2038: 检測到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“0”不匹配值“2”

    1>cvblob.lib(cvblob.obj) : error LNK2038: 检測到"_ITERATOR_DEBUG_LEVEL"的不匹配项: 值"0&quo ...

随机推荐

  1. Extjs——简单的Grid panel小实例

    <!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ...

  2. Newtonsoft.Json.Linq 序列化 反序列化等知识

    1.反序列化实体类 //使用JObject读写字符串:JObject j = JObject.Parse(data);IEnumerable<JProperty> properties = ...

  3. Rank of Tetris 杭电 拓扑排序加并查集

    自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球. 为了更好的符合那些爱好者的喜好,Lele又想了一个新点子:他将制作一个全球Tetris高手排行榜, ...

  4. Git敏捷开发--stash命令

    save 执行git stash,默认以commit info保存当前的stash信息 当在某个commit下,执行多次stash时,无法友好地区分每个stash的改动.save 命令可以清晰地标识每 ...

  5. redis 分布式锁的 5个坑,真是又大又深

    引言 最近项目上线的频率颇高,连着几天加班熬夜,身体有点吃不消精神也有些萎靡,无奈业务方催的紧,工期就在眼前只能硬着头皮上了.脑子浑浑噩噩的时候,写的就不能叫代码,可以直接叫做Bug.我就熬夜写了一个 ...

  6. [安全] Kali Linux安装TheFatRat

    一.解决访问国外网络的问题 由于字符敏感,以下所有vray的第二位都需要加上"2". 1.使用vray客户端 前提条件:拥有一个海外vray服务器提供socks5代理. 1)下载v ...

  7. PHP 新特性:如何善用接口与Trait

    首先! 接口也可以继承,通过使用 extends 操作符. 案例: <?php interface a { public function foo(); } interface b extend ...

  8. 在php中如何实现cookie即时生效,不用刷新就可以使用

    参考:https://www.jianshu.com/p/0468ef5dbf4d 今天在用php设置cookie的时候,发现cookie如果只是赋值一次的话,要手动刷新一下浏览器才能把数据及时更新, ...

  9. JQ获取select上的option的data-start和data-id

    来源:https://zhidao.baidu.com/question/692142321436883524.html 静态的写法: 用jq的attr()函数,如: HTML: <select ...

  10. PL/SQL 九九乘法表

    和shell脚本九九乘法表一样,只是语法有少出入 先看看效果图先: 利用for循环: SET SERVEROUTPUT ON DECLARE x INT :=1; y INT :=1; BEGIN F ...