《SegFix: Model-Agnostic Boundary Refinement for Segmentation》

– 目的是提升现存分割模型的边界像素预测质量,现阶段的分割模型普遍的情况是:越接近物体边界的像素预测准确度越低

– 本文提出的解决方法是:在现有模型预测完成的结果上,仅对边界像素分类进行微调。

现有模型基本上都是直接预测出物体的边界像素位置,但往往预测出错就出现在这些边界像素上。

本文的方法与用哪个分割模型无关,因为它只是在分割完成的结果上做进一步修正。

– 本文提出的方法仅对输入图像做两步处理:1)定位轮廓边界像素。2)找到与轮廓边界像素相对应的内部像素

– 模型结构如图:

训练过程为:先使用一个Backbone对原始图片进行特征提取,然后将提取到的特征作为两个预测模型的输入:

  1. Boundary 分支负责预测物体的边界,得到一个 boundary map,该map只有(0,1)两个数,1表示边界像素
  2. Direction 分支负责预测从边界指向内部像素的方向(想象一个人站在任意像素上看向离他最近边界的反方向),得到一个 direction map

使用 boundary map 作为 direction map 的mask,即可得到仅含边界的 direction map,将该 map 作为 offset 分支的输入,得到一个offset map

offset 分支不是一个神经网络,而只是一个值转换函数,direction map 中每个元素表示的方向取值是 (0,360] 的连续值,而 offset branch 则将它们分类为 n 个方向上的离散值(例如分成每45°就划分为一个方向,共分为8个方向)

– 通过SegFix模型得到了一个 offset map,再将其作用与任意分割模型的分割结果上

最终产生的分割边界为:

其中 L 表示边界的label map(一张图中哪些是边界),L帽表示经过SegFix精炼过后的label map,Pi 表示边界像素 i 的坐标,Δqi表示边界像素偏移量(即上述模型的 offset map ) ,pi + Δqi 即为将边界向偏移量方向偏移后的新像素位置

– 应用举例

使用任意分割方法得到一个原始的label map,再使用本文方法得到offset map做增强

– Ground-truth生成过程

  1. 首先根据分割的 ground-truth 得到 k 个的二值化图(一张图片能分割出多少个物体就产生多少个二值化图)
  2. 然后使用 Distance Transform 得到 Distance Map(计算每个像素点到最近分割边界的距离,图中,距离越远,值越大,颜色越红)。将这 k 个 distance map 进行合并成为一整个 distance map。
    取一个阈值λ,若 distance 小于该值则认为其就是边界,将这些像素取出就能得到 boundary map 的 ground-truth
  3. 对合并后的 distance map 再使用Sobel(类似差分)算子得到 direction map 的 ground-truth

– 疑问

看完文章我更加懵逼了,既然你 Segfix 本身就已经预测出边界了,而且你也预测出边界像素了,那不就已经完成分割了吗?

我再三确认了下,发现其 ground-truth 确实是基于分割的ground-truth完成的,也就是说它这个模型确实是在预测正确的分割边界,这就更更加让我困惑了。

We start from the ground-truth segmentation label to generate the ground-truth distance map, followed by boundary map and direction map.

以下是我自己的理解:

1. 分割模型的任务不仅是分割,还应该有选择的分割。不是说我啥都不知道就开始对图片进行分割,而是我先知道我要分割什么东西,再去选择相应的像素进行分割

2. 从 Ground-truth 生成过程中,boundary map 的 ground-truth 生成可以看出,该模型的作用仅仅是预测出边界,而没有指定说预测什么东西的边界(因为它将 k 个 distance map 融合在一起生成的ground-truth)

3. 文章中有这么一句话:

We follow the contour detection methods [4,2,20] and simply use a convolutional network to predict a binary mask indicating the boundary pixels

也就是说,该模型的边界预测其实算是轮廓预测,边界和轮廓的区别在于:一个物体的边界内可以有很多轮廓,或者一个大的轮廓里也有可能有很多物体边界。再者有些轮廓是不闭合的,而边界一定是闭合的。

这就好比对图片中的房子进行语义切割,但房子上的窗户也被作为轮廓识别了出来,显然,对于窗户的轮廓来说,不管是其内部还是外部也都还是房子这个语义的一部分

4. 该模型最终会生成一个 Offset map,想象中,如果该模型本身就已经完成了语义分割,则该 offset map 转换为轮廓图后,必然和分割的ground-truth一样(分割轮廓起码应该是一样的)。

以下为原图:

以下是我将Segfix对上面原图生成的 offset map 可视化的结果:

图中共有8种颜色,每个颜色表示边界向内部像素方向的指向,例如黑色表示该边界像素应属于其上面那个物体的边界,浅蓝色则表示属于下面的物体

以下是 ground-truth:

对比很明显是差别较大的,offset map 确实能都找到正确的分割边界,但同时也找到了其他的细节轮廓。从右上角那一道大横线看确实也不是闭合的,这也印证了第3个猜想。

所以我想,这个 boundary map 的 ground-truth 生成,是不是也可以不用分割的 ground-truth 去做,而直接使用一些边缘检测算法,例如 opencv 的 findcontours 方法或者 canny 算法等。回头有机会试试看

PS:我下载了他的代码,但是其复杂程度超乎我的想象。不是说模型或训练的过程复杂,而是代码逻辑,我不知道是不是我自己太菜了,看这个代码就像是在整理一团毛线。但是你也不能说他代码乱,相反,都是井井有条的。而且看得出来其有一定的开发水平。但是怎么说,太多无关的东西了,你也不能说它无关,有关系,但仿佛都又过于耦合了,你也不能说它耦合,反正就是将各种东西放在一起。作者文档写得很详细,但是怎么说,按照文档上来的话,我这边还是会有很多问题要处理。我想跟着代码执行过程走,我发现作者设定的参数太多了,你经常不知道这个参数是干嘛用的,走着走着你就不知道自己在干嘛了,我太菜了 T_T

Leave a Comment