You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

石头剪刀布手势识别模型预测出现ValueError该如何解决

报错根因

该报错由输入张量的通道数和模型要求的输入通道数不匹配导致:

  • 你训练的RockPaperScissor_model.h5要求输入是3通道的RGB彩色图像(最后一维维度为3)
  • 你当前推理代码中将采集的帧转成了单通道灰度图处理,最终送入模型的张量维度为(None, 48, 48, 1),和模型要求的输入维度不符。

此外你还存在逻辑错误:你调用的是haarcascade_frontalface_default.xml人脸检测分类器,无法识别手势区域,就算修复通道问题也无法正常完成手势识别。


修复步骤

  1. 替换检测用的级联分类器为支持手势检测的版本,或者暂时去掉检测逻辑直接处理采集帧
  2. 调整输入图像处理逻辑,不要转灰度图,直接用3通道彩色图像做预处理,修复后的参考代码如下:
from time import sleep
from keras.preprocessing.image import img_to_array
from keras.preprocessing import image
import cv2
import numpy as np
from keras.models import load_model # 补充你原代码遗漏的load_model导入

classifier = load_model('RockPaperScissor_model.h5')
emotion_labels = ['Paper','Rock','Scissor']
cap = cv2.VideoCapture(0)

while True:
    _, frame = cap.read()
    # 直接把帧resize到模型要求的48*48尺寸
    roi = cv2.resize(frame, (48,48), interpolation=cv2.INTER_AREA)
    # 把OpenCV默认的BGR格式转成RGB格式,匹配模型训练时的输入格式
    roi = cv2.cvtColor(roi, cv2.COLOR_BGR2RGB)
    if np.sum([roi])!=0:
        roi = roi.astype('float')/255.0
        roi = img_to_array(roi)
        roi = np.expand_dims(roi, axis=0)

        prediction = classifier.predict(roi)[0]
        label=emotion_labels[prediction.argmax()]
        cv2.putText(frame,label, (10,40), cv2.FONT_HERSHEY_SIMPLEX,1,(0,255,0),2)
    
    cv2.imshow('Gesture Recognition', frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

如果你确认模型是用单通道灰度图训练的,需要修改模型输入层的参数,或者在训练时统一输入的通道数,避免推理时出现维度不匹配问题。


内容的提问来源于stack exchange,提问作者Dimuth De Zoysa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 11:21:02