【问题标题】:How to save openCV classifier?如何保存openCV分类器?
【发布时间】:2019-01-21 05:58:00
【问题描述】:

我想保存一个已经在多张图像上训练过的分类器,以避免每次运行程序时重新训练它所花费的时间。对于 sklearn 的分类器,我可以使用 pickle.load 简单地腌制它们,但是当我尝试这样做时,会出现以下错误:

TypeError: can't pickle cv2.face_LBPHFaceRecognizer objects

这是分类器本身:

face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_alt2.xml')
clf = cv2.face.LBPHFaceRecognizer_create()

img = cv2.imread(path, cv2.IMREAD_GRAYSCALE)
# detecting face using haarcasade
face = face_cascade.detectMultiScale(img, minNeighbors = 3)
# detecting region of interest and appending it to a separate matrix
for x, y, w, h in face:
     roi = img[y:y+h, x:x+w]
     x_train.append(roi)
     y_train.append(label)
 clf.train(x_train, y_train)

有没有办法保存这样的分类器?

【问题讨论】:

    标签: python-3.x opencv pickle


    【解决方案1】:

    您可以将此类分类器保存为.yml 文件。

    例如:

    clf.save('trainingData.yml')
    

    您可以使用以下方法加载相同的内容:

    clf.load('trainingData.yml')
    

    【讨论】:

    • 保存确实有效,但是在执行 clf.load() 时出现错误提示:对象没有属性“加载”
    • 显然,在较新版本的 openCV 中,load() 已被 read() 替换。
    • 您使用的是什么版本的 OpenCV?我正在使用 3.4.1 和 load() 为我工作
    • 奇怪,我的也是 3.4.1,但我用谷歌搜索了 load() 遇到的问题,我遇到了这个stackoverflow.com/questions/46873728/…。奇怪的是,当这篇文章说它也已被 write() 取代时, save() 确实有效
    猜你喜欢
    • 2018-07-01
    • 2014-08-17
    • 2016-12-06
    • 1970-01-01
    • 1970-01-01
    • 2018-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多