石头剪刀布手势识别模型预测出现ValueError该如何解决
报错根因
该报错由输入张量的通道数和模型要求的输入通道数不匹配导致:
- 你训练的
RockPaperScissor_model.h5要求输入是3通道的RGB彩色图像(最后一维维度为3) - 你当前推理代码中将采集的帧转成了单通道灰度图处理,最终送入模型的张量维度为
(None, 48, 48, 1),和模型要求的输入维度不符。
此外你还存在逻辑错误:你调用的是haarcascade_frontalface_default.xml人脸检测分类器,无法识别手势区域,就算修复通道问题也无法正常完成手势识别。
修复步骤
- 替换检测用的级联分类器为支持手势检测的版本,或者暂时去掉检测逻辑直接处理采集帧
- 调整输入图像处理逻辑,不要转灰度图,直接用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
相关产品推荐
相关产品推荐

