2015-02-04 7 views
0

Я использую функцию svmtrain для классификации изображений. И я получаю такую ​​ошибку.Ошибка в svmtrain: «Y и TRAINING должны иметь одинаковое количество строк» ​​

Error using svmtrain (line 253) 
Y and TRAINING must have the same number of rows. 

Error in svm5 (line 80) 
SVMStruct = svmtrain(Training_Set , train_label, 'kernel_function', 'linear'); 

Training_Set содержит наборы изображений, а train_lable - это класс для идентификации входного изображения. Полный код ссылки

clc 
clear all 

% Load Datasets 

Dataset = 'D:\majorproject\image\traindata\'; 
Testset = 'D:\majorproject\image\testset\'; 


% we need to process the images first. 
% Convert your images into grayscale 
% Resize the images 

width=100; height=100; 
DataSet  = cell([], 1); 

for i=1:length(dir(fullfile(Dataset,'*.jpg'))) 

    % Training set process 
    k = dir(fullfile(Dataset,'*.jpg')); 
    k = {k(~[k.isdir]).name}; 
    for j=1:length(k) 
     tempImage  = imread(horzcat(Dataset,filesep,k{j})); 
     imgInfo   = imfinfo(horzcat(Dataset,filesep,k{j})); 

     % Image transformation 
     if strcmp(imgInfo.ColorType,'grayscale') 
      % array of images 
      DataSet{j} = double(imresize(tempImage,[width height])); 
     else 
      % array of images 
      DataSet{j} = double(imresize((tempImage),[width height])); 
     end 
    end 
end 
TestSet = cell([], 1); 
    for i=1:length(dir(fullfile(Testset,'*.jpg'))) 

    % Training set process 
    k = dir(fullfile(Testset,'*.jpg')); 
    k = {k(~[k.isdir]).name}; 
    for j=1:length(k) 
     tempImage  = imread(horzcat(Testset,filesep,k{j})); 
     imgInfo   = imfinfo(horzcat(Testset,filesep,k{j})); 

     % Image transformation 
     if strcmp(imgInfo.ColorType,'grayscale') 
      % array of images 
      TestSet{j} = double(imresize(tempImage,[width height])); 
     else 
      % array of images 
      TestSet{j} = double(imresize(tempImage,[width height])); 
     end 
    end 
    end 

    % Prepare class label for first run of svm 
% I have arranged labels 1 & 2 as per my convenience. 

% It is always better to label your images numerically 

% Note that for every image in our Dataset we need to provide one label. 

% we have 10 images and we divided it into two label groups here. 

    train_label    = zeros(size(10,1),1); 
    train_label(1:4,1) = 1;   % 1 = naa 
    train_label(5:10,1) = 2;   % 2 = ta 


% Prepare numeric matrix for svmtrain 

    Training_Set=[]; 
    for i=1:length(DataSet) 
    b = imresize(DataSet{i},[100 100]); 
    Training_Set_tmp= b(:); 
    %Training_Set_tmp = reshape(DataSet{i},1, 100*100); 
    Training_Set=[Training_Set;Training_Set_tmp]; 
    end 

    Test_Set=[]; 
    for j=1:length(TestSet) 
    b = imresize(TestSet{j},[100 100]); 
    Test_set_tmp= b(:); 
    %Test_set_tmp = reshape(TestSet{j},1, 100*100); 
    Test_Set=[Test_Set;Test_set_tmp]; 
    end 


% Perform first run of svm 

SVMStruct = svmtrain(Training_Set, train_label, 'kernel_function', 'linear'); 
Group  = svmclassify(SVMStruct, Test_Set); 

просьба направлять мне преодолеть от этого. Спасибо.

+1

Можете ли вы предоставить дополнительную информацию о Training_set? Если это коллекция изображений PxPx3 RBG, я действительно не думаю, что это так, как вы хотели бы использовать svmtrain. В большинстве случаев вам будет полезно уменьшить размерность, используя что-то вроде PCA, тогда набор для обучения будет NxM, где N - количество изображений, M - уменьшенное количество функций, поэтому train_label должен быть Nx1 или что-то подобное. – Falimond

+0

Training_Set = []; для i = 1: length (DataSet) b = imresize (DataSet {i}, [100 100]); Training_Set_tmp = b (:); % Training_Set_tmp = reshape (DataSet {i}, 1, 100 * 100); Training_Set = [Training_Set; Training_Set_tmp]; вот как я получаю данные обучения – user3859472

+4

, проверьте, является ли 'size (Training_Set, 1)' такой же, как 'length (train_label)'. – Rashid

ответ

0

Я недавно столкнулся с этой подобной проблемой и после нескольких часов проверки, вот проблема, которую я нашел:

% we have 10 images and we divided it into two label groups here. 

train_label    = zeros(size(10,1),1); 
train_label(1:4,1) = 1;   % 1 = naa 
train_label(5:10,1) = 2;   % 2 = ta 

Где у меня есть только 499 изображений, в то время как вместо этого, я поставил свой размер 500 (Accidentally удаленный 1) и, таким образом, приводит к той же ошибке, что и выше. Вы не представили свой набор данных здесь, поэтому, возможно, вы можете снова рассмотреть его.