2013-05-24 14 views
5

Używam funkcji SVM Matlaba do klasyfikowania obrazów, które są odczytywane z folderu. Chcę najpierw odczytać 20 obrazów z folderu, następnie użyć ich do szkolenia SVM, a następnie podać nowy obraz jako dane wejściowe, aby zdecydować, czy ten obraz wejściowy należy do tej samej kategorii tych 20 obrazów treningowych, czy nie. Jeśli tak, to wynik klasyfikacji powinien dać mi 1, jeśli nie, to spodziewam się otrzymać -1.Matlab SVM do Image Classification

Do tej pory mój napisany kod jest w następujący sposób:

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

Ponieważ obrazy są odczytywane przez szeregowo z folderu, więc camethe komórkę images. Następnie przekonwertowałem je do skali szarości, jak pokazano w kodzie, i zmieniłem ich rozmiar, ponieważ te obrazy NIE były tego samego rozmiaru. Po tym kroku miałem 20 zdjęć, wszystkie o rozmiarze 200x200. I w końcu dałem je, by służyły jako mój zbiór danych treningowych z kolumnami 20 i 200x200. Sprawdziłem wszystkie te wyniki wielkości i wydawało się, że działają dobrze. Ale w tej chwili jedynym problemem jest to, bez względu na to, jaki rodzaj wejściowego obrazu daję do przewidzenia, zawsze daje mi wynik jako 1, nawet dla tych bardzo różnych obrazów. Wygląda na to, że nie działa poprawnie. Czy ktoś mógłby mi pomóc sprawdzić, gdzie powinien być problem? Nie mogłem znaleźć żadnych wyjaśnień z istniejących źródeł w Internecie. Z góry dziękuję.

+1

'zdjęć {i} = im2double (obrazy {ii}); 'Dlaczego' ii'? – chenaren

+1

Czy zwraca 1 na obrazach ze zbioru treningowego, które mają klasę -1? – Photon

+0

przykro mi, dla {ii} wpisałem to niepoprawnie na moim pytaniu tutaj. Edytowałem to. –

Odpowiedz

3

Oto funkcja, aby przeczytać wszystkie obrazy, które mogą pomóc Ci

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 

Źródło: http://computervisionblog.wordpress.com/2011/04/13/matlab-read-all-images-from-a-folder-everything-starts-here/

0

to powinny być prace w 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