基于SIFT+Kmeans+SVM的场景识别,参数需注意的问题(Matlab实现)

来源:互联网 发布:直男癌语录知乎 编辑:程序博客网 时间:2024/05/22 16:50
具体细节请参考我的论文
http://download.csdn.net/detail/m0_37393277/9895391

1.试验目的:


实现20类的建筑图片分类。


2.实现方法及正确率:

可参见本人上传的资源,论文中有详细介绍。

用深度学习的方法来做,正确率虽然高,但是训练的时候,对硬件要求高啊~没条件不会玩的只能abandon了。流程图如下:


3.参数需注意的问题

(1)图片的预处理

原图像素太大时,往往需要压缩。这里建议不要过分的压缩。这样才能尽可能的多的保留原图像的特征。压缩时,按原图长宽比例进行压缩。例如:960×1280像素的图片压缩成480×640。

(2)提取SIFT特征

推荐一个很实用的工具箱--vlfeat。里面有SIFT、Kmeans等实用工具。

其实用SURF也是很好的选择,速度快,鲁棒性高。Dense SIFT(分块提取)计算也很快。

SIFT可以直接找David Lowe的Matlab源程序。

要明白一幅图像SIFT提取的特征就是n×128维的特征矩阵

(3)Kmeans聚类

Kmean聚类,类别数对试验结果影响很大。如下图:


这里不推荐用Matlab自带的Kmeans聚类,太慢!!!聚1000类的话,如果是20类图片,每类100张480×640像素,那么时间>24h。

推荐用vlfeat工具包,vlfeat里的vlfeat-kmeans,只要2h。不过还是很久。


这里聚类是所有类的所有图片的所有1×128维特征向量放在一起聚类,得到1000类聚类中心。然后在把每张图片的1×128维特征按欧式距离到聚类中心的远近,归入最近的聚类中心所在的类。这样,就把一幅图像的n×128的特征矩阵转换成 1×K的统计直方图了。


(4)SVM

SVM可以用libsvm的工具包里的SVM。当然特征数量和维数很大时,liblinear更高效。


SVM的核函数可以选线性核('-t 2'),也可以选高斯核('-t 0')(默认)。线性核需要调c的值,高斯核就需要调c和g.有参数寻优的方法找c和g。我用的是线性核,特征数量比较多,用线性核。


当训练集里的每一类图像比例很大时,可以通过SVM中的‘-w’来调权重,不然结果对误判为训练集中数量多的那一类。