2014-09-18 2 views
0

Хотелось бы узнать, существует ли какой-либо метод/функция, которая может использоваться для сохранения обучаемой модели EM (Expectation Maximization или модели гауссовой смеси), определенной в OpenCV с помощью Python?Как сохранить/написать OpenCV EM/GMM модель с помощью Python?

Я уже пробовал Pickledump() метод, но его не работает. Он показывает ошибку: TypeError: не может разжевывать объекты EM. Кроме того, я пробовал и другие простые методы, такие как открытие и запись файлов (в формате XML). Однако он также не работает.

Вот часть моего кода Python:

import cv2 
import numpy as np 
from sklearn import mixture 

im = cv2.imread('001.png', False) 
PCenter = [2,2] 
pyrDown_img = im.copy() 
X_train = [] 
gmm_clf = cv2.EM(12, cv2.EM_COV_MAT_DIAGONAL) # Initialize classifier object 

for row in range(PCenter[0], pyrDown_img.shape[0] - PCenter[0]): 
    for col in range(PCenter[1], pyrDown_img.shape[1] - PCenter[1]): 

     patch = pyrDown_img[row-PCenter[0]:row+PCenter[0]+1, col-PCenter[1]:col+PCenter[1]+1] 
     patch = np.asarray(patch) # compute patch as a feature vector 
     X_train.append(patch.reshape(-1)) 

X_train = np.asarray(X_train) 
gmm_clf.train(X_train) # train GMM classifier 

Я хочу сохранить эту gmm_clf в файл, так что я могу использовать его в дальнейшем для целей тестирования.

ответ

1
mean = gmm_clf.getMat('means') 
cov = gmm_clf.getMatVector('covs') 

then save mean, cov with pickle.

Однако вы не можете gmm_clf.setMat('means') в соответствии с последним разделом в doc.

Итак, у вас есть два выбора теперь:

  1. модифицировать исходный код OpenCV, так что среднее значение и ковариация не только для чтения, а затем компилировать cv2.so снова.

  2. Прогнозируйте ваши данные с помощью экстента и cov.

(я выберу 2, который очень легко.)

+1

Спасибо большое. Да, похоже, что EM в OpenCV для Python не очень четко определен. Я использовал библиотеку sklearn, которая обеспечивает реализацию модели GMM и работает отлично. Там вы можете сохранить модель с помощью Pickle и повторно использовать ее в любое время позже. Что касается выбора, они оба имеют смысл. Но у меня мало времени на них расследование. – Sanchit

1

Я знаю, что это старое, но я только что через это, и я уверен, что этот метод лучше, чем при использовании рассола. Используя либо numpy.savez или когда пространство является проблемой numpy.savez_compressed, например:

import cv2 
import numpy as np 

# say em is your trained cv2.EM() 
means = np.float32(em.getMat("means")) 
covs = np.float32(em.getMatVector("covs")) 
weights = np.float32(em.getMat("weights")) 

filepath = "gmm_coefficients.npz" 
np.savez(filepath, means=means, covs=covs, weights=weights) 

# then to load the file 
npzfile = np.load(filepath) 
means = npzfile["means"] 
covs = npzfile["covs"] 
weights = npzfile["weights"] 
Смежные вопросы