You need to enable JavaScript to run this app. 如何调整视频尺寸适配Keras Conv2D训练模型的predict接口输入要求
优惠活动
大模型
产品
解决方案
定价
更多

如何调整视频尺寸适配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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.30 16:27:04