【快速实践】类激活图(CAM,class activation map)可视化

类激活图可视化:有助于了解一张图像的哪一部分让卷积神经网络做出了最终的分类决策

  • 对输入图像生成类激活热力图
  • 类激活热力图是与特定输出类别相关的二维分数网格:对任何输入图像的每个位置都要进行计算,它表示每个位置对该类别的重要程度

我们将使用的具体实现方式是“Grad-CAM: visual explanations from deep networks via gradient based localization”

  • 给定一张输入图像,对于一个卷积层的输出特征图,用类别相对于通道的梯度对这个特征图中的每个通道进行加权

代码示例如下

  1. 加载 VGG16 执行图片分类

    from keras.preprocessing import image 
    from keras.applications.vgg16 import VGG16 
    from keras.applications.vgg16 import preprocess_input, decode_predictions 
    import numpy as np 
    from keras import backend as K import tensorflow as tf
    tf.compat.v1.disable_eager_execution()##---------------------------------- 加载 VGG16 网络
    model = VGG16(weights='imagenet')  ##---------------------------------- 预测给定图片 
    img_path = 'elephant.png'   
    img = image.load_img(img_path, target_size=(224, 224))   
    x = image.img_to_array(img)   
    x = np.expand_dims(x, axis=0)   
    x = preprocess_input(x) 
    preds = model.predict(x) ##---------------------------------- 解读预测结果
    print('Predicted:', decode_predictions(preds, top=3)[0]) 
    # 打印出:对这张图像预测的前三个类别
    # Predicted:', [(u'n02504458', u'African_elephant', 0.92546833),   ## 非洲象(African elephant,92.5% 的概率)
    # (u'n01871265', u'tusker', 0.070257246), 						   ## 长牙动物(tusker,7%的概率)
    # (u'n02504013', u'Indian_elephant', 0.0042589349)]				   ## 印度象(Indian elephant,0.4% 的概率)print(np.argmax(preds[0])) 
    # 获得 非洲象对应输出索引:386
    
  2. 应用Grad-CAM算法,计算类激活热力图 heatmap

    african_elephant_output = model.output[:, 386]                                  # 预测向量中的 “非洲象” 元素    (None,)       
    last_conv_layer_output = model.get_layer('block5_conv3').output                 # VGG16 最后一个卷积层         (None, 14, 14, 512)# 类别相对于通道的梯度: “非洲象”类别相对于 block5_conv3 输出特征图的梯度
    grads = K.gradients(african_elephant_output, last_conv_layer_output)[0]         # grads.shape:                (None, 14, 14, 512)
    pooled_grads = K.mean(grads, axis=(0, 1, 2))                                    # pooled_grads.shape:         (512,)# 获得当前图 conv_layer_output_value 和 pooled_grads_value 实际值
    iterate = K.function([model.input], [pooled_grads, last_conv_layer_output[0]])
    pooled_grads_value, conv_layer_output_value = iterate([x]) 
    # 计算加权值
    for i in range(512):   conv_layer_output_value[:, :, i] *= pooled_grads_value[i]heatmap = np.mean(conv_layer_output_value, axis=-1) 
    
  3. 可视化

    import matplotlib.pyplot as plt
    heatmap = np.maximum(heatmap, 0) 
    heatmap /= np.max(heatmap) 
    plt.matshow(heatmap)
    plt.show()  ##  ---------------------------------------------------- 下方左图# 缩放 heatmap 后,在原图上叠加显示
    import cv2 
    img = cv2.imread(img_path) 
    heatmap = cv2.resize(heatmap, (img.shape[1], img.shape[0]))
    heatmap = np.uint8(255 * heatmap)
    heatmap = cv2.applyColorMap(heatmap, cv2.COLORMAP_JET) 
    superimposed_img = heatmap * 0.4 + img
    cv2.imwrite('elephant_cam.jpg', superimposed_img)  ## -------------- 下方右图
    

完整代码参考

from keras.preprocessing import image 
from keras.applications.vgg16 import VGG16 
from keras.applications.vgg16 import preprocess_input, decode_predictions 
import numpy as np 
from keras import backend as K 
import tensorflow as tf
tf.compat.v1.disable_eager_execution()##---------------------------------- 加载 VGG16 网络
model = VGG16(weights='imagenet')  ##---------------------------------- 预测给定图片 
img_path = 'elephant.png'   
img = image.load_img(img_path, target_size=(224, 224))   
x = image.img_to_array(img)   
x = np.expand_dims(x, axis=0)   
x = preprocess_input(x) 
preds = model.predict(x) ##---------------------------------- 解读预测结果
print('Predicted:', decode_predictions(preds, top=3)[0]) 
# 打印出:对这张图像预测的前三个类别
# Predicted:', [(u'n02504458', u'African_elephant', 0.92546833),      ## 非洲象(African elephant,92.5% 的概率)
# (u'n01871265', u'tusker', 0.070257246), 		          ## 长牙动物(tusker,7%的概率)
# (u'n02504013', u'Indian_elephant', 0.0042589349)]                   ## 印度象(Indian elephant,0.4% 的概率)print(np.argmax(preds[0])) 
# 获得 非洲象对应输出索引:386african_elephant_output = model.output[:, 386]                                  # 预测向量中的 “非洲象” 元素    (None,)       
last_conv_layer_output = model.get_layer('block5_conv3').output                 # VGG16 最后一个卷积层         (None, 14, 14, 512)# 类别相对于通道的梯度: “非洲象”类别相对于 block5_conv3 输出特征图的梯度
grads = K.gradients(african_elephant_output, last_conv_layer_output)[0]         # grads.shape:                (None, 14, 14, 512)
pooled_grads = K.mean(grads, axis=(0, 1, 2))                                    # pooled_grads.shape:         (512,)# 获得当前图 conv_layer_output_value 和 pooled_grads_value 实际值
iterate = K.function([model.input], [pooled_grads, last_conv_layer_output[0]])
pooled_grads_value, conv_layer_output_value = iterate([x]) 
# 计算加权值
for i in range(512):   conv_layer_output_value[:, :, i] *= pooled_grads_value[i]heatmap = np.mean(conv_layer_output_value, axis=-1) import matplotlib.pyplot as plt
heatmap = np.maximum(heatmap, 0) 
heatmap /= np.max(heatmap) 
plt.matshow(heatmap)
# plt.show()# 缩放 heatmap 后,在原图上叠加显示
import cv2 
img = cv2.imread(img_path) 
heatmap = cv2.resize(heatmap, (img.shape[1], img.shape[0]))
heatmap = np.uint8(255 * heatmap)
heatmap = cv2.applyColorMap(heatmap, cv2.COLORMAP_JET) 
superimposed_img = heatmap * 0.4 + img
cv2.imwrite('elephant_cam.jpg', superimposed_img)

参考书籍:Python 深度学习

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/64922.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ros2 py文件间函数调用

文章目录 写在前面的话生成python工程包命令运行python函数命令python工程包的目录结构目录结构(细节) 报错 1( no module name ***)错误示意 截图终端输出解决方法 报错 2( AttributeError: *** object has no attrib…

Milvus×合邦电力:向量数据库如何提升15%电价预测精度

01. 全球能源市场化改革下的合邦电力 在全球能源转型和市场化改革的大背景下,电力交易市场正逐渐成为优化资源配置、提升系统效率的关键平台。电力交易通过市场化手段,促进了电力资源的有效分配,为电力行业的可持续发展提供了动力。 合邦电力…

OLED的显示

一、I2C I2C时序:时钟线SCL高电平下:SDA由高变低代表启动信号,开始发送数据;SCL高电平时,数据稳定,数据可以被读走,开始进行读操作,SCL低电平时,数据发生改变&#xff1…

VMware运维效率提升50%,RVTools管理更简单

RVTools 是一款专为 VMware 虚拟化环境量身打造的高效管理工具,基于 .NET 4.7.2 框架开发,并与 VMware vSphere Management SDK 8.0 和 CIS REST API 深度集成,能够全面呈现虚拟化平台的各项关键数据。该工具不仅能够详细列出虚拟机、CPU、内…

python +t kinter绘制彩虹和云朵

python t kinter绘制彩虹和云朵 彩虹,简称虹,是气象中的一种光学现象,当太阳光照射到半空中的水滴,光线被折射及反射,在天空上形成拱形的七彩光谱,由外圈至内圈呈红、橙、黄、绿、蓝、靛、紫七种颜色。事实…

Zabbix5.0版本(监控Nginx+PHP服务状态信息)

目录 1.监控Nginx服务状态信息 (1)通过Nginx监控模块,监控Nginx的7种状态 (2)开启Nginx状态模块 (3)配置监控项 (4)创建模板 (5)用默认键值…

Python入门教程 —— 字符串

字符串介绍 字符串可以理解为一段普通的文本内容,在python里,使用引号来表示一个字符串,不同的引号表示的效果会有区别。 字符串表示方式 a = "Im Tom" # 一对双引号 b = Tom said:"I am Tom" # 一对单引号c = Tom said:"I\m Tom" # 转义…

AcWing练习题:差

读取四个整数 A,B,C,D,并计算 (AB−CD)的值。 输入格式 输入共四行,第一行包含整数 A,第二行包含整数 B,第三行包含整数 C,第四行包含整数 D。 输出格式 输出格式为 DIFERENCA X,其中 X 为 (AB−CD) 的…

小程序添加购物车业务逻辑

数据库设计 DTO设计 实现步骤 1 判断当前加入购物车中的的商品是否已经存在了 2 如果已经存在 只需要将数量加一 3 如果不存在 插入一条购物车数据 4 判断加到本次购物车的是菜品还是套餐 Impl代码实现 Service public class ShoppingCartServiceImpl implements Shoppin…

如何在谷歌浏览器中使用自定义搜索快捷方式

在数字时代,浏览器已经成为我们日常生活中不可或缺的一部分。作为最常用的浏览器之一,谷歌浏览器凭借其简洁的界面和强大的功能深受用户喜爱。本文将详细介绍如何自定义谷歌浏览器的快捷工具栏,帮助你更高效地使用这一工具。 一、如何找到谷歌…

Python 3 与 Python 2 的主要区别

文章目录 1. 语法与关键字print 函数整数除法 2. 字符串处理默认字符串类型字符串格式化 3. 输入函数4. 迭代器和生成器range 函数map, filter, zip 5. 标准库变化urllib 模块configparser 模块 6. 异常处理7. 移除的功能8. 其他重要改进数据库操作多线程与并发类型注解 9. 总结…

关于IDE的相关知识之二【插件推荐】

成长路上不孤单😊😊😊😊😊😊 【14后😊///计算机爱好者😊///持续分享所学😊///如有需要欢迎收藏转发///😊】 今日分享关于ide插件推荐的相关内容&#xff01…

基于微信小程序的校园点餐平台的设计与实现(源码+SQL+LW+部署讲解)

文章目录 摘 要1. 第1章 选题背景及研究意义1.1 选题背景1.2 研究意义1.3 论文结构安排 2. 第2章 相关开发技术2.1 前端技术2.2 后端技术2.3 数据库技术 3. 第3章 可行性及需求分析3.1 可行性分析3.2 系统需求分析 4. 第4章 系统概要设计4.1 系统功能模块设计4.2 数据库设计 5.…

spring中使用@Validated,什么是JSR 303数据校验,spring boot中怎么使用数据校验

文章目录 一、JSR 303后台数据校验1.1 什么是 JSR303?1.2 为什么使用 JSR 303? 二、Spring Boot 中使用数据校验2.1 基本注解校验2.1.1 使用步骤2.1.2 举例Valid注解全局统一异常处理 2.2 分组校验2.2.1 使用步骤2.2.2 举例Validated注解Validated和Vali…

应用架构模式-总体思路

采用引导式设计方法:以企业级架构为指导,形成较为齐全的规范指引。在实践中总结重要设计形成决策要点,一个决策要点对应一个设计模式。自底向上总结采用该设计模式的必备条件,将之转化通过简单需求分析就能得到的业务特点&#xf…

【数据结构】双向循环链表的使用

双向循环链表的使用 1.双向循环链表节点设计2.初始化双向循环链表-->定义结构体变量 创建头节点(1)示例代码:(2)图示 3.双向循环链表节点头插(1)示例代码:(2&#xff…

【Java设计模式-3】门面模式——简化复杂系统的魔法

在软件开发的世界里,我们常常会遇到复杂的系统,这些系统由多个子系统或模块组成,各个部分之间的交互错综复杂。如果直接让外部系统与这些复杂的子系统进行交互,不仅会让外部系统的代码变得复杂难懂,还会增加系统之间的…

Linux一些问题

修改YUM源 Centos7将yum源更换为国内源保姆级教程_centos使用中科大源-CSDN博客 直接安装包,走链接也行 Index of /7.9.2009/os/x86_64/Packages 直接复制里面的安装包链接,在命令行直接 yum install https://vault.centos.org/7.9.2009/os/x86_64/Pa…

HTML——57. type和name属性

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>type和name属性</title></head><body><!--1.input元素是最常用的表单控件--><!--2.input元素不仅可以在form标签内使用也可以在form标签外使用-…

uniapp本地加载腾讯X5浏览器内核插件

概述 TbsX5webviewUTS插件封装腾讯x5webview离线内核加载模块&#xff0c;可以把uniapp的浏览器内核直接替换成Android X5 Webview(腾讯TBS)最新内核&#xff0c;提高交互体验和流畅度。 功能说明 下载SDK插件 1.集成x5内核后哪些页面会由x5内核渲染&#xff1f; 所有plus…