RDSNet: A New Deep Architecture for Reciprocal Object Detection and Instance Segmentation

本文主要是介绍RDSNet: A New Deep Architecture for Reciprocal Object Detection and Instance Segmentation,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

该论文录用于AAAI 2020,相关工作已开源,论文链接 & 代码链接。作者团队:中科院自动化所&地平线,第一作者王绍儒是地平线实习生,来自中科院自动化所的硕士生。

论文对当前目标检测及实例分割算法的现状进行了简要的概述,并对各种方法的优劣进行了简要的分析,据此提出了一套完整的框架,同时完成目标检测与实例分割任务,并且两个任务相互辅助,同时取得了性能的提升。

一、问题提出

目标检测与实例分割是计算机视觉领域重要的两个任务,近年来出现了非常多优秀的算法解决这两个问题,且都取得了优异的效果,但是,却鲜有文章深入分析两者之间的关联,也就导致了诸如下图所示的错误的出现:
图1
图中所示结果由 Mask R-CNN 得到,可以看到由于边界框定位不准导致的实例掩码缺失((a), (b))及边界框与实例掩码不统一的问题(( c), (d))。这些问题都可以在这篇论文提出的算法中得到很好的解决。

二、方法介绍

算法框架如下图所示:
图2
文章中认为:目标检测属于 object level 的任务,这类任务更关注物体级别的特征,对分辨率的需求不高,但需要更多的高级语义信息;而实例分割任务属于 pixel level 的任务,这类任务需要给出逐像素的输出,对分辨率的需求较高,需要更多的细节信息。

因此便设计了如图所示的双流网络,上面的 object stream 重点完成目标检测任务,可以是 SSD, YOLO, RetinaNet 等任一 anchor-based 的目标检测算法(文中采用了 RetinaNet);下面 pixel stream 重点完成分割的任务,分辨率很高(文中采用了类似 PanopticFPN 的方式融合了多尺度的特征,得到了高分辨率的输出);后续的若干操作则是文章的重点,介绍了如何使得两个任务相互辅助:

“物体”辅助实例分割:

目前常见的实例分割算法分为两类,一类是类似于 Mask R-CNN 的 proposal-based 的方法,是目标检测算法的直接扩展,但这类方法会面临上文提到的诸多问题:得到的实例掩码分辨率相对较低且严重依赖于 proposal 的边界框;另一类基于分割算法,首先预测每个点的 embedding,然后再通过聚类得到每个实例的掩码(属于相同物体的点具有相似的 embedding,通过聚类,即可使得属于同一物体的点形成一个簇,也就得到了每个物体的掩码),这类方法天然克服了 proposal-based 的缺陷,但一般无法 end-to-end 训练(一般需要 metric learning 的方式训练 embedding),且受限于聚类算法,性能一般有限。

仔细分析发现,聚类的难题主要源于聚类中心的缺失,换句话说,如果我们拥有每个簇的中心,我们就可以抛弃聚类算法,进行 end-to-end 的训练;而这个「中心」,应该是每个物体的 embedding,也就是说,它应该源于 object level,而非 pixel level!因此,也就形成了论文里提出的基于相关滤波的实例掩码生成算法:

Object stream 和 pixel stream 分别提取 object 和 pixel 的 embedding(object embedding 的获取方式也很简单,直接在目标检测算法的 detection head 中在 classification 和 regression 分支的基础上额外增加一个分支进行预测就可以),属于同一物体的 pixel 和与其对应的物体具有相近的 embedding,相似性的衡量采用了内积相似度,也就是说:对于每个检测到的物体,以其 embedding 作为 kernel,在 pixel embedding 上执行相关滤波,即可得到这一物体的掩码。

除此之外,文中还充分利用了 object stream 得到的目标边界框,对距离物体中心较远的噪声进行了抑制,本质上是在一定程度上克服 CNN 的 translation-variant 对实例分割任务的影响。

“掩码”辅助目标检测:

边界框定位是目标检测的一项重要任务,而现有的方法大多采用回归的方式得到边界框的位置。然而我们回顾边界框的定义,发现它本身就是通过物体的掩码定义的(minimum enclosing rectangle of an object mask)!那么,既然我们可以得到物体的掩码,为什么还要依赖于回归算法,多此一举呢(前提是物体掩码的获取应该不依赖于边界框)?然而文中通过实验发现,直接利用通过上述基于相关滤波方法得到的实例掩码生成边界框,精度并不太高,甚至低于回归方法得到的边界框!文章作者通过可视化发现:大多数物体的掩码都可以提供十分准确的边界框,然而也存在部分物体的掩码预测结果不太理想,使得边界框出现了较大的偏移。

据此观察,文章提出了一种基于贝叶斯公式的边界框定位算法,首先将边界框定位定义为分类任务(在 width/height 维度上某个坐标是不是物体的边界),将问题转化为给定物体掩码,坐标属于边界框的后验概率的预测:

然后利用贝叶斯公式,将回归得到的边界框作为先验概率 P(X=i),而 P(M |X=i) 则由物体实例掩码通过逐列(行)取最大、一维卷积和激活函数得到。

整体过程如下图所示:
图3
此方法综合考虑了回归得到的边界框和实例掩码的优势,得到了更准确的边界框。具体结果可以看下图,可以明显发现,由此方法得到的边界框可以以更高的 IOU 和 ground truth bbox 匹配。
图4

三、实验结果

文章在 COCO 数据集上进行了实验验证:
图4
在实例分割任务中,此方法在单阶段算法中可以达到更优的速度与精度的平衡,以近 3 倍的速度取得了和 TensorMask 相近的精度,以相近的速度在 YOLACT 的基础上取得了 2.3mAP 的提升。

在目标检测任务中,此方法以极低的计算代价在不同的 backbone 上取得了一致的性能提升。

值得注意的是:文章中采用的是 RetinaNet 作为 detector,且在其基础上扩展到实例分割任务中并不会带来显著的计算量的增加,如果采用其他更先进的目标检测算法,其精度与速度还能取得更进一步的提升。

四、一些题外话

文章的解读到此已经结束,但是作者还提供了一些其他的角度来理解这篇文章:

Anchor-based or Anchor-free?

Anchor-free 可以算得上是 2019 年目标检测领域爆火的词汇,本文也蹭一下热点,分析一下和这篇论文的关联。

仔细观察这篇文章提出的算法框架可以发现,object stream 实际上是 anchor-based,而 pixel stream 则是 anchor-free:object stream 中的 detector 可以由很多目标检测算法充当,包括但不限于 SSD, YOLO, RetinaNet, 甚至可以是两阶段的 Faster R-CNN;而 pixel stream 不只可以预测 pixel embedding,还可以额外预测边界框角点(类似 CornerNet),或人体关键点(类似于 Assoc. Embed.),或是其他物体实例像素级的表征;而这两个分支通过相关滤波联系到一起,一定程度上解决了如 CornerNet 中的 grouping 的问题。从这个角度说,这篇文章提出的框架算得上是真正的 anchor-based 和 anchor-free 的结合,未来可能催生出更多有意思的工作。

Bbox or Mask?

正如 Ross 大神在 ICCV 的 Tutorial 上提到的内容,object detection 是一个很广义的概念,不同的物体表征也对应着不同 level 的任务:例如:bbox 对应着传统意义上的 object detection,mask 对应着 instance segmentation,human keypoints 对应着 pose estimation,human surfaces 对应着 dense human pose estimation……这些任务相互关联,对应着不同角度、不同 level 的对物体的理解。现有的方法或是将这些问题独立看待,或是 high-level task 直接建立在 low-level task 上(例如 Mask R-CNN,两阶段的人体姿态估计等),但这些任务的关联绝不仅限于此。这篇文章的关注点是 bbox 和 mask 的关联,但也并未做到极致。从这个角度说,object detection 仍然还有巨大的发展空间。

参考文献

[1] Kaiming He, et al. “Mask R-CNN.” In Proceedings of IEEE International Conference on Computer Vision. 2017.
[2] Wei Liu, et al. “SSD: Single shot multibox detector.” In Proceedings of European Conference on Computer Vision. 2016.
[3] Joseph Redmon and Ali Farhadi. “YOLOv3: An incremental improvement.” arXiv preprint arXiv:1804.02767 (2018).
[4] Tsung-Yi Lin, et al. “Focal loss for dense object detection.” In Proceedings of IEEE International Conference on Computer Vision. 2017.
[5] Alexander Kirillov, et al. “Panoptic feature pyramid networks.” In Proceedings of IEEE Conference on Computer Vision and Pattern Recognition. 2019.
[6] Xinlei Chen, et al. “Tensormask: A foundation for dense object segmentation.” arXiv preprint arXiv:1903.12174 (2019).
[7] Daniel Bolya, et al. YOLACT: Realtime instance segmentation. In Proceedings of IEEE International Conference on Computer Vision. 2019.
[8] Shaoqing Ren, et al. “Faster R-CNN: Towards real-time object detection with region proposal networks.” In Proceedings of Advances in Neural Information Processing Systems. 2015.
[9] Hei Law and Jia Deng. “CornerNet: Detecting objects as paired keypoints.” In Proceedings of European Conference on Computer. 2018.
[10] Alejandro Newell, et al. “Associative embedding: End-to-end learning for joint detection and grouping.” In Proceedings of Advances in Neural Information Processing Systems. 2017.

这篇关于RDSNet: A New Deep Architecture for Reciprocal Object Detection and Instance Segmentation的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/306146

相关文章

vue解决子组件样式覆盖问题scoped deep

《vue解决子组件样式覆盖问题scopeddeep》文章主要介绍了在Vue项目中处理全局样式和局部样式的方法,包括使用scoped属性和深度选择器(/deep/)来覆盖子组件的样式,作者建议所有组件... 目录前言scoped分析deep分析使用总结所有组件必须加scoped父组件覆盖子组件使用deep前言

Golan中 new() 、 make() 和简短声明符的区别和使用

《Golan中new()、make()和简短声明符的区别和使用》Go语言中的new()、make()和简短声明符的区别和使用,new()用于分配内存并返回指针,make()用于初始化切片、映射... 详细介绍golang的new() 、 make() 和简短声明符的区别和使用。文章目录 `new()`

深入探讨Java 中的 Object 类详解(一切类的根基)

《深入探讨Java中的Object类详解(一切类的根基)》本文详细介绍了Java中的Object类,作为所有类的根类,其重要性不言而喻,文章涵盖了Object类的主要方法,如toString()... 目录1. Object 类的基本概念1.1 Object 类的定义2. Object 类的主要方法3. O

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

java线程深度解析(一)——java new 接口?匿名内部类给你答案

http://blog.csdn.net/daybreak1209/article/details/51305477 一、内部类 1、内部类初识 一般,一个类里主要包含类的方法和属性,但在Java中还提出在类中继续定义类(内部类)的概念。 内部类的定义:类的内部定义类 先来看一个实例 [html]  view plain copy pu

【Python报错已解决】AttributeError: ‘list‘ object has no attribute ‘text‘

🎬 鸽芷咕:个人主页  🔥 个人专栏: 《C++干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 前言一、问题描述1.1 报错示例1.2 报错分析1.3 解决思路 二、解决方法2.1 方法一:检查属性名2.2 步骤二:访问列表元素的属性 三、其他解决方法四、总结 前言 在Python编程中,属性错误(At

string字符会调用new分配堆内存吗

gcc的string默认大小是32个字节,字符串小于等于15直接保存在栈上,超过之后才会使用new分配。

OpenStack实例操作选项解释:启动和停止instance实例

关于启动和停止OpenStack实例 如果你想要启动和停止OpenStack实例时,有四种方法可以考虑。 管理员可以暂停、挂起、搁置、停止OpenStack 的计算实例。但是这些方法之间有什么不同之处? 目录 关于启动和停止OpenStack实例1.暂停和取消暂停实例2.挂起和恢复实例3.搁置(废弃)实例和取消废弃实例4.停止(删除)实例 1.暂停和取消暂停实例

时间序列|change point detection

change point detection 被称为变点检测,其基本定义是在一个序列或过程中,当某个统计特性(分布类型、分布参数)在某时间点受系统性因素而非偶然因素影响发生变化,我们就称该时间点为变点。变点识别即利用统计量或统计方法或机器学习方法将该变点位置估计出来。 Change Point Detection的类型 online 指连续观察某一随机过程,监测到变点时停止检验,不运用到

List list = new ArrayList();和ArrayList list=new ArrayList();的区别?

List是一个接口,而ArrayList 是一个类。 ArrayList 继承并实现了List。 List list = new ArrayList();这句创建了一个ArrayList的对象后把上溯到了List。此时它是一个List对象了,有些ArrayList有但是List没有的属性和方法,它就不能再用了。而ArrayList list=new ArrayList();创建一对象则保留了A