首页 > 解决方案 > 经过训练的 SVM 在测试集上的准确率接近 100%,但是当使用“cv2.VideoCapture(0)”中的帧时,它每次都会给出肯定的结果

问题描述

我已经使用 Python 中的定向梯度直方图训练了一个用于面部检测的 SVM。我在一个由网络摄像头中的图片组成的数据集上对其进行了训练。这是我导入和规范化图像的方法:

for theImage in arr:
    face_img = cv2.imread(url + theImage)
    bicubic = cv2.resize(np.float32(face_img), dsize=(64,32),   interpolation=cv2.INTER_CUBIC)
    data = asarray(bicubic)
    data = data.astype(np.uint8)
    posImages.append(data)

我这样设置 SVM:

svm = cv2.ml.SVM_create()
svm.setType(cv2.ml.SVM_C_SVC)
svm.setKernel(cv2.ml.SVM_RBF)

即使训练集只占整个图片集的 20%,它仍然可以达到 98.8% 的准确率,在正常的训练/测试分割上,它可以达到 100% 的准确率。

我的问题是,当我尝试使用我的网络摄像头使用“cv2.VideoCapture(0)”对其进行测试时,无论输入如何,它每次都会给出 1(有一张脸)的结果。这是我如何实现的:

我已经使用 Python 中的定向梯度直方图训练了一个用于面部检测的 SVM。我在一个由网络摄像头中的图片组成的数据集上对其进行了训练。这是我导入和规范化图像的方法:

for theImage in arr:
    face_img = cv2.imread(url + theImage)
    bicubic = cv2.resize(np.float32(face_img), dsize=(64,32),   interpolation=cv2.INTER_CUBIC)
    data = asarray(bicubic)
    data = data.astype(np.uint8)
    posImages.append(data)

我这样设置 SVM:

svm = cv2.ml.SVM_create()
svm.setType(cv2.ml.SVM_C_SVC)
svm.setKernel(cv2.ml.SVM_RBF)

即使训练集只占整个图片集的 20%,它仍然可以达到 98.8% 的准确率,在正常的训练/测试分割上,它可以达到 100% 的准确率。

我的问题是,当我尝试使用我的网络摄像头使用“cv2.VideoCapture(0)”对其进行测试时,无论输入如何,它每次都会给出 1(有一张脸)的结果。这是我如何实现的:

svm = cv2.ml.SVM_load('model.xml')
print("svm loaded")
vc = cv2.VideoCapture(0)
if vc.isOpened():
    while True:
        ret, img = vc.read()
        bicubic = cv2.resize(np.float32(img), dsize=dim, interpolation=cv2.INTER_CUBIC)
        data = asarray(bicubic)
        data = data.astype(np.uint8)
        cv2.imshow('test', data)
        hogfeature = [hog.compute(data)]
        y_val = svm.predict(np.array(hogfeature))
        print(y_val)
        if y_val[1][0] == 1:
            print("FACE")
        else:
            print("NOT FACE")
        cv2.waitKey(0)

    vc.release()
    cv2.destroyAllWindows()

我猜这是因为出于某种原因 cv2.imread() 的输出与 vc.read() 不同,如果这是问题所在,我该如何将网络摄像头图像转换为该格式。

我相信准确度结果是有效的,因为当我创建一个新数据集并测试它提供类似准确度的模型时。

任何帮助表示赞赏。

标签: pythonopencv

解决方案


推荐阅读