CNN-LSTM模型预测视频时报ValueError: not enough values to unpack错误
问题排查与解决方案
1. 报错直接原因
报错出现在boxes, scores, labels = model.predict_on_batch(np.expand_dims(frame_set, axis=0))行,你的CNN-LSTM是分类模型,从公开的结构看最后一层dense_2输出维度为(None,5),单次预测仅返回1个形状为(1,5)的张量,存储5个类别的预测概率,不存在目标检测模型才会输出的框坐标、置信度、标签三类返回值,硬拆为3个变量接收自然会触发“期望3个值,仅拿到1个”的错误。
2. 其余需要修正的逻辑问题
- 输入构造错误:你当前仅从视频读取1帧,反而用
np.arange生成随机数值构造输入张量,完全没有用到真实视频数据。你需要循环读取连续10帧,预处理后堆叠为(10,384,384,3)格式,才能匹配模型输入要求。 - 输入尺寸不匹配:模型要求单帧输入尺寸为384*384,你用百分比缩放的逻辑无法保证输出尺寸符合要求,需要把resize的目标尺寸固定为(384,384)。
- 冗余逻辑错误:代码后续的画框、框坐标计算逻辑都是目标检测场景的代码,唇读分类场景仅需要拿到预测概率向量,取argmax得到类别编号对应标签即可,不需要处理boxes、scores相关逻辑。
核心逻辑修正示例
import numpy as np import cv2 from tensorflow import keras # 替换为你自己的5个分类标签 classes = ["类别1","类别2","类别3","类别4","类别5"] model_path = 'CCTV_10Frame_SGD_Model_1e4_b16_l21e2_Terbaru.h5' model = keras.models.load_model(model_path, compile = True) vid = cv2.VideoCapture('Data16_116.mp4') frame_buffer = [] # 存储连续10帧做滑窗预测 input_size = 384 # 预处理逻辑要和训练时完全对齐,比如是否归一化、是否减均值等 train_normalize_scale = 255.0 while vid.isOpened(): ret, frame = vid.read() if not ret: break # 预处理当前帧 frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) frame_resized = cv2.resize(frame_rgb, (input_size, input_size), interpolation=cv2.INTER_AREA) frame_buffer.append(frame_resized) # 凑够10帧再执行预测 if len(frame_buffer) == 10: # 转换为模型要求的输入格式 model_input = np.array(frame_buffer, dtype=np.float32) / train_normalize_scale model_input = np.expand_dims(model_input, axis=0) # 增加batch维度 # 仅用单个变量接收预测结果 pred_probs = model.predict_on_batch(model_input)[0] pred_label_idx = np.argmax(pred_probs) pred_score = pred_probs[pred_label_idx] pred_class = classes[pred_label_idx] # 绘制预测结果 cv2.putText(frame, f"Pred: {pred_class} Score: {pred_score:.3f}", (10, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,255,0), 2) # 移除最早的1帧,滑动窗口处理下一组 frame_buffer.pop(0) cv2.imshow('Result', frame) if cv2.waitKey(25) & 0xFF == ord('q'): break vid.release() cv2.destroyAllWindows()
内容的提问来源于stack exchange,提问作者JuniorPython
相关产品推荐
相关产品推荐

