一个用BoW|Pyramid BoW+SVM进行图像分类的Matlab Demo

做了一个简单的图像分类的Demo。是能够让图像分类的初学者能够直观的从实际中观察揣摩理解图像分类的环节,各个环节的步骤以及重要性,哪些环节是问题的本质等等。

图像的特征用到了Dense Sift,通过Bag of Words词袋模型进行描述,当然一般来说是用训练集的来构建词典,因为我们还没有测试集呢。虽然测试集是你拿来测试的,但是实际应用中谁知道测试的图片是啥,所以构建BoW词典我这里也只用训练集。

其实BoW的思想很简单,虽然很多人也问过我,但是只要理解了如何构建词典以及如何将图像映射到词典维上去就行了,面试中也经常问到我这个问题,不知道你们都怎么用生动形象的语言来描述这个问题?

用BoW描述完图像之后,指的是将训练集以及测试集的图像都用BoW模型描述了,就可以用SVM训练分类模型进行分类了。

在这里除了用SVM的RBF核,还自己定义了一种核: histogram intersection kernel,直方图正交核。因为很多论文说这个核好,并且实验结果很显然。能从理论上证明一下么?通过自定义核也可以了解怎么使用自定义核来用SVM进行分类。

代码下载链接:

github:PG_BOW_DEMO.zip,

如果无法下载,当然可以再发邮件问我要,pagelee.sd at gmail.com。

Demo中的图像是我自己研究中用到的一些Action的图像,我都采集的简单的一共6类,每一类60幅,40训练20测试。请注意图像的版权问题,自己研究即可,不能商用

分类器用的是libsvm,最好自己mex重新编译一下。

如果libsvm版本不合适或者没有编译成适合你的平台的,会报错,例如:

Classification using BOW rbf_svm
??? Error using ==> svmtrain at 172
Group must be a vector.

Demo中的版权我也已经注明。

下面是默认的demo结果:

Classification using BOW rbf_svm
Accuracy = 75.8333% (91/120) (classification)

Classification using histogram intersection kernel svm
Accuracy = 82.5% (99/120) (classification)

Classification using Pyramid BOW rbf_svm
Accuracy = 82.5% (99/120) (classification)

Classification using Pyramid BOW histogram intersection kernel svm
Accuracy = 90% (108/120) (classification)

当然结果这个样子是因为我已经把6类图像提前弄成一样大了,而且每一类都截取了最关键的子图,不太符合实际,但是为了demo方便,当然图像大小可以是任意的。

下图就是最好结果的混淆矩阵,最好结果就是Pyramid BoW+hik-SVM:

http://pic002.cnblogs.com/images/2011/109710/2011102412350443.jpg

这是在另一个数据集上的结果(7类分类问题):

Classification using BOW rbf_svm
Accuracy = 34.5714% (242/700) (classification)

Classification using histogram intersection kernel svm
Accuracy = 36% (252/700) (classification)

Classification using Pyramid BOW rbf_svm
Accuracy = 43.7143% (306/700) (classification)

Classification using Pyramid BOW histogram intersection kernel svm
Accuracy = 55.8571% (391/700) (classification)

你可能感兴趣的:(计算机视觉视觉,机器学习)