【问题标题】:Matlab SVM for Image Classification用于图像分类的 Matlab SVM
【发布时间】:2013-05-20 05:02:53
【问题描述】:

我正在使用 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的结果,即使是那些非常不同的图像。似乎它无法正常工作。有人可以帮我看看这里应该是哪里的问题吗?我无法从互联网上的现有资源中找到任何解释。提前致谢。

【问题讨论】:

  • images{i} = im2double(images{ii}); 为什么是ii
  • 它是否在训练集中具有 -1 类的图像上返回 1 ?
  • 抱歉,对于 {ii},我在这里的问题中输入错误。我编辑了它。
  • @Photon:我可以在训练集上试试,然后会给你更多信息。谢谢。
  • 好的,我自己解决了这个问题。谢谢大家的关注。

标签: image matlab image-processing classification svm


【解决方案1】:

这是一个读取所有可能对您有帮助的图像的功能

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/

【讨论】:

    【解决方案2】:

    这应该可以在 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

    【讨论】:

      猜你喜欢
      • 2020-04-07
      • 2012-03-13
      • 2019-01-30
      • 2013-01-23
      • 2016-09-13
      • 2014-05-12
      • 1970-01-01
      • 2013-07-04
      • 2016-08-09
      相关资源
      最近更新 更多