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 的示例。 trainDataMatOfFloat,其形式取决于您用于获取特征向量的方法。为了制作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游戏中的一般步骤

在linux下编译opencv for android

Android For OpenCV的环境搭建

OpenCV for Android:使用 Imgproc.cvtColor 将相机预览从 YUV 转换为 RGB

opencv for android 如何实现后台启动摄像头,不显示预览界面