如何基于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
相关产品推荐
相关产品推荐

