具体细节请参考我的论文
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’来调权重,不然结果对误判为训练集中数量多的那一类。