gpt4 book ai didi

matlab - 词袋没有正确标记响应

转载 作者:太空宇宙 更新时间:2023-11-03 21:37:03 24 4
gpt4 key购买 nike

我正在尝试在 opencv 中实现词袋,并随附了以下实现。我正在使用 Caltech 101 database .然而,由于我是第一次并且不熟悉,所以我打算使用数据库中的两个图像集,椅子图像集和足球图像集。我使用 this 为 svm 编码.

一切顺利,除了当我调用 classifier.predict(descriptor) 时,我没有按预期获得标签 vale。 无论我的测试图像如何,我总是得到 0 而不是“1”。椅子数据集中的图像数量为 10,足球数据集中的图像数量为 10。我将椅子标记为 0 ,将足球标记为 1 。链接代表每个类别的样本,前10个是椅子,后10个是足球

function hello

clear all; close all; clc;

detector = cv.FeatureDetector('SURF');
extractor = cv.DescriptorExtractor('SURF');


links = {
'http://i.imgur.com/48nMezh.jpg'
'http://i.imgur.com/RrZ1i52.jpg'
'http://i.imgur.com/ZI0N3vr.jpg'
'http://i.imgur.com/b6lY0bJ.jpg'
'http://i.imgur.com/Vs4TYPm.jpg'
'http://i.imgur.com/GtcwRWY.jpg'
'http://i.imgur.com/BGW1rqS.jpg'
'http://i.imgur.com/jI9UFn8.jpg'
'http://i.imgur.com/W1afQ2O.jpg'
'http://i.imgur.com/PyX3adM.jpg'


'http://i.imgur.com/U2g4kW5.jpg'
'http://i.imgur.com/M8ZMBJ4.jpg'
'http://i.imgur.com/CinqIWI.jpg'
'http://i.imgur.com/QtgsblB.jpg'
'http://i.imgur.com/SZX13Im.jpg'
'http://i.imgur.com/7zVErXU.jpg'
'http://i.imgur.com/uUMGw9i.jpg'
'http://i.imgur.com/qYSkqEg.jpg'
'http://i.imgur.com/sAj3pib.jpg'
'http://i.imgur.com/DMPsKfo.jpg'
};


N = numel(links);

trainer = cv.BOWKMeansTrainer(100);


train = struct('val',repmat({' '},N,1),'img',cell(N,1), 'pts',cell(N,1), 'feat',cell(N,1));


for i=1:N

train(i).val = links{i};
train(i).img = imread(links{i});

if ndims(train(i).img > 2)
train(i).img = rgb2gray(train(i).img);
end;

train(i).pts = detector.detect(train(i).img);
train(i).feat = extractor.compute(train(i).img,train(i).pts);

end;

for i=1:N
trainer.add(train(i).feat);
end;

dictionary = trainer.cluster();
extractor = cv.BOWImgDescriptorExtractor('SURF','BruteForce');
extractor.setVocabulary(dictionary);

for i=1:N
desc(i,:) = extractor.compute(train(i).img,train(i).pts);
end;

a = zeros(1,10)';
b = ones(1,10)';
labels = [a;b];


classifier = cv.SVM;
classifier.train(desc,labels);

test_im =rgb2gray(imread('D:\ball1.jpg'));

test_pts = detector.detect(test_im);
test_feat = extractor.compute(test_im,test_pts);

val = classifier.predict(test_feat);
disp('Value is: ')
disp(val)

end

这些是我的测试样本:

Soccer Ball

Soccer Ball
(来源:timeslive.co.za)

Chair

Chair

通过搜索这个网站,我认为我的算法ok,尽管我对此不是很有信心。如果有人可以帮助我找到错误,那将是非常感谢的。

按照 Amro 的代码,这是我的结果:

Distribution of classes:
Value Count Percent
1 62 49.21%
2 64 50.79%
Number of training instances = 61
Number of testing instances = 65
Number of keypoints detected = 38845
Codebook size = 100
SVM model parameters:
svm_type: 'C_SVC'
kernel_type: 'RBF'
degree: 0
gamma: 0.5063
coef0: 0
C: 62.5000
nu: 0
p: 0
class_weights: 0
term_crit: [1x1 struct]

Confusion matrix:

ans =

29 1
1 34

Accuracy = 96.92 %

最佳答案

我觉得你的逻辑没问题。

现在我想如果你想提高分类准确度,你必须调整各种参数。这包括 clustering algorithm参数(如词汇表大小、簇初始化、终止标准等)、SVM 参数(内核类型、C 系数、..)、使用的局部特征算法(SIFT、SURF , ..).

理想情况下,无论何时要执行参数选择,都应该使用 cross-validation .有些方法已经嵌入了这种机制(例如 CvSVM::train_auto),但在大多数情况下,您必须手动执行此操作...

最后,您应该遵循一般的机器学习指南;查看全部bias-variance tradeoff dilemma .在线Coursera ML class在第 6 周详细讨论了这个主题,并解释了如何执行错误分析并使用学习曲线来决定下一步要尝试什么(我们是否需要添加更多实例、增加模型复杂性等等)。

话虽如此,我编写了自己的代码版本。您可能想将它与您的代码进行比较:

% dataset of images
% I previously saved them as: chair1.jpg, ..., ball1.jpg, ball2.jpg, ...
d = [
dir(fullfile('images','chair*.jpg')) ;
dir(fullfile('images','ball*.jpg'))
];

% local-features algorithm used
detector = cv.FeatureDetector('SURF');
extractor = cv.DescriptorExtractor('SURF');

% extract local features from images
t = struct();
for i=1:numel(d)
% load image as grayscale
img = imread(fullfile('images', d(i).name));
if ~ismatrix(img), img = rgb2gray(img); end

% extract local features
pts = detector.detect(img);
feat = extractor.compute(img, pts);

% store along with class label
t(i).img = img;
t(i).class = find(strncmp(d(i).name,{'chair','ball'},4));
t(i).pts = pts;
t(i).feat = feat;
end

% split into training/testing sets
% (a better way would be to use cvpartition from Statistics toolbox)
disp('Distribution of classes:')
tabulate([t.class])
tTrain = t([1:7 11:17]);
tTest = t([8:10 18:20]);
fprintf('Number of training instances = %d\n', numel(tTrain));
fprintf('Number of testing instances = %d\n', numel(tTest));

% build visual vocabulary (by clustering training descriptors)
K = 100;
bowTrainer = cv.BOWKMeansTrainer(K, 'Attempts',5, 'Initialization','PP');
clust = bowTrainer.cluster(vertcat(tTrain.feat));

fprintf('Number of keypoints detected = %d\n', numel([tTrain.pts]));
fprintf('Codebook size = %d\n', K);

% compute histograms of visual words for each training image
bowExtractor = cv.BOWImgDescriptorExtractor('SURF', 'BruteForce');
bowExtractor.setVocabulary(clust);
M = zeros(numel(tTrain), K);
for i=1:numel(tTrain)
M(i,:) = bowExtractor.compute(tTrain(i).img, tTrain(i).pts);
end
labels = vertcat(tTrain.class);

% train an SVM model (perform paramter selection using cross-validation)
svm = cv.SVM();
svm.train_auto(M, labels, 'SvmType','C_SVC', 'KernelType','RBF');
disp('SVM model parameters:'); disp(svm.Params)

% evaluate classifier using testing images
actual = vertcat(tTest.class);
pred = zeros(size(actual));
for i=1:numel(tTest)
descs = bowExtractor.compute(tTest(i).img, tTest(i).pts);
pred(i) = svm.predict(descs);
end

% report performance
disp('Confusion matrix:')
confusionmat(actual, pred)
fprintf('Accuracy = %.2f %%\n', 100*nnz(pred==actual)./numel(pred));

这里是输出:

Distribution of classes:
Value Count Percent
1 10 50.00%
2 10 50.00%
Number of training instances = 14
Number of testing instances = 6

Number of keypoints detected = 6300
Codebook size = 100

SVM model parameters:
svm_type: 'C_SVC'
kernel_type: 'RBF'
degree: 0
gamma: 0.5063
coef0: 0
C: 312.5000
nu: 0
p: 0
class_weights: []
term_crit: [1x1 struct]

Confusion matrix:
ans =
3 0
1 2
Accuracy = 83.33 %

因此分类器正确标记了测试集中 6 张图像中的 5 张,这对于开始来说还不错 :) 显然,由于聚类步骤固有的随机性,每次运行代码时都会得到不同的结果。

关于matlab - 词袋没有正确标记响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20765496/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com