在背景图像上绘制神经网络中权重的热图

时间:2019-01-27 06:18:41

标签: python-3.x matplotlib deep-learning conv-neural-network seaborn

我有这个问题来展示给我的原始图像,以便以原始图像在背景中且分配的权重以海洋热图形式显示的方式进行可视化。

示例热图图片: enter image description here

我发现了一些使用混淆矩阵可视化的答案,但是权重始终是另一回事。

我还要问的是,是否有可能以这样的方式可视化图像,就好像图像是28x28一样,3x3的重量怎么能覆盖整个图像呢?

1 个答案:

答案 0 :(得分:1)

我假设您的热图来自网络中卷积层的要素图,并且您想使用诸如CAM(类激活图)或grad-CAM(梯度加权类激活图)之类的技术)。

假设您已将卷积特征图转换为14x14 numpy数组的热图,并且要将其覆盖在256x256像素的图像上。热图包含介于0和1之间的float32数字。其想法是首先使用opencv将14x14功能图上采样到256x256,例如:

import cv2
import matplotlib.pyplot as plt

img = cv2.imread('./my-image.png')
# Resize the heatmap
heatmap = cv2.resize(heatmap, (img.shape[0], img.shape[1]))
# Convert dtype to uint8
heatmap = np.uint8(255 * heatmap)
# Overlay the heatmap on the image
heatmap = cv2.applyColorMap(heatmap, cv2.COLORMAP_RAINBOW)
result = cv2.addWeighted(img, 0.6, heatmap, 0.4, 0)

您可以使用matplotlib绘制结果:

fig, ax = plt.subplots()
ax.imshow(result)

这是纯matplotlib解决方案,而不是无用的解决方案。 Seaborn主要提供matplotlib包装器,因此您应该可以从这里获取它。有关完整的grad-cam示例(以及此答案的源代码),可以refer to this blogpost