SIGGRAPH 2018 「Semantic Soft Segmentation」复现笔记

santa
santa

SIGGRAPH 2018这篇论文主要分为两大部分,第一部分是 DeepLab v2+ResNet101 训练出来用于获取输入图像的 high-level feature 网络,对于输入的 $I = (h, w, 3)$ 图像,为每一个像素点生成一个 128 维的特征向量,因此该网络的输出是 $F = (h, w, 128)$

接下来,使用 $F$ 和 $I$ 进行引导滤波,$F_{filtered} = imguidedfilter(F, I, 10, 0.01)$,在引导滤波这个地方,OpenCV中的 cv2.ximgproc.guided_filter 与原作者使用的 matlab 中实现的 imguidedfilter 有不小区别,于是我对着 matlab 中 imguidedfilter 的实现重写了一下 OpenCV 版的,bluecocoa/imguidedfilter-opencv

在计算完了 $F_{filtered}$ 之后,利用 PCA 将它压缩到 3 维,$F_{PCA} = PCA(F_{filtered}, 3)$,如下图。

santa PCA
santa PCA

随后计算了原始图像的 matting affinity 矩阵,$A_{matting}$,接下来,根据 SLIC 的结果又计算了neighbor affinity 矩阵 $A_{neigh}$ 和 nearby affinity 矩阵 $A_{nearby}$。之后将这三个 affinity 矩阵按照 $A = A_{matting} + 0.01A_{neigh} + 0.01A_{nearby}$ 的计算方式,获得一个融合之后的 $N\times N$ 大小的 affinity 矩阵 $A$,其中 $N = h * w$。有了 $A$ 之后,计算其对应的 Laplacian 矩阵,$L = diags(sum(A, axis=2), 0, N, N)$,$L$ 的可视化如下(只取了一小部分,因为 $L$ 是一个 [h*w, h*w] 大小的矩阵)。

santa Laplacian
santa Laplacian

并对 $L$ 进行SM类型的特征分解,取前 100 个特征向量。然后使用得到的特征向量、特征值,加上 $L$、$F_{PCA}$ 来计算出初始的 soft segments,接下来将这些初始的 soft segments 根据语义特征 $F_{PCA}$ 进行 group,最后在 group 的结果上进行 sparsify,就得到最后的 soft segments 了。可视化之后的效果如下。

santa visualized soft segments
santa visualized soft segments

这里一共分了 5 个类出来,那么选择某一个类,和其取反的结果如下面 5 张图。(实际使用的时候可以在不同的类之间组合,以便获取希望的抠图结果)

santa segmentation 1
santa segmentation 1
santa segmentation 2
santa segmentation 2
santa segmentation 3
santa segmentation 3
santa segmentation 4
santa segmentation 4
santa segmentation 5
santa segmentation 5

这里可以看到存在一些问题,但是其分割效果也还是比较突出的。原论文中也有提过,在颜色相近的部分上,他们使用的传统算法部分算法会出现分割错误。

不过个人认为这一点还好,至少可以为手工抠图提出一些预先的、比较准确的分割,但是因为要计算原始图像中每个点之间的 affinity,因此三个 affinity 矩阵和 $L$ 的大小都是 [h*w, h*w],原始图像的长和宽每翻一倍,像素点个数就翻 4 倍,那么 affinity 矩阵的大小就是翻 16 倍!这一点相当可怕,并且还要进行矩阵的特征分解,因此该算法所需要的时间会变得相当长。

声明: 本文为0xBBC原创, 转载注明出处喵~

《SIGGRAPH 2018 「Semantic Soft Segmentation」复现笔记》有2个想法

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.