python - 如何使用 Python 保存/写入 OpenCV EM/GMM 模型?

标签 python opencv expectation-maximization

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

我已经试过了Pickle dump() 方法,但它不起作用。它显示错误: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 保存到一个文件中,以便以后可以将其用于测试目的。

最佳答案

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

然后用 pickle 保存 mean、cov。

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

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

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

  2. 使用提取的均值和 cov 预测您的数据。

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

关于python - 如何使用 Python 保存/写入 OpenCV EM/GMM 模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25914614/

相关文章:

algorithm - 立方体上的等距点

Python Pandas 滚动窗口应用多个 lambda 函数

python - Django:如何创建表,然后通过它们更新数据库

python-3.x - Dlib get_frontal_face_detector不响应

opencv - Android NDK unsatisfiedLinkError(仅适用于<4.3的android)

r - 如何向量化多参数下的似然计算?

matlab - 期望最大化问题——如何在数据中找到最佳数量的高斯分布

python - 做ILP时的多种解决方案

python - 使用 Python 脚本控制虚拟机

java - 运行 JavaCV 应用程序时出现 IllegalStateException