使用 gist 和 SVM 训练的图像分类

Posted

技术标签:

【中文标题】使用 gist 和 SVM 训练的图像分类【英文标题】:Image Classification using gist and SVM training 【发布时间】:2014-01-18 04:48:42 【问题描述】:

首先我想说我是 CV 的新手,可能有一些明显的事情我没有想到,所以请不要犹豫提及该类别的任何内容。

为了简单起见,我正在尝试实现场景分类,目前在室内和室外图像之间。

我的想法是使用一个 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 参数应该可以改进分类,但是:

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

    我可能完全走错了方向,如果是,请指出。

编辑: 感谢黑暗荒原!我将尝试使用此工具箱进行校准,并可能尝试改进我的特征提取。 希望当我有一个工作分类时,我会在这里发布。

编辑2:忘记更新了,通过从SUN数据库中获取室内和城市室外图像的gist描述符,并使用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】:

    建议你使用libsvm,效率很高。 libsvm 的cross validation 有相关帖子。您提到的相关 Matlab 库可以使用相同的逻辑。

    你的逻辑是正确的。提取特征并尝试对它们进行分类。无论如何,不​​要期望分类器的校准会返回巨大的差异。关键思想是针对结果中的巨大差异进行特征提取,当然还要结合分类器校准;)。

祝你好运。

【讨论】:

我不同意不要指望你的分类器的校准会返回巨大的差异。在 rbf SVM 中设置正确的 C 和 sigma 参数是至关重要的,并且会导致任何准确度的变化。 我说我们不期望您的分类器的校准会返回巨大差异的事实是指用户对相当糟糕的评论 结果。这意味着分类器本身无法创造奇迹。有一次,用户特别提到了分类器。感谢您的评论。

以上是关于使用 gist 和 SVM 训练的图像分类的主要内容,如果未能解决你的问题,请参考以下文章

SVM 分类器和测试图像

在训练 SVM 对图像进行分类时设置具有序列错误的数组元素

图像识别之初探SVM分类器

SVM 用于图像特征分类?

如何在 Matlab 中提高 SVM 训练和分类的准确性?

如何使用 SIFT 和 SVM 实现通用图像分类器