适用于Android的OpenCV - 使用SURF描述符训练SVM

mtn*_*ndg 4 android opencv svm surf

我需要一些帮助来训练Android应用程序的SVM.我有一组不同类(12个类)的图像,并从中获取所有描述符.我设法为每个图像获得相同数量的描述符.我需要的是使用这些描述符训练我的Android应用程序的SVM.我不确定我是否应该在Android模拟器中训练它或编写C++程序来训练SVM然后将其加载到我的应用程序中(如果我使用OpenCV的lib for windows来训练SVM然后保存它,将是lib我用于Android识别保存的SVM文件?).我想我不应该在模拟器中用如此大的数据集训练SVM.我已经在Weka的SMO(http://www.cs.waikato.ac.nz/ml/weka/)上测试了我的描述符数据集并得到了很好的结果,但我需要实现(或使用openCV)SVM并保存它为未来的分类培训.

1''*_*1'' 6

以下是在OpenCV4Android中训练SVM的示例. trainData是a MatOfFloat,其形式取决于您用于获取特征向量的方法.为了做到这一点trainData,我曾经Core.hconcat()将数据集中每个元素的特征向量连接成一个Mat.

Mat responses = new Mat(1, sizeOfDataset, CvType.CV_32F);
responses.put(0, 0, labelArray); // labelArray is a float[] of labels for the data

CvSVM svm = new CvSVM();
CvSVMParams params = new CvSVMParams();
params.set_svm_type(CvSVM.C_SVC);
params.set_kernel_type(CvSVM.LINEAR);
params.set_term_crit(new TermCriteria(TermCriteria.EPS, 100, 1e-6)); // use TermCriteria.COUNT for speed

svm.train_auto(trainData, responses, new Mat(), new Mat(), params);
Run Code Online (Sandbox Code Playgroud)

我很相信OpenCV使用相同的格式来保存Android和C++界面中的SVM.当然,您始终可以在Android中训练SVM并使用类似的方式将XML文件保存到模拟器的SD卡中

File datasetFile = new File(Environment.getExternalStorageDirectory(), "dataset.xml");
svm.save(datasetFile.getAbsolutePath());
Run Code Online (Sandbox Code Playgroud)

然后将其从SD卡中拉出并存储在应用程序的/res/raw文件夹中.