在MATLAB中实现朴素贝叶斯最近邻(NBNN)

时间:2014-12-08 02:41:29

标签: matlab image-processing computer-vision matlab-cvst knn

我几天前在简历上发布了这个question,但论坛基本上没有观察到它。我试图在MATLAB中实现NBNN来对CIFAR-10图像数据集进行图像分类。算法非常简单,我对它的正确性充满信心,然而,我收到22-28%的可怕准确率。我不确定为什么,我希望有图像分类或算法经验的人可以指出我正确的方向。该算法学习了SIFT图像描述符,这可能是其表现不佳的原因之一。 Matlab只有一个SURF特征检测器。根据我的阅读,SURF / SIFT基本相同。我一直在使用features,(nDescriptros x 64)从下面的函数中获取我的模型。

points = detectSURFFeatures(rgb2gray(image));
[features,valid_points] = extractFeatures(image,points);

CIFAR数据集和此方法的另一个可能问题是图像的小尺寸。每张图像都是32 x 32图像,我相信,这使得特征检测非常困难。我在detectSURFFeatures()中使用了不同的八度音阶设置,但没有任何事情使我的准确度超过28%。

该方法的注释代码如下。这很难理解,但仍然可能有所帮助。

希望有人可以帮助我。

for i = 3001:4000 %Train on the first 3000 instances and test on the remaining 1000.
    closeness = [];
    for j = 1:10 %loop over the 10 catergories
        class = train(trainLabel==j,:); % Pull out all descriptors that belong to class j
        descriptor = test(test_id==i,:); % Pull out all descriptors for image i
        [idx,dist] = knnsearch(class,descriptor,'K',1); % Find the distance between the descriptors and the closest labeled descriptor in class j.
        total = sum(dist); % sum up distances
        closeness = [closeness,sum(total)]; % append a vector of the image-to-class distances.
    end
    [val,cat] = min(closeness); % Find choose the class that resulted in the lowest, summed distance.
    predLabel = [predLabel;cat]; % Append to a vector of labels.
    i
end

1 个答案:

答案 0 :(得分:0)

如果您的图像是32x32像素,那么尝试检测兴趣点并不是一个好主意。正如您所观察到的,如果有的话,您将获得很少的功能。对图像进行上采样是一种选择。另一种选择是使用像HOG(extractHOGFeatures)这样的全局描述符。