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ę.
'zdjęć {i} = im2double (obrazy {ii}); 'Dlaczego' ii'? – chenaren
Czy zwraca 1 na obrazach ze zbioru treningowego, które mają klasę -1? – Photon
przykro mi, dla {ii} wpisałem to niepoprawnie na moim pytaniu tutaj. Edytowałem to. –