点击上方“CVer”,选择加"星标"或“置顶”
重磅干货,第一时间送达
作者:谢恩泽
https://zhuanlan.zhihu.com/p/121806709
本文已由原作者授权,不得擅自二次转载
这篇文章是对我过去一年在实例分割上的调研以及尝试做的一次详细总结,总体会review一下之前two stage的实例分割算法,如Mask R-CNN等,以及他们和物体检测的关系。同时会分析当下流行的一阶段实例分割算法,分析他们如何跳出物体检测的思路,以及对未来的展望。此外,我短期应该不会再做2D Image Instance Segmentation了,这篇文章算是对我之前工作的一个总结。
先回顾2019年物体检测的发展,自从ECCV18的CornerNet横空出世之后,各个大组都意识到one stage anchor free检测有搞头,于是在2019年上半年我们看到了几个代表性的工作,FCOS, RepPoint, CenterNet(Objects as points) 以及Foveabox等等。这些方法虽然有不同之处,但是在性能上都超过了传统的two stage检测器,并且方法上看起来更加简单直接了。这一波重新定义了2d 物体检测的建模方式。各个小组以及国内公司研究院看到了,纷纷拍手称快,并开始迅速follow....
不过,稍微敏感一点的人会意识到,既然2d 物体检测被重新建模了,那实例分割是不是也有希望搞?于是一些国内外大中小组+ai公司研究院也开始思考这个问题,并开始争分夺秒的赶工,生怕互相撞车(手快有手慢无的节奏)。接下来我总结一些我心中比较有代表性的几条线,不一定全。
1 先检测再分割型
首先大家会想到基于one stage 检测的基础上同时出mask。这条线的文章有Yolact, Embedmask, CenterMask, Blendmask等。核心思想是在出box的同时,再出一个embeding,每个Box和embeding 进行某种程度的组合,可以得到一个mask(Yolact, EmbedMask)。或者还是follow mask rcnn的思路,检测+roi pool, 然后基于roi做分割(CenterMask, BlendMask)。这些方法往往点都不低,因为他们的分割性能很大程度取决于检测性能,并且他们都基于比较强的one-stage检测器,如FCOS, 因此性能大多和mask rcnn 55开。不过在我眼中,这些方法可以算是1.5 stage 或者two stage的实例分割方法,因为要得到mask必然要先得到box,因此还是没有完全跳出mask rcnn的思路。
2 检测轮廓型
这条线的方法 把实例分割转化为轮廓检测,假设一个物体,得到了轮廓自然就得到了分割图。不过想法是美好的,现实是残酷的。首先先说数据,coco数据十分恶心,很多物体被截断成2-3个联通区域,因此一个闭合轮廓无法描述完整的mask。其次轮廓检测的难度也很大,因此这些方法往往在coco上性能相对比较低(或者不做coco),但是胜在方法相对新颖。这条线的代表性方法有 PolarMask, DeepSnake 和DenseReppoint。其中PolarMask是我2019年做的工作,核心思想是基于FCOS, 把Mask基于极坐标系建模,把box分支回归上下左右四个射线修改成回归36根射线。DeepSnake 结合传统的snake算法进行轮廓回归,而DenseReppoint 则是对Reppoint进一步扩展,希望能用DCN的offset来描述instance。这些方法相当于给了一个新的角度来做实例分割,可惜目前做不过基于分割的方法。
3 Bottom Up 型
这条线的话 之前有过一些文章,不过都不温不火,如 Deep Watershed Transform, Discriminative Loss等,19年有一篇SSAP, 他们的核心思想都是通过出一个semantic segmentation map, 然后想办法对同类semantic seg的结果进行聚类,进而区分出instance。Discriminative Loss通过学每个pixel的embeding,同一个instance的pixel embeding相近,不同的pixel embeding远。SSAP对每个点的学他和周围pixel 的连接关系,相同Instance的pixel连接,不同的断开。deep watershed直接分割物体的heatmap,物体中心是1,越往外越趋近于0, 并通过分水岭算法,卡一个阈值区分instance,最后加个简单的膨胀算法得到完整的instance mask。其中deep watershed 这篇方法简单粗暴,是我比较欣赏的一片,但是由于年代久远,性能有点惨不忍睹,其次这类方法同样很难解决coco上instance断开的问题。
4 一个点出一片区域(一张图)型
这类方法是目前instance segmentation里做的最work的方法,同时也彻底摆脱了anchor 和Box的限制,代表方法有TensorMask, Solo v1&v2, 以及CondInst等。核心思想是两个分支,一个分支出正样本分类,第二个分支基于这个点出mask的pixel wise分割。具体怎么出,不同的方法不一样,比如tensormask 把这个点的channel直接转换为空间上的w h得到最终的mask, 具体来说,1x1x225的vector 可以直接reshape成15x15x1的mask。Tensormask这套做法相当于人工定义了一个固定大小的滑动窗口(FPN不同层不一样大)。十分简单粗暴。Solo则先划分正样本的Grid, 并且把每一个grid对应一个物体的mask,相当于一个正样本对应一张图,这张图中只有这个正样本的mask。CondInst的核心思想和solo相对接近,但是做法更加骚, 第一次在实例分割中引入Dynamic Filter(虽然dynamic filter已经在无数领域被灌水),但是还是很巧妙 的,他是怎么做的呢,他让一个正样本学一个参数,直接赋予给卷积核,然后一张预定义的feature map上做卷积,因为每个正样本对应一个独一无二的卷积核(相当于每个正样本出一组参数给conv,因此称为dynamic filter),这样每个正样本的conv都能卷基出一张图,这个图和solo是一样的,对应整图中该instance的mask。这些方法在目前来看性能可以超过maskrcnn(虽然有些trick是mask rcnn也能用的),并且也是一个新的角度来建模实例分割, 感觉还是挺厉害的。
为什么这些方法在这个时候work了?
其实有些思路在过去也有人想到过,但是由于当时技术限制,导致做的没那么work。所谓太阳底下无新鲜事,这些方法大多也都是站在巨人的肩膀上。我个人认为主要是2d detection的高度成熟,其中最重要的几个点使得这些方法取得成功,1 分类分支的Focal Loss, 2 FPN的这套target 机制, 3 沾了one stage detector的光。其中1,2都是kaiming大佬提的,不得不说还是他厉害.....
未来的展望:
我暂时想不到新的思路,能在coco上做的过第四条线的方法,这也是我不想做instance segmentation的原因。coco上由于我之前提到的原因,如果不用Pixel-wise分割的方法是绝无可能取得SOTA。而且我的感觉是目前第四条线也差不多把新东西都做完了,现在再入的话大概率跟在这些方法后小修小补。如果目标不是冲击SOTA的话,可以基于contour或者bottom up找一些灵感(第2,3条线),这样说不定也能做点新东西,目前基于contour的方法还是比较naive的,可以从传统方法寻找灵感。
此外,全景分割可以是下一个突破的点,比如one stage 全景分割, 不过也有人在做了,比如deeperlab, panoptic deeplab, 以及一些one stage instance seg+semantic seg融合的方法。现在进入也不算早了,但应该还有机会。
本文作者为谢恩泽,现香港大学计算机系PhD,导师为Dr. Luo Ping. 研究方向为计算机视觉,物体检测和分割等。
个人主页 : https://xieenze.github.io/
欢迎有想法的小伙伴多多交流
重磅!CVer-图像分割 微信交流群已成立
扫码添加CVer助手,可申请加入CVer-图像分割 微信交流群,目前已汇集1250人!涵盖语义分割、实例分割和全景分割等。互相交流,一起进步!
同时也可申请加入CVer大群和细分方向技术群,细分方向已涵盖:目标检测、图像分割、目标跟踪、人脸检测&识别、OCR、姿态估计、超分辨率、SLAM、医疗影像、Re-ID、GAN、NAS、深度估计、自动驾驶、强化学习、车道线检测、模型剪枝&压缩、去噪、去雾、去雨、风格迁移、遥感图像、行为识别、视频理解、图像融合、图像检索、论文投稿&交流、TensorFlow和PyTorch等群。
一定要备注:研究方向+地点+学校/公司+昵称(如图像分割+上海+上交+卡卡),根据格式备注,可更快被通过且邀请进群
▲长按加群
▲长按关注我们
麻烦给我一个在看!