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

