视频分类_grad_cam

本文详细记录了使用3D ResNet进行视频理解时遇到的问题及解决方案,包括处理UCF-101数据集链接失效、Python版本不兼容、HMDB51数据集解压错误、视频文件格式与图片目录不匹配以及多线程运行限制等问题。同时,还探讨了如何生成Grad-CAM热力图,并调整网络输出以获得更精确的特征图。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码(resnet3D):
https://github.com/kenshohara/3D-ResNets-PyTorch

坑:
1 ucf-101 的链接失效,后面找了个新的:
https://www.crcv.ucf.edu/research/data-sets/ucf101/

2 开始我的python是3.6, 结果执行生成json文件的脚本时,提示没有capture_output这个key: 出错代码如下,subprocess是python的一个包,后面查了下,说python3.7才加入了这个属性
p = subprocess.run(ffprobe_cmd, capture_output=True)

3 使用数据集hmdb51,有些rar包在ubuntu上解压失败,这种情况以前也有,还不知道怎么处理

4 然后那个视频文件我是avi结尾的,他去找jpg文件时也按照这个avi文件为目录去找。结果我要把去掉这个avi字段,然后把图片放在视频文件同目录里面

5 跑了一个epoch后,提示说啥只能建立一个child procress.似乎搞的什么多线程,pycharm 跑有问题,只能在命令行下面跑

基于如下代码(somethinsomething)生成grad-cam热力图
1 主文件
https://github.com/TwentyBN/smth-smth-v2-baseline-with-models
2 热力图生成主要代码
https://github.com/TwentyBN/smth-smth-v2-baseline-with-models/blob/master/notebooks/get_saliency_maps_CAM.ipynb

主要遇到一个问题是,resnet3D的layer4的输出是512,1,4,4。而输入的切片个数是16. 这样将特征图反向叠加到原图时只用了1个特征图,这样所有的切片的热力图都一样的。将网络修改输出为512,8,4,4之后,16个切片就有8个不同的热力图,但有前后两张图是共用的一张特征图。

### 实现和解释计算机视觉中的3D Grad-CAM #### 背景介绍 Class Activation Mapping (CAM),Grad-CAM及其改进版本Grad-CAM++是在卷积神经网络(CNNs)中用于可视化特定类别的特征图的方法[^2]。这些方法帮助理解模型决策过程,通过高亮输入图像区域来显示哪些部分对于预测类别最重要。 当涉及到三维数据时,如医学影像或者视频序列分析,则需要扩展到3D空间。因此出现了针对这类应用而设计的3D Grad-CAM算法。 #### 3D Grad-CAM的工作原理 为了适应体积数据集的特点,在原有二维基础上增加了第三个维度z轴方向上的梯度加权操作。具体来说: - 对于给定的一个3D CNN最后一层feature map \( F_k \in R^{W\times H\times D} \),其中\( W,H,D \)分别代表宽度、高度以及深度尺寸; - 计算目标分类得分相对于该层各位置响应值的偏导数得到全局平均池化后的权重向量\( a_k^n=\frac{\partial y^n}{\partial A_k}\); - 将上述计算所得的一维数组重新映射回原始大小的空间分布形式并取绝对值得到最终热力图表示: \[ L_{camm}^n=ReLU(\sum_k a_k^n *F_k)\] 此表达式同样适用于处理具有时间连续性的四维张量结构(即包含T帧的时间序列)[^1]. 以下是Python代码片段展示如何基于Pytorch框架实现简单的3D Grad-CAM功能: ```python import torch from torchvision import models, transforms import numpy as np class GuidedBackprop(): """ Implementation of Guided Back Propagation. """ def __init__(self, model): self.model = model self.image_reconstruction = None self.activation_maps = [] self.gradient_maps = [] # Register hook to get gradients from last conv layer target_layer = list(model.children())[-2][-1] target_layer.register_forward_hook(self.forward_hook) target_layer.register_backward_hook(self.backward_hook) def forward_hook(module, input, output): activation = output.detach().cpu() global feature_map feature_map = activation.numpy()[0] def backward_hook(module, grad_input, grad_output): global guided_gradients guided_gradients = grad_output[0].detach().cpu().numpy()[0] def generate_3d_grad_cam(image_tensor, class_index=None): gb_model = GuidedBackprop(models.vgg16(pretrained=True)) prediction = gb_model(image_tensor.unsqueeze_(dim=0).cuda()) _, predicted_class = torch.max(prediction.data.cpu(), 1) one_hot_vector = torch.zeros((1, prediction.size()[-1])) if not isinstance(class_index,int): class_index=predicted_class.item() one_hot_vector[:, class_index]=1 gb_model.zero_grad() prediction.backward(one_hot_vector.cuda()) weights = np.mean(guided_gradients,axis=(1,2)) # Compute per-channel mean gradient value over spatial dimensions cam=np.zeros(feature_map.shape[1:],dtype=np.float32) for i,w in enumerate(weights): cam+=w*feature_map[i,:,:] cam = np.maximum(cam, 0) # Apply ReLU operation on CAM result cam -= np.min(cam) cam /= np.max(cam)-np.min(cam)+1e-8 return cam,prediction,class_index ``` 请注意这段代码主要展示了指导反向传播(Guided Backpropagation)与传统2D Grad-CAM相结合的方式,并未完全按照3DCNN架构编写;实际项目开发过程中还需要根据具体的网络结构调整相应参数设置。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值