2013-05-24 3 views
5

Я использую функцию SVM для Matlab для классификации изображений, которые читаются из папки. Я хочу сначала прочитать 20 изображений из папки, а затем использовать их для обучения SVM, а затем дать новое изображение в качестве входного сигнала, чтобы решить, попадает ли это входное изображение в одну категорию этих 20 обучающих образов или нет. Если это так, то результат классификации должен дать мне 1, если нет, то я ожидаю получить -1.Matlab SVM для классификации изображений

До сих пор, мой написанный код выглядит следующим образом:

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); 

Поскольку изображения считываются последовательно из папки, так camethe клетки images. Затем я преобразовал их в оттенки серого, как показано в коде, и изменил их размер, поскольку эти изображения были НЕ того же размера. Таким образом, после этого шага у меня было 20 изображений, каждый из которых имел размер 200x200. И наконец, я дал им служить в качестве моего учебного набора данных с номерами 20 и 200x200. Я проверил все эти результаты, и они, похоже, отлично работали. Но сейчас единственная проблема заключается в том, что независимо от того, какое входное изображение я предсказываю, он всегда дает мне результат как 1, даже для тех самых разных изображений. Похоже, что он работает неправильно. Может кто-нибудь помочь мне проверить, где должна быть проблема здесь? Я не мог найти никаких объяснений из существующих источников в Интернете. Заранее спасибо.

+1

'изображения {i} = im2double (изображения {ii}); 'Почему' ii'? – chenaren

+1

Возвращает ли он 1 на изображения из набора тренировок, которые имеют класс -1? – Photon

+0

извините, для {ii}, я набрал его неправильно в моем вопросе здесь. Я отредактировал его. –

ответ

3

Вот функция, чтобы прочитать все изображения, которые могут помочь вам

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/

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

Смежные вопросы