类别激活热力图grad-cam(pytorch)实战跑图

这篇具有很好参考价值的文章主要介绍了类别激活热力图grad-cam(pytorch)实战跑图。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

写在前面

类激活热力图:用于检查图像哪一部分对模型的最终输出有更大的贡献。具体某个类别对应到图片的那个区域响应最大,也就是对该类别的识别贡献最大

pytorch-grad-cam库代码GitHub代码
如果只想跑个图的话不用下!

作用:一是清晰直观的看看到底影响检测结果的特征;而是cv论文里出图真的很好看
本篇只是跑了代码给的猫狗图,下一篇要写如何可视化其他类别实战

先上跑完结果

类别激活热力图grad-cam(pytorch)实战跑图
使用的是resnet50,可以看出其关注度不仅仅只有狗,还有后面的背景,这会对以后的检测结果造成影响

实战

1.安装pytorch-grad-cam

在pycharm终端中输入

pip install grad-cam

我之前安装过了,页面如下
类别激活热力图grad-cam(pytorch)实战跑图

2.复制全部代码

'''
1)导入相关的包并加载模型
'''

from pytorch_grad_cam import GradCAM, ScoreCAM, GradCAMPlusPlus, AblationCAM, XGradCAM, EigenCAM
from pytorch_grad_cam.utils.image import show_cam_on_image, \
                                         deprocess_image, \
                                         preprocess_image
from torchvision.models import resnet50
import cv2
import numpy as np
import os

os.environ["KMP_DUPLICATE_LIB_OK"]="TRUE"

# 1.加载模型
model = resnet50(pretrained=True) #预先训练
# 2.选择目标层
# target_layer = model.layer4[-1]
target_layer = [model.layer4]
'''
Resnet18 and 50: model.layer4[-1]
VGG and densenet161: model.features[-1]
mnasnet1_0: model.layers[-1]
ViT: model.blocks[-1].norm1
'''
#------------------------------
'''
2)构建输入图像的Tensor形式,使其能传送到model里面去计算
'''



image_path = '../../examples/both.png'
rgb_img = cv2.imread(image_path, 1)[:, :, ::-1]   # 1是读取rgb
                                                 #imread返回从指定路径加载的图像
rgb_img = cv2.imread(image_path, 1) #imread()读取的是BGR格式
rgb_img = np.float32(rgb_img) / 255



# preprocess_image作用:归一化图像,并转成tensor
input_tensor = preprocess_image(rgb_img, mean=[0.485, 0.456, 0.406],
                                             std=[0.229, 0.224, 0.225])   # torch.Size([1, 3, 224, 224])
# Create an input tensor image for your model..
# Note: input_tensor can be a batch tensor with several images!


#----------------------------------------
'''
3)初始化CAM对象,包括模型,目标层以及是否使用cuda等
'''
# Construct the CAM object once, and then re-use it on many images:
cam = GradCAM(model=model, target_layers=target_layer, use_cuda=False)
'''
4)选定目标类别,如果不设置,则默认为分数最高的那一类
'''
# If target_category is None, the highest scoring category
# will be used for every image in the batch.
# target_category can also be an integer, or a list of different integers
# for every image in the batch.
target_category = None
#指定类:target_category = 281

'''
5)计算cam
'''
# You can also pass aug_smooth=True and eigen_smooth=True, to apply smoothing.
grayscale_cam = cam(input_tensor=input_tensor, target_category=target_category)  # [batch, 224,224]

#----------------------------------
'''
6)展示热力图并保存
'''
# In this example grayscale_cam has only one image in the batch:
# 7.展示热力图并保存, grayscale_cam是一个batch的结果,只能选择一张进行展示
grayscale_cam = grayscale_cam[0]
visualization = show_cam_on_image(rgb_img, grayscale_cam)  # (224, 224, 3)
cv2.imwrite(f'first_try.jpg', visualization)

> 步骤:先把博客中代码复制,然后按照本博客写的修改即可,也可以直接拉到下面复制我的代码,然后按照说明修改路径

3.自己使用代码需要修改的部分

1、图片路径

第34行,将单引号地址改为你要用的图片地址

image_path = '../../examples/both.png'

不会的请详细参看错误1内容,写的很清楚
注意:路径中不要有中文

2、结果图名称

第79行

cv2.imwrite(f'first_try.jpg', visualization)

将’'改为你希望的名字即可

4.查看结果图

其实就在代码当前路径的文件夹下
当然也可以复制图片名称first_try.jpg,在保存代码的文件夹里直接查找
类别激活热力图grad-cam(pytorch)实战跑图

点击结果图
类别激活热力图grad-cam(pytorch)实战跑图

运行代码所遇到的问题

错误1:TypeError: ‘NoneType’ object is not subscriptable

1、报错内容:

Traceback (most recent call last):
File “E:/CAM/pytorch-grad-cam/pytorch_grad_cam/utils/using_grad_cam.py”, line 32, in
rgb_img = cv2.imread(image_path, 1)[:, :, ::-1] # 1是读取rgb
TypeError: ‘NoneType’ object is not subscriptable
类别激活热力图grad-cam(pytorch)实战跑图

2、错误代码:

第2)构建输入图像的Tensor形式,使其能传送到model里面去计算,这一步

image_path = './examples/both.png'
rgb_img = cv2.imread(image_path, 1)[:, :, ::-1]   # 1是读取rgb
rgb_img = np.float32(rgb_img) / 255

使用OpenCV读取图片时发生错误,一直显示图片类型是“nonetype”

3、修正:

发现是路径错误

image_path = './examples/both.png'  #错误路径

修改后

image_path = '../../examples/both.png'

附上运行代码与读取的图片位置
类别激活热力图grad-cam(pytorch)实战跑图
关于路径如何正确表示可以看这篇文件路径./和…/

错误2:AttributeError: ‘GradCAM’ object has no attribute ‘activations_and_grads’

报错内容:

Traceback (most recent call last):
File “D:\anaconda\envs\pytorch\lib\site-packages\pytorch_grad_cam\base_cam.py”, line 192, in del
self.activations_and_grads.release()
AttributeError: ‘GradCAM’ object has no attribute ‘activations_and_grads’
类别激活热力图grad-cam(pytorch)实战跑图

错误3:TypeError: init() got an unexpected keyword argument ‘target_layer’

报错内容:

Traceback (most recent call last):
File “E:/CAM/pytorch-grad-cam/pytorch_grad_cam/utils/using_grad_cam.py”, line 60, in
cam = GradCAM(model=model, target_layer=target_layer, use_cuda=False)
TypeError: init() got an unexpected keyword argument ‘target_layer’
类别激活热力图grad-cam(pytorch)实战跑图

针对错误2与错误3的修改:

第一处:

target_layer = model.layer4[-1]

修改为 target_layer = [model.layer4]
第二处:

cam = GradCAM(model=model, target_layer=target_layer, use_cuda=False)

修改为

cam = GradCAM(model=model, target_layers=target_layer, use_cuda=False)

只想跑图出结果的不需要看,想大概熟悉代码与原理的可以看一看

使用pytorch实现grad-cam需了解hook机制,详细看 pytorch的autograd
pytorch的hook应用
个人理解:hook就是储存pytorch所释放的中间变量的“钩子”,哪里需要就钩在哪里 举例更好理解。
hook机制一定要理解,grad-cam中hook是重要代码

基础差的看不懂基础代码,可以哪里不懂点哪里
1、*args**kargs 知识点讲解链接
2、Python自带模块argparse详细使用说明书 Python argparse命令行参数解析包的详细使用说明书

例:采用LeNet-5演示backward_hook在grad-cam中应用,下面是代码过程(具体代码上面链接中有) 1、创建网络net
2、注册forward_hook函数用于提取最后一层特征图;
3、注册backward_hook函数用于提取类向量(one-hot)关于特征图的梯度; 4、对特征图的梯度进行求均值,并对特征图进行加权;
5、可视化heatmap

model._modules.items() 遍历输出每一层
register_hook的作用:即对x求导时,对x的导数进行操作,并且register_hook的参数只能以函数的形式传过去。(保护求导中中间值作用,不然pytorch将直接保存最后结果,中间结果不保存)详细解释

本篇主要参考CAM(类激活映射),卷积可视化,神经网络可视化,一个库搞定,真的简单的不能再简单文章来源地址https://www.toymoban.com/news/detail-465206.html

到了这里,关于类别激活热力图grad-cam(pytorch)实战跑图的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 《python深度学习》笔记(二十):神经网络的解释方法之CAM、Grad-CAM、Grad-CAM++、LayerCAM

    原理 优点 缺点 GAP 将多维特征映射降维为一个固定长度的特征向量 ①减少了模型的参数量;②保留更多的空间位置信息;③可并行计算,计算效率高;④具有一定程度的不变性 ①可能导致信息的损失;②忽略不同尺度的空间信息 CAM 利用最后一个卷积层的特征图×权重(用

    2024年02月05日
    浏览(38)
  • Grad-CAM简介

    论文名称:Grad-CAM: Visual Explanations from Deep Networks via Gradient-based Localization 论文下载地址:https://arxiv.org/abs/1610.02391 推荐代码(Pytorch):https://github.com/jacobgil/pytorch-grad-cam bilibili视频讲解:https://b23.tv/1kccjmb 对于常用的深度学习网络(例如CNN),普遍认为是个黑盒可解释性并不

    2024年02月02日
    浏览(40)
  • grad-CAM用于自己的语义分割网络【亲测】

    参考链接:https://github.com/jacobgil/pytorch-grad-cam  我遇到了 如下错误 解决方法: 将base_cam.py的第81行修改为:  就不报错了! 拿下!    

    2024年02月02日
    浏览(44)
  • [ 可视化 ] 经典网络模型 —— Grad-CAM 详解与复现

    🤵 Author :Horizon Max ✨ 编程技巧篇 :各种操作小结 🎇 机器视觉篇 :会变魔术 OpenCV 💥 深度学习篇 :简单入门 PyTorch 🏆 神经网络篇 :经典网络模型 💻 算法篇 :再忙也别忘了 LeetCode 随着神经网路模型的不断发展,深度模型通过使用 更抽象 (增加网络层数)和 更紧密

    2024年02月02日
    浏览(34)
  • grad-cam用于3D分割网络的代码修改——以及特征层非常规输出的解决方法

    首先,我们看下chatgpt写的Gradcam框架。 为了个性化设计输出的cam,我们需要修改源码。也就是GradCAM()函数。 先解读一下原版 可以看到并没有太多函数方法,我们打开基类BaseCAM() 看一下ActivationsAndGradients 可以看到,ActivationsAndGradients类主要的功能是通过钩子函数获取正向传播

    2024年02月06日
    浏览(40)
  • 【深度学习】pytorch 可视化类激活的热力图 Visualizing heatmaps of class activation

    “Visualizing heatmaps of class activation” 是指使用深度学习模型的中间层特征来可视化分类器对图像的响应区域,从而确定哪些区域对于特定类别的识别最为关键。 在深度学习中,卷积神经网络(CNN)已被广泛用于图像分类任务。CNN在其卷积层中学习特征并将其传递到后续层进行

    2024年02月12日
    浏览(38)
  • Pytorch autograd.grad与autograd.backward详解

    平时在写 Pytorch 训练脚本时,都是下面这种无脑按步骤走: 对用户屏蔽底层自动微分的细节,使得用户能够根据简单的几个 API 将模型训练起来。这对于初学者当然是极好的,也是 Pytorch 这几年一跃成为最流行的深度学习框架的主要原因:易用性。 但是,我们有时需要深究自

    2023年04月09日
    浏览(41)
  • pytorch 绘制一维热力图

    热力图(Heat Map)是指用 X 轴 和 Y 轴 表示的两个分类字段确定数值点的位置, 通过相应位置的矩形颜色去表现数值的大小 ,颜色深代表的数值大。 热力图是非常特殊的一种图,可以显示不可点击区域发生的事情。 热力图非常关注分布 ,可以不需要坐标轴,其背景通常是图

    2024年02月07日
    浏览(36)
  • 深入理解PyTorch中的train()、eval()和no_grad()

    ❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️ 👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博相关......)👈 (封面图由文心一格生成) 在PyTorch中,train()、eval()和no_grad()是三个非常重

    2023年04月08日
    浏览(47)
  • pytorch | loss不收敛或者训练中梯度grad为None的问题

    原因定位: https://blog.csdn.net/weixin_44231148/article/details/107240840 Pytorch中自定义网络参数,存在梯度但不进行更新 - 漱石的文章 - 知乎 https://zhuanlan.zhihu.com/p/92729376 https://zhuanlan.zhihu.com/p/508458545 介绍hooks: https://zhuanlan.zhihu.com/p/553627695 https://medium.com/analytics-vidhya/pytorch-hooks-5909c7636

    2024年02月08日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包