论文提出了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的更多相关文章

  1. 定位、识别;目标检测,FasterRCNN

    定位: 针对分类利用softmax损失函数,针对定位利用L2损失函数(或L1.回归损失等) 人关节点检测 针对连续变量和离散变量需要采用不同种类的损失函数. 识别: 解决方案: 1.利用滑动窗口,框的 ...

  2. 经典论文系列 | 目标检测--CornerNet & 又名 anchor boxes的缺陷

    ​ 前言: 目标检测的预测框经过了滑动窗口.selective search.RPN.anchor based等一系列生成方法的发展,到18年开始,开始流行anchor free系列,CornerNe ...

  3. Android经典完美退出方法

    Android经典完美退出方法,使用单例模式创建一个Activity管理对象,该对象中有一个Activity容器(具体实现自己处理,使用LinkedList等)专门负责存储新开启的每一个Activit ...

  4. 论文阅读笔记五十二:CornerNet-Lite: Efficient Keypoint Based Object Detection(CVPR2019)

    论文原址:https://arxiv.org/pdf/1904.08900.pdf github:https://github.com/princeton-vl/CornerNet-Lite 摘要 基 ...

  5. 第14.12节 Python中使用BeautifulSoup解析http报文:使用select方法快速定位内容

    一. 引言 在<第14.10节 Python中使用BeautifulSoup解析http报文:html标签相关属性的访问>和<第14.11节 Python中使用BeautifulSo ...

  6. CVPR2019目标检测方法进展综述

    CVPR2019目标检测方法进展综述 置顶 2019年03月20日 14:14:04 SIGAI_csdn 阅读数 5869更多 分类专栏: 机器学习 人工智能 AI SIGAI   版权声明:本文为 ...

  7. 目标检测 | 经典算法 Cascade R-CNN: Delving into High Quality Object Detection

    作者从detector的overfitting at training/quality mismatch at inference问题入手,提出了基于multi-stage的Cascade R-CNN ...

  8. 目标检测方法——SSD

    SSD论文阅读(Wei Liu--[ECCV2016]SSD Single Shot MultiBox Detector) 目录 作者及相关链接 文章的选择原因 方法概括 方法细节 相关背景补充 实验 ...

  9. 目标检测方法总结(R-CNN系列)

    目标检测方法系列--R-CNN, SPP, Fast R-CNN, Faster R-CNN, YOLO, SSD 目录 相关背景 从传统方法到R-CNN 从R-CNN到SPP Fast R-CNN ...

  10. [DeeplearningAI笔记]卷积神经网络3.1-3.5目标定位/特征点检测/目标检测/滑动窗口的卷积神经网络实现/YOLO算法

    4.3目标检测 觉得有用的话,欢迎一起讨论相互学习~Follow Me 3.1目标定位 对象定位localization和目标检测detection 判断图像中的对象是不是汽车--Image clas ...

随机推荐

  1. STM32 printf 方法重定向到串口UART

    在嵌入式系统中调试代码是很麻烦的一件事, 如果能方便地输出调试信息(与调试者交互), 能使极大加快问题排查的过程. 串口在嵌入式领域是一个比较重要的通讯接口. 因为没有显示设备, 在单片机的程序里调用 ...

  2. Spring Boot图书管理系统项目实战-3.用户登录

    导航: pre:  2.项目搭建 next:4.基础信息管理 只挑重点的讲,具体的请看项目源码. 1.项目源码 需要源码的朋友,请捐赠任意金额后留下邮箱发送:) 2.登录页设计 <!DOCTYP ...

  3. Java并发编程实例--7.守护(Damon)线程

    Java有一种特殊线程叫守护(后台)线程. 1.这类线程拥有非常低的优先级且通常只是在没有其他线程运行的情况下执行. 2.其通常作为无线循环服务去执行某项任务. 3.不能让他们去执行重要任务因为你不知 ...

  4. Detours 的使用

    Detours 是一个用于在 ARM, ARM64, X86, X64 和 IA64 机器上拦截二进制函数的库. Detours 最常用来拦截应用程序中的 win32 api 调用,比如添加调试工具. ...

  5. IDA 常用快捷键记录

    常用快捷键1 1.切换文本视图与图表视图 空格键 2.返回上一个操作地址 ESC 3.搜索地址和符号 G 4.对符号进行重命名 N 5.常规注释 冒号键 6.可重复注释 分号键 7.添加标签 Alt+ ...

  6. java怎么打印一个对象的内存地址

    在Java一般使用HashCode来代表对象的地址,但是两个相同的对象就不行了,两个相同的对象的hashcode是相同的. 如果要对比两个相同的对象的地址可以使用,System.identityHas ...

  7. 这样优化,0.059s 启动一个SpringBoot项目

    https://mp.weixin.qq.com/s/2_tQO7Z6GfmC6y73jc6ITQ

  8. 【Java复健指南11】OOP高级02-代码块、单例设计和final关键字

    代码块 定义 代码化块又称为初始化块,属于类中的成员[即是类的一部分]. 类似于方法,将逻辑语句封装在方法体中,通过{}包围起来. 但和方法不同,没有方法名,没有返回,没有参数,只有方法体, 而且不用 ...

  9. 【生成对抗网络学习 其二】GAN(keras实现)代码阅读笔记

    想来想去还是记录一下吧,主要是怕以后时间长忘了 好记性不如烂笔头 代码来自eriklindernoren的开源GAN实现:https://github.com/eriklindernoren/Kera ...

  10. 框架和MVC架构

    网络框架及MVC架构 网络框架 所谓网络框架是指这样的一组Python包,它能够使开发者专注于网站应用业务逻辑的开发,而无须处理网络应用底层的协议.线程.进程等方面.这样能大大提高开发者的工作效率,同 ...