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

2024-10-01 09:35:27 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我已经尝试过Pickledump()方法,但它不起作用。它显示一个错误:TypeError:can't pickle EM objects。此外,我还尝试了其他简单的方法,如文件的打开和写入(以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文件保存到一个文件中,以便以后用于测试。在


Tags: 文件方法importimgnptraincolcv2
2条回答
mean = gmm_clf.getMat('means')
cov = gmm_clf.getMatVector('covs')

那就用腌菜保存吧。在

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

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

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

  2. 用提取平均值和cov预测数据。

(我选2个,这很容易。)

我知道这是老办法,但我刚碰到这个,我很确定这个方法比用泡菜好。{or}例如,使用^或^作为空格:

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"]

相关问题 更多 >