2017-02-14 5 views
0

У меня есть набор изображений, на которых я выполнил обнаружение кромок с использованием OpenCV 3.1. Края хранятся в MAT OpenCV. Может ли кто-нибудь помочь мне в обработке для Java SVM поезда и тестового кода на этих наборах изображений?Как SVM Настроить мои изображения Edge с помощью Java-кода

+0

Что вы хотите, чтобы SVM работал с этими изображениями? Можете ли вы уточнить? –

+0

Мы хотим классифицировать изображения с помощью SVM, но с проблемой подготовки SVM в java opencv 3.1 –

+0

Конечно, вы хотите классифицировать, SVM делает именно это. Что вы подразумеваете под «неприятностью» здесь? –

ответ

0

После обсуждения в комментариях я предоставляю вам примерный проект, который я построил для андроид-студии некоторое время назад. Это использовалось для классификации изображений в зависимости от цветовых пространств Lab.

//1.a Assign the parameters for SVM training here 
    double nu = 0.999D; 
    double gamma = 0.4D; 
    double epsilon = 0.01D; 
    double coef0 = 0; 
    //kernel types are Linear(0), Poly(1), RBF(2), Sigmoid(3) 
    //For Poly(1) set degree and gamma 
    double degree = 2; 
    int kernel_type = 4; 
//1.b Create an SVM object 
    SVM B_channel_svm = SVM.create(); 
    B_channel_svm.setType(104); 
    B_channel_svm.setNu(nu); 
    B_channel_svm.setCoef0(coef0); 
    B_channel_svm.setKernel(kernel_type); 
    B_channel_svm.setDegree(degree); 
    B_channel_svm.setGamma(gamma); 
    B_channel_svm.setTermCriteria(new TermCriteria(2, 10, epsilon)); 
    // Repeat Step 1.b for the number of SVMs. 
//2. Train the SVM 
    // Note: training_data - If your image has n rows and m columns, you have to make a matrix of size (n*m, o), where o is the number of labels. 
    // Note: Label_data is same as above, n rows and m columns, make a matrix of size (n*m, o) where o is the number of labels. 
    // Note: Very Important - Train the SVM for the entire data as training input and the specific column of the Label_data as the Label. Here, I train the data using B, G and R channels and hence, the name B_channel_SVM. I make 3 different SVM objects separately but you can do this by creating only one object also.  
    B_channel_svm.train(training_data, Ml.ROW_SAMPLE, Label_data.col(0)); 
    G_channel_svm.train(training_data, Ml.ROW_SAMPLE, Label_data.col(1)); 
    R_channel_svm.train(training_data, Ml.ROW_SAMPLE, Label_data.col(2)); 
    // Now after training we "predict" the outcome for a sample from the trained SVM. But first, lets prepare the Test data. 
    // As above for the training data, make a matrix of (n*m, o) and use the columns to predict. So, since I created 3 different SVMs, I will input three separate matrices for the three SVMs of size (n*m, 1). 
//3. Predict the testing data outcome using the trained SVM. 
    B_channel_svm.predict(scene_ml_input, predicted_final_B, StatModel.RAW_OUTPUT); 
    G_channel_svm.predict(scene_ml_input, predicted_final_G, StatModel.RAW_OUTPUT); 
    R_channel_svm.predict(scene_ml_input, predicted_final_R, StatModel.RAW_OUTPUT); 
//4. Here, predicted_final_ are matrices which gives you the final value as in Label(0,1,2... etc) for the input data (edge profile in your case) 

Теперь, надеюсь, у вас есть идея, как работает SVM. Вам в основном необходимо выполнить следующие действия:

Шаг 1: Определите ярлыки - В вашем случае Жесты из профиля края.

Шаг 2: Присвоение значений меток - Например, если вы пытаетесь классифицировать тактильные жесты - Open Hand = 1, Закрытая рука/Кулак = 2, Недурно = 3 и так далее.

Шаг 3: Подготовьте данные обучения (профили кромок) и ярлыки (1,2,3) и т. Д. В соответствии с вышеописанным процессом.

Этап 4: Подготовьте данные для прогнозирования с использованием преобразования, рассчитанного с использованием SVM.

Очень важен для SVM на OpenCV - Нормализация данных, убедитесь, что вы все матрицы из одного типа - CvType

Надеется, что это помогает. Не стесняйтесь задавать вопросы, если у вас есть какие-либо сомнения и публикуйте то, что вы пробовали. Я могу решить проблему для вас, если вы пришлете мне несколько изображений, но тогда вы ничего не узнаете? ;)

+0

B_channel_svm.train (edge1, Ml.ROW_SAMPLE, reponses.col (1)); в приведенном выше коде. Я проверил, что у меня одинаковое количество строк ребер1 и ответов. Но столкнулась с ошибкой OpenCV Error: Assertion failed (_layout == ROW_SAMPLE || _layout == COL_SAMPLE) в void cv :: ml :: TrainDataImpl :: setData. в некоторой строке data.cpp 271 –

+0

вы можете помочь мне объяснить, как вы создали training_data, label_data? –

+0

Можете ли вы обновить свой код в вопросе? –

Смежные вопросы