Implementación Python OpenCV SVM

Así que tengo una matriz con mis imágenes de muestra (todas convertidas en vectores) que se ejecutó a través de PCA / LDA, y un vector que denota la clase a la que pertenece cada imagen. Ahora quiero usar la clase OpenCV SVM para entrenar a mi SVM (estoy usando Python, OpenCV 2.3.1). Pero tengo un problema con la definición de los parámetros:

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

Estoy atascado en cómo definir el tipo de SVM (lineal, etc.) y otras cosas. En C ++ lo define al indicar, por ejemplo: svm_type = CvSVM :: C_SVC … Python no tiene eso. C ++ también tiene una clase especial para almacenar estos parámetros -> CvSVMParams. ¿Puede alguien darme un ejemplo de esto en Python? Como definir el tipo de SVM, gamma, etc.

Los documentos 2.3.1 lo dice así:

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

¿Qué son varIdx y sampleIdx, y cómo definir los parámetros?

Para usar los algoritmos de aprendizaje automático de OpenCV, debe escribir algunas clases de envoltorio:

1. Primera clase para padres

 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. Finalmente la envoltura 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. Ejemplo de uso:

 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) 

Configurando parametros

La configuración de los parámetros es simple: solo escriba un diccionario que contenga los parámetros como claves. Debe consultar la documentación original para ver todos los parámetros posibles y los valores permitidos: http://opencv.itseez.com/modules/ml/doc/support_vector_machines.html#cvsvmparams

Sí, los valores posibles para svm_type y kernel_type están en C ++, pero hay una manera fácil de convertir esas constantes en representación de Python, por ejemplo, CvSVM :: C_SVC se escribe como cv2.SVM_C_SVC en Python.

Prelude Para obtener más envoltorios para algoritmos de aprendizaje automático, consulte el ejemplo de letter-recog.py en su ejemplo de apertura en disco o abra la URL del repository de OpenCV: https://github.com/Itseez/opencv/tree/master/samples/python2

Adaptado de la versión de timgluz, pero usa “train_auto” en lugar de “train”. cv2 encontrará los parámetros “C”, “gamma”, … para nosotros.

 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)