在训练之前执行图形切割或作为基于像素的分类的后处理

Posted

技术标签:

【中文标题】在训练之前执行图形切割或作为基于像素的分类的后处理【英文标题】:Graph cut performed before training or as a post-processing to a pixel-based classification 【发布时间】:2019-06-17 08:57:06 【问题描述】:

我目前正在使用Scikit-learn 中实现的简单监督分类器对图像进行基于像素的分类。首先将图像重新整形为单像素强度的向量,然后进行如下训练和分类:

from sklearn.linear_model import SGDClassifier

classifier = SGDClassifier(verbose=True)
classifier.fit(training_data, training_target)
predictions = classifier.predict(test_data)

基于像素的分类的问题在于生成的分类图像的噪声性质。为了防止它,我想使用 Graph Cut(例如 Boykov-Kolmogorov 实现)来考虑像素之间的空间上下文。但是,我在 Python(NetworkX,Graph-tool)和 C++(OpenGM 和原始实现:[1] 和 [2])中发现的实现没有显示如何从图像转到图形,除了对于matlab中的[2],我对Graph Cut和matlab都不是很熟悉。

所以我的问题基本上是如何将图形切割整合到之前的分类中(例如,在训练之前或作为后处理)?

我查看了Scikit-image (here) 中的图形算法,但这些算法仅适用于具有离散值的 RGB 图像,而我的像素值是连续的。

【问题讨论】:

“我的像素值是连续的”是指颜色信息存储在浮点值介于 0 和 1 之间的三维向量中吗?如果是这样,将向量乘以 255 并将它们截断为整数。这将为您提供具有“离散值”的 RGB 图像,可与 Scikit-image 中的图形算法一起使用。 是的,我的像素值是浮点数,但我的图像是单波段而不是 RGB。我找到了一个 Python 库,它实现了图形切割(C++ 的包装器),这个image restoration 示例似乎看起来像我想要实现的,除了要后处理的图像在我的案子。剩下的另一个想法可能是调整参数。您如何看待这个解决方案? 【参考方案1】:

我发现了这个image restoration tutorial,它或多或少地满足了我的需求。此外,您使用 Python 库包装器 (PyMaxflow) 调用 maxflow 算法对图进行分区。

从左边的噪声图像开始,考虑像素之间的空间约束,得到右边的二值图像。

【讨论】:

以上是关于在训练之前执行图形切割或作为基于像素的分类的后处理的主要内容,如果未能解决你的问题,请参考以下文章

具有基于像素的标记灰度图像数据。有没有建议训练这些数据进行分类?

-图形处理单元-3.8-像素着色器

LabVIEW彩色图像分割

Opencv学习之路—Opencv下基于HOG特征的KNN算法分类训练

Lecture 11 检测与分割

自然语言处理(NLP)基于GRU实现情感分类