PyTorchVideo 视频动作识别教程:使用 Torch Hub 进行推理
前言
在计算机视觉领域,视频理解是一个重要且具有挑战性的任务。PyTorchVideo 是一个专门为视频理解任务设计的深度学习库,提供了丰富的预训练模型和工具。本教程将介绍如何使用 PyTorchVideo 中的预训练模型进行视频动作识别。
环境准备
在开始之前,我们需要确保环境中安装了必要的依赖包:
- PyTorch 和 TorchVision:这是运行 PyTorchVideo 的基础
- PyTorchVideo:视频理解专用库
如果环境中缺少这些包,可以通过 pip 进行安装。需要注意的是,PyTorchVideo 对 PyTorch 版本有一定要求,建议使用兼容版本。
数据准备
类别标签映射
Kinetics-400 是一个常用的视频动作识别数据集,包含 400 种不同的动作类别。我们需要下载类别名称与 ID 的映射文件,以便将模型的输出转换为可读的动作名称。
with open("kinetics_classnames.json", "r") as f:
kinetics_classnames = json.load(f)
# 创建ID到类别名称的映射
kinetics_id_to_classname = {}
for k, v in kinetics_classnames.items():
kinetics_id_to_classname[v] = str(k).replace('"', "")
模型加载
PyTorchVideo 通过 Torch Hub 提供了多种预训练模型,包括:
- SlowFast:同时处理慢速和快速视频路径的模型
- X3D:高效的三维卷积网络
- ResNet:经典的2D/3D卷积网络
本教程以 SlowFast R50 模型为例:
# 选择设备(CPU或GPU)
device = "cpu" # 可改为"cuda"使用GPU
# 加载预训练模型
model_name = "slowfast_r50"
model = torch.hub.load("facebookresearch/pytorchvideo:main",
model=model_name,
pretrained=True)
# 设置为评估模式并移动到指定设备
model = model.to(device)
model = model.eval()
输入预处理
视频数据在输入模型前需要经过一系列预处理步骤,这些步骤对模型性能至关重要:
- 时间维度采样:从视频中均匀采样固定数量的帧
- 归一化:将像素值从[0,255]缩放到[0,1]并进行标准化
- 空间变换:调整视频尺寸并进行中心裁剪
- 路径打包(SlowFast特有):将帧分为慢速和快速两条路径
# SlowFast专用预处理
transform = ApplyTransformToKey(
key="video",
transform=Compose([
UniformTemporalSubsample(num_frames),
Lambda(lambda x: x/255.0),
NormalizeVideo(mean, std),
ShortSideScale(size=side_size),
CenterCropVideo(crop_size),
PackPathway()
]),
)
视频加载与处理
我们使用一个示例视频(射箭动作)来演示推理过程:
# 加载视频文件
video_path = "archery.mp4"
# 初始化视频加载器
video = EncodedVideo.from_path(video_path)
# 截取指定时间段的视频片段
video_data = video.get_clip(start_sec=start_sec, end_sec=end_sec)
# 应用预处理变换
video_data = transform(video_data)
# 准备模型输入
inputs = video_data["video"]
inputs = [i.to(device)[None, ...] for i in inputs]
模型推理与结果解析
完成预处理后,我们可以将视频输入模型进行推理:
# 模型推理
preds = model(inputs)
# 对输出进行softmax处理
post_act = torch.nn.Softmax(dim=1)
preds = post_act(preds)
# 获取top-5预测结果
pred_classes = preds.topk(k=5).indices
# 将类别ID转换为名称
pred_class_names = [kinetics_id_to_classname[int(i)] for i in pred_classes[0]]
print("预测结果: %s" % ", ".join(pred_class_names))
技术要点解析
-
模型选择:SlowFast模型通过双路径架构同时捕捉视频中的慢动作和快动作特征,适合处理复杂的时间动态。
-
时间采样:视频通常包含大量冗余帧,均匀时间采样可以减少计算量同时保留关键信息。
-
多路径处理:SlowFast的PackPathway将输入分为两条路径:
- 慢路径:低帧率,高空间分辨率
- 快路径:高帧率,低空间分辨率
-
结果解释:模型输出是400个类别的概率分布,我们通常取top-k结果进行分析。
应用场景
这种视频动作识别技术可应用于:
- 智能视频监控
- 体育动作分析
- 人机交互
- 视频内容理解与检索
总结
本教程详细介绍了使用PyTorchVideo进行视频动作识别的完整流程,从环境准备、模型加载到最终的推理过程。通过这个例子,我们可以看到PyTorchVideo提供了简洁高效的接口来处理视频理解任务,使得开发者能够快速构建视频分析应用。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考