如何使用Python保存/编写OpenCV EM / GMM模型?

时间:2014-09-18 13:53:00

标签: python opencv expectation-maximization

我想知道是否存在任何可用于保存OpenCV中定义的训练EM(Expectation Maximization或高斯混合模型)模型的方法/函数?

我已经尝试了Pickle dump()方法,但它无效。它显示错误: 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 保存到文件中,以便稍后用于测试目的。

2 个答案:

答案 0 :(得分:1)

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

然后保存卑鄙,与泡菜相关。

但是,根据doc的最后一部分,您不能gmm_clf.setMat('means')

所以,你现在有两个选择:

  1. 修改opencv源代码,使得均值和协方差不是只读的,然后再次编译cv2.so。

  2. 使用提取均值和cov。

  3. 预测您的数据

    (我会选择2,这很容易。)

答案 1 :(得分:1)

我知道这是旧的,但我刚刚遇到过这个问题,我很确定这种方法比使用pickle更好。使用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"]