如何调整视频尺寸适配Keras Conv2D训练模型的predict接口输入要求
核心问题说明
直接调用trained_model.predict('7.avi')无法完成推理,原因是Keras的predict接口仅接受匹配模型输入格式的Numpy张量作为输入,不内置视频路径解码逻辑,必须手动完成视频解码、格式对齐、维度匹配的全流程预处理。
模型输入维度对齐规则
根据给出的模型定义代码,结合Keras模型的张量结构要求,预处理需要匹配以下维度规则:
- 代码中Conv2D层定义的
input_shape=(16, 120, 120, 3),对应非批量维度下的输入结构为:16个连续视频帧、单帧空间尺寸120*120像素、3色彩通道 - 送入predict的最终张量需满足5维结构
(批量样本数, 16, 120, 120, 3),数据类型为float32,像素值的缩放逻辑必须和训练阶段完全一致 - 最准确的维度确认方式:加载模型后直接打印
trained_model.input_shape,以模型实际加载得到的输入维度为准。若代码中误将批量维度写入input_shape(例如把batch_size=16混入输入定义),真实的单样本输入可能为(120,120,3)的图像格式,需根据实际值调整预处理逻辑。
视频预处理完整流程
- 视频解码:使用OpenCV、imageio等工具逐帧读取
7.avi的全部帧,按播放顺序存储为帧序列 - 单帧格式调整:
- 每帧统一缩放到120*120的目标分辨率
- 将帧的通道顺序从OpenCV默认的BGR格式转换为模型训练时使用的RGB格式,避免色彩错位导致推理精度下降
- 序列切分:按照模型要求的帧长度(如16帧)切分帧序列,每16个连续帧组成一个独立样本;若视频总帧数不足要求长度,按训练阶段的补帧逻辑(如重复最后一帧)补齐对应长度
- 张量维度调整:将处理好的帧序列堆叠为符合输入维度的数组,例如单段16帧样本需增加批量维度,最终形成
(1, 16, 120, 120, 3)的张量结构 - 像素值归一化:对齐训练阶段的像素缩放逻辑(如将0-255范围的像素值除以255缩放到0-1区间),不要直接传入原始整型像素值
参考预处理代码
import cv2 import numpy as np from tensorflow.keras.models import load_model # 加载训练完成的模型 trained_model = load_model("cyclist.h5") # 打印实际输入维度,确认结构 print("模型实际输入维度:", trained_model.input_shape) def preprocess_video_input(video_path, required_frame_len=16, frame_size=(120,120)): video_capture = cv2.VideoCapture(video_path) collected_frames = [] while video_capture.isOpened(): read_success, frame = video_capture.read() if not read_success: break # 转换通道顺序为RGB frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) # 调整帧尺寸 frame_resized = cv2.resize(frame_rgb, frame_size) collected_frames.append(frame_resized) video_capture.release() # 不足要求帧数时,用最后一帧补齐 while len(collected_frames) < required_frame_len: collected_frames.append(collected_frames[-1]) # 取对应长度的帧序列组成样本 selected_frames = np.array(collected_frames[:required_frame_len], dtype=np.float32) # 对齐训练时的归一化逻辑 normalized_frames = selected_frames / 255.0 # 增加批量维度,匹配模型输入要求 input_tensor = np.expand_dims(normalized_frames, axis=0) return input_tensor # 生成符合要求的输入张量并推理 model_input = preprocess_video_input("7.avi") inference_result = trained_model.predict(model_input)
常见踩坑提醒
- 不要直接传入视频路径字符串给predict:接口无内置视频解码能力,必须将视频解码为结构化数组
- 维度顺序不要错配:若训练时输入维度为(16,120,120,3),禁止将维度排列为(120,120,3,16)这类结构
- 通道顺序错位:OpenCV读取的帧默认是BGR格式,若训练时使用RGB格式的帧数据,必须做通道转换,否则推理结果会出现明显偏差
- 归一化逻辑不一致:哪怕维度完全匹配,像素值的缩放比例和训练阶段不一致,也会导致输出结果异常
内容的提问来源于stack exchange,提问作者Joseph Adam
相关产品推荐
相关产品推荐

