2013-04-23 106 views
4

我需要一些幫助來訓練Android應用程序的SVM。 我有一組圖像在不同的類(12類),並從它們獲取所有描述符。我設法爲每個圖像獲得相同數量的描述符。我需要的是用這些描述符爲我的android應用程序訓練SVM。 我不知道應該在Android模擬器中訓練它還是編寫一個C++程序來訓練SVM,然後將其加載到我的應用程序中(如果我使用OpenCV的lib for windows來訓練SVM並保存它,將我用於Android的庫識別保存的SVM文件?)。我想我不應該在模擬器中訓練帶有這麼大數據集的SVM。 我已經在Weka的SMO(http://www.cs.waikato.ac.nz/ml/weka/)上測試過描述符的數據集,並且獲得了很好的結果,但是我需要實現(或使用openCV的)SVM並將其保存爲未來的分類。OpenCV for Android - 使用SURF描述符訓練SVM

+0

我是OpenCV的新手,我想問你一個問題。這是什麼意思,你有12個不同的課程? – definera 2014-12-23 21:19:59

回答

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

+0

非常感謝您的回答!我在設置trainData時遇到了一些麻煩,但在閱讀[this](http://stackoverflow.com/questions/14694810/using-opencv-and-svm-with-images)文章和[documentation](http:// docs.opencv.org/doc/tutorials/ml/introduction_to_svm/introduction_to_svm.html)我想通了。 – 2013-04-28 19:29:23

+0

很高興幫助你:) – 2013-04-28 20:24:21

+0

@ 1'':你可以請提供一些關於[這個問題]的建議(http://stackoverflow.com/questions/29072000/opencv4android-template-matching-using-camera)? – 2015-03-16 08:03:48