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

相关文章

【机器学习】高斯过程的基本概念和应用领域以及在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

C++操作符重载实例(独立函数)

C++操作符重载实例,我们把坐标值CVector的加法进行重载,计算c3=c1+c2时,也就是计算x3=x1+x2,y3=y1+y2,今天我们以独立函数的方式重载操作符+(加号),以下是C++代码: c1802.cpp源代码: D:\YcjWork\CppTour>vim c1802.cpp #include <iostream>using namespace std;/*** 以独立函数

实例:如何统计当前主机的连接状态和连接数

统计当前主机的连接状态和连接数 在 Linux 中,可使用 ss 命令来查看主机的网络连接状态。以下是统计当前主机连接状态和连接主机数量的具体操作。 1. 统计当前主机的连接状态 使用 ss 命令结合 grep、cut、sort 和 uniq 命令来统计当前主机的 TCP 连接状态。 ss -nta | grep -v '^State' | cut -d " " -f 1 | sort |

Java Websocket实例【服务端与客户端实现全双工通讯】

Java Websocket实例【服务端与客户端实现全双工通讯】 现很多网站为了实现即时通讯,所用的技术都是轮询(polling)。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发 出HTTP request,然后由服务器返回最新的数据给客服端的浏览器。这种传统的HTTP request 的模式带来很明显的缺点 – 浏 览器需要不断的向服务器发出请求,然而HTTP

SAM2POINT:以zero-shot且快速的方式将任何 3D 视频分割为视频

摘要 我们介绍 SAM2POINT,这是一种采用 Segment Anything Model 2 (SAM 2) 进行零样本和快速 3D 分割的初步探索。 SAM2POINT 将任何 3D 数据解释为一系列多向视频,并利用 SAM 2 进行 3D 空间分割,无需进一步训练或 2D-3D 投影。 我们的框架支持各种提示类型,包括 3D 点、框和掩模,并且可以泛化到不同的场景,例如 3D 对象、室

828华为云征文|华为云Flexus X实例docker部署rancher并构建k8s集群

828华为云征文|华为云Flexus X实例docker部署rancher并构建k8s集群 华为云最近正在举办828 B2B企业节,Flexus X实例的促销力度非常大,特别适合那些对算力性能有高要求的小伙伴。如果你有自建MySQL、Redis、Nginx等服务的需求,一定不要错过这个机会。赶紧去看看吧! 什么是华为云Flexus X实例 华为云Flexus X实例云服务是新一代开箱即用、体

LLVM入门2:如何基于自己的代码生成IR-LLVM IR code generation实例介绍

概述 本节将通过一个简单的例子来介绍如何生成llvm IR,以Kaleidoscope IR中的例子为例,我们基于LLVM接口构建一个简单的编译器,实现简单的语句解析并转化为LLVM IR,生成对应的LLVM IR部分,代码如下,文件名为toy.cpp,先给出代码,后面会详细介绍每一步分代码: #include "llvm/ADT/APFloat.h"#include "llvm/ADT/S

OpenStack离线Train版安装系列—11.5实例使用-Cinder存储服务组件

本系列文章包含从OpenStack离线源制作到完成OpenStack安装的全部过程。 在本系列教程中使用的OpenStack的安装版本为第20个版本Train(简称T版本),2020年5月13日,OpenStack社区发布了第21个版本Ussuri(简称U版本)。 OpenStack部署系列文章 OpenStack Victoria版 安装部署系列教程 OpenStack Ussuri版

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

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

Cmake之3.0版本重要特性及用法实例(十三)

简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【原创干货持续更新中……】🚀 优质视频课程:AAOS车载系统+AOSP14系统攻城狮入门视频实战课 🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧