opencv输出特征数据、libsvm进行图像分类输出置信度、matlab输出ROC曲线

来源:互联网 发布:指纹 门禁锁 知乎 编辑:程序博客网 时间:2024/05/16 04:40

前言:

在研究分类问题时,可能会遇到需要分类器返回样本属于每一类的概率,而不是直接输出该样本的类别的情况。因为之前一直使用OpenCV库进行开发,所以也想在opencv的ml模块寻找是否有对应功能的SVM分类器,无果。最后发现最新的LIBSVM库提供类似功能的函数。于是,借助LIBSVM,实现了样本的概率估计。(引用自http://blog.csdn.net/u011853479/article/details/51326132)


1相关程序的下载、安装以及“一键式”训练测试(引用自http://www.cnblogs.com/yangyangcv/archive/2012/05/04/2483000.html)

1.1 libsvm:到http://www.csie.ntu.edu.tw/~cjlin/libsvm/ 下载,我用的是libsvm-3.22.zip,下载后直接解压缩到任意位置,我解压到E:\Codes\libsvm-3.22下。

1.2 python:到http://www.python.org/download/ 下载(该地址可能需要FQ),我下的是python-2.7.3.msi,双击该文件安装到默认位置,我安装到C:\Python27下。将该路径添加到系统环境变量中。添加方法:右键点击 我的电脑 -> 属性 -> 高级系统设置 -> 环境变量,在 系统变量 里找到 path, 点击 编辑,在弹出框最后加上 C:\Python27;(注意用分号与之前的项隔开) 之后重启电脑。

1.3 gunplot:到http://www.gnuplot.info/ 下载,我下的是gp460-win32-setup.exe,双击该文件安装到默认位置,我安装到C:\Program Files (x86)\gnuplot下。

1.4. 生成训练数据和测试数据,分别存为train和test两个文本文件,拷贝到libsvm-3.12\tools下。

1.5. 进入libsvm-3.12\tools下,用写字板打开easy.py,将里面gnuplot_exe = 后的路径改为gnuplot的安装路径,对于我的情况:

gnuplot_exe = r"C:\Program Files (x86)\gnuplot\bin\gnuplot.exe"。同样,用写字板打开grid.py,修改gnuplot_pathname = r'C:\Program Files (x86)\gnuplot\bin\gnuplot.exe'。修改这两个文件时都要注意,要修改else下的gnuplot_exe,而不是if not is_win32下的。另外要注意,如果修改完后easy.py或grid.py默认打开程序变成了写字板,要把它改回成python.exe

1.6. 在命令行cd到该路径libsvm-3.12\tools下,命令行输入easy.py train test,敲回车,程序会自动执行scale,参数寻优,生成svm模型train.model,用该模型对test数据进行预测,并给出准确度。(截图如下)


2、输出置信度

2.1 利用交叉验证找到最优的惩罚因子C和RBF核函数中的参数gamma

步骤如下:

进入libsvm-tools的路径下,输入 python.exe(加上所在路径)    easy.py    train(训练数据),如下所示:


2.2 训练数据(对于分类来说就是opencv输出的特征数据)

进入进入libsvm-windows的路径下,输入 svm-train.exe  -c  512.0  -g  0.3125  -b  1   train(训练数据,加上所在路径)   train.model(生成训练模型),如下所示:(注:‘-b  1  ’是为了输出置信度)



2.3 测试数据(对于分类来说就是opencv输出的特征数据)

进入进入libsvm-windows的路径下,输入 svm-predict.exe   -b  1   test(测试数据,加上所在路径)   train.model(训练模型,加上所在路径) predict.model(生成预测数据),如下图所示:


注:如果训练数据过多可能会出现“wrong input in format 8684”,具体什么意思,我没搞清楚。


3、画ROC曲线(二类、多类均可以)

所需数据:预测数据和测试数据

%ROC曲线绘制(引用自http://blog.csdn.net/wiseclown/article/details/51131494)

score = predict.model(:,1); %1’是所需类对应的列数

[x,y]=perfcurve(test_labels,score,1); %test_labels是输入数据,‘1’是对应的类的标签

plot(x,y,'-r');

legend('hog','location','best');

xlabel('假阳性率(False Positive Rate)'); ylabel('真阳性率(True positive rate)')

理论说明参考http://alexkong.net/2013/06/introduction-to-auc-and-roc/

原创粉丝点击