在为 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 并将其保存为将来的分类训练。
问问题
5414 次
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);
我相当确定 OpenCV 使用相同的格式在 Android 和 C++ 接口中保存 SVM。当然,您始终可以在 Android 中训练 SVM,并将 XML 文件保存到模拟器的 SD 卡中,使用类似
File datasetFile = new File(Environment.getExternalStorageDirectory(), "dataset.xml");
svm.save(datasetFile.getAbsolutePath());
然后将其从 SD 卡中拉出并将其存储在应用程序的/res/raw
文件夹中。
于 2013-04-25T04:34:19.977 回答