早期目标检测研究以anchor-based为主,设定初始anchor,预测anchor的修正值,分为two-stage目标检测与one-stage目标检测,分别以Faster R-CNN和SSD作为代表。后来,有研究者觉得初始anchor的设定对准确率的影响很大,而且很难找到完美的预设anchor,于是开始不断得研究anchor-free目标检测算法,意在去掉预设anchor的环节,让网络自行学习anchor的位置与形状,在速度和准确率上面都有很不错的表现。anchor-free目标检测算法分为两种,一种是DenseBox为代表的Dense Prediction类型,密集地预测的框的相对位置,另一种则是以CornerNet为代表的Keypoint-bsaed Detection类型,以检测目标关键点为主。

  本文主要列举几种Dense Prediction类型的网络,主要涉及以下网络:

YOLO


  YOLOv1是早期的anchor-free算法,后来的系列则转型成anchor-based算法。YOLO同时对多个物体进行分类和定位,没有proposal的概念,是one-stage实时检测网络的里程碑,标准版在TitanX达到45 fps,快速版达到150fps,但精度不及当时的SOTA网络。

  将输入分为$S\times S$的格子,如果GT的中心点在格子中,则格子负责该GT的预测:

  • 每个格子预测$B$个bbox,每个bbox预测5个值: $x,y,w,h$和置信度,分别为中心点坐标和bbox的宽高,中心点坐标是格子边的相对值,宽高则是整图的相对值。置信度可以反应格子是否包含物体以及包含物体的概率,定义为${\Pr}(Object)*IOU_{pred}^{truth}$,无物体则为0,有则为IOU
  • 每个格子预测$C$个类的条件概率$\Pr(Class_i|Object)$,注意这里按格子进行预测,没有按bbox进行预测

DenseBox


  DenseBox是早期的Anchor-free目标检测算法,当时R-CNN系列在小物体的检测上有明显的瓶颈,所以作者提出DenseBox,在小物体的检测也有不错的表现。在DenseBox提出的早些时间,著名的Faster R-CNN出现了,其强大的性能主导了目标检测算法往anchor-based的方向发展。直到FPN的出现,Anchor-free算法的性能才有了很大的提升,更多的工作开始涉及Anchor-free领域。目前很多Anchor-free目标检测研究都有DenseBox的影子,所以DenseBox的设计思路还是很超前的。

  DenseBox的整体设计如图1所示,单个卷积网络同时输出多个预测框及其类别置信度,输出的特征图大小为$5\times \frac{m}{4}\times \frac{n}{4}$。假设像素$i$位于$(x_i, y_i)$,其期望的5维向量为$\hat{t}_i={\hat{s}, \hat{dx^t}=x_i - x_t, \hat{dy^t}=y_i - y_t, \hat{dx^b}=x_i - x_b, \hat{dy^b}=y_i - y_b }$,第一个为分类置信度,后四个为像素位置到目标边界的距离,最后,将所有像素的输出转化为预测框,经过NMS处理后进行最后的输出。

Guided Anchoring


  Guided Anchoring通过在线生成anchor的方式解决常规手工预设anchor存在的问题,能够根据生成的anchor自适应特征,在嵌入方面提供了两种实施方法,是一个很完整的解决方案。

  Guided Anchoring首先判断目标可能出现的位置,然后学习不同位置上的目标的形状,可根据图片特征在线学习稀疏的候选anchor。然而,在线生成的anchor形状各异,固定的感受域可能不匹配其形状,所以Guided Anchoring根据anchor的形状进行自适应特征提取,然后再进行预测框精调与分类。

FSAF


  目标检测的首要问题就是尺寸变化,许多算法使用FPN以及anchor box来解决此问题。在正样本判断上面,一般先根据目标的尺寸决定预测用的FPN层,越大的目标则使用更高的FPN层,然后根据目标与anchor box的IoU进一步判断,但这样的设计会带来两个限制:拍脑袋式的特征选择以及基于IoU的anchor采样。

  为了解决上述的问题,FSAF(feature selective anchor-free)在每轮迭代中选择最优的层进行训练优化。如图3所示,FSAF为FPN每层添加anchor-free分支,包含分类与回归,在训练时,根据anchor-free分支的预测结果选择最合适的FPN层用于训练,最终的网络输出可同时综合FSAF的anchor-free分支结果以及原网络的预测结果。

FCOS


  论文提出anchor-free和proposal-free的one-stage的目标检测算法FCOS,不再需要anchor相关的的超参数,在目前流行的逐像素(per-pixel)预测方法上进行目标检测。从实验结果来看,FCOS能够与主流的检测算法相比较,达到SOTA,为后面的大热的anchor-free方法提供了很好的参考。

  目标检测由于anchor的存在,不能进行纯逐像素地快速预测,于是FCOS抛弃anchor,提出逐像素全卷积目标检测网络网络,总结如下:

  • 效仿前期的FCNs-based网络,如DenseBox,每个像素回归一个4D向量指代预测框相对于当前像素位置的偏移,如图1左
  • 为了预测不同尺寸的目标,DenseBox会缩放或剪裁生成图像金字塔进行预测,而且当目标重叠时,会出现像素不知道负责预测哪个目标的问题,如图1右。在对问题进行研究后,论文发现使用FPN能解决以上问题
  • 由于预测的结果会产生许多低质量的预测结果,论文采用center-ness分支来预测当前像素与对应目标中心点的偏离情况,用来去除低质量预测结果以及进行NMS

FoveaBox


  FoveaBox同时预测每个有效位置为目标中心的可能性及其对应目标的尺寸,输出类别置信度以及用以转化目标区域的尺寸信息。作为与FCOS和FSAF同期的Anchor-free论文,FoveaBox在整体结构上也是基于DenseBox加FPN的策略,主要差别在于FoveaBox只使用目标中心区域进行预测且回归预测的是归一化后的偏移值,还有根据目标尺寸选择FPN的多层进行训练。由于FoveaBox的整体实现方案太纯粹了,与其它Anchor-free方法很像,所以一直投稿到现在才中了,作者也是相当不容易。

SAPD


  Anchor-free检测方法分为anchor-point类别和key-point类别两种,anchor-point类别虽然更快更灵活,但准确率一般比key-point类别要低,所以论文着力于研究阻碍anchor-point类别准确率的因素,提出了SAPD(Soft Anchor-Point Detecto)。

  SAPD的核心如图3所示,分别为Soft-Weighted Anchor Points以及Soft-Selected Pyramid Levels:

  • Soft-weighted anchor points。anchor-point算法在训练时一般将满足几何关系的点设置为正样本点,其损失值权重均为1,这造成定位较不准确的点偶尔分类置信度更高。实际上,不同位置的点的回归难度是不一样的,越靠近目标边缘的点的损失值权重应该越低,让网络集中于优质anchor point的学习。
  • Soft-selectedpyramid levels。anchor-point算法每轮训练会选择特征金字塔的其中一层特征进行训练,其它层均忽略,这在一定程度上造成了浪费。因为其他层虽然响应不如被选择的层强,但其特征分布应该与被选择层是类似的,所以可以赋予多层不同权重同时训练。

ATSS


  在仔细比对了anchor-based和anchor-free目标检测方法后,结合实验结果,论文认为两者的性能差异主要来源于正负样本的定义,假如训练过程中使用相同的正负样本,两者的最终性能将会相差无几,于是论文提出ATSS( Adaptive Training Sample Selection)方法。

  ATSS能够自动根据与GT的相关统计特征选择合适的anchor box作为正样本进行训练,在不带来额外计算量和参数的情况下,能够大幅提升模型的性能,十分有用。

FCOSv2


  图2为FCOSv2中的主干网络结构,主干网络依然采用FPN,每层特征使用共同的head预测类别信息、尺寸信息以及Center-ness,整体思想基本与FCOS一致。对FCOS的小修小改,最终性能达到了50.4AP,可谓相当强劲了,在工程上可以参考其中的改进以及提升方法。

DDBNet


  作者认为当前anchor-free方法存在两个问题,中心关键点与目标的语义不一致以及局部特征的回归有局限性。为了解决上述两个问题,作者提出了十分大胆的方法DDBNet。

  DDBNet包含box分解/组合模块以及语义一致模块,分别用于解决中心关键点的回归不准问题以及中心关键点与目标的语义不一致问题,结果如图2中的实线框。论文的主要贡献如下:

  • 基于anchor-free架构提出新的目标检测算法DDBNet,能够很好地解决中心关键点的回归问题以及中心关键点的语义一致性。
  • 验证了中心关键点和GT的语义一致性,能够帮助提升目标检测网络的收敛性。
  • DDBNet能够达到SOTA精度(45.5%),并且能够高效地拓展到其它anchor-free检测器中。







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

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

Anchor-free目标检测综述 -- Dense Prediction篇的更多相关文章

  1. Anchor-free目标检测综述 -- Keypoint-based篇

      早期目标检测研究以anchor-based为主,设定初始anchor,预测anchor的修正值,分为two-stage目标检测与one-stage目标检测,分别以Faster R-CNN和SSD作 ...

  2. 深度学习目标检测综述推荐之 Xiaogang Wang ISBA 2015

    一.INTRODUCTION部分 (1)先根据时间轴讲了历史 (2)常见的基础模型 (3)讲了深度学习的优势 那就是feature learning,而不用人工划分的feature engineeri ...

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

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

  4. 目标检测算法(1)目标检测中的问题描述和R-CNN算法

    目标检测(object detection)是计算机视觉中非常具有挑战性的一项工作,一方面它是其他很多后续视觉任务的基础,另一方面目标检测不仅需要预测区域,还要进行分类,因此问题更加复杂.最近的5年使 ...

  5. CVPR 2019 论文解读 | 小样本域适应的目标检测

    引文 ​ 最近笔者也在寻找目标检测的其他方向,一般可以继续挖掘的方向是从目标检测的数据入手,困难样本的目标检测,如检测物体被遮挡,极小人脸检测,亦或者数据样本不足的算法.这里笔者介绍一篇小样本(few ...

  6. CVPR目标检测与实例分割算法解析:FCOS(2019),Mask R-CNN(2019),PolarMask(2020)

    CVPR目标检测与实例分割算法解析:FCOS(2019),Mask R-CNN(2019),PolarMask(2020)1. 目标检测:FCOS(CVPR 2019)目标检测算法FCOS(FCOS: ...

  7. 目标检测算法(2)SPP-net

    本文是使用深度学习进行目标检测系列的第二篇,主要介绍SPP-net:Spatial Pyramid Pooling in Deep ConvolutionalNetworks for Visual R ...

  8. CVPR 2020几篇论文内容点评:目标检测跟踪,人脸表情识别,姿态估计,实例分割等

    CVPR 2020几篇论文内容点评:目标检测跟踪,人脸表情识别,姿态估计,实例分割等 CVPR 2020中选论文放榜后,最新开源项目合集也来了. 本届CPVR共接收6656篇论文,中选1470篇,&q ...

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

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

随机推荐

  1. 贝塞尔曲线(面)二三维可视化(Three+d3)

    贝塞尔曲线(面)二三维可视化(Three+d3) 在学完 games101 几何后开始实践,可视化贝塞尔曲线 我想实现三维的贝塞尔曲线,用 threejs,但是 threejs 控制太麻烦了,因此,我 ...

  2. JVM调优2-远程监控

    监控远程JVM VisualJVM不仅是可以监控本地jvm进程,还可以监控远程的jvm进程,需要借助于JMX技术实现. 什么是JMX JMX(Java Management Extensions,即J ...

  3. 更快的Maven构建工具mvnd和Gradle哪个更快?

    Maven 作为经典的项目构建工具相信很多人已经用很久了,但如果体验过 Gradle,那感觉只有两个字"真香". 前段时间测评了更快的 Maven 构建工具 mvnd,感觉性能挺高 ...

  4. Java构造器(构造方法)

    类中的构造器也成为构造方法,是在进行创建对象的时候必须调用的,并且构造器有以下两个特点: 1.必须和类名字相同 2.必须没有返回类型也不能写void public class Demo06 { //一 ...

  5. flask中错误使用flask.redirect('/path')导致的框架奇怪错误

    我在首页的位置使用了如下代码: import flask @page_index.route('/') def index(): flask.redirect('/pythoncgi/') 结果站点出 ...

  6. ant -design vue a-tree 树形控件

    话不多说,先上代码. <a-tree v-if="this.treeData && this.treeData.length > 0" ref=&quo ...

  7. Java应用程序OOM分析

    内存泄露:申请使用完的内存没有释放,导致虚拟机不能再次使用该内存,此时这段内存就泄露了,因为申请者不用了,而又不能被虚拟机分配给别人用. 内存溢出:申请的内存超出了JVM能提供的内存大小,此时称之为溢 ...

  8. Intellig Idea 常用快捷键列表

    修改方法如下: 点击 文件菜单(File) –> 点击 设置(Settings- Ctrl+Alt+S), –> 打开设置对话框. 在左侧的导航框中点击 KeyMap. 接着在右边的树型框 ...

  9. Java的代理机制

    Java的代理机制 使用代理 Proxzy 可以在运行时创建一组给定接口的新类,这种功能只有在编译时无法确定需要实现哪种接口时才需要使用. 1. 使用代理的时机 假如有一个表示接口的 Class 对象 ...

  10. Linq to SQL各种参考

    原文:https://www.cnblogs.com/lyj/archive/2008/01/23/1049686.htmlhttps://www.cnblogs.com/lyj/archive/20 ...