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

如何基于MoViNet模型获取自定义MP4视频的预测结果(无需评估)

解决MoViNet仅预测自定义视频动作类别的方法

核心思路

直接跳过依赖标注的评估流程,只保留模型加载→视频预处理→预测推理三个核心环节,全程不需要标注文件参与。

具体实现步骤

1. 准备预训练模型与类别标签

  • 加载MoViNet预训练模型(以movinet_a0为例),设置为评估模式(model.eval()),避免训练相关的冗余操作。
  • 准备动作类别标签映射:对应预训练模型使用的Kinetics数据集类别,你可以从公开的Kinetics标签列表中复制内容,保存为labels.txt文件,每行记录一个类别。

2. 自定义视频预处理

编写函数处理MP4视频,将其转换成模型要求的输入格式:

  • 用OpenCV读取视频帧,调整分辨率为模型要求的尺寸(比如movinet_a0对应172×172)。
  • 将OpenCV默认的BGR格式转为RGB,再做归一化处理(遵循模型训练时的均值[0.45, 0.45, 0.45]和标准差[0.225, 0.225, 0.225])。
  • 调整张量维度,把[帧数, 高度, 宽度, 通道数]转为[1, 帧数, 通道数, 高度, 宽度](添加batch维度)。

3. 执行预测并输出结果

  • 关闭梯度计算(torch.no_grad()),减少内存消耗。
  • 将预处理后的视频输入模型,得到输出logits,通过softmax转为概率值。
  • 取概率最高的前N个类别,对应标签映射输出最终结果。

代码示例

import torch
import cv2
import numpy as np

# 1. 加载模型与标签
model = torch.hub.load('Atze00/MoViNet-pytorch', 'movinet_a0', pretrained=True)
model.eval()

# 加载类别标签(labels.txt每行对应一个Kinetics-400类别)
with open('labels.txt', 'r') as f:
    labels = [line.strip() for line in f.readlines()]

# 2. 视频预处理函数
def preprocess_video(video_path, target_size=(172, 172), num_frames=16):
    cap = cv2.VideoCapture(video_path)
    frames = []
    while len(frames) < num_frames:
        ret, frame = cap.read()
        if not ret:
            break
        # 调整尺寸并转换色彩通道
        frame = cv2.resize(frame, target_size)
        frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
        frames.append(frame)
    cap.release()
    # 补全不足的帧(视频过短时重复最后一帧)
    while len(frames) < num_frames:
        frames.append(frames[-1])
    # 归一化并转为模型所需张量格式
    frames = np.array(frames) / 255.0
    frames = (frames - np.array([0.45, 0.45, 0.45])) / np.array([0.225, 0.225, 0.225])
    frames = torch.tensor(frames, dtype=torch.float32).permute(0, 3, 1, 2)  # [T, C, H, W]
    frames = frames.unsqueeze(0)  # 添加batch维度 [1, T, C, H, W]
    return frames

# 3. 预测自定义视频
video_path = "your_custom_video.mp4"
input_tensor = preprocess_video(video_path)

with torch.no_grad():
    logits = model(input_tensor)
    probabilities = torch.nn.functional.softmax(logits, dim=1)
    # 获取top3预测结果
    top3_prob, top3_idx = torch.topk(probabilities, 3)

# 输出结果
print("Top 3 预测类别:")
for i in range(3):
    print(f"{i+1}. {labels[top3_idx[0][i]]} (概率: {top3_prob[0][i]:.4f})")

关键注意点

  • 预处理的尺寸、归一化参数必须与预训练模型一致,否则会导致预测结果偏差。
  • 如果视频帧数量不足模型要求的帧数(比如movinet_a0默认16帧),可以通过重复最后一帧补全。
  • 全程不需要加载任何标注数据集的逻辑,完全跳过评估环节的相关代码。

内容的提问来源于stack exchange,提问作者Georgia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 23:27:28