CornerNet:经典keypoint-based方法,通过定位角点进行目标检测 | ECCV2018
论文提出了CornerNet,通过检测角点对的方式进行目标检测,与当前的SOTA检测模型有相当的性能。CornerNet借鉴人体姿态估计的方法,开创了目标检测领域的一个新框架,后面很多论文都基于CorerNet的研究拓展出新的角点目标检测
来源:晓飞的算法工程笔记 公众号
论文: CornerNet: Detecting Objects as Paired Keypoints

Introduction
目标检测算法大都与anchor box脱不开关系,论文认为使用anchor box有两个缺点:1) 需要在特征图上平铺大量的anchor box避免漏检,但最后只使用很小一部分的anchor box,造成正负样本不平衡且拖慢训练。 2) anchor box的引入带来了额外的超参数和特别的网络设计,使得模型训练变复杂。

基于上面的考虑,论文提出了CornerNet,将目标检测定义为左上角点和右下角点的检测。网络结构如图1所示,通过卷积网络预测出左上角点和右下角点的热图,然后将两组热图组合输出预测框,彻底去除了anchor box的需要。论文通过实验也表明CornerNet与当前的主流算法有相当的性能,开创了目标检测的新范式。
CornerNet
Overview
CornerNet中通过检测目标的左上角点和右下角点进行目标检测,卷积网络预测两组热图(heatmap)来表示不同类别目标的角点位置,分别对应左上角点和右下角点。为了将左上角点和左下角点进行对应,为每个角点预测一个embedding向量,属于同一个目标的两个角点的距离会非常小。另外还增加了偏移量(offset)的预测,对角点的位置进行小幅度的调整。

CornerNet的结构如图4所示,使用hourglass网络作为主干网络,通过独立的两个预测模块输出两组结果,分别对应左上角点和右下角点,每个预测模块通过corner池化输出用于最终预测的热图、embedding向量和偏移。
Detecting Corners

预测的热图的大小为\(C\times H\times W\),\(C\)为类别数量,不包含背景类。每个GT的角点仅对应一个正样本点,其它的点均为负样本点,但在训练时不会等同地惩罚负样本点,而是减少正样本点半径内的负样本点的惩罚力度。这样做的原因主要在于,靠近正样本点的负样本点能够产生有足够高IoU的预测框,如图5所示。
半径的大小根据目标的大小来设定,保证产生的预测框能至少满足IoU大于\(t\)。在设定半径后,根据二维高斯核\(e^{-\frac{x^2+y^2}{2\sigma^2}}\)进行惩罚衰减,\(x\)和\(y\)为相对正样本点的距离,\(\sigma\)为半径的1/3。定义\(p_{cij}\)为位置\((i,j)\)关于类别\(c\)的预测分数,\(y_{cij}\)为根据高斯核得出的分数,论文设计了一个focal loss的变种:

由于池化层的存在,原图位置\((x,y)\)在特征图上通常会被映射到\((\lfloor\frac{x}{n}\rfloor, \lfloor\frac{y}{n}\rfloor)\),\(n\)为下采样因子。在将热图中的点映射回原图时,由于池化的原因可能会有精度的损失,这会极大地影响小目标的IoU计算。为了解决这个问题,论文提出了偏移预测,在将热图位置映射到原图前,小幅调整角点的位置:

\(o_k\)为偏移值,\(x\)和\(y\)为角点\(k\)的坐标。需要注意的是,网络对左上角点和右下角点分别预测一组偏移值,偏移值在类别间共用。在训练时,对正样本点添加smooth L1损失来训练角点的偏移值:

Grouping Corners
当图片中存在多个目标时,需要区分预测的左上角点和右下角点的对应关系,然后组成完整的预测框。这里论文参考了人体姿态估计的策略,每个角点预测一个一维的embedding向量,根据向量间的距离进行对应关系的判断。定义\(e_{t_k}\)目标\(k\)左上角点的embedding向量,\(e_{b_k}\)为右下角的embedding向量,使用pull损失和push损失来分别组合以及分离角点:

\(e_k\)为\(e_{t_k}\)和\(e_{b_k}\)的平均值,\(\Delta=1\),这里的pull损失和push损失跟偏移一样,仅对正样本点使用。
Corner Pooling

角点的位置一般都没有目标信息,为了判断像素是否为左上角点,需要向右水平查找目标的最高点以及向下垂直查找目标的最左点。基于这样的先验知识,论文提出corner pooling来定位角点。
假设需要确定位置\((i,j)\)是否为左上角点,首先定义\(f_t\)和\(f_l\)为左上corner pooling的输入特征图,\(f_{t_{i,j}}\)和\(f_{l_{i,j}}\)为输入特征图在位置\((i,j)\)上的特征向量。特征图大小为\(H\times W\),corner pooling首先对\(f_t\)中\((i,j)\)到\((i,H)\)的特征向量进行最大池化输出向量\(t_{ij}\),同样对\(f_l\)中\((i,j)\)到\((W,j)\)的特征向量也进行最大池化输出向量\(l_{ij}\),最后将\(t_{ij}\)和\(l_{ij}\)相加。完整的计算可表示为:

公式6和公式7采用element-wise最大池化。

在实现时,公式6和公式7可以如图6那样进行整张特征图的高效计算,有点类似动态规划。对于左上角点的corner pooling,对输入特征图分别进行从右往左和从下往上的预先计算,每个位置只需要跟上一个位置的输出进行element-wise最大池化即可,最后直接将两个特征图相加即可。

完整的预测模块结构如图7所示,实际上是个改进版residual block,将\(3\times 3\)卷积模块替换为corner pooling模块,最后输出热图、embedding向量和偏移。
Hourglass Network

CornerNet使用hourglass网络作为主干网络,这是用于人体姿态估计任务中的网络。Hourglass模块如图3所示,先对下采样特征,然后再上采样恢复,同时加入多个短路连接来保证恢复特征的细节。论文采用的hourglass网络包含两个hourglass模块,并做了以下改进:
- 替换负责下采样的最大池化层为stride=2的卷积
- 共下采样五次并逐步增加维度(256, 384, 384, 384, 512)
- 上采样使用两个residual模块+最近邻上采样
- 短路连接包含2个residual模块
- 在网络的开头,使用4个stride=2、channel=128的\(7\times 7\)卷积模块以及1个stride=2、channel=256维度的residual模块进行处理
- 原版的hourglass网络会对每个hourglass模块添加一个损失函数进行有监督学习,而论文发现这对性能有影响,没有采用这种方法
Experiments

对比corner pooling的效果。

对比负样本点惩罚衰减的效果。

对比hourglass网络与corner检测搭配的效果

对比热图和偏移预测的效果。

与其它各种类型的检测网络进行对比。
CONCLUSION
论文提出了CornerNet,通过检测角点对的方式进行目标检测,与当前的SOTA检测模型有相当的性能。CornerNet借鉴人体姿态估计的方法,开创了目标检测领域的一个新框架,后面很多论文都基于CorerNet的研究拓展出新的角点目标检测。
如果本文对你有帮助,麻烦点个赞或在看呗~
更多内容请关注 微信公众号【晓飞的算法工程笔记】

CornerNet:经典keypoint-based方法,通过定位角点进行目标检测 | ECCV2018的更多相关文章
- 定位、识别;目标检测,FasterRCNN
定位: 针对分类利用softmax损失函数,针对定位利用L2损失函数(或L1.回归损失等) 人关节点检测 针对连续变量和离散变量需要采用不同种类的损失函数. 识别: 解决方案: 1.利用滑动窗口,框的 ...
- 经典论文系列 | 目标检测--CornerNet & 又名 anchor boxes的缺陷
前言: 目标检测的预测框经过了滑动窗口.selective search.RPN.anchor based等一系列生成方法的发展,到18年开始,开始流行anchor free系列,CornerNe ...
- Android经典完美退出方法
Android经典完美退出方法,使用单例模式创建一个Activity管理对象,该对象中有一个Activity容器(具体实现自己处理,使用LinkedList等)专门负责存储新开启的每一个Activit ...
- 论文阅读笔记五十二:CornerNet-Lite: Efficient Keypoint Based Object Detection(CVPR2019)
论文原址:https://arxiv.org/pdf/1904.08900.pdf github:https://github.com/princeton-vl/CornerNet-Lite 摘要 基 ...
- 第14.12节 Python中使用BeautifulSoup解析http报文:使用select方法快速定位内容
一. 引言 在<第14.10节 Python中使用BeautifulSoup解析http报文:html标签相关属性的访问>和<第14.11节 Python中使用BeautifulSo ...
- CVPR2019目标检测方法进展综述
CVPR2019目标检测方法进展综述 置顶 2019年03月20日 14:14:04 SIGAI_csdn 阅读数 5869更多 分类专栏: 机器学习 人工智能 AI SIGAI 版权声明:本文为 ...
- 目标检测 | 经典算法 Cascade R-CNN: Delving into High Quality Object Detection
作者从detector的overfitting at training/quality mismatch at inference问题入手,提出了基于multi-stage的Cascade R-CNN ...
- 目标检测方法——SSD
SSD论文阅读(Wei Liu--[ECCV2016]SSD Single Shot MultiBox Detector) 目录 作者及相关链接 文章的选择原因 方法概括 方法细节 相关背景补充 实验 ...
- 目标检测方法总结(R-CNN系列)
目标检测方法系列--R-CNN, SPP, Fast R-CNN, Faster R-CNN, YOLO, SSD 目录 相关背景 从传统方法到R-CNN 从R-CNN到SPP Fast R-CNN ...
- [DeeplearningAI笔记]卷积神经网络3.1-3.5目标定位/特征点检测/目标检测/滑动窗口的卷积神经网络实现/YOLO算法
4.3目标检测 觉得有用的话,欢迎一起讨论相互学习~Follow Me 3.1目标定位 对象定位localization和目标检测detection 判断图像中的对象是不是汽车--Image clas ...
随机推荐
- 立创EDA使用笔记
立创EDA 在立创EDA上制作的PCB可以直接导入到嘉立创下单, 每个注册用户每个月可以下两个免费订单, 限制PCB尺寸10CMx10CM, 每单五片, 连制作到快递全部免费, 非常适合做样板. 立创 ...
- 适用于Spring Boot Jar的启停部署脚本
shell脚本参数 使用-z或-n对一个变量判空时, 若直接使用[ -n ARG ]这种形式,当{ARG}中有空格将会报错, line 27: [: sd: binary operator expec ...
- h5页面在微信打开,ios底部存在返回横条的问题
我的问题比较简单,一个处理链接的页面,二次跳转进入真正的页面,导致ios出现返回横条,点击后退回到了处理链接页面.因为这个后退不会重新加载,导致一直处在处理链接的这个空页面. 所以我用replace代 ...
- Qt+MySql开发笔记:Qt5.9.3的mingw32版本编译MySql8版本驱动并Demo连接数据库测试
前言 之前特定的mysql版本msvc版本已经调通了,但是为了更好的跨平台,所以选择用mingw32版本,于是需要编译mysql驱动的mingw32版本的驱动库,以便提供给qt连接mysql使用. ...
- Qt实用技巧:Qt从QtCreator更换为VS开发Qt所需要注意的坑
前言 基本都是使用QtCreator开发,使用vs进行一下开发,记录从QtCreator换成VS所遇到的注意的坑. VS装对应的Qt版本助手配置Qt版本 VS装番茄助手 这里 ...
- django中的Case,When,then用法
# 参考文档 https://docs.djangoproject.com/en/2.2/ref/models/conditional-expressions/ # Case()接受任意数量的When ...
- 【LeetCode贪心#02】摆动序列,麻了
摆动序列 力扣题目链接(opens new window) 如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列.第一个差(如果存在的话)可能是正数或负数.少于两个元素的序列也是摆动 ...
- python基础安装虚拟环境
1.pip install virtualenv或者pip3 install virtualenv 2.在要存放虚拟环境的地方创建一个venv文件夹,用来存放所有创建的虚拟环境,方便查找与管理 3.m ...
- 【Azure 事件中心】使用Kafka消费Azure EventHub中数据,遇见消费慢的情况可以如何来调节呢?
问题描述 使用Kafka消费Azure EventHub中数据,遇见消费慢的情况可以如何来调节呢? 问题解答 查看Kafka Consumer的配置参数,其中最只要的一个参数为:max.poll.re ...
- 【Azure 应用服务】如何定期自动重启 Azure App Service Plan(应用服务计划)
问题描述 如何定期自动重启 Azure App Service Plan(应用服务计划)? 因一个App Service Plan 下包含多个应用服务,如果能统一通过应用服务计划来重启所有的应用,则有 ...