【问题标题】:How can I do a simple binary image classification in MATLAB?如何在 MATLAB 中进行简单的二值图像分类?
【发布时间】:2018-06-23 19:24:46
【问题描述】:

我对 MATLAB 并不是很陌生,只是对整个机器学习这件事很陌生。

我必须做一个简单的二值图像分类。我不在乎它是工具箱还是只是代码,我只需要这样做。我尝试了一些我在 Github 或其他网站上在线找到的分类代码,但其中大多数是随机工作的,其中一些适用于预定义的图像。

那些在预定义图像上工作的很整洁(例如:http://www.di.ens.fr/willow/events/cvml2011/materials/practical-classification/),但我在应用一组新图像时遇到了问题,只是因为有一些 .txt 文件(图像名称的向量,这很容易复制)和一些 .mat 文件(带有名称和直方图)。

我在以相同顺序创建名称和直方图时遇到问题,我使用的代码是:

  for K = 1 : 4
    filename = sprintf('image_%04d.jpg', K);
    I = imread(filename);
    IGray = rgb2gray(I);
    H = hist(Igray(:), 32);
  end
  save('ImageDatabase.mat', 'I', 'H');

但由于某种原因,只有最后一个图像的名称和路径仍然被存储(例如,在这种情况下,只有 image_0004 存储在名称槽中)。

我发现的另一个似乎很简单的代码是:https://github.com/rich-hart/SVM-Classifier,但输出确实是随机的(对我而言),所以如果有人能向我解释发生了什么,我将不胜感激。有 19 个训练图像和 20 个测试图像。然而,如果我删除其中一张测试图像,支持向量结构中会消失 2 个条目?

无论如何,如果你有一个工具箱,或者更容易适应的代码或对上述代码的一些解释,我将不胜感激。

干杯!

编辑:

我尝试按照此代码的示例进行操作:http://dipwm.blogspot.ro/2013/01/svm-support-vector-machine-with-matlab.html

即使我得到了 30 张 100x100 的图像,我仍然收到此错误:

Error using svmtrain (line 253)
Y and TRAINING must have the same number of rows.

Error in Untitled (line 74)
SVMStruct = svmtrain(Training_Set , train_label, 'kernel_function', 'linear');

【问题讨论】:

  • 根据图像,您的输出看起来随机也就不足为奇了。你需要有更多的训练样本。如果您有机器学习工具箱,我建议您使用 Matlabs 出色的 tutorial
  • 问题是我没有太多时间。这个项目本来应该是一些同学做的,结果他们什么都没做。我必须独自完成所有事情,而且我还有 1 天的时间。无论如何,我用别的东西编辑了我的原始帖子。如果您能够对此做出回答,我会很高兴。非常感谢!
  • 我的猜测是您没有正确调整训练数据的大小。它需要是 NxD,其中 N 是样本数(在这种情况下为 30),D 是特征维度。如果您使用原始图像作为特征,则需要在使用 svmtrain 之前将其从 100x100 重塑为 1x10000。 train_label 也应该是一个长度为 N 的数组。
  • 你能分享一个示例图像吗?也许我们可以推荐另一个分类器。我怀疑 SVM 在使用 20 张图像进行训练时是否能正常工作。
  • 感谢大家如此合作和乐于助人。这是因为我使用的是绝对路径而不是相对路径(我说的是我在最新编辑后发布的链接)。我得到了一个输出。有时在输出中我得到的值是 18 而不是 30(我使用了多少张图片),我真的不明白在哪里可以读取哪个图片属于哪个类。我在训练和测试中都使用了相同的图片,只是为了看看它是否有效(X 射线和射线照相图片)。我的 SVM 结构输出的打印屏幕:i.imgur.com/KWv2dGv.png

标签: image matlab classification


【解决方案1】:

当您只有约 40 个数据点用于训练、测试和验证时,无法在原始 100x100 图像上训练任何分类器。所以推荐一个 Matlab 工具箱并不能真正解决你的问题。

答案是:获取更多数据

为了完整起见,您可以尝试以下两种方法:

特征提取

也许您的图片中有一些非常明显的特征(有些图片较暗,有一个白色的角等),您可以在训练之前提取这些特征。使用 3-4 个功能,您可以尝试使用您的数据集训练分类器。在这种情况下,我会尝试fitcensemble,因为它非常易于使用,无需算法的内部运作。

使用预训练的分类器

您可以使用 GoogLeNet,也许您的图片适合 ImageNet categories 之一。如果您的图片不符合任何类别,请尝试transfer learning

【讨论】:

    猜你喜欢
    • 2019-08-07
    • 1970-01-01
    • 2014-04-07
    • 2014-12-26
    • 2011-07-13
    • 1970-01-01
    • 2011-02-22
    • 2018-04-07
    • 1970-01-01
    相关资源
    最近更新 更多