前一阵子好忙啊,很久没更新了。最近正好挖了新坑,来更新下。由于以前是作检测的,而目前课题顺道偏到了instance segmentation,这篇文章简单梳理一下从检测、分割结果到instance segmentation结果问题在哪里,以及已有的解决方案。dom
分类、检测、分割是有自然的联系的:从目的来说,三个任务都是为了正确的分类一张(或一部分)图像;进一步,检测和分割还共同负责定位任务。这些任务之间的不一样是因为人在解决同一类问题时,对问题的描述方案不一样致使的,是人为的。于是,能够找到一种共同的描述(或任务),即instance segmentation。那么,instance segmentation既然集成了上述3种任务,若是有上述3种任务的结果,是否是经过简单组合就能够获得instance segmentation的结果呢?显然是不行的。ide
为何不能够呢?或者说须要补全什么才能够获得instance segmentation的结果呢?咱们先从每一个任务分开来看,工具
解释一下空间上的相关性,它对于检测和instance segmentation都很是重要。空间上的相关性即同一个像素因为处在物体的不一样相对位置,它对于不一样物体可能语义并不相同,如图中人的框虽然覆盖了部分羊,可是该框并不会分到羊这个类别,而是分到了人,正是因为空间上,羊没并有主导整个框。既然如此,解决方案彷佛显而易见了,缺什么补什么就好了。学习
依然沿着以上思路,精细定位比较容易补出来,那么空间相关性如何编码呢?与检测类似,能够采用roi pooling或position sensitive map解决。因为region是不规则的相似one-stage detection的anchor box的方案,就比较难实现了。咱们能够开发出几种不一样的解决方案:优化
对于每个方案,将简要介绍一篇相关论文,加深理解。仅仅是为了阐述明白每个解决方案,文章不是特别新,你们多包涵了。编码
这篇文章解决方案很是直接,对每一个segmentation proposal提取特征,对他们进行分类,就能够获得instance segmentation的结果。采用两种特征:1)segmentation proposal bounding box内的特征,2)以上特征mask掉segmentation proposal的背景部分。spa
也可借助另一种方案使用segmentation map:利用边缘图对segmentation map进行分割,分割成不一样的物体。[9]使用instance segmentation的标注训练了边缘检测器,注意这里的“边缘”是boundary,而不是edge。而后,使用这个边缘图划分超像素,以超像素为单位对图进行划分和贴标签。这里假设了一个物体必定对应一个联通域(这个假设是有问题的,有时候因为遮挡等问题可能对应多个联通域)。3d
其中,image partition采起非深度学习的方法进行求解,是CRF和multicut的结合。我本身对这部分的理解以下。orm
输入有三种:blog
其中,u,v是两个超像素,l,l'是他们的label。
为了给全部超像素选取标签(xu,l=1表示超像素u标注为l)采用conditional random field(CRF),这里先假设同标签的超像素之间不存在边缘。
利用已有的数学工具可有效的对最后一个方程式求解。
为了分割属于不一样物体但被标为同一类别的像素,采用multicut的方法。
最后一个方程的不等式约束,使得图中全部的cycle只能包含0个或2个以上cutting edge。设想若是没有第二个cutting edge那么必定存在一个cycle能够联通两个区域,即没法造成联通域;若是有2个或以上cutting edge则能够将cycle完全阶段,只能造成区域内和区域外的循环。 一样,利用已有的数学工具可有效的对方程式求解。
最后,为了同时对上述两个问题求解,只须要优化一个共同的目标,即:
这类方法比较多,如著名的mask RCNN就属于这种方法,思路是先进行检测,再对检测框中的内容进行分割。
我选的这篇文章Instance-aware semantic segmentation via multi-task network cascades [11] 年代更早一点,从结构图中,能够清晰的看到先进行类别无关的物体检测(rpn),而后对框内的部分估计一个类别无关的mask,最后对mask进行分类(与[1]方法类似)。
注意在stage3上再加入一个额外的box regression支路,这个结构就能够进行屡次叠加。
这里介绍Fully convolutional instance-aware semantic segmentation [12],把它分为simutaneously不知道是否合适,不过这个方法确实比较不一样。
因为物体的部件很难彻底重合在一块儿,那么经过部件位置+类别就能够区分出不一样物体,于是采用inside score map。outside score map是为了同时进行检测和分割任务,outside部分虽然不属于物体,可是对bounding box有贡献,也须要有响应,于是又设置了outside score map并使用pixel-wise max的方式对inside和outside map进行结合,投票出检测结果。