我需要一些帮助来培训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并保存它以便将来分类。
答案 0 :(得分:6)
以下是在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
文件夹中。