单点分割 Class 通过图形切割注释?

Segmentation with Single Point Class Annotations via Graph Cuts?

我有一个要分割的图像数据集。对于数据集中的每张图像,专家随机选择单个 pixels/points 并添加 class 关于该像素属于什么 class 的注释。换句话说,每个图像将有大约 60 个标记点:

x, y, class

我怎样才能最好地利用这些单像素注释的知识来执行良好的语义分割?

之前问过类似的问题,回答是使用图割:

图割在理论上似乎是一个不错的选择,但图割是否适用于单像素注释?此外,是否有方法可以处理 multiclass 数据集?如果是这样,是否有一个好的库实现或一些好的资源?

如果不是,哪种方法最适合这种情况?我玩了一些随机游走,但结果分割的边缘定位很差(非常圆的边缘)。

如果您能提供任何帮助、资源或示例,我们将不胜感激(最好使用 python 库,但我真的可以使用任何东西)。

编辑: 我的数据集有大约 10 个不同的 classes,每个图像平均可能有大约 5 个。注释者不能保证注释每一种宗教,但很少会漏掉一个(一些缺失的区域或错误标记的区域是可以容忍的)。 classes 每个都对应于纹理均匀的区域,并且纹理相当恒定(想想天空、泥土、水、山)。你不能从一个点获取纹理,但几乎所有区域都应该有多个点注释。

一个有趣的问题。由于没有具体的例子可以研究,我只会概述我自己会尝试的算法方法。


方法 #1:使用密集描述符

  • 计算密集图像描述符(例如,SIFT/HOG/Gabor 或使用像 VGG 这样的预训练深度网络更好)。
  • 仅从带注释的位置的所有图像中获取描述符:您应该有约 10K 个带有 class 标签的描述符。在这个集合上训练一个简单的 classifier(例如 SVM)。
  • 回到图像:应用 classifier 并输出每个像素属于每个 classes 的对数概率。这应该是您图形切割的一元项(又名“数据项”)。
  • 局部修改一元项,强制标注点属于右边class。
  • 使用简单的成对术语(图像梯度或一些基于边缘的术语)。
  • 应用 Graph-Cut 进行语义分割。

方法 2:训练您自己的深度语义分割模型

为了训练用于分割的完全卷积模型,您不必为所有像素都添加标签。您可能有“ignore_label”:标有该标签的像素将被忽略,不会造成损失。
您的情况是“ignore_label”的极端情况 - 每张图片只有 ~60 像素标记。尽管如此,看看您可以从如此稀疏的信息中学到什么可能会很有趣。

仔细想想,每张图片所包含的信息不仅仅是标记的点:

My dataset has about 10 different classes, each image probably has about 5 on average

意味着如果图像有 classes 1..5 的标签,你知道它不包含 classes 6..10 (!) 你可能有一个“积极的术语”在损失中,将极少数标记像素分配给右侧 classes,以及 负项”用于所有其他像素,如果它们被分配给class图像中根本不存在的像素。