示例工程【免费下载链接】deep-learning-for-image-processingdeep learning for image processing including classification and object-detection etc.项目地址https://gitcode.com/gh_mirrors/de/deep-learning-for-image-processing点击查看免费下载Grad-CAMGradient-weighted Class Activation Mapping是一种经典的深度网络可视化方法它利用目标类别在指定卷积层上的梯度生成反映模型关注区域的类激活热力图是分类模型调试、可解释性与错误分析中不可缺少的工具。本文以deep-learning-for-image-processing仓库中 pytorch_classification/grad_cam 模块为核心完整讲解 Grad-CAM 的数学原理、Pytorch 实现细节以及如何通过5 步流程将现成实现无缝替换为你自己的网络并覆盖 CNNMobileNetV3 / ResNet / VGG / EfficientNet / RegNet、Vision TransformerViT与 Swin Transformer 三类网络的 target_layers 与 reshape_transform 配置技巧。读完本文你将能够对任意自己训练的分类模型一键生成热力图并理解其中每一个参数的含义与来源。一、Grad-CAM 原理速览Grad-CAM 的核心思想是对于分类网络输出的某一目标类别得分 $y^c$计算该得分对最后一个卷积层或任意目标层输出特征图$A^k$ 的梯度然后利用梯度对特征图进行通道加权求和从而得到一张与输入图像分辨率对齐的显著性热力图。具体步骤如下前向传播得到网络输出 logits取目标类别的得分 $y^c$不经过 softmax反向传播计算 $y^c$ 对目标层输出特征图 $A^k$ 的梯度 $\frac{\partial y^c}{\partial A^k}$对每个通道的梯度做空间平均得到通道权重 $\alpha_k^c \frac{1}{Z}\sum_i\sum_j \frac{\partial y^c}{\partial A^k_{ij}}$以 $\alpha_k^c$ 对特征图 $A^k$ 加权求和得到 CAM即 $\text{CAM}^c \text{ReLU}(\sum_k \alpha_k^c A^k)$最后上采样到输入尺寸并叠加显示。在仓库的 utils.py 中上述过程被清晰地拆分为三个类/函数ActivationsAndGradients通过 PyTorch Hook 收集前向激活与反向梯度、GradCAM核心 CAM 计算与多目标层聚合、show_cam_on_image热力图与原始图像的叠加渲染。下面逐一展开。二、核心实现源码解析utils.py2.1 ActivationsAndGradients用 Hook 捕获激活与梯度ActivationsAndGradients是 Grad-CAM 的数据采集层它针对每个target_layer注册两个 Hook见 utils.pyregister_forward_hook保存前向输出激活register_full_backward_hook老版本 Pytorch 回退到register_backward_hook保存反向传播的梯度且由于梯度是逆序计算的代码里用self.gradients [grad] self.gradients把它插到列表头部保证与激活顺序一致见 utils.py。需要特别留意的是reshape_transform参数对于 ViT / Swin 这类输出为[B, num_tokens, C]序列形态的网络Hook 捕获到的特征图并不是标准图像形态必须通过reshape_transform把它重排成[B, C, H, W]才能参与后续计算。这个设计贯穿 CNN 与 Transformer 两类网络详见后文。2.2 GradCAM 类通道加权与多层聚合GradCAM类是整个模块的主入口它的计算管线集中在__call__中见 utils.py前向传播得到 logitstarget_category为None时自动取argmax作为默认类别否则按 batch 中每个样本传入类别 idloss output[i, target_category[i]]取出目标类别的得分并backward(retain_graphTrue)utils.pyget_cam_weights对梯度做空间均值np.mean(grads, axis(2, 3), keepdimsTrue)即公式中的通道权重 $\alpha_k^c$utils.pyget_cam_image中weights * activations后按通道求和得到 CAM并对负值截断cam[cam 0] 0等价于 ReLUutils.pyscale_cam_image将每张 CAM 做 min-max 归一化并cv2.resize到输入尺寸utils.py若指定了多个target_layersaggregate_multi_layers会对各层结果取逐像素最大值后再求平均得到最终显著性图utils.py。2.3 show_cam_on_image热力图叠加渲染show_cam_on_image使用 OpenCV 的cv2.applyColorMap将归一化的 CAM 映射为 JET 色带并叠加到原始图像上utils.py。两个关键约定use_rgb输入图像为 RGB 时设为True内部会先做COLOR_BGR2RGB转换否则叠加结果色相会偏移输入img必须是np.float32且取值在[0, 1]区间否则直接抛出Exception提示。同文件还提供了center_crop_imgutils.py先将图像等比缩放至短边等于目标尺寸再从中心裁剪出size × size正方形用于 ViT / Swin 等对输入尺寸敏感的模型。三、使用流程替换成自己的网络README 给出了将本项目替换为自有网络的 5 步流程这也是整个模块使用的核心骨架替换模型创建与权重加载将创建模型部分代码替换成自己创建模型的代码并载入自己训练好的权重设置target_layers根据自己网络结构选择合适的目标层通常取最后一个卷积层 / 倒数第二个 Attention 块前的层设置预处理方法根据自己的网络ImageNet 均值方差、归一化区间等设置合适的data_transform赋值img_path将要预测的图片路径赋值给img_path赋值target_category将感兴趣的类别 id 赋值给target_category置None时自动取模型预测的最优类别。下面结合仓库内三个可直接运行的示例脚本main_cnn.py、main_vit.py、main_swin.py分别演示这三步在不同网络上的具体写法。四、CNN 网络main_cnn.py 实战main_cnn.py 面向传统卷积网络演示了 MobileNetV3、VGG16、ResNet34、RegNet、EfficientNet 五种架构的target_layers选择脚本中以注释形式给出可直接切换网络target_layers 配置MobileNetV3-Large[model.features[-1]]VGG16[model.features]整个特征提取段ResNet34[model.layer4]最后一个残差 stageRegNetY-800MF[model.trunk_output]EfficientNet-B0[model.features]脚本默认使用torchvision.models.mobilenet_v3_large(pretrainedTrue)并采用 ImageNet 标准预处理Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])。默认图片为仓库内的both.png——一张同时包含虎斑猫与斗牛犬的演示图默认target_category 281tabby cat注释中还给出了254pug作为第二个可切换类别方便你直接对比同一张图上猫与狗两个类别关注区域的差异main_cnn.py。CNN 场景下特征图本身就是[B, C, H, W]形态因此不需要reshape_transform直接GradCAM(modelmodel, target_layerstarget_layers, use_cudaFalse)即可。将use_cuda置为True可在 GPU 上运行GradCAM内部会对模型与输入调用.cuda()。五、Vision Transformermain_vit.py 实战ViT 与 CNN 的关键差异在于特征是序列token形态而非图像形态因此必须引入reshape_transform。在 main_vit.py 中定义了ReshapeTransform类从model.patch_embed读取img_size与patch_size计算 token 网格尺寸h H // patch_h、w W // patch_w__call__中先丢掉首位的 class tokenx[:, 1:, :]再把[B, num_tokens, C]重排为[B, H, W, C]最后permute成[B, C, H, W]交给 Grad-CAM。target_layers的选择有一个重要前提脚本注释有明确说明见 main_vit.py最终分类是在最后一个 Attention 块输出的 class token 上完成的若把目标层设在最后一块之后如model.norm梯度对 14×14 的空间 token 会全部为 0热力图失效。因此正确做法是取最后一个 Attention 块之前的层脚本选用[model.blocks[-1].norm1]。此外 ViT 官方预训练模型使用Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5])与 CNN 的 ImageNet 归一化不同需要同步替换。权重文件vit_base_patch16_224.pth需按脚本注释中的来源自行下载后放到当前目录。六、Swin Transformermain_swin.py 实战main_swin.py 演示了层级式 TransformerSwin的 Grad-CAM 配置与 ViT 相比有两个额外注意点输入尺寸必须是 32 的整数倍Swin 共经历 1 次 PatchEmbed 与 3 次 PatchMerging每级下采样 2 倍ResizeTransform.feature_size按ceil(s/4) → ceil(s/2) × 3递推得到特征图网格main_swin.py。脚本明确注释输入图片必须是 32 的整数倍否则由于 padding 的原因会出现注意力飘逸的问题默认img_size 224并带断言assert img_size % 32 0权重加载方式Swin 官方权重为字典格式加载时使用torch.load(...)[model]且strictFalsetarget_layers与 ViT 同理取最终分类之前的model.norm之后的空间 token 已无梯度故选用最后一个 stage 的输出[model.norm]该层输出即为 7×7 网格的空间特征。预处理与 CNN 一致ImageNet 均值方差图片同样经过center_crop_img裁剪到 224。由于 Swin 的 stage 间有层级下采样ResizeTransform需要显式传入im_h/im_w以推算特征图尺寸main_swin.py。七、运行与环境依赖三个脚本均为独立可运行的主程序直接执行即可弹出叠加了热力图的 matplotlib 窗口python main_cnn.py # 或 main_vit.py / main_swin.py依赖库包括torch、torchvision、numpy、opencv-pythoncv2、Pillow、matplotlib。运行 ViT / Swin 脚本前需先在当前目录放置对应权重文件vit_base_patch16_224.pth、swin_base_patch4_window7_224.pth模型定义分别位于 vit_model.py 与 swin_model.py。类别索引文件 imagenet1k_classes.txt 与 imagenet21k_classes.txt 可用于按名称查询类别 id。八、替换为自己的网络的完整清单将 README 的 5 步流程落实到代码中最终需要修改的只有四类位置以main_cnn.py为模板模型段model ...换成你训练好的模型并load_state_dict加载权重target_layers按最后一个卷积层 / 最后 Attention 块之前的层原则选取Transformer 网络还需额外传入自定义reshape_transform预处理与训练时保持一致均值、方差、尺寸、是否center_crop_img预测目标img_path换成待解释图片target_category换成想可视化的类别 id置None则自动取模型预测类别。完成以上四步GradCAM类即自动完成前向收集激活、反向收集梯度、通道加权、归一化上采样与多层聚合的全部工作。该实现同时支持一次传入 batch 多张图片target_category传入列表长度需与 batch 一致也支持传入多个target_layers做多层显著性聚合为分析深层语义提供了更强的灵活性。赞分享示例工程【免费下载链接】deep-learning-for-image-processingdeep learning for image processing including classification and object-detection etc.项目地址https://gitcode.com/gh_mirrors/de/deep-learning-for-image-processing点击查看免费下载相关推荐pytorch-cnn-visualizations实战指南从安装到Grad-CAM热力图生成pytorch cnn visualizations实战指南从安装到Grad CAM热力图生成 你是否曾好奇AI如何看见图像当深度学习模型对一张图片进行人工智能深度学习计算机视觉AI 可解释性终极指南如何用pytorch-grad-cam实现Swin Transformer注意力机制可视化终极指南如何用pytorch grad cam实现Swin Transformer注意力机制可视化 在深度学习和计算机视觉领域 pytorch grad c人工智能AI 可解释性计算机视觉深度学习终极指南使用pytorch-grad-cam实现多标签分类可视化热力图终极指南使用pytorch grad cam实现多标签分类可视化热力图 想要了解AI模型是如何思考的吗pytorch grad cam是一个强大的深度学人工智能AI 可解释性计算机视觉深度学习上一篇如何用VideoCrafter在5分钟内生成高质量视频AI视频生成终极指南下一篇BilibiliLiveRecordDownLoader录制付费直播教程登录与权限设置全攻略创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考