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

如何通过TorchVision提取视频特征而非分类预测结果?

用SlowFast_R50提取视频特征的调整方法(新手友好)

问题根源

你现在得到的低维度张量是Kinetics400的分类输出,因为默认的SlowFast_R50模型自带了分类头(最后一层用来输出400类的预测结果)。要拿到视频特征,得把这个分类头去掉,取模型前面层级输出的高维特征。

具体调整步骤

1. 确保依赖安装

先装好用到的库,打开终端跑下面的命令:

pip install torch pytorchvideo torchvision

2. 加载不带分类头的模型

有两种简单方法可以去掉分类头:

方法一:加载时直接指定不带分类头
import torch
import pytorchvideo.models as models

# 加载预训练的slowfast_r50,num_classes设为0就会自动去掉分类头
model = models.slowfast.slowfast_r50(pretrained=True, num_classes=0)
方法二:手动替换分类头

如果已经加载了默认模型,直接把最后一层换成恒等层(输出等于输入,相当于跳过分类头):

import torch
import pytorchvideo.models as models

# 先加载默认带分类头的模型
model = models.slowfast.slowfast_r50(pretrained=True)
# 把分类头替换成恒等层,SlowFast的分类头在model.head属性里
model.head = torch.nn.Identity()

3. 处理视频输入(符合模型要求)

SlowFast模型需要两个输入分支:慢路径(采样少帧)和快路径(采样多帧),输入张量的格式是[batch_size, 通道数, 帧数, 高度, 宽度],默认要求:

  • 慢路径:3通道,8帧,224×224分辨率
  • 快路径:3通道,32帧,224×224分辨率

这里给个模拟输入的例子(实际使用时你需要把上传的视频转成这种格式):

# 模拟1个视频的输入(batch_size=1)
slow_frame_tensor = torch.randn(1, 3, 8, 224, 224)  # 慢路径张量
fast_frame_tensor = torch.randn(1, 3, 32, 224, 224)  # 快路径张量
# 把两个分支打包成元组作为模型输入
model_input = (slow_frame_tensor, fast_frame_tensor)

4. 提取视频特征

把模型设为评估模式(避免训练时的dropout等操作影响特征),然后计算特征:

# 切换到评估模式
model.eval()
# 关闭梯度计算,节省内存和计算资源
with torch.no_grad():
    video_features = model(model_input)

# 查看特征维度,应该是(1, 2048),2048就是每个视频的向量嵌入维度
print(video_features.shape)

新手额外提示

  • 视频预处理:实际处理上传的视频时,需要把视频拆成帧,缩放到224×224,然后按照SlowFast的采样规则取帧(比如慢路径每4帧取1帧,快路径每1帧取1帧,凑够8和32帧)。
  • 特征保存:可以把特征转成numpy数组或者直接存成pt文件,方便后续使用:
    # 转成numpy数组
    features_np = video_features.numpy()
    # 保存为pt文件
    torch.save(video_features, "video_feature.pt")
    
  • 如果你想用TorchVision的模型:TorchVision大多是图片模型,要处理视频的话得用3D卷积模型(比如torchvision.models.video.r3d_18),同样需要去掉分类头才能拿到特征。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 17:23:23