【发布时间】: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