Реализация Python OpenCV SVM

Итак, у меня есть матрица с моими образцами (все превращенные в векторы), которые запускались через PCA/LDA, и вектор, который обозначает класс, к которому принадлежат все изображения. Теперь я хочу использовать класс SVM OpenCV для обучения моего SVM (я использую Python, OpenCV 2.3.1). Но у меня проблема с определением параметров:

test = cv2.SVM()
test.train(trainData, responses, ????)

Я зациклился на том, как определить тип SVM (линейный и т.д.) и другие вещи. В С++ вы определяете его, указав, например: svm_type = CvSVM:: C_SVC... У Python этого нет. С++ также имеет специальный класс для хранения этих параметров → CvSVMParams. Может ли кто-нибудь дать мне пример этого в Python? Как определение типа SVM, гамма и т.д.

В документах 2.3.1 сказано следующее:

Python: cv2.SVM.train(trainData, responses[, varIdx[, sampleIdx[, params]]]) → retval

Что такое varIdx и sampleIdx, и как определить параметры?

Ответ 1

Чтобы использовать алгоритмы обучения OpenCV, вам нужно написать некоторые классы-оболочки:

1. Первый родительский класс

class StatModel(object):
    '''parent class - starting point to add abstraction'''    
    def load(self, fn):
        self.model.load(fn)
    def save(self, fn):
        self.model.save(fn)

2. Наконец, оболочка SvM:

class SVM(StatModel):
    '''wrapper for OpenCV SimpleVectorMachine algorithm'''
    def __init__(self):
        self.model = cv2.SVM()

    def train(self, samples, responses):
        #setting algorithm parameters
        params = dict( kernel_type = cv2.SVM_LINEAR, 
                       svm_type = cv2.SVM_C_SVC,
                       C = 1 )
        self.model.train(samples, responses, params = params)

    def predict(self, samples):
        return np.float32( [self.model.predict(s) for s in samples])

3. Пример использования:

import numpy as np
import cv2

samples = np.array(np.random.random((4,2)), dtype = np.float32)
y_train = np.array([1.,0.,0.,1.], dtype = np.float32)

clf = SVM()
clf.train(samples, y_train)
y_val = clf.predict(samples)

Параметры настройки

Параметры настройки просты - просто напишите словарь, содержащий параметры как ключи. Вы должны посмотреть оригинальную документацию, чтобы увидеть все возможные параметры и допустимые значения: http://opencv.itseez.com/modules/ml/doc/support_vector_machines.html#cvsvmparams

Да, возможные значения для svm_type и kernel_type находятся в С++, но есть простой способ преобразования этих констант в представление Python, например CvSVM:: C_SVC записывается как cv2.SVM_C_SVC в Python.

Прелюдия Чтобы получить больше оберток для алгоритмов машинного обучения, загляните в пример letter-recog.py в своих примерах opensv на диске или открытом URL-адресе репозитория OpenCV: https://github.com/Itseez/opencv/tree/master/samples/python2

Ответ 2

Адаптирован из версии timgluz, но вместо "train" использует "train_auto". cv2 найдет для нас параметры "C", "гамма",...

import cv2
import numpy as np

class Learn:
    def __init__(self, X, y):
        self.est = cv2.SVM()
        params = dict(kernel_type=cv2.SVM_LINEAR, svm_type=cv2.SVM_C_SVC)
        self.est.train_auto(X, y, None, None, params, 3) #kfold=3 (default: 10)

    def guess(self, X):
        return np.float32( [self.est.predict(s) for s in X])

X = np.array(np.random.random((6,2)), dtype = np.float32)
y = np.array([1.,0.,0.,1.,0.,1.], dtype = np.float32)
g = Learn(X,y).guess(X)