为了解决CornerNet缺乏目标内部信息的问题,提出了CenterNet使用三元组进行目标检测,包含一个中心关键点和两个角点。从实验结果来看,CenterNet相对于CornerNet只增加了少量推理时延,但带来了将近5个点的AP提升



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

论文: CenterNet: Keypoint Triplets for Object Detection

Introduction


  CornerNet将目前常用的anchor-based目标检测转换为keypoint-based目标检测,使用角点对表示每个目标,CornerNet主要关注目标的边界信息,缺乏对目标内部信息的获取,很容易造成误检,如图1所示。为了解决这个问题,论文提出CenterNet,在角点对的基础上加入中心关键点组成三元组进行检测,既能捕捉目标的边界信息也能兼顾目标的内部信息。另外,为了更好地提取特征,论文还提出了center pooling和cascade corner pooling,分别用于更好地提取中心关键点和角点。

Baseline and Motivation


  CenterNet以CornerNet为基础,为了检测角点,CornerNet分别预测左上角点和右下角点的热图。另外,为每个角点预测了embedding向量和偏移值,相同目标的角点的embedding向量距离会非常小,偏移值则是对角点进行小范围调整。最后分别选择top-k个左上角点和top-k个右下角点,根据embedding向量距离进行配对,预测框置信度为角点对的置信度均值。

  论文对CornerNet的误检率进行了分析,如表1所示,大部分的误检集中在低IoU区域,有32.7%的预测结果与GT的IoU低于0.05,而小目标的误检率高达60.3%,可能的原因是CornerNet无法感知目标内部的信息,这个问题可以通过ROI池化二次分类来弥补,但是计算消耗很大。于是,论文提出高效的替代方案CenterNet,在CornerNet的角点对上再加入一个目标内部点组成三元组,以最低的成本捕捉目标的内部信息。

Object Detection as Keypoint Triplets


  CenterNet的整体结构如图2所示,将每个目标表示为中心关键点和角点对。在CornerNet的基础上增加一个中心关键点的热图输出,先按CornerNet的方法获取top-k个预测框,然后使用中心关键点对预测框进行过滤和排序:

  1. 根据分数选择top-k个中心关键点
  2. 结合对应的偏移值将中心关键点映射到输入图片
  3. 定义每个预测框的中心区域,检查中心区域是否包含中心关键点
  4. 如果中心区域包含中心关键点,保留该预测框,将分数替换为三个关键点的分数均值。如果中心区域不包含中心关键点,则去除该预测框。

  中心区域的大小对检测结果有直接的影响,区域过小会导致小目标召回率低,而区域过大则会导致大目标准确率低。为此,论文提出了尺寸可知(scale-aware)的中心区域,能够根据预测框的大小进行调整。定义\(tl_x\)和\(tl_y\)为预测框的左上角点坐标,\(br_x\)和\(br_y\)为预测框的右下角点坐标,\(ctl_x\)和\(ctl_y\)为中心区域的左上角点坐标,\(cbr_x\)和\(cbr_y\)分别为右下角点的坐标,四个点应满足以下关系:

  \(n\)为奇数,决定中心区域的尺寸大小,论文对于尺寸小于150和大于150的预测框分别将\(n\)设为3和5。

  图3展示了\(n=3\)和\(n=5\)的中心区域,根据公式1计算尺寸可知的中心区域,然后检查中心区域是否包含中心关键点。

Enriching Center and Corner Information


Center pooling

  通常,目标的几何中心不一定包含重要的分辨信息,比如人最有辨识度的地方在头部,而几何中心却在人体的中间。为了解决这个问题,论文提出中心池化来提取更丰富的可辨认信息。

  如图a所示,主干网络输出特征图后,在判断中心关键点时,取特征图水平方向和垂直方向的最大值之和作为分数,这样能够很好地帮助中心关键点的检测。

Cascade corner pooling

  由于角点通常在目标之外,缺少目标的相关信息,CornerNet使用corner pooling来解决这个问题,如图b所示,取边界方向的最大值作为分数,但这会导致角点过于关注边界信息。

  为了解决这个问题,需要让角点能够关注目标的内部,cascade corner pooling如图c所示,首先在边界方向找到最大值,然后在边界最大值处向内找到内部最大值,将两个最大值相加作为分数输出,这样角点能够同时关注边界信息和目标信息。

  Center pooling和cascade corner polling可通过组合不同方向的corner pooling进行简单实现,如图5所示。需要注意,图5b为cascade top corner pooling模块,只输出左上角点在top方向值,还要加上cascade left corner pooling输出的left方向值。cascade left corner pooling的结构跟图5b类似,只是交换Top pooling和Left pooling的位置。

Training and Inference


Training

  CenterNet的输入分辨率为\(511\times 511\),最后的热图大小为\(128\times 128\),完整的网络损失函数为:

  \(L^{co}_{det}\)和\(L^{ce}_{det}\)为focal loss,用来训练网络检测角点和中心关键点,\(L^{co}_{pull}\)和\(L^{co}_{push}\)为角点pull损失和push损失,用来最大化和最小化embedding向量的距离,\(L^{co}_{off}\)和\(L^{ce}_{off}\)为L1损失,用来调整角点和中心点的偏移值。

Inference

  测试时同时使用原图和水平翻转图片,每个图分别保留70个中心关键点、左上角点和右上关键点来预测,最后综合两个图片的结果进行Soft-nms输出。

Experiments


  与SOTA目标检测方法对比。

  与CornerNet的错误率优化对比。

  对比实验。

CONCLUSION


  为了解决CornerNet缺乏目标内部信息的问题,CenterNet使用三元组进行目标检测,包含一个中心关键点和两个角点。从实验结果来看,CenterNet相对于CornerNet只增加了少量推理时延,但带来了将近5个点的AP提升。





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

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

CenterNet:Corner-Center三元关键点,检测性能全面提升 | ICCV 2019的更多相关文章

  1. CenterNet算法笔记(目标检测论文)

    论文名称:CenterNet: Keypoint Triplets for Object Detectiontection 论文链接:https://arxiv.org/abs/1904.08189 ...

  2. dlib人脸关键点检测的模型分析与压缩

    本文系原创,转载请注明出处~ 小喵的博客:https://www.miaoerduo.com 博客原文(排版更精美):https://www.miaoerduo.com/c/dlib人脸关键点检测的模 ...

  3. PCL—低层次视觉—关键点检测(NARF)

    关键点检测本质上来说,并不是一个独立的部分,它往往和特征描述联系在一起,再将特征描述和识别.寻物联系在一起.关键点检测可以说是通往高层次视觉的重要基础.但本章节仅在低层次视觉上讨论点云处理问题,故所有 ...

  4. PCL—低层次视觉—关键点检测(rangeImage)

    关键点又称为感兴趣的点,是低层次视觉通往高层次视觉的捷径,抑或是高层次感知对低层次处理手段的妥协. ——三维视觉关键点检测 1.关键点,线,面 关键点=特征点: 关键线=边缘: 关键面=foregro ...

  5. 用keras实现人脸关键点检测(2)

    上一个代码只能实现小数据的读取与训练,在大数据训练的情况下.会造内存紧张,于是我根据keras的官方文档,对上一个代码进行了改进. 用keras实现人脸关键点检测 数据集:https://pan.ba ...

  6. keras实现简单CNN人脸关键点检测

    用keras实现人脸关键点检测 改良版:http://www.cnblogs.com/ansang/p/8583122.html 第一步:准备好需要的库 tensorflow  1.4.0 h5py ...

  7. 『关键点检测』CPN:Cascaded Pyramid Network for Multi-Person Pose Estimation

    论文连接 网络简介 face++2017年coco keypoint benchmark 数据集冠军的文章,发表于CVPR201 1  提出了一种金字塔型的串接模型,即CPN(cascaded pyr ...

  8. 『计算机视觉』Mask-RCNN_从服装关键点检测看KeyPoints分支

    下图Github地址:Mask_RCNN       Mask_RCNN_KeyPoints『计算机视觉』Mask-RCNN_论文学习『计算机视觉』Mask-RCNN_项目文档翻译『计算机视觉』Mas ...

  9. 机器学习进阶-人脸关键点检测 1.dlib.get_frontal_face_detector(构建人脸框位置检测器) 2.dlib.shape_predictor(绘制人脸关键点检测器) 3.cv2.convexHull(获得凸包位置信息)

    1.dlib.get_frontal_face_detector()  # 获得人脸框位置的检测器, detector(gray, 1) gray表示灰度图, 2.dlib.shape_predict ...

  10. OpenCV实战:人脸关键点检测(FaceMark)

    Summary:利用OpenCV中的LBF算法进行人脸关键点检测(Facial Landmark Detection) Author:    Amusi Date:       2018-03-20 ...

随机推荐

  1. 【Android】Message、Handler、MessageQueue、Looper 详解

    1 前言 ​ Handler 即处理器,常用于跨线程通讯:线程A 和线程 B 拥有同一个 handler 对象,在线程 A 中使用 handler 的 sendMessage() 方法发送消息,在线程 ...

  2. linux 快速安装LAMP教程

    最近学习linux,安装lamp遇到一些问题,记录下来分享一下: ------------------------------------------------------------------- ...

  3. oracle 使用comment语句添加表注释

    使用oracle comment语句可以给表.字段.视图等对象添加备注信息. 大致语法为: comment on TABLE table_name IS '备注内容'; 权限要求: 默认情况下用户只能 ...

  4. 理解[].forEach.call()并说明为什么要使用[].forEach.call()

    [].forEach.call(elems, callback) 相当于: Array.prototype.forEach.call(elems, callback) 又相当于: function(e ...

  5. 使用go module导入本地包

    go module是Go1.11版本之后官方推出的版本管理工具,并且从Go1.13版本开始,go module将是Go语言默认的依赖管理工具. 前提 假设我们有learngo和mypackage两个 ...

  6. Java链接Mysql数据库整理,尽管很简单,但还是分享出来,希望对那些初级朋友有所帮助!!!

    Java MySQL 连接 Java MySQL 连接 本章节我们为大家介绍 Java 如何使用 使用 JDBC 连接 MySQL 数据库. Java 连接 MySQL 需要驱动包,最新版下载地址为: ...

  7. 记一次酣畅淋漓的 K8s Ingress 排错过程(302,404,503,...)

    故事开始 第 1 关:[流量重定向到 /] 第 2 关:[应用返回 302,重定向到 /,引入 503 错误] 第 3 关:[静态资源访问遇到 503 问题] 第 4 关:[静态资源访问遇到 403 ...

  8. 【Azure App Service】当App Service中使用系统标识无法获取Access Token时

    问题描述 App Serive上的应用配置了系统标识(System Identity),通过系统标识获取到访问Key Vault资源的Access Token.但这次确遇见了无法获取到正常的Acces ...

  9. 【Azure API 管理】是否可以将Swagger 的API定义导入导Azure API Management中

    问题描述 是否可以将Swagger 的API定义导入导Azure API Management中? 操作步骤 是的,可以通过APIM门户导入单个的API Swagger定义文件.具体步骤如下: 第一步 ...

  10. 关于Cortex-M3报错解决方法总结:Flash Download failed错误

    事情原因:在一次使用ST-LINK v2下载程序时,突然出现 Error:Flash Download Failed-"Cortex-M3"这个错误,显示没有错误,没有警告.芯片型 ...