bagofwords_classification的一种正确的打开方式
bagofwords_classification是opencv_contrib中用bags of words对图像进行分类的一个范例,其测试数据是PASCAL VOC。PASCAL VOC为图像识别和分类提供了一套标准化的优秀数据集,是验证各种精妙算法性能的标准评估系统。本文介绍bagofwords_classification.cpp一种正确的打开方式。
1. 开发环境
win10专业版 64位操作系统 + VS2013中文版 + opencv3.x(20161003源码) + opencv_contrib(20161003源码),配置好的例程和相关文件已上传至CSDN。
bagofwords_classification.cpp位于opencv_contrib\modules\xfeatures2d\samples\bagofwords_classification.cpp.
2. 测试数据集PASCAL VOC的数据结构
先了解PASCAL VOC数据集相关背景,有助于理解bagofwords_classificationPascal
的代码。PASCAL VOC全称是 Pattern Analysis, Statical Modeling and Computational
Learning。从2005年至今,PASCAL VOC组织每年都会提供一系列类别的、带标签的图片,挑战者通过设计各种精妙的算法,仅根据分析图片内容来将其分类,最终通过准确率、召回率、效率来一决高下。如今,挑战赛和其所使用的数据集已经成为了对象检测领域普遍接受的一种标准。
本文测试用的数据是VOC2010,VOC2010包含20个物体类别,有三个主要任务:
1. 分类:针对每一个图像类别,在给定测试图像中预测当前图像中是否包含或不包含当前类别中的至少一个对象。
2. 检测:在测试图像中检测是否存在当前类别下任意一个对象,若存在,画出该对象的边界框。
3. 分割:针对测试图像的每一个像素,预测包含该像素的对象类别,用不同的颜色区分出当前不同类别的物体和背景。
VOC2010中包含五个文件夹,Annotations, ImageSets, JPEGImages, SegmentationClass, SegmentationObject,各文件夹包含的内容大致如下:
bagofwords_classification完成的任务是VOC挑战三大主要任务中的“分类”, 在正式开始学习bagofwords_classification的代码之前,强烈建议先研读一下VOC测试数据的说明文档。PASCAL VOC的官网中有每一年的测试数据和测试数据的极少文档,测试数据的官方下载链接The pascal voc project.
3. bagofwords_classification例程运行结果
在说明“正确的打开方式”之前,我们先来看一下bagofwords_classification例程的运行结果。对于“分类”任务,PASCAL VOC要求参赛者提交三个文件,以aeroplane类别为例,需要comp1_cls_val_aeroplane.plt, comp1_cls_val_aeroplane.txt, scoregt_aeroplane.txt。其中plt是用测试集图像中每一张图片的Recall(召回率)和Precision(准确率)组成的PR曲线,如下图所示。comp1_cls_val_aeroplane.txt和scoregt_aeroplane.txt则是依照VOC官方的要求计算得到的每张图像的confidence和score。VOC挑战会以PR曲线和平均准确率(ap)作为评价算法优劣的主要依据。
4. bagofwords_classification.cpp运行前准备
4.1 新建opencv工程
用bagofwords_classification.cpp新建一个工程,为该工程配置opencv3.1+opencv_contrib的运行环境,配置方法请参考cmake-gui和vs2013编译opencv和opencv_contrib源码.
4.2 修改工程属性
一般新建VS工程时,“工程属性页–>配置属性–>常规–>字符集”中默认为”使用Unicode字符集“,但在编译bagofwords_classification.cpp时需要将其修改为“使用多字节字符集”,如下图所示。
该例程中有一个函数名为makeDir( const string& dir ),其中用到了dir.c_str()。若使用”使用Unicode字符集“,那么VS2013会报如下图所示错误,按上述方式修改设置即可。
4.3 准备参数设置文件和修改部分代码
例程的原程序的运行模式是在控制台下输入: exe 参数1 参数2 参数3 参数4 参数5,这些参数也可以提前按照规定格式写在一个名为param.xml的文件中。为方便调试,在运行程序之前,我提前准备了该文档,内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<?xml version="1.0" ?> <opencv_storage> <!--必须包含该语句--> <vocName>VOC2010</vocName> <ddmParams> <detectorType>SURF</detectorType> <descriptorType>SURF</descriptorType> <matcherType>BruteForce</matcherType> </ddmParams> <vocabTrainParams> <trainObjClass>chair</trainObjClass> <vocabSize>1000</vocabSize> <memoryUse>200</memoryUse> <descProportion>0.3</descProportion> </vocabTrainParams> <svmTrainParamsExt> <descPercent>0.5</descPercent> <targetRatio>0.4</targetRatio> <balanceClasses>true</balanceClasses> </svmTrainParamsExt> </opencv_storage> <!--必须包含该语句--> |
将解压后的测试数据放在当前运行的工程目录下,并且修改例程中的变量const string vocPath(将VOC数据的路径赋给该变量)和const string resPath(指定bow,svm, plot等相关数据的存储路径。)
理论上而言,做好上述准备后就可以开始测试程序了,测试完成的时间由电脑配置决定。我的电脑跑了24小时以上,汗。
5. gnuplot查看运行结果
bagofwords_classification会将测试数据的准确率、召回率、效率以plt格式的文件进行输出,因此这里需要说明一下plt文件的查看方法,我用的是gnuplot win32版本。在sourceforge中下载完成后,按提示安装。
安装完成后,打开安装目录下的gnuplot.exe,并将gnu的工作目录切换至bagofwords_classification的工作目录下。cd “D:\\XXX\\XXX\\XXX” 这一行命令能够实现gnuplot的工作目录,注意了:目录划分符号为’\\’ 。
然后执行命令: load ‘filename’,这时gnuplot会将当前plt文件的图像形式以PNG格式输出到当前工作目录。
下一篇文章我们一起来学习bagofwords_classification的工作原理,敬请期待。