OpenCV for Android - 使用 SURF 描述符训练 SVM
Posted
技术标签:
【中文标题】OpenCV for Android - 使用 SURF 描述符训练 SVM【英文标题】:OpenCV for Android - training SVM with SURF descriptors 【发布时间】:2013-04-16 05:49:33 【问题描述】:在为 android 应用训练 SVM 时,我需要一些帮助。 我有一组不同类别(12 个类别)的图像,并从中获取了所有描述符。我设法为每个图像获得了相同数量的描述符。我需要的是使用这些描述符为我的 android 应用程序训练一个 SVM。 我不确定是否应该在 Android 模拟器中训练它或编写一个 C++ 程序来训练 SVM,然后将其加载到我的应用程序中(如果我使用 OpenCV 的 Windows 库来训练 SVM 然后保存它,将我用于 Android 的 lib 识别保存的 SVM 文件?)。我想我不应该在模拟器中用这么大的数据集训练 SVM。 我已经在 Weka 的 SMO (http://www.cs.waikato.ac.nz/ml/weka/) 上测试了我的描述符数据集并得到了很好的结果,但我需要实现(或使用 openCV 的)SVM 并将其保存为将来的分类训练。
【问题讨论】:
我是 OpenCV 新手,想问你一个问题。你有 12 个不同的班级是什么意思? 【参考方案1】:这是一个在 OpenCV4Android 中训练 SVM 的示例。 trainData
是 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);
我很确定 OpenCV 使用相同的格式在 Android 和 C++ 接口中保存 SVM。当然,您始终可以在 Android 中训练 SVM,然后使用类似的方法将 XML 文件保存到模拟器的 SD 卡中
File datasetFile = new File(Environment.getExternalStorageDirectory(), "dataset.xml");
svm.save(datasetFile.getAbsolutePath());
然后将其从 SD 卡中拉出并将其存储在您应用的 /res/raw
文件夹中。
【讨论】:
非常感谢您的回答!我在设置 trainData 时遇到了一点麻烦,但在阅读了this 帖子和documentation 之后,我想通了。 @1'' : 能否请您对this question 提出一些建议?以上是关于OpenCV for Android - 使用 SURF 描述符训练 SVM的主要内容,如果未能解决你的问题,请参考以下文章
opencv for android(十六):opencv在android上的录制avi格式的视频
NDk编译opencv for Android,并引用在Unity3d游戏中的一般步骤