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

4

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


我是OpenCV的新手,想请教一个问题。你说有12个不同的类是什么意思? - dephinera
1个回答

6

这是一个有关在OpenCV4Android中训练SVM的例子。变量trainData是一个MatOfFloat,其形式取决于您用于获取特征向量的方法。我使用Core.hconcat()将数据集中每个元素的特征向量连接成一个单独的Mat,来创建trainData

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);

我相信OpenCV在Android和C++接口中使用相同的格式保存SVM。当然,你可以在Android上训练SVM,并使用类似以下方式将XML文件保存到模拟器的SD卡中:

File datasetFile = new File(Environment.getExternalStorageDirectory(), "dataset.xml");
svm.save(datasetFile.getAbsolutePath());

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

非常感谢您的答复!在阅读了这篇帖子和文档之后,我成功解决了trainData设置的问题:https://dev59.com/v2Uq5IYBdhLWcg3wNtuB; http://docs.opencv.org/doc/tutorials/ml/introduction_to_svm/introduction_to_svm.html - mtndg
@1:你能否提供一些对于这个问题的建议? - Mehul Joisar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接