使用神经网络进行预测时,一个明显的缺陷就是缺少可解释性,我们不能通过一些简单的方法来知道网络做出决策或者预测的理由,这在很多方面就使得它的应用受限。

虽然不能通过一些数学方法来证明模型的有效性,但我们仍能够通过一些可视化热力图的方法来观测一下原始数据中的哪些部分对我们网络影响较大。

实现热力图绘制的方法有很多,如:CAM, Grad-CAM, Contrastive EBP等。在热力图生成之后,因为没有原始数据信息,所以我们并不能很直观地观测到模型到底重点关注了图像的哪些区域。这时将热力图叠加到原始图像上的想法就会很自然的产生。这里存在的一个问题是原始图像的色域空间可能和产生的热力图的色域空间是不一致的,当二者叠加的时候,会产生颜色的遮挡。并且因为产生的热力图的尺寸应该与原始图像尺寸一致或者调整到与原始尺寸一致,这样当二者直接简单地叠加的话,产生的图像可能并不是我们想要的,因此,我们需要先对热力图数据进行一些简单的像素处理,然后在考虑与原始图像的融合。以下部分的安排为:1. 热力图的产生 2. 热力图与原始图的叠加 3. 热力图与原始图融合优化

1. 热力图产生

在这里使用3D-Grad-CAM的方法来实现热力图绘制的方法,使用的图像尺寸为144, 168, 152 代码如下:

def cam(img_path, model_path, relu=True, sigmoid=False):

# grad-cam

img_data = np.load(img_path)

img_data = img_data[np.newaxis, :, :, :, np.newaxis]

max_ = np.max(img_data)

min_ = np.min(img_data)

img_data = (img_data - min_) / (max_ - min_)

model = load_model(model_path)

model.summary()

index = 0

pred = model.predict(img_data)

if sigmoid:

if pred >= 0.5:

index = 1

else:

max_ = np.max(pred)

for i in range(4):

if pred[0][i] == max_:

index = i

break

print(pred)

print("index: ", index)

pre_output = model.output[:, index]

last_conv_layer = model.get_layer('conv3d_7')

grads = K.gradients(pre_output, last_conv_layer.output)[0]

pooled_grads = K.mean(grads, axis=(0, 1, 2, 3))

iterate = K.function([model.input], [pooled_grads, last_conv_layer.output[0]])

pooled_grads_value, conv_layer_output_value = iterate([img_data])

if relu:

conv_layer_output_value[np.where(conv_layer_output_value < 0)] = 0

conv_max = np.max(conv_layer_output_value)

conv_min = np.min(conv_layer_output_value)

conv_layer_output_value = (conv_layer_output_value - conv_min) / (conv_max - conv_min)

pool_max = np.max(pooled_grads_value)

pool_min = np.min(pooled_grads_value)

pooled_grads_value = (pooled_grads_value - pool_min) / (pool_max - pool_min)

layer_number = len(pooled_grads_value)

for i in range(layer_number):

conv_layer_output_value[:, :, :, i] *= pooled_grads_value[i]

# along the last dim calculate the mean value

heatmap = np.mean(conv_layer_output_value, axis=-1)

# remove the value which less than 0

heatmap = np.maximum(heatmap, 0)

# uniformization

min_ = np.min(heatmap)

max_ = np.max(heatmap)

heatmap = (heatmap - min_) / (max_ - min_)

return heatmap

2. 热力图与原始图的叠加

通过以下代码获取热力图,并将其尺寸放缩到与原图一致:

heatmap = cam(img_path, model_path)

heatmap = resize(heatmap, (144, 168, 152))

加载数据:

img_data = np.load(img_path)

热力图与原图简单叠加:

def easy_show(data, heatmap):

plt.figure()

plt.subplot(221)

plt.axis('off')

plt.imshow(data, cmap='bone')

plt.subplot(222)

plt.axis('off')

plt.imshow(heatmap, cmap='rainbow')

plt.subplot(223)

plt.axis('off')

plt.imshow(data, cmap='bone')

plt.imshow(heatmap, cmap='rainbow', alpha=0.7)

plt.subplot(224)

plt.axis('off')

plt.imshow(data, cmap='bone')

plt.imshow(heatmap, cmap='rainbow', alpha=0.3)

plt.savefig(r'E:\study\研究生\笔记\studyNote\others\imgs\tmp.png')

# 使用

heatmap = np.load("CNcam.npy")

img_data = np.load(img_path)

easy_show(img_data[:, 84, :], heatmap[:, 84, :])

图像融合结果:

3. 热力图与原始图融合优化

上面图像融合之后存在的问题是,前景热力图完全遮挡了原图,使得最终的展示图中,原图结构存在模糊。首先对热力图进行优化,使背景颜色变为白色且去掉一些权重过小热力。然后将热力图剩余的部分叠加到原图上。

def img_fusion(img1, img2, save_path):

dpi = 100

save_fig(img1, dpi, "cam.png")

img = Image.open("cam.png")

img = np.array(img)

for i in range(len(img)):

for j in range(len(img[0])):

if img[i][j][0] == 127 and img[i][j][1] == 0 and img[i][j][2] == 255 \

and img[i][j][3] == 255:

img[i][j][:] = 255

save_fig(img2, dpi, "data.png", "bone")

cam_img = cv2.imread("cam.png")

data_img = cv2.imread("data.png")

cam_gray = cv2.cvtColor(cam_img, cv2.COLOR_BGR2GRAY)

rest, mask = cv2.threshold(cam_gray, 80, 255, cv2.THRESH_BINARY)

cam_fg = cv2.bitwise_and(cam_img, cam_img, mask=mask)

dst = cv2.addWeighted(cam_fg, 0.4, data_img, 1, 0)

add_cubic = cv2.resize(dst, (dst.shape[1] * 4, dst.shape[0] * 4), cv2.INTER_CUBIC)

cv2.imwrite(save_path, add_cubic)

使用上面的函数(上面的图像不正,首先向左旋转90°,之后再进行融合):

heatmap = np.load("CNcam.npy")

img_data = np.load(img_path)

heatmap = np.where(heatmap < 0.3, 0, heatmap) * 255

img_data = np.rot90(img_data[:, 84, :], 1) # 向左旋转90度

heatmap = np.rot90(heatmap[:, 84, :], 1)

img_fusion(heatmap, img_data, r'tmp.png')

绘制结果:

java生成png热力图_热力图与原始图像融合相关推荐

  1. java生成pdf方法_详解Java生成PDF文档方法|chu

    最近项目需要实现PDF下载的功能,由于没有这方面的经验,从网上花了很长时间才找到相关的资料.整理之后,发现有如下几个框架可以实现这个功能. 1. 开源框架支持iText,生成PDF文档,还支持将XML ...

  2. java生成缩略图例子_具体介绍java生成缩略图的方法示例代码

    这篇文章主要介绍了java生成缩略图的方法,结合具体实例形式分析了java生成缩略图过程中所涉及的各种常见的图形处理技巧,需要的朋友可以参考下 本文实例讲述了java生成缩略图的方法.分享给大家供大家 ...

  3. Java生成PDF文件_自用

    Java生成PDF文件 一.前言 前几天,做ASN条码收货模块,需要实现打印下载收货报表,经一番查找,选定iText--用于生成PDF文档的一个Java类库.废话不多说,进入正题. 二.iText简介 ...

  4. 灰度图转热力图_热力图(HeatMap)实现

    热力图是数据可视化项目中,比较常用的显示方式.通过颜色变化程度,他可以直观反应出热点分布,区域聚集等数据信息. 屏幕快照 2017-02-10 下午3.45.52.png 项目概述 我们的项目任务是统 ...

  5. java生成电子证书_关于Java:使用Bouncycastle生成数字证书

    经过研究,我确定,为了在Java中以编程方式生成和签署证书,我需要bouncycastle库. 不幸的是,图书馆似乎在最近的某个时候进行了大修. 现在不推荐使用它们的很多类,而我可以找到的所有简单易懂 ...

  6. java生成四则运算表达式_生成四则运算(java实现)

    |博客班级 | https://edu.cnblogs.com/campus/ahgc/AHPU-SE-19/ | |作业要求 | https://edu.cnblogs.com/campus/ahg ...

  7. java 生成pdf 乱码_利用java处理fop导出pdf的中文乱码问题解决方案

    本文的作用是,生成带中文的加密pdf格式的文件,防止被人修改. 在项目下建立docbook-xsl, fo-res, out, sample四个文件夹 docbook-xsl目录: 放从sourcef ...

  8. java生成大素数_用BigInteger实现大素数生成算法

    一.通过素数的基本性质 根据素数的性质(除了1和此整数(n)自身外,无法被其他自然数整除的数):即从2到n/2的数都不能整除n. 1 public static booleanisPrime(BigI ...

  9. java生成iso9660工具_基于数据库的代码自动生成工具,生成JavaBean、生成数据库文档、生成前后端代码等(TableGo v7.0.0版)...

    TableGo_20210212 v7.0.0 正式版发布,此次版本更新如下: 1.新增对DB2数据库的支持 2.新增按字段生成文件,支持把字段.JSON.XML数据转换成任何代码 3.新增大量新的自 ...

  10. 灰度图转热力图_热力图下看区域城市密集度,密集度较高的主要在沿海和省会周边...

    城市是人口聚集的地方,形成城市的区域大多在平原,或者低矮丘陵,即便在山地形成城市,也是在河谷平原地带.一定区域内形成城市的数量,取决于他的地理环境和资源承载能力.在农业社会背景下,可耕种土地的多少,土 ...

最新文章

  1. python线程只能启动一次_python多线程只能运行一个线程的问题
  2. C Primer Plus_第8章_字符输入输出和输入确认_编程练习
  3. 干货 | 一文带你搞定Python 数据可视化
  4. C++:线程操作之CRITICAL_SECTION用法的介绍和例子理解
  5. Codeforces Round #368 (Div. 2) problem: (C) Pythagorean Triples
  6. python---[列表]lsit
  7. 部署php项目到linux
  8. 说说python程序的执行过程_做人,尽量不要说这四种话,一说,祸事就来了
  9. 点评锤子新机外观被前下属骂“厚颜无耻” 罗永浩道歉:希望还来得及补偿
  10. dac生成信号频率取决于_信号发生器和DA转换 FPGA案例教程
  11. python课程开课吧怎么样-廖雪峰总结的Python商业爬虫教程,请查收!
  12. 2017黑客大预言:病毒传播无需文件,无人机可能成为炸弹
  13. java运行环境JDK下载安装配置
  14. html5视频加速播放插件,Video Speed Controller Chrome(HTML5视频加速播放插件) v0.3.2 官方免费版...
  15. Gris 游戏开发-day04
  16. 如何提高深度学习的泛化能力?
  17. ios7版本 控件设置圆角
  18. 解决 Docker Desktop for Mac 下载镜像缓慢的问题
  19. 港科资讯 | 香港首个金融科技行业发展深入研究,就策略,创新及人才培育提出多项建议...
  20. 天地劫幽城再临服务器维护,天地劫幽城再临开服时间是什么时候_天地劫幽城再临开服时间一览_3DM手游...

热门文章

  1. 2021-06-08
  2. 阿里总结的《Java成神之路》 PDF 火了,完整版开放下载!
  3. 万维网联盟:已完成对HTML5的规范开发
  4. 打开Word提示向程序发送命令时出现问题怎么办
  5. 打开Excel2007都提示向程序发送命令时出现问题的解决办法
  6. linux下 fat32转ntfs,NTFS和FAT32区别和转换
  7. 检查压缩包是否损坏_【安全知识】运动安全带检查PPE(个人防护装备)检查程序与表格...
  8. 如何将PS中的图片字体变为黑色
  9. Orinda无线ap
  10. PhpStudy BackDoor 2019漏洞