视频分类_grad_cam

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

代码(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 #### 一、Grad-CAM原理概述 Class Activation Mapping (CAM),以及其改进版本Grad-CAMGrad-CAM++, 是用于可视化卷积神经网络(CNN)决策过程的技术。这些方法通过生成热图来显示输入图像中哪些区域对于特定类别的预测最为重要[^2]。 #### 二、从2D到3D的扩展 为了适应三维数据集,比如医学影像或者视频分析任务,可以将原本应用于二维图片上的Grad-CAM算法拓展至三个维度空间上操作。这种转换主要体现在特征映射(feature maps)处理方式的变化——即由原来的H×W变为D×H×W形式(D表示depth深度方向)[^1]。 #### 三、具体实现步骤说明 针对3D CNN模型,在前向传播过程中获取最后一层convolution layer之后产生的feature map作为基础;接着计算目标类别得分相对于各个位置梯度值并求平均得到权重系数wi;最后利用该权重加权sum up所有channels获得最终heatmap,并将其resize回原始尺寸大小以便于观察理解。 ```python import torch.nn.functional as F from torchvision import models def get_3d_grad_cam(model, input_tensor, target_layer_name='layer4'): # 前馈传递以提取所需层的激活 activations = [] def hook_fn(module, inp, out): activations.append(out) handle = model._modules.get(target_layer_name).register_forward_hook(hook_fn) output = model(input_tensor.unsqueeze(0)) handle.remove() # 获取指定分类的概率分布 pred_probabilities = F.softmax(output,dim=1).data.squeeze() score_class = pred_probabilities[target_class].item() # 反向传播仅保留感兴趣的类 one_hot_output = torch.FloatTensor(1,output.size()[-1]).zero_() one_hot_output[0][target_class]=1 model.zero_grad() loss = torch.sum(one_hot_output.cuda()*output) loss.backward(retain_graph=True) gradients = model.get_activations_gradient().cpu().numpy()[0] pooled_gradients = np.mean(gradients,axis=(0,2,3)) feature_maps = activations[0].detach().cpu().numpy()[0] for i in range(len(pooled_gradients)): feature_maps[i,:,:,:] *=pooled_gradients[i] cam=np.maximum(feature_maps.sum(axis=0),0) cam = cv2.resize(cam,(input_tensor.shape[-1],input_tensor.shape[-2])) cam = cam -np.min(cam) cam = cam / np.max(cam) return cam ``` 上述代码片段展示了如何基于PyTorch框架下构建适用于3D数据类型的Grad-CAM工具函数。需要注意的是这里假设读者已经熟悉Python编程环境及其科学计算库如NumPy等基础知识[^1]。
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值