Matlab支持向量机(SVM)用于图像分类

6
我正在使用Matlab的SVM函数对从文件夹中读取的图像进行分类。我想要做的是首先从文件夹中读取20个图像,然后使用它们来训练SVM,最后给一个新的图像作为输入,判断这个输入图像是否属于这20个训练图像相同的类别。如果是,那么分类结果应该给出1,否则,我希望收到-1
到目前为止,我编写的代码如下:
imagefiles = dir('*.jpg');
nfiles = 20; 

for i = 1:nfiles
    currentfilename = imagefiles(i).name;
    currentimage = imread(currentfilename);
    images{i} = currentimage;
    images{i} = im2double(images{i});
    images{i} = rgb2gray(images{i});
    images{i} = imresize(images{i},[200 200]);
    images{i} = reshape(images{i}', 1, size(images{i},1)*size(images{i},2));
end

trainData = zeros(nfiles, 40000);

for ii=1:nfiles
    trainData(ii,:) = images{ii};
end

class = [1 1 1 1 1 1 1 1 -1 -1 -1 -1 -1 -1 1 1 1 1 1 1];
SVMStruct = svmtrain (trainData, class);

inputImg = imread('testImg.jpg');
inputImg = im2double(inputImg);
inputImg = rgb2gray(inputImg);
inputImg = imresize(inputImg, [200 200]);
inputImg = reshape (inputImg', 1, size(inputImg,1)*size(inputImg,2));
result = svmclassify(SVMStruct, inputImg);

由于这些图像是按顺序从文件夹中读取的,因此出现了单元格images。然后我按照代码所示将它们转换为灰度,并调整了大小,因为这些图像的大小不同。因此,在这一步之后,我有20张图片,每张图片的大小都为200x200。最后,我将它们作为我的训练数据集,共有20行和200x200列。我检查了所有这些大小结果,它们似乎都正常工作。但是现在唯一的问题是,无论我输入什么样的图像进行预测,它总是给我一个1的结果,即使对于那些非常不同的图像也是如此。看起来它没有正确地工作。有人能帮我检查一下这里应该出现了什么问题吗?我在现有的互联网资源中找不到任何解释。提前致谢。

1
为什么使用 iiimages{i} = im2double(images{ii}); - chenaren
1
训练集中类别为-1的图像是否返回1? - Photon
@E_learner:你能否提供完整的源代码给我呢?因为在你的问题中,每个图像的训练数据都是一个一维数组(你将RGB图像转换为灰度图像,然后将其重塑成一维数组),而在本帖接受的问题中,图像仍然处于RGB格式。我不理解那个答案是如何解决你的问题的。我可以在MATLAB的'svmtrain'函数中传递RGB图像作为训练数据吗? - Mohammad Fajar
@E_learner:我需要为我的当前任务实现SVM,我认为你的问题会让我的任务更容易。很抱歉,我没有图像处理方面的背景知识。 - Mohammad Fajar
@fajar66:被接受的答案是为了以正确的方式读取图像系列,因为这是我原始问题中的问题。然后,您可以参考我的代码的其余部分进行SVM分类。 - E_learner
显示剩余3条评论
2个回答

4
这里有一个函数可以帮助你读取所有的图片。
function X = ReadImgs(Folder,ImgType)
Imgs = dir(fullfile(Folder, ImgType));
NumImgs = size(Imgs,1);
image = double(imread(fullfile(Folder, Imgs(1).name)));
X = zeros([NumImgs size(image)]);
for i=1:NumImgs,
  img = double(imread(fullfile(Folder, Imgs(i).name)));
  if (size(image,3) == 1)
    X(i,:,:) = img;
  else
    X(i,:,:,:) = img;
end
end

来源:http://computervisionblog.wordpress.com/2011/04/13/matlab-read-all-images-from-a-folder-everything-starts-here/

该链接提供了一个Matlab代码片段,用于读取指定文件夹中的所有图像。使用matlab自带的imread函数,可以轻松地读取每个图像,并将其存储在一个cell数组中。这是一种常见的数据预处理任务,因为许多计算机视觉和深度学习应用程序需要读取大量的图像数据,以便进行模型训练和测试。

0

这应该可以在MATLAB中运行

clear all; 
clc; 

folder = 'gambar 1'; 
dirImage = dir( folder ); 

numData = size(dirImage,1); 

M ={} ; 

% read image 
for i=1:numData
    nama = dirImage(i).name;  
    if regexp(nama, '(lion|tiger)-[0-9]{1,2}.jpg')
        B = cell(1,2); 
        if regexp(nama, 'lion-[0-9]{1,2}.jpg')
            B{1,1} = double(imread([folder, '/', nama]));
            B{1,2} = 1; 
        elseif regexp(nama, 'tiger-[0-9]{1,2}.jpg')
            B{1,1} = double(imread([folder, '/', nama]));
            B{1,2} = -1; 
        end
        M = cat(1,M,B); 
    end 
end

% convert image holder from cell to array
numDataTrain = size(M,1); 
class = zeros(numDataTrain,1);
arrayImage = zeros(numDataTrain, 300 * 300);

for i=1:numDataTrain
    im = M{i,1} ;
    im = rgb2gray(im); 
    im = imresize(im, [300 300]); 
    im = reshape(im', 1, 300*300); 
    arrayImage(i,:) = im; 
    class(i) = M{i,2}; 
end

SVMStruct = svmtrain(arrayImage, class);

% test for lion
lionTest = double(imread('gambar 1/lion-test.jpg' )); 
lionTest = rgb2gray(lionTest); 
lionTest = imresize(lionTest, [300 300]); 
lionTest = reshape(lionTest',1, 300*300); 
result = svmclassify(SVMStruct, lionTest);  

result 

https://github.com/gunungloli666/svm-test


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接