点击上方“AI算法修炼营”,选择加星标或“置顶”
标题以下,全是干货
本文授权转自知乎作者彭思达,整理:极市平台
地址:https://zhuanlan.zhihu.com/p/134111177
记得点击文章最后:阅读原文,支持原作者
仅做学术交流,如有侵权,请联系删文
我们介绍一篇2020 CVPR Oral的实例分割的论文:Deep Snake for Real-Time Instance Segmentation,该论文由浙江大学CAD&CG国家重点实验室/浙大三维视觉实验室提出。
论文链接:https://arxiv.org/abs/2001.01629
论文代码:https://github.com/zju3dv/snake
当前做instance segmentation的大多数工作采用了Mask R-CNN [1] 的Pipeline。
它基本的pipeline是先检测物体矩形框,然后在矩形框中做逐像素分割。Mask R-CNN达到了很好的instance segmentation的结果,但是这样的pipeline其实有一些limitation:
在矩形框中做逐像素分割会受限于矩形框的准确度。如果矩形框本来就不准,比如没有完全覆盖物体,那就算框中的分割做的再好,也无法得到正确的instance mask。
逐像素分割计算量其实很大,后续处理计算量也大。因为逐像素分割计算量大,所以网络一般将矩形框区域downsample为28x28的网格,然后进行分割,之后再把分割结果upsample到原图大小。这个upsample根据Mask R-CNN论文里的统计是有15ms的,比较费时。还有个问题是,在28x28网格上做分割会损失精度。即使28x28的网格上的分割结果完全正确,upsample到原图的mask仍然是很粗糙的。
逐像素分割不适用于一些物体,比如细胞和文本。
考虑到逐像素分割有诸多限制,我们的工作选择用contour来表示物体的shape。Contour是一组有序的点,而且是首尾相连的。比如图片中猫的边缘就是一个Contour。
Contour相对于用稠密像素表示物体有两大优势:
参数量远小于稠密像素,更接近于box的参数量。这样使得instance segmentation的速度上限更高,也能更廉价地使用分割结果。这里举个例子就是tracking。现在tracking主要还是使用box做跟踪,用物体的dense pixels做tracking计算量会很大。如果把dense pixel换成用contour做tracking就会好很多。
Contour更适用于细胞、文字这些物体的分割。
传统的图像分割领域一直都有用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来做这个优化过程。
在自动化标注领域,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这样的数据结构,无法定义卷积核,也就无法使用标准的卷积。
Contour是一组有序的、首尾相连的点,可以看作一个cycle graph。这种cycle graph每个节点的邻居节点为2,顺序固定,所以可以定义卷积核。
我们论文引入Circular convolution来处理contour,下图是Circular convolution的示例图:
和传统snake类似,给定一个initial contour,基于图片的feature map,给contour的每个节点提取一个feature,得到一个定义在contour上的feature。然后用Circular convolution构成的网络进行contour上的feature learning,最后映射为指向物体轮廓的offset,用于变形contour。
传统的active contour models要求有一个比较准确的initial contour才能比变形得比较好,所以initial contour对后续的变形挺重要的。
受到ExtremeNet [4] 的启发,我们用物体extreme points来构造initial contour。物体的extreme point是物体在图片中最上边、最左边、最下边和最右边的点。我们在每个点上延伸出一条线段,然后将线段连接起来,得到一个八边形,把这个八边形作为initial contour。
论文里的pipeline就是首先通过预测extreme point来得到initial contour,然后将initial contour变形为物体边缘:
我们首先用detector检测得到一个矩形框,将矩形框四条边的中点连接起来,就得到一个菱形contour。通过Deep Snake来处理这个contour,预测指向extreme point的offset,从而得到extreme point。
用extreme point构造Octagon contour,然后用Deep Snake来处理这个contour,预测指向物体边缘点的offset,从而得到物体轮廓。
因为遮挡的原因,图片中的物体可能会分成多段。比如图中的车,因为柱子的遮挡,就分成了不连续的三段。要分割这辆车,就需要分别分割它的三段part,也就需要三个contour。但是根据前面的pipeline,一个矩形框只会出一个contour,所以无法处理fragmented instances。
为了解决这个问题,我们提出了Multi-component detection。给定一个物体矩形框,我们在矩形框里做二次检测,用于检测出物体的各个不连续的part。这里的检测器可以用已有的任意的detector,我们用的是CenterNet [5]。
在实验中,我们首先验证了自己提出的做法的有效性,包括Initial contour和Circular convolution。实验在SBD上进行。四行方法分别为:
Baseline是直接将Curve GCN和CenterNet结合起来。
Architecture是将网络换成了我们论文里提的一个网络结构,其中卷积仍为graph convolution。
Initial contour是用extreme point构造的octagon contour作为initial contour。
Circular convolution是把网络里的graph convolution换成circular convolution。
我们在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