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

相关文章

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

springboot security验证码的登录实例

《springbootsecurity验证码的登录实例》:本文主要介绍springbootsecurity验证码的登录实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录前言代码示例引入依赖定义验证码生成器定义获取验证码及认证接口测试获取验证码登录总结前言在spring

tomcat多实例部署的项目实践

《tomcat多实例部署的项目实践》Tomcat多实例是指在一台设备上运行多个Tomcat服务,这些Tomcat相互独立,本文主要介绍了tomcat多实例部署的项目实践,具有一定的参考价值,感兴趣的可... 目录1.创建项目目录,测试文China编程件2js.创建实例的安装目录3.准备实例的配置文件4.编辑实例的

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤

C++字符串提取和分割的多种方法

《C++字符串提取和分割的多种方法》在C++编程中,字符串处理是一个常见的任务,尤其是在需要从字符串中提取特定数据时,本文将详细探讨如何使用C++标准库中的工具来提取和分割字符串,并分析不同方法的适用... 目录1. 字符串提取的基本方法1.1 使用 std::istringstream 和 >> 操作符示

Spring 中使用反射创建 Bean 实例的几种方式

《Spring中使用反射创建Bean实例的几种方式》文章介绍了在Spring框架中如何使用反射来创建Bean实例,包括使用Class.newInstance()、Constructor.newI... 目录1. 使用 Class.newInstance() (仅限无参构造函数):2. 使用 Construc

MyBatis-Plus中Service接口的lambdaUpdate用法及实例分析

《MyBatis-Plus中Service接口的lambdaUpdate用法及实例分析》本文将详细讲解MyBatis-Plus中的lambdaUpdate用法,并提供丰富的案例来帮助读者更好地理解和应... 目录深入探索MyBATis-Plus中Service接口的lambdaUpdate用法及示例案例背景

MyBatis-Plus中静态工具Db的多种用法及实例分析

《MyBatis-Plus中静态工具Db的多种用法及实例分析》本文将详细讲解MyBatis-Plus中静态工具Db的各种用法,并结合具体案例进行演示和说明,具有很好的参考价值,希望对大家有所帮助,如有... 目录MyBATis-Plus中静态工具Db的多种用法及实例案例背景使用静态工具Db进行数据库操作插入

Spring中@Lazy注解的使用技巧与实例解析

《Spring中@Lazy注解的使用技巧与实例解析》@Lazy注解在Spring框架中用于延迟Bean的初始化,优化应用启动性能,它不仅适用于@Bean和@Component,还可以用于注入点,通过将... 目录一、@Lazy注解的作用(一)延迟Bean的初始化(二)与@Autowired结合使用二、实例解

前端原生js实现拖拽排课效果实例

《前端原生js实现拖拽排课效果实例》:本文主要介绍如何实现一个简单的课程表拖拽功能,通过HTML、CSS和JavaScript的配合,我们实现了课程项的拖拽、放置和显示功能,文中通过实例代码介绍的... 目录1. 效果展示2. 效果分析2.1 关键点2.2 实现方法3. 代码实现3.1 html部分3.2