CPNDet:粗暴地给CenterNet加入two-stage精调,更快更强 | ECCV 2020
本文为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个右下角点。将有效的关键点组合成目标的候选框,关键点组合是否有效主要有两个判断:
- 关键点是否属于同一个类别
- 左上角点必须在右上角点的左上位置
尽管论文基于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的更多相关文章
- Python之路,Day7 - Python基础7 面向对象
本节内容: 面向对象编程介绍 为什么要用面向对象进行开发? 面向对象的特性:封装.继承.多态 类.方法. 引子 你现在是一家游戏公司的开发人员,现在需要你开发一款叫做<人狗大战> ...
- Python之路第一课Day6--随堂笔记(面向对象 )
本节内容: 1. 面向对象编程介绍 2. 为什么要用面向对象进行开发? 3. 面向对象的特性:封装.继承.多态 4. 类.方法 一.面向过程 VS 面向对象 1. 编程范式 编程是 程序 员 用 ...
- 异构SOA系统架构之Asp.net实现(兼容dubbo)
我们公司技术部门情况比较复杂,分到多个集团,每个集团又可能分为几个部门,每个部门又可能分为多个小组,组织架构比较复杂,开发人员比较多. 使用的编程语言也有点复杂,主流语言有.net(C#).Java. ...
- 利用Caffe做回归(regression)
Caffe应该是目前深度学习领域应用最广泛的几大框架之一了,尤其是视觉领域.绝大多数用Caffe的人,应该用的都是基于分类的网络,但有的时候也许会有基于回归的视觉应用的需要,查了一下Caffe官网,还 ...
- python走起之第六话
面向过程 VS 面向对象 编程范式 编程是 程序 员 用特定的语法+数据结构+算法组成的代码来告诉计算机如何执行任务的过程 , 一个程序是程序员为了得到一个任务结果而编写的一组指令的集合,正所谓条条大 ...
- Python之路,Day6 - 面向对象学习
本节内容: 面向对象编程介绍 为什么要用面向对象进行开发? 面向对象的特性:封装.继承.多态 类.方法. 引子 你现在是一家游戏公司的开发人员,现在需要你开发一款叫做<人狗大战>的游戏 ...
- Monte Carlo方法简介(转载)
Monte Carlo方法简介(转载) 今天向大家介绍一下我现在主要做的这个东东. Monte Carlo方法又称为随机抽样技巧或统计实验方法,属于计算数学的一个分支,它是在上世纪四十年代 ...
- python之路-Day7
编程范式 编程是 程序 员 用特定的语法+数据结构+算法组成的代码来告诉计算机如何执行任务的过程 , 一个程序是程序员为了得到一个任务结果而编写的一组指令的集合,正所谓条条大路通罗马,实现一个任务的方 ...
- 新版本来袭:Apache Spark 1.5新特性介绍
年9月9日发布了1.5版本,该版本由230+开发人员和80+机构参与,修复了1400多个补丁,该版本可以通过 http://spark.apache.org/downloads.html进行下载.Sp ...
随机推荐
- Salesforce 系列(一):云服务和 Salesforce 理念简介
本系列文章系笔者在 Salesforce 开发过程中的些许总结与心得,旨在记录自己的成长,以及为对 Salesforce 感兴趣的小伙伴提供一些帮助,如有疏漏,还望多多包涵 ~ 云服务 云服务,也称云 ...
- 公司项目适配IOS9总结
1.JSONKit 项目在xcode7 IOS9 开发环境上报错,不能进行JSONSring和JSONData的使用 .在真机上没有问题,在模拟器上put和post数据适合JSONKit报空对象野指针 ...
- ubuntu 设置apple主题
ubuntu 设置apple主题 参考地址,主要是看这个,很详细 https://linuxhint.com/gnome-tweak-tool-ubuntu-17-10/ 效果图 终端命令 $ sud ...
- 深入解析 C# 的 String.Create 的方法
作者:Casey McQuillan 译者:精致码农 原文:http://dwz.win/YVW 说明:原文比较长,翻译时精简了很多内容,对于不重要的细枝末节只用了一句话概括,但不并影响阅读. 你还记 ...
- Web服务器-正则表达式-小例子(3.1.2)
@ 目录 1.邮箱 2.手机号码 关于作者 1.邮箱 import re def main(): email = input("请输入一个邮件地址:") ret = re.matc ...
- matplotlib的学习6-annotation的标注
import matplotlib.pyplot as plt import numpy as np ''' 当图线中某些特殊地方需要标注时,我们可以使用 annotation. matplotlib ...
- 《Spring Boot 实战纪实》之关键点文档
目录 前言 (思维篇)人人都是产品经理 1.需求文档 1.1 需求管理 1.2 如何攥写需求文档 1.3 需求关键点文档 2 原型设计 2.1 缺失的逻辑 2.2 让想法跃然纸上 3 开发设计文档 3 ...
- Redis缓存穿透和缓存雪崩的面试题解析
前段时间去摩拜面试,然后,做笔试的时候,遇到了几道Redis面试题目,今天来做个总结.捋一下思路,顺便温习一下之前的知识,如果对您有帮助,左上角点下关注 ! 谢谢 文章目录 缓存穿透 缓存雪崩 大家都 ...
- LightningChart -XY 2D图表特性
LightningChart -XY 2D图表--2D图表 系列类型:抽样数据(离散数据).点线.任意形式的点线.面积.高低.多边形.股票系列(蜡烛图).条.带.恒定线.强度网格和强度网强度系列能够渲 ...
- 5行Python代码就能实现刷爆全网的动态条形图!
说起动态图表,最火的莫过于动态条形图了. 在B站上搜索「数据可视化」这个关键词,可以看到很多与动态条形图相关的视频. 好多视频都达到了上百万的播放量,属实厉害. 目前网上实现动态条形图现成的工具也很多 ...