论文地址:https://arxiv.org/abs/1808.01244v1

论文代码:https://github.com/umich-vl/CornerNet

概述

CornerNet是一篇发表在ECCV 2018的目标检测论文。有别于主流目标检测算法基于anchor box的思想,CornerNet将关键点检测用于目标检测,通过检测目标区域的左上角和右下角这两个关键点来获取预测框。CornerNet创新性强,而且检测效果很好,在MS COCO数据集上的AP达到42.1%。

CornerNet介绍

Anchor box的使用使得单阶段算法具有与两阶段算法相当的检测效果,但是anchor box(1)数目巨大,而且容易造成正负样本不平衡,训练速度慢(2)引入了许多超参数设置和结构设计。受Newell等人在多人姿态估计上下文关联embedding的启发,作者提出了CornerNet,将一个目标检测为一个关键点对(边界框的左上角和右下角),使用单个卷积神经网络来预测heatmap(左上角、右下角),以及每个角点的embedding vector,该向量用于组合同一目标的角点对。CornerNet的大体流程如下图所示:

如图2所示,不同目标的角点没有相似特征。那么,怎样确定边界框的角点呢?

文中提出了一种新的池化层来解决这个问题。注意到目标的左上角的角点向右可以得到目标的顶部特征信息,向下可以得到目标的左侧特征信息,右下角的角点类似。作者提出Corner pooling的池化方式来获得这些信息。以左上角的角点为例,Corner pooling的示意图如下:

具体计算示例如图6所示,简单来讲,左上角的Corner pooling就是自右向左扫描的水平max-pooling、自底向上扫描的垂直max-pooling,将两个结果做元素和。右下角的池化类似。

网络结构

CornerNet的网络结构如下:

CornerNet使用Hourglass网络作为backbone提取特征,之后的两个预测模块分别用于预测左上角和右下角的角点,每个预测模块首先是一个Corner pooling层,其后有三个分支:heatmaps、embeddings和offsets。

Heatmaps就是角点位置的预测,一共两组分别表示左上角和右下角,每组有C个通道(C为类别数目,不含背景类),大小为H*W,每个通道都是二进制mask用于表示该类的角点的位置。注意到对于每个角点,只有ground-truth处是正,其余所有位置都是负的。但是实际上如果一对false角点距离ground-truth很近,那么它仍然可以生成与ground-truth重叠程度很大的框,如图5所示。所以用同样的权值惩罚负位置是不合理的。

因此,文中提出了focal loss的变体来处理heatmap损失:

其中,pcij是类别c在位置(i, j)的score,ycij是非标准化高斯增强的ground-truth,N是图像中目标数,α和β是超参数(实验中α设为2,β 设为4)。

Offsets则是位置偏移。下采样的使用使得输出尺寸小于原始图像尺寸,假设下采样因子为n,则图像中(x, y)映射到Heatmaps的([x/n], [y/n])。取整计算会导致精度丢失,使用offsets来更准确地进行Heatmaps到输入图像的映射。

训练过程中使用smooth L1损失,即:

Embedding用于确定左上角和右下角的一对角点是否来自同一个目标边界框。Embedding产生每个角点的embedding vector,如果左上角和右下角的一对角点属于同一个目标,那么它们embedding vector之间的距离应该很小。该部分的训练通过如下两个损失函数实现,其中(4)用于缩小属于同一目标的两个角点的embedding向量的距离,(5)用来放大不属于同一目标的两个角点的embedding向量的距离:

预测模块的详细结构如下图所示:

第一部分采用residual block结构,首先使用两个128通道的3*3卷积模块处理特征,然后使用corner pooling层。将池化特征输入256通道的3*3的conv-BN层,加上shortcut,然后通过卷积模块和conv-ReLU-conv层产生输出结果。

实验

网络随机初始化,没有在任何数据集上进行预训练。训练过程中,输入图像尺度为511*511,输出为128*128,。采用随机水平翻转、随机缩放、随机裁剪、随机色彩抖动等数据扩增技术。

Full loss如下:

其中,α和β都设为0.1,γ设为1。

测试细节:在角点Heatmaps上使用3*3 max-pooling,使用NMS后处理产生100个左上和100个右下角点。去掉Embedding vector的距离大于0.5或者包含不同类别的角点对。检测分数为左上角和右下角的平均得分。不对图像resize,使用0填充的方式产生指定大小的图像作为输入。同时应用原始图像和翻转图像进行测试,并结合二者的检测结果,使用softmax抑制冗余,仅保留前100个预测框。

实验结果

可见,使用corner pooling使得AP提升了两个点。

采用基于目标的半径衰减损失效果明显优于固定半径和不使用衰减惩罚损失的方法。

Heatmaps和offsets的引入大大提升了AP值。

CornerNet511的多尺度模型在COCO数据集上的AP达到42.1。

论文阅读 | CornerNet:Detecting Objects as Paired Keypoints的更多相关文章

  1. [论文理解] CornerNet: Detecting Objects as Paired Keypoints

    [论文理解] CornerNet: Detecting Objects as Paired Keypoints 简介 首先这是一篇anchor free的文章,看了之后觉得方法挺好的,预测左上角和右下 ...

  2. 【论文阅读】CornerNet: Detecting Objects as Paired Keypoints

    以下内容将介绍ECCV2018的一篇目标检测的文章<CornerNet: Detecting Objects as Paired Keypoints>.该文章讲述了一个老子就是不用anch ...

  3. CornerNet: Detecting Objects as Paired Keypoints

    CornerNet是一种anchor free的目标检测方法,不需要设置anchor,而是通过检测关键点(Keypoints),即目标的左上角(Top-Left Corners)和右下角(Bottom ...

  4. 论文阅读笔记五十:CornerNet: Detecting Objects as Paired Keypoints(ECCV2018)

    论文原址:https://arxiv.org/pdf/1808.01244.pdf github:https://github.com/princeton-vl/CornerNet 摘要 本文提出了目 ...

  5. 【CV论文阅读】Detecting events and key actors in multi-person videos

    论文主要介绍一种多人协作的视频事件识别的方法,使用attention模型+RNN网络,最近粗浅地学习了RNN网络,它比较适合用于处理序列的存在上下文作用的数据. NCAA Basketball数据集 ...

  6. 论文阅读笔记五十一:CenterNet: Keypoint Triplets for Object Detection(CVPR2019)

    论文链接:https://arxiv.org/abs/1904.08189 github:https://github.com/Duankaiwen/CenterNet 摘要 目标检测中,基于关键点的 ...

  7. 论文阅读笔记五十三:Libra R-CNN: Towards Balanced Learning for Object Detection(CVPR2019)

    论文原址:https://arxiv.org/pdf/1904.02701.pdf github:https://github.com/OceanPang/Libra_R-CNN 摘要 相比模型的结构 ...

  8. 论文阅读笔记四十九:ScratchDet: Training Single-Shot Object Detectors from Scratch(CVPR2019)

    论文原址:https://arxiv.org/abs/1810.08425 github:https://github.com/KimSoybean/ScratchDet 摘要 当前较为流行的检测算法 ...

  9. 论文阅读笔记四十四:RetinaNet:Focal Loss for Dense Object Detection(ICCV2017)

    论文原址:https://arxiv.org/abs/1708.02002 github代码:https://github.com/fizyr/keras-retinanet 摘要 目前,具有较高准确 ...

随机推荐

  1. razor DisplayNameFor ViewModel为集合时显示列名的问题

    @{ViewModel nullModel = null; } @Html.DisplayNameFor(model => nullModel .FullName) https://stacko ...

  2. 随机抽样问题(蓄水池问题Reservoir Sampling)

    转自:孤影醉残阳 http://hi.baidu.com/siyupy/item/e4bb218fedf4a0864414cfad 随机抽样问题(蓄水池问题Reservoir Sampling) 随即 ...

  3. jstl中的日期格式化

    <% String strdate="2004/04/01";   Date a=new Date(strdate);   request.setAttribute(&quo ...

  4. Spring框架总结(四)

    对象依赖关系 Spring中,如何给对象的属性赋值?  [DI, 依赖注入] 1) 通过构造函数 2) 通过set方法给属性注入值 3) p名称空间 4)自动装配(了解) 5) 注解 一.对象属性赋值 ...

  5. Java中BufferedReader和scanner的对比

    Scanner 和BufferedReader同样能实现将键盘输入的数据送入程序, import java.io.*;import java.util.Scanner;public class C { ...

  6. 年年岁岁花相似,岁岁年年人不同。——linux课程初探

    写在前面 记得大约两年以前第一次学习linux,当初的目的还仅仅是学习操作系统,后来慢慢开始写linux内核代码,慢慢学会重构与代码的维护.在娄老师课上感觉这些工具是如此亲切和熟悉,没错这些曾经被我抛 ...

  7. 哇,两门学考都是A(〃'▽'〃)

    看来只要拼命去搞,两个月也是可以搞出来的啊~

  8. Linux系统优化及状态监控

    1.查看系统进程命令 top 进入后可按s 加时间,指定多长时间刷新一次 2.查看cpu信息 cat /proc/cpuinfo 3.查看内存信息 cat /proc/meminfo 4.清理内存:主 ...

  9. error: field 'b' has imcomplete type

    在下面的程序中,在编译时会遇到下面的错误: error: field 'b' has incomplete type 域b是一个不完备的类型,即class B的声明不完备 #include <i ...

  10. INDEX--关于索引的琐碎

    --=========================================================更新时的操作1>更新时有两种方式,一种是在原来的位置更新,另外一种是移除删除 ...