CVPR2020 Oral|实例分割新思路: Deep Snake

2023-12-18 12:48

本文主要是介绍CVPR2020 Oral|实例分割新思路: Deep Snake,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

点击上方“AI算法修炼营”,选择加星标或“置顶”

标题以下,全是干货

本文授权转自知乎作者彭思达,整理:极市平台

地址:https://zhuanlan.zhihu.com/p/134111177

记得点击文章最后:阅读原文,支持原作者

仅做学术交流,如有侵权,请联系删文

我们介绍一篇2020 CVPR Oral的实例分割的论文:Deep Snake for Real-Time Instance Segmentation,该论文由浙江大学CAD&CG国家重点实验室/浙大三维视觉实验室提出。

  1. 论文链接:https://arxiv.org/abs/2001.01629

  2. 论文代码:https://github.com/zju3dv/snake

1. 当前一些方法在实例分割上的局限性

当前做instance segmentation的大多数工作采用了Mask R-CNN [1] 的Pipeline。

它基本的pipeline是先检测物体矩形框,然后在矩形框中做逐像素分割。Mask R-CNN达到了很好的instance segmentation的结果,但是这样的pipeline其实有一些limitation:

  1. 在矩形框中做逐像素分割会受限于矩形框的准确度。如果矩形框本来就不准,比如没有完全覆盖物体,那就算框中的分割做的再好,也无法得到正确的instance mask。

  2. 逐像素分割计算量其实很大,后续处理计算量也大。因为逐像素分割计算量大,所以网络一般将矩形框区域downsample为28x28的网格,然后进行分割,之后再把分割结果upsample到原图大小。这个upsample根据Mask R-CNN论文里的统计是有15ms的,比较费时。还有个问题是,在28x28网格上做分割会损失精度。即使28x28的网格上的分割结果完全正确,upsample到原图的mask仍然是很粗糙的。

  3. 逐像素分割不适用于一些物体,比如细胞和文本。

2. 选择Contour作为Shape representation

考虑到逐像素分割有诸多限制,我们的工作选择用contour来表示物体的shape。Contour是一组有序的点,而且是首尾相连的。比如图片中猫的边缘就是一个Contour。

Contour相对于用稠密像素表示物体有两大优势:

  1. 参数量远小于稠密像素,更接近于box的参数量。这样使得instance segmentation的速度上限更高,也能更廉价地使用分割结果。这里举个例子就是tracking。现在tracking主要还是使用box做跟踪,用物体的dense pixels做tracking计算量会很大。如果把dense pixel换成用contour做tracking就会好很多。

  2. Contour更适用于细胞、文字这些物体的分割。

2.1. Snakes: Active contour models

传统的图像分割领域一直都有用Contour做分割。有一个很经典很有名的工作是Snakes:Active contour models. [2]。我们的工作叫做Deep Snake,其实就是用深度学习的方法实现了传统snake。传统snake做图像分割的时候要求先给定一个initial contour。这个contour大概围绕着目标物体。

Active contour models将节点坐标作为变量,通过最小化目标函数来优化节点坐标。这个目标函数一般由两个部分组成,一个是image term,用来将contour拉向图像中的目标位置。一个是contour term,用于约束contour的形状,比如让contour保持一定的smoothness,节点之间不要交叉。

传统snake的一个很大问题是他的目标函数和optimization都是handcrafted的,对数据的噪声比较敏感,容易收敛到局部最优点。为了解决这个问题,Deep Snake用deep learning来做这个优化过程。

2.2. Curve GCN

在自动化标注领域,Curve GCN [3] 用deep learning实现了这个过程。首先也是先给定一个initial contour。网络对图片提取feature map,然后在contour上的每个节点提取一个feature,也就得到了定义在contour上的一组feature。Curve GCN用GCN处理contour上的feature,通过给每个节点预测一个offset来变形contour。

Curve GCN的一个限制在于将Contour当作一般化的Graph,用GCN处理Contour,没有充分考虑Contour的拓扑结构。一般化的Graph的节点是无序的,而且没有固定的拓扑结构,每个节点的邻居节点数量也不定 。对于Graph这样的数据结构,无法定义卷积核,也就无法使用标准的卷积。

3. 论文方法

Contour是一组有序的、首尾相连的点,可以看作一个cycle graph。这种cycle graph每个节点的邻居节点为2,顺序固定,所以可以定义卷积核。

我们论文引入Circular convolution来处理contour,下图是Circular convolution的示例图:

3.1. Overview of Deep Snake

和传统snake类似,给定一个initial contour,基于图片的feature map,给contour的每个节点提取一个feature,得到一个定义在contour上的feature。然后用Circular convolution构成的网络进行contour上的feature learning,最后映射为指向物体轮廓的offset,用于变形contour。

3.2. 问题1: 如何得到Initial contour

传统的active contour models要求有一个比较准确的initial contour才能比变形得比较好,所以initial contour对后续的变形挺重要的。

受到ExtremeNet [4] 的启发,我们用物体extreme points来构造initial contour。物体的extreme point是物体在图片中最上边、最左边、最下边和最右边的点。我们在每个点上延伸出一条线段,然后将线段连接起来,得到一个八边形,把这个八边形作为initial contour。

3.3. Pipeline for instance segmentation

论文里的pipeline就是首先通过预测extreme point来得到initial contour,然后将initial contour变形为物体边缘:

  1. 我们首先用detector检测得到一个矩形框,将矩形框四条边的中点连接起来,就得到一个菱形contour。通过Deep Snake来处理这个contour,预测指向extreme point的offset,从而得到extreme point。

  2. 用extreme point构造Octagon contour,然后用Deep Snake来处理这个contour,预测指向物体边缘点的offset,从而得到物体轮廓。

3.4. 问题2: 怎么处理fragmented instances

因为遮挡的原因,图片中的物体可能会分成多段。比如图中的车,因为柱子的遮挡,就分成了不连续的三段。要分割这辆车,就需要分别分割它的三段part,也就需要三个contour。但是根据前面的pipeline,一个矩形框只会出一个contour,所以无法处理fragmented instances。

为了解决这个问题,我们提出了Multi-component detection。给定一个物体矩形框,我们在矩形框里做二次检测,用于检测出物体的各个不连续的part。这里的检测器可以用已有的任意的detector,我们用的是CenterNet [5]。

4. 实验分析

4.1. Ablation study

在实验中,我们首先验证了自己提出的做法的有效性,包括Initial contour和Circular convolution。实验在SBD上进行。四行方法分别为:

  1. Baseline是直接将Curve GCN和CenterNet结合起来。

  2. Architecture是将网络换成了我们论文里提的一个网络结构,其中卷积仍为graph convolution。

  3. Initial contour是用extreme point构造的octagon contour作为initial contour。

  4. Circular convolution是把网络里的graph convolution换成circular convolution。

4.2. 与其他方法的比较

我们在Cityscapes数据集上和之前的方法进行了比较。我们在 Cityscapes上效果和PANet差不多,在AP_val和AP_50上比PANet高一些。因为Cityscapes的图片是1024 x 2048,所以大家的速度都比较慢。PANet的fps小于1,我们是4.6 fps,也就是说我们在相同的准确率上速度是PANet的5倍左右。

我们还和之前基于contour分割物体的方法进行了比较。之前用contour分割物体的方法一般是通过网络直接回归物体边缘点。而我们是通过变形initial contour来得到物体边缘。可以看到Deep Snake比之前的方法高出很多,而且improvement在  上比   高,这说明我们比之前的方法分割得更精细。

我们在PASCAL VOC上做了速度比较。在512 x 512的图片上,我们的速度有32.3 fps,达到了real-time的表现。

最后是可视化结果,可以看出我们的分割结果是比较精细的。

5. 参考文献

[1] He, Kaiming, et al. "Mask r-cnn." In ICCV, 2017.

[2] Kass, Michael, Andrew Witkin, and Demetri Terzopoulos. "Snakes: Active contour models." In IJCV, 1988.

[3] Ling, Huan, et al. "Fast interactive object annotation with curve-gcn." In CVPR, 2019.

[4] Zhou, Xingyi, Jiacheng Zhuo, and Philipp Krahenbuhl. "Bottom-up object detection by grouping extreme and center points." In CVPR, 2019.

[5] Zhou, Xingyi, Dequan Wang, and Philipp Krahenbuhl. "Objects as points." In arXiv preprint arXiv:1904.07850, 2019.

目标检测系列秘籍一:模型加速之轻量化网络秘籍二:非极大值抑制及回归损失优化秘籍三:多尺度检测秘籍四:数据增强秘籍五:解决样本不均衡问题秘籍六:Anchor-Free视觉注意力机制系列Non-local模块与Self-attention之间的关系与区别?视觉注意力机制用于分类网络:SENet、CBAM、SKNetNon-local模块与SENet、CBAM的融合:GCNet、DANetNon-local模块如何改进?来看CCNet、ANN
语义分割系列一篇看完就懂的语义分割综述最新实例分割综述:从Mask RCNN 到 BlendMask超强视频语义分割算法!基于语义流快速而准确的场景解析CVPR2020 | HANet:通过高度驱动的注意力网络改善城市场景语义分割基础积累系列卷积神经网络中的感受野怎么算?
图片中的绝对位置信息,CNN能搞定吗?理解计算机视觉中的损失函数深度学习相关的面试考点总结自动驾驶学习笔记系列 Apollo Udacity自动驾驶课程笔记——高精度地图、厘米级定位 Apollo Udacity自动驾驶课程笔记——感知、预测 Apollo Udacity自动驾驶课程笔记——规划、控制自动驾驶系统中Lidar和Camera怎么融合?竞赛与工程项目分享系列如何让笨重的深度学习模型在移动设备上跑起来基于Pytorch的YOLO目标检测项目工程大合集目标检测应用竞赛:铝型材表面瑕疵检测基于Mask R-CNN的道路物体检测与分割
SLAM系列视觉SLAM前端:视觉里程计和回环检测视觉SLAM后端:后端优化和建图模块视觉SLAM中特征点法开源算法:PTAM、ORB-SLAM视觉SLAM中直接法开源算法:LSD-SLAM、DSO视觉SLAM中特征点法和直接法的结合:SVO
2020年最新的iPad Pro上的激光雷达是什么?来聊聊激光SLAM

这篇关于CVPR2020 Oral|实例分割新思路: Deep Snake的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

java图像识别工具类(ImageRecognitionUtils)使用实例详解

《java图像识别工具类(ImageRecognitionUtils)使用实例详解》:本文主要介绍如何在Java中使用OpenCV进行图像识别,包括图像加载、预处理、分类、人脸检测和特征提取等步骤... 目录前言1. 图像识别的背景与作用2. 设计目标3. 项目依赖4. 设计与实现 ImageRecogni

Java操作ElasticSearch的实例详解

《Java操作ElasticSearch的实例详解》Elasticsearch是一个分布式的搜索和分析引擎,广泛用于全文搜索、日志分析等场景,本文将介绍如何在Java应用中使用Elastics... 目录简介环境准备1. 安装 Elasticsearch2. 添加依赖连接 Elasticsearch1. 创

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

使用Python将长图片分割为若干张小图片

《使用Python将长图片分割为若干张小图片》这篇文章主要为大家详细介绍了如何使用Python将长图片分割为若干张小图片,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. python需求的任务2. Python代码的实现3. 代码修改的位置4. 运行结果1. Python需求

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

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

Oracle Expdp按条件导出指定表数据的方法实例

《OracleExpdp按条件导出指定表数据的方法实例》:本文主要介绍Oracle的expdp数据泵方式导出特定机构和时间范围的数据,并通过parfile文件进行条件限制和配置,文中通过代码介绍... 目录1.场景描述 2.方案分析3.实验验证 3.1 parfile文件3.2 expdp命令导出4.总结

C#中字符串分割的多种方式

《C#中字符串分割的多种方式》在C#编程语言中,字符串处理是日常开发中不可或缺的一部分,字符串分割是处理文本数据时常用的操作,它允许我们将一个长字符串分解成多个子字符串,本文给大家介绍了C#中字符串分... 目录1. 使用 string.Split2. 使用正则表达式 (Regex.Split)3. 使用

MySQL的索引失效的原因实例及解决方案

《MySQL的索引失效的原因实例及解决方案》这篇文章主要讨论了MySQL索引失效的常见原因及其解决方案,它涵盖了数据类型不匹配、隐式转换、函数或表达式、范围查询、LIKE查询、OR条件、全表扫描、索引... 目录1. 数据类型不匹配2. 隐式转换3. 函数或表达式4. 范围查询之后的列5. like 查询6

Python开发围棋游戏的实例代码(实现全部功能)

《Python开发围棋游戏的实例代码(实现全部功能)》围棋是一种古老而复杂的策略棋类游戏,起源于中国,已有超过2500年的历史,本文介绍了如何用Python开发一个简单的围棋游戏,实例代码涵盖了游戏的... 目录1. 围棋游戏概述1.1 游戏规则1.2 游戏设计思路2. 环境准备3. 创建棋盘3.1 棋盘类

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss