我想先说一下,我对CV非常新手,可能有些显而易见的事情我没有考虑到,请不要犹豫,如果有什么建议请直接提出。
我正在尝试实现场景分类,目前只是简单的室内和室外图像分类。
我的想法是使用Gist描述符,它可以创建一个包含场景某些参数的向量。
为了获得可靠的分类结果,我使用了100个室内和100个室外图像,分别使用Gist描述符创建训练矩阵,并且使用'svmtrain'进行训练。以下是一个相当简单的代码,展示了如何训练Gist向量:
问题在于结果相当糟糕。 我阅读了优化“rbf”内核的约束和gamma参数可能会改善分类的内容,但是: 1. 我不确定如何使用多维数据向量进行优化(Mathworks网站上给出的优化示例为2D,而我的为512),有什么建议吗? 2. 我可能完全偏离了方向,请指出。
编辑:谢谢Darkmoor!我将尝试使用这个工具箱进行校准,并尝试改进我的特征提取。希望当我有一个可用的分类时,我会在这里发布它。
编辑2:忘记更新了,通过从SUN数据库获取室内和城市户外图像的GIST描述符,并使用libsvm工具箱使用优化参数进行训练,我设法在测试来自我的公寓和街道外的图片时实现了95%的分类率。
我对来自数据库的城市户外场景和自然场景执行了相同的操作,并在测试来自我的国家的各种场景时获得了类似的准确性。
我正在尝试实现场景分类,目前只是简单的室内和室外图像分类。
我的想法是使用Gist描述符,它可以创建一个包含场景某些参数的向量。
为了获得可靠的分类结果,我使用了100个室内和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”内核的约束和gamma参数可能会改善分类的内容,但是: 1. 我不确定如何使用多维数据向量进行优化(Mathworks网站上给出的优化示例为2D,而我的为512),有什么建议吗? 2. 我可能完全偏离了方向,请指出。
编辑:谢谢Darkmoor!我将尝试使用这个工具箱进行校准,并尝试改进我的特征提取。希望当我有一个可用的分类时,我会在这里发布它。
编辑2:忘记更新了,通过从SUN数据库获取室内和城市户外图像的GIST描述符,并使用libsvm工具箱使用优化参数进行训练,我设法在测试来自我的公寓和街道外的图片时实现了95%的分类率。
我对来自数据库的城市户外场景和自然场景执行了相同的操作,并在测试来自我的国家的各种场景时获得了类似的准确性。
我用来创建数据矩阵的代码取自这里,只做了非常小的修改:
% 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