使用gist和SVM训练进行图像分类

时间:2013-12-31 08:16:03

标签: matlab classification svm scene gist

我首先要说的是,我对简历很新,可能会有一些我没想过的显而易见的事情,所以不要犹豫提及该类别的任何内容。

我正在尝试实现场景分类,目前介于室内和室外图像之间,以简化操作。

我实现这一目标的想法是使用一个gist描述符,它创建一个包含场景某些参数的向量。

为了获得可靠的分类,我使用室内和室外图像,每个100个样本,使用gist描述符,从中创建训练矩阵,并在其上使用'svmtrain'。这是一个非常简单的代码,显示了我如何训练gist向量:

train_label= zeros(size(200,1),1);
train_label(1:100,1) = 0;         % 0 = indoor
train_label(101:200,1) = 1;        % 1 = outdoor

training_mat(1:100,:) = gist_indoor1;
training_mat(101:200,:) = gist_outdoor1;
test_mat = gist_test;

SVMStruct = svmtrain(training_mat ,train_label, 'kernel_function', 'rbf', 'rbf_sigma', 0.6);
Group       = svmclassify(SVMStruct, test_mat);

问题是结果非常糟糕。

我读到优化'rbf'kernell的约束和gamma参数应该改进分类,但是:

  1. 我不确定如何使用多维数据向量进行优化(the optimization example given in Mathworks site在2D中,而我的是512),任何建议如何开始?

  2. 我可能完全走错方向,请说明是否如此。

  3. 修改 谢谢Darkmoor!我将尝试使用此工具箱进行校准,并尝试改进我的特征提取。 希望当我有一个工作分类时,我会在这里发布。

    编辑2:忘记更新,通过从SUN数据库获取室内和城市室外图像的要点描述符,并使用libsvm工具箱进行优化参数训练,我设法达到分类率在我的公寓和外面的街道上对照片模型进行测试时,这一比例为95%。

    我对数据库中的城市户外场景和自然场景做了同样的事情,并且在我国的各种场景中进行测试时达到了相似的准确度。

    我用来创建数据矩阵的代码取自here,只做了很小的修改:

    % GIST Parameters:
    clear param
    param.imageSize = [256 256]; % set a normalized image size
    param.orientationsPerScale = [8 8 8 8]; % number of orientations per scale (from HF to LF)
    param.numberBlocks = 4;
    param.fc_prefilt = 4;
    
    %Obtain images from folders
    sdirectory = 'C:\Documents and Settings\yotam\My Documents\Scene_Recognition\test_set\indoor&outdoor_test';
    jpegfiles = dir([sdirectory '/*.jpg']);
    
    % Pre-allocate gist:
    Nfeatures = sum(param.orientationsPerScale)*param.numberBlocks^2;
    gist = zeros([length(jpegfiles) Nfeatures]); 
    
    % Load first image and compute gist:
    filename = [sdirectory '/' jpegfiles(1).name];
    img = imresize(imread(filename),param.imageSize);
    [gist(1, :), param] = LMgist(img, '', param); % first call
    % Loop:
    for i = 2:length(jpegfiles)
       filename = [sdirectory '/' jpegfiles(i).name];
       img = imresize(imread(filename),param.imageSize);
       gist(i, :) = LMgist(img, '', param); % the next calls will be faster
    end
    

1 个答案:

答案 0 :(得分:0)

  1. 我建议您使用libsvm它非常有效。 libsvm的cross validation有相关帖子。您提到的相关Matlab库可以使用相同的逻辑。

  2. 你的逻辑是正确的。提取功能并尝试对其进行分类。无论如何,不​​要指望分类器的校准会产生巨大的差异。关键的想法是提取结果中的巨大差异的特征提取,当然还有分类器校准;)。

  3. 祝你好运。