论文:Objects as Points
论文链接:https://arxiv.org/abs/1904.07850
代码链接:https://github.com/xingyizhou/CenterNet

这篇CenterNet算法也是anchor-free类型的目标检测算法,基于点的思想和CornerNet(参考博客:CornerNet算法笔记)是相似的,方法上做了较大的调整,整体上给人一种非常清爽的感觉,算法思想很朴素、直接,而且重点是在效果和效率之间能取得很好的平衡,提供的几个模型基本上能满足大部分人对效果和效率的需求,如Table1所示,这是十分难得的。

整体上还是习惯拿CenterNet和CornerNet做对比,CenterNet和CornerNet主要有3个不同点:
1、CenterNet,从算法名也可以看出这个算法要预测的是目标的中心点,而不再是CornerNet中的2个角点;相同点是都采用热力图(heatmap)来实现,都引入了预测点的高斯分布区域计算真实预测值,同时损失函数一样(修改版focal loss,网络输出的热力图也将先经过sigmod函数归一化成0到1后再传给损失函数)。另外CenterNet也不包含corner pooling等操作,因为一般目标框的中心点落在目标上的概率还是比较大的,因此常规的池化操作能够提取到有效的特征,这是其一。
2、CerterNet中也采用了和CornerNet一样的偏置(offset)预测,这个偏置我在CornerNet那篇博客中也介绍了,表示的是标注信息从输入图像映射到输出特征图时由于取整操作带来的坐标误差,只不过在CornerNet中计算的是2个角点的offset,而CenterNet计算的是中心点的offset。这部分还有一个不同点:损失函数,在CornerNet中采用SmoothL1损失函数来监督回归值的计算,但是在CenterNet中发现用L1损失函数的效果要更好,实验如下表所示,差异这么大是有点意外的,这是其二。

3、CenterNet直接回归目标框尺寸,最后基于目标框尺寸和目标框的中心点位置就能得到预测框,这部分和CornerNet是不一样的,因为CornerNet是预测2个角点,所以需要判断哪些角点是属于同一个目标的过程,在CornerNet中通过增加一个corner group任务预测embedding vector,最后基于embedding vector判断哪些角点是属于同一个框。而CenterNet是预测目标的中心点,所以将CornerNet中的corner group操作替换成预测目标框的size(宽和高),这样一来结合中心点位置就能确定目标框的位置和大小了,如Figure2所示,这部分的损失函数依然采用L1损失,这是其三。

以上这3者组成了CenterNet,可以分别用下面这3个图来描述,第一个图中粉色区域大致表示了以预测点为中心点的高斯分布区域。

前面提到这篇论文的一大特点是提供了多种不同效果和效率的模型,而这主要是通过替换不同的特征提取网络实现的。论文中主要提到的有4个网络,具体可以看Table1,其中DLA和ResNet网络均引入了deformable卷积,另外ResNet部分并非采用原ResNet网络的实现,而是增加了上采样、减少通道数等操作,前者是为了增大输出特征图尺寸(原来stride=32,现在是4),后者则是为了减少计算量。
整体来看既有注重速度的,也有注重效果的,还有在二者之间取得非常好的平衡的,比较实用,而且从这也可以看出主网络的设计对效果影响还是比较大的。

在Table1中用到的Hourglass网络、ResNet和DLA-34网络的详细结构可以参看Figure6,图示部分讲解非常清晰了,ResNet部分主要增加了上采样操作,保证输出特征图和输入图像之间的stride为4;DLA网络主要是增加了更多的特征融合操作,这部分没有对比实验。

看完CenterNet算法,可能有一些同学会有个疑问,那就是当不同目标框的中心点重合时,这种情况下怎么预测?这个问题和FCOS算法(参考博客:FCOS算法详解)中遇到的问题类似,在FCOS中当多个目标框区域重叠时,重叠部分的点的监督信息就有多个,但模型训练时监督信息肯定只能有一个,因为这种情况占比23%,影响较大,因此通过引入FPN网络解决。CenterNet中的冲突是目标框的中心点重合(基于输出特征层计算的中心点),作者从COCO数据集的统计信息来看,这种重合框的比例非常少,不到0.1%,基本上不会对训练稳定产生太大影响,因此没有针对这个进行解决。

论文中强调了在inference阶段不需要NMS操作做重复框去除的操作,因此特地跑了一下CenterNet的demo(默认是单尺度测试)看看具体的inference操作。假设测试输入是一张图像,默认配置下会先对图像做仿射变换,这一步重点在于将图像尺寸处理成512*512大小后作为网络的输入。执行网络的前向计算将得到3个输出:1、[1,80,128,128]大小的heatmap,2、[1,2,128,128]大小的尺寸预测,3、[1,2,128,128]大小的offset预测。heatmap会经过一个sigmoid函数使得范围为0到1,符合heatmap的定义,接下来对heatmap执行一个最大池化操作,kernel设置为3,stride设置为1,pad设置为1,这一步其实是在做重复框过滤,这也是为什么后续不再需要NMS操作的一个重要原因,毕竟这里3✖️3大小的kernel加上特征图和输入图像之间的stride=4,相当于输入图像中每12✖️12大小的区域都不会有重复的中心点,想法非常简单有效!然后再基于heatmap选择top K个得分最高的点(默认K=100),这样就确定了100个置信度最高的预测框的中心点位置了,这一步也会去掉一定的重复框。接下来就要确定预测框的大小了,通过输出的尺寸预测值和offset就可以得到。到目前位置,得到的预测框信息都是在128✖️128大小的特征图上,因此最后将预测框信息再映射到输入图像上就得到最终的预测结果了,显示预测结果时可以设定一个置信度阈值,高于阈值的才显示。

最后看看CenterNet和其他算法的对比,如Table2所示,结果一目了然。

CenterNet算法笔记相关推荐

  1. 《算法笔记》中文版 - 包括数组,链表,树,图,递归,DP,有序表等相关数据结构与算法的讲解及代码实现...

    来源:专知本文为资源,建议阅读5分钟本文为你分享<算法笔记>中文版. https://github.com/Dairongpeng/algorithm-note 目录概览 第一节 复杂度. ...

  2. 数据结构与算法笔记 - 绪论

    数据结构与算法笔记 - 绪论 1. 什么是计算 2. 评判DSA优劣的参照(直尺) 3. 度量DSA性能的尺度(刻度) 4. DSA的性能度量的方法 5. DSA性能的设计及其优化 x1. 理论模型与 ...

  3. 数据结构与算法笔记(十六)—— 二叉搜索树

    一.二叉搜索树定义 二叉搜索树(Binary Search Tree),又名二叉排序树(Binary Sort Tree). 二叉搜索树是具有有以下性质的二叉树: 若左子树不为空,则左子树上所有节点的 ...

  4. 数据结构与算法笔记(十五)—— 散列(哈希表)

    一.前沿 1.1.直接寻址表 当关键字的全域U比较小时,直接寻址是一种简单而有效的技术.假设某应用要用到一个动态集合,其中每个元素都有一个取自全域U={0,1,-,m-1)的关键字,此处m是一个不很大 ...

  5. 《algorithm-note》算法笔记中文版正式发布!

    无论是做机器学习.深度学习.自然语言处理还是其它领域,算法的重要性不言而喻!吃透算法底层原理.掌握算法数学推导和代码实现,对提高自己的硬核实力来说非常重要!今天给大家推荐一个超赞的开源算法笔记!中文版 ...

  6. 【算法】《algorithm-note》算法笔记中文版正式发布!

    无论是做机器学习.深度学习.自然语言处理还是其它领域,算法的重要性不言而喻!吃透算法底层原理.掌握算法数学推导和代码实现,对提高自己的硬核实力来说非常重要!今天给大家推荐一个超赞的开源算法笔记!中文版 ...

  7. c++ string 删除字符_算法笔记|(5)第二章C、C++的快速入门字符数组的存放方式string.h文件...

    字符数组的存放方式 由于字符数组是由若干个char类型的元素组成的,因此字符数组的每一位都是一个char字符,除此之外,在一维字符数组或者二维字符数组的第二维的末尾都有一个空字符\0表示存放的字符串的 ...

  8. 算法笔记(JavaScript版)——排序

    算法笔记(JavaScript版)--排序 本文内容根据Rebert Sedgewick和Kevin Wayne的<算法(第四版)>整理,原代码为java语言,自己修改为JavaScrip ...

  9. 三维重建7:Visual SLAM算法笔记

    VSLAM研究了几十年,新的东西不是很多,三维重建的VSLAM方法可以用一篇文章总结一下. 此文是一个好的视觉SLAM综述,对视觉SLAM总结比较全面,是SLAM那本书的很好的补充.介绍了基于滤波器的 ...

最新文章

  1. QT程序启动加载流程简介
  2. APScheduler 浅析
  3. UiPickerView基本使用方法
  4. java poi 设置标题_poi生成Word时指定文本样式,如“正文”,“标题1”,“标题2”等...
  5. php连接mysql开发环境_PHP开发环境搭建及常用的数据库操作
  6. Hyper-V损坏数据恢复报告
  7. linux下的yum命令详解
  8. ubuntu安装最新的rails-4.2.0
  9. java过滤html相关标签
  10. java怎么解析json_基于java解析JSON的三种方式详解
  11. 哪种处理器能跑vs还有oracle,AMD处理器哪个最强 2020AMD处理器性能排行榜
  12. 会matlab的简历怎么写,算法工程师简历项目经验填写样本
  13. 为什么程序员不应该在同一家公司待太久?
  14. git教程 git笔记 git常用 git使用 git操作 git简明 git版本控制 git仓库
  15. 《崩坏3》评测:游戏设计中整体性和利用率分析(中)
  16. java裁剪图片_java实现图片的缩放和裁剪
  17. python time localtime()
  18. An Industrial-Strength Audio Search Algorithm
  19. CTF(二)DES中的S盒
  20. 服务网格峰会 Service Mesh Summit 2022 重启报名

热门文章

  1. 第三次工业革命(七)
  2. 【工具】在TTF字体中提取想要的文字,让字体文件变迷你
  3. deskvideosys终端安全管理软件主要功能介绍
  4. python实现计时器(装饰器)
  5. 一个关于国产化适配 的PPT文案
  6. debian时间同步_如何在Debian 10上设置时间同步
  7. BFO Publisher轻松将HTML转换为PDF
  8. Springboot2.x集成ES7.x
  9. 本科学计算机专业当海军可以分配什么兵种,海军五大院校欢迎高中毕业生加入海军...
  10. 开源项目 02 HttpLib