Grad-Cam实现流程(pytorch)_gradcam实现

收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
img
img

如果你需要这些资料,可以戳这里获取

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

最近感觉类激活图可视化是一件很有趣的事情。
CAM(传送门:CAM实现的流程(pytorch))由于对网络结构有定性要求,所以在可视化一些有多个全连接层的网络时,表现不太友好,于是出现了Grad-CAM。

文章目录
算法思路

引用的博主 G5Lorenzo 一句话

Grad-CAM根据输出向量,进行backward,求取特征图的梯度,得到每个特征图上每个像素点对应的梯度,也就是特征图对应的梯度图,然后再对每个梯度图求平均,这个平均值就对应于每个特征图的权重,然后再将权重与特征图进行加权求和,最后经过relu激活函数就可以得到最终的类激活图

实现过程

先准备图片、标签以及模型
类别标签下载方法:
先安装axel:
sudo apt-get install axel
执行下载命令
axel -n 5 https://s3.amazonaws.com/outcome-blog/imagenet/labels.json
labels.json如果下不了就从网盘下:
链接:https://pan.baidu.com/s/1JAfwLtVEp1-ourEdd4VLhg
提取码:1234
图片下载:
axel -n 5 http://media.mlive.com/news_impact/photo/9933031-large.jpg
模型下载:
senet1_1:axel -n 5 https://download.pytorch.org/models/squeezenet1_1-f364aa15.pth
resnet18:axel -n 5 https://download.pytorch.org/models/resnet18-5c106cde.pth

1.导入各种包
import cv2
import os
import numpy as np
import torch
import torchvision.transforms as transforms
from torchvision import models
import json

2.定义一些函数

图片预处理函数

# 图片预处理
def img\_preprocess(img_in):
    img = img_in.copy()						
    img = img[:, :, ::-1]   				# 1
    img = np.ascontiguousarray(img)			# 2
    transform = transforms.Compose([
        transforms.ToTensor(),
        transforms.Normalize([0.4948052, 0.48568845, 0.44682974], [0.24580306, 0.24236229, 0.2603115])
    ])
    img = transform(img)
    img = img.unsqueeze(0)					# 3
    return img

1.之后读取图片会使用opencv读取,读取的颜色通道为BGR,为了适应模型,需要将颜色通道转回为RGB。
2.由于更改通道后,数组变为不连续,所以需要使用np.ascontiguousarray将img转为连续数组,否则无法转为tensor。
3.增加第一维的batch通道,使得图片能够输入网络

定义获取梯度和特征图的函数

# 定义获取梯度的函数
def backward\_hook(module, grad_in, grad_out):
    grad_block.append(grad_out[0].detach())

# 定义获取特征图的函数
def farward\_hook(module, input, output):
    fmap_block.append(output)

定义计算grad-cam并显示的函数

# 计算grad-cam并可视化
def cam\_show\_img(img, feature_map, grads, out_dir):
    H, W, _ = img.shape
    cam = np.zeros(feature_map.shape[1:], dtype=np.float32)		# 4
    grads = grads.reshape([grads.shape[0],-1])					# 5
    weights = np.mean(grads, axis=1)							# 6
    for i, w in enumerate(weights):
        cam += w \* feature_map[i, :, :]							# 7
    cam = np.maximum(cam, 0)
    cam = cam / cam.max()
    cam = cv2.resize(cam, (W, H))

    heatmap = cv2.applyColorMap(np.uint8(255 \* cam), cv2.COLORMAP_JET)


![img](https://img-blog.csdnimg.cn/img_convert/960151b92309eb54f0034a137a1c0b23.png)
![img](https://img-blog.csdnimg.cn/img_convert/e3ca8c2f1e4d2f9682c66d780859fbf1.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新**

**需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618679757)**

含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新**

**需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618679757)**

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Grad-CAM(gradient-weighted class activation mapping)是一种用于解释卷积神经网络(CNN)分类结果的可视化技术。Grad-CAM通过计算网络最后一个卷积层的特征图和网络输出类别之间的梯度关系,来确定网络对输入图像各个位置的关注程度,并将其可视化为热力图。 在使用PyTorch实现Grad-CAM时,首先需要定义一个用于目标网络的子类,在该子类中可以获取到目标网络最后一个卷积层的输出特征图。然后,使用PyTorch提供的autograd功能,计算目标网络输出类别的梯度。接下来,根据梯度和特征图,计算每个特征图通道的权重,并将其加权求和得到最终的热力图。 具体实现时,可以通过自定义一个Grad-CAM类,在该类中实现上述步骤。首先,通过构造函数初始化目标网络和最后一个卷积层的名字。然后,定义一个forward_hook函数,在目标网络的最后一个卷积层上注册该函数,用于获取该层的输出特征图。接着,定义一个backward_hook函数,在目标网络的输出结果上注册该函数,用于计算梯度。最后,在实例化Grad-CAM类时,输入目标网络和目标类别,调用相应的函数即可得到热力图。 总之,Grad-CAM是一种用于可视化卷积神经网络分类结果的技术,通过计算特征图和类别梯度的关系来得到关注程度,然后将其可视化为热力图。在PyTorch中,可以通过实现一个Grad-CAM类来实现该功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值