本文为CenterNet作者发表的,论文提出anchor-free/two-stage目标检测算法CPN,使用关键点提取候选框再使用两阶段分类器进行预测。论文整体思路很简单,但CPN的准确率和推理速度都很不错,比原本的关键点算法更快,源码也会公开,到时可以一试



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

论文: Corner Proposal Network for Anchor-free,Two-stage Object Detection

Introduction


  目前,amchor-based目标检测方法和anchor-free目标检测方法都涌现了大量的优秀检测方案。论文认为,对于形状特异的目标,anchor-free目标检测方式比较占优,但acnhor-free方法通常会出现大量的误检,如图1所示,需要一个独立的分类器来提升检测的准确率。为此,论文提出CPNDet(Corner Proposal Network),结合了anchor-free和two-stage的检测范式。先基于CornerNet进行角点检测,将有效的角点枚举组合成大量候选预测框。由于候选框包含大量负样本,先训练一个二值分类器过滤大部分的候选预测框,再使用多类别分类器进行标签预测。

Anchor-based or Anchor-free? One-stage or Two-stage?


  这里论文主要讨论anchor-based vs anchor-free以及one-stage vs two-stage的问题。

Anchor-based or Anchor-free?

  Anchor-based方法将大量的anchor平铺在特征图上,然后预测每个anchor是否包含物体以及标签。通常,anchor是与图片特定的位置关联,大小也是相对固定的,bbox回归能够轻微地改变其几何形状。Anchor-free方法则不受预设的anchor限制,直接定位目标的关键点,然后再预测其形状和标签。所以,论文认为anchor-free方法在任意形状目标的定位上更灵活,召回率也更高。

  论文也对anchor-based方法和anchor-free方法在不同大小以及不同比例的目标上的进行召回率对比,结果如上表所示。可以看出anchor-free方法通常有较高的召回率,特别是在长宽比较大的物体上,anchor-based方法由于预设的anchor与目标差异大,召回率偏低。其次,FCOS虽然也是anchor-free方法,但其最后需要预测关键点到边界的距离,这在这种场合下也难以预测。

One-stage or Two stage?

  虽然anchor-free方法解决了寻找目标候选框的约束,但由于缺乏目标的内部信息,难以很好地建立关键点与目标之间的联系,会给检测的准确率带来较大的影响,而关键点和目标之间的联系的建立通常需要丰富的语义信息。

  论文将高召回率CornerNet和CenterNet作为实验目标,结果如上表所示。主干网络的加强能够带来准确率的提升,但仍然有很多的误检。如果去掉无目标的误检($AP_{refined}$)以及纠正标签的错误识别($AP_{correct}$)后,准确率能够明显地提升了。上述的实验说明,为了建立关键点与目标间的联系,需要借用two-stage的范式,提取候选框的信息来过滤误检部分。

The Framework of Corner Proposal Network


  基于上面的分析,论文结合acnhor-free方法和two-stage范式提出了Corner-Proposal-Network(CPN),完整的结构如图2所示。首先使用anchor-free方法提取关键点,遍历关键点组合成候选框,最后使用两个分类器分别对候选框进行误检过滤以及标签预测。

Stage 1: Anchor-free Proposals with Corner Keypoints

  第一阶段为anchor-free候选框提取过程,假定每个目标都由两个关键点进行定位,先根据CornerNet输出两组角点的热图,选择top-k个左上角点以及top-k个右下角点。将有效的关键点组合成目标的候选框,关键点组合是否有效主要有两个判断:

  1. 关键点是否属于同一个类别
  2. 左上角点必须在右上角点的左上位置

  尽管论文基于CornerNet提取候选框,但后处理有较大差异。CornerNet使用embedding向量来组合关键点,论文认为embedding向量并不能保证是可学习的,而论文采用独立的分类器进行处理,能够使用完整的中间特征来提升准确率。

Stage 2: Two-step Classification for Filtering Proposals

  基于anchor-free方法提取候选框虽然召回率很高,但会带来大量的误检,论文采用two-step分类方法进行过滤和校正。首先采用轻量的二值分类器过滤80%的候选框,然后使用多分类器预测剩余候选框的类别。

  第一步训练二值分类器来决定候选框是否为目标,采用$7\times 7$的RoIAlign提取每个候选框的在box特征图上的特征,然后使用1个$32\times 7\times 7$的卷积层来输出每个预测框的分类置信度,损失函数为:

  $M$为总候选框数,$N$为正样本数,$p_m$为$m$候选框为目标的概率,$\tau$为IoU阈值,设为0.7。

  第二步用于给剩余的候选框预测类别,由于缺乏目标的内部信息的,关键点的类别通常不太准确,所以需要强大的分类器来根据ROI特征进行预测。首先使用$7\times 7$的ROIAlign提取每个候选框在category特征图上的特征,然后使用$C$个$256\times 7\times 7$的卷积层输出$C$维向量,$C$为类别数量,损失函数为:

  $\hat{M}$和$\hat{N}$为过滤后的候选框数量和正样本数量,$q_{m,c}$为$m$候选框的$c$类别置信度,其余的参数与第一步类似。

The Inference Process

  推理过程跟训练过程基本一样,由于训练过程包含很多低质量的预测框,$p_m$和$q_{m,c}$的值是偏向零的,所以推理阶段第一步使用相对低的阈值(0.2)进行过滤,大约保留20%的候选框。在第二步,每个候选框有两个标签,分别为角点预测的标签$s_1$和第二阶段分类器预测的标签$s_2$,当其中一个标签分数大于0.5时才将候选框输出,分数计算为$s_c=(s_1+0.5)(s_2+0.5)$,再归一化到$[0,1]$。

Experiments


  与SOTA检测算法进行对比,初始的输入分辨率为$511\times 511$。

  推理阶段的两个分类器对性能的影响,B-Classifier为二值分类器,M-Classifier为多标签分类器。

  相对于其它keypoint-based方法,CPN误检更低。

  二值分类器与CornerNet的embedding向量的性能对比。

  推理速度对比。

CONCLUSION


  论文提出anchor-free/two-stage目标检测算法CPN,使用关键点提取候选框再使用两阶段分类器进行预测。论文整体思路很简单,但CPN的准确率和推理速度都很不错,比原本的关键点算法更快,论文的细节也值得推敲。





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

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

CPNDet:粗暴地给CenterNet加入two-stage精调,更快更强 | ECCV 2020的更多相关文章

  1. Python之路,Day7 - Python基础7 面向对象

    本节内容:   面向对象编程介绍 为什么要用面向对象进行开发? 面向对象的特性:封装.继承.多态 类.方法.     引子 你现在是一家游戏公司的开发人员,现在需要你开发一款叫做<人狗大战> ...

  2. Python之路第一课Day6--随堂笔记(面向对象 )

    本节内容: 1. 面向对象编程介绍 2. 为什么要用面向对象进行开发? 3. 面向对象的特性:封装.继承.多态 4. 类.方法   一.面向过程 VS 面向对象  1. 编程范式 编程是 程序 员 用 ...

  3. 异构SOA系统架构之Asp.net实现(兼容dubbo)

    我们公司技术部门情况比较复杂,分到多个集团,每个集团又可能分为几个部门,每个部门又可能分为多个小组,组织架构比较复杂,开发人员比较多. 使用的编程语言也有点复杂,主流语言有.net(C#).Java. ...

  4. 利用Caffe做回归(regression)

    Caffe应该是目前深度学习领域应用最广泛的几大框架之一了,尤其是视觉领域.绝大多数用Caffe的人,应该用的都是基于分类的网络,但有的时候也许会有基于回归的视觉应用的需要,查了一下Caffe官网,还 ...

  5. python走起之第六话

    面向过程 VS 面向对象 编程范式 编程是 程序 员 用特定的语法+数据结构+算法组成的代码来告诉计算机如何执行任务的过程 , 一个程序是程序员为了得到一个任务结果而编写的一组指令的集合,正所谓条条大 ...

  6. Python之路,Day6 - 面向对象学习

    本节内容:   面向对象编程介绍 为什么要用面向对象进行开发? 面向对象的特性:封装.继承.多态 类.方法. 引子 你现在是一家游戏公司的开发人员,现在需要你开发一款叫做<人狗大战>的游戏 ...

  7. Monte Carlo方法简介(转载)

    Monte Carlo方法简介(转载)       今天向大家介绍一下我现在主要做的这个东东. Monte Carlo方法又称为随机抽样技巧或统计实验方法,属于计算数学的一个分支,它是在上世纪四十年代 ...

  8. python之路-Day7

    编程范式 编程是 程序 员 用特定的语法+数据结构+算法组成的代码来告诉计算机如何执行任务的过程 , 一个程序是程序员为了得到一个任务结果而编写的一组指令的集合,正所谓条条大路通罗马,实现一个任务的方 ...

  9. 新版本来袭:Apache Spark 1.5新特性介绍

    年9月9日发布了1.5版本,该版本由230+开发人员和80+机构参与,修复了1400多个补丁,该版本可以通过 http://spark.apache.org/downloads.html进行下载.Sp ...

随机推荐

  1. MySQL和sparkSQL合并行

    表A 表B 从表A到表B MySQL 写法:select name, group_concat(score seperate ';') as score from A group by name sp ...

  2. mongodb 学习之——mongod --help 中文解释

    中文解释如下: -------------------------------------------------------------------------------- --quiet # 安 ...

  3. nginx配置访问本地资源

    参考博客:https://www.cnblogs.com/xy51/p/9973326.html 需要访问路径:http://IP:10013/p1upgrade/picfiles/image73b4 ...

  4. (原创)nginx反向代理上网,使docker可以拉取镜像

    转载请注明出处:饭饭博客:https://www.cnblogs.com/zzf0305/p/9602107.html 摘语:参考了N多大侠的资料,终于将自己的环境配置起来了.站在众多巨人的肩膀进行总 ...

  5. Python轻松入门到项目实战-实用教程

    本课程完全基于Python3讲解,针对广大的Python爱好者与同学录制.通过本课程的学习,可以让同学们在学习Python的过程中少走弯路.整个课程以实例教学为核心,通过对大量丰富的经典实例的讲解.让 ...

  6. Navicat Primium连接数据库报ORA-28547错误

    这个问题主要是Navicat Primium与orecal中的oci.dll版本不一致造成的,无论是本地数据库或者网络数据库. 解决方法:在数据库orecal安装目录中搜索oci.dll文件,找到后将 ...

  7. UML—20—001

    这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzzcxy/2018SE1 这个作业要求在哪里 https://edu.cnblogs.com/campus/fz ...

  8. Helm 带你飞

    文章目录 目录 文章目录 在没使用 Helm之前,向 K8S部署应用,我们要依次部署 deployment. svc 等,步骤较繁琐.况且随着很多项目微服务化,复杂的应用在容器中部署以及管理显得较为复 ...

  9. luabind 使用

    LuaBind --最强大的Lua C++ Bind 转载:http://www.cppblog.com/deane/articles/49208.html1 介绍LuaBind 是一个帮助你绑定C+ ...

  10. 部署docker镜像仓库及高可用

      下载地址: https://github.com/goharbor/harbor/releases   安装harbor服务器: 安装harbor root@harbor-vm1:/usr/loc ...