Реализация Python OpenCV SVM - PullRequest
       5

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

10 голосов
/ 31 декабря 2011

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

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

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

Документация 2.3.1 гласит:

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

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

Ответы [ 2 ]

18 голосов
/ 01 января 2012

Чтобы использовать алгоритмы машинного обучения 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 указаны в C ++, но есть простой способ конвертировать эти константы в представление Python, напримерCvSVM :: C_SVC записывается в Python как cv2.SVM_C_SVC.

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

1 голос
/ 27 марта 2013

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

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)
...