从CNN(卷积神经网络),又名CAM获取热图

一、说明

卷积神经网络(CNN)令人难以置信。如果你想知道它如何看待世界(图像),有一种方法是可视化它。
这个想法是,我们从最后的密集层中得到权重,然后乘以最终的CNN层。这需要全局平均池化(GAP)才能发挥作用。

二、选择型号

在本教程中,我们将 Keras 与 Tensorflow 和 ResNet50 结合使用。

因为 ResNet50 有一个全局平均池化 (GAP) 层(稍后会解释),所以它适合我们的演示。这很完美。
测试图像

三、热图如何工作

来自CNN的热图,又名类激活映射(CAM)。这个想法是我们收集卷积层的每个输出(作为图像),并将其组合在一个镜头中。(我们稍后会逐步展示代码)
卷积层输出

因此,以下是全局平均池化 (GAP) 或全局最大池化的工作方式(取决于您使用哪个,但它们是相同的想法)。

在一些特征提取后的模型中,我们使用与神经网络的扁平层(完全连接)来预测结果。但这一步就像丢弃图像维度和一些信息。

相比之下,使用全局平均池 (GAP) 或全局最大池 (GMP) 在这里起作用。它保留图像维度信息,并使神经网络决定哪个CNN通道(特征图像)对于预测结果更为关键。

四、示例和代码

让我们从Keras中的ResNet50开始。

ax 复制代码
from tensorflow.keras.applications import ResNet50
res_model = ResNet50()
res_model.summary() 

ResNet-50 摘要

如您所见(上图):

  • 红色:我们将使用此层作为"转移倾斜"。
  • 绿色:全球平均池化(GAP)。这项工作至关重要。

并导入库和图像供以后使用。

ax 复制代码
import cv2
import matplotlib.pyplot as plt
from scipy.ndimage import zoom
from tensorflow.keras.applications.resnet50 import preprocess_input, decode_predictions
img = cv2.imread('./test_cat.png')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
X = np.expand_dims(img, axis=0).astype(np.float32)
X = preprocess_input(X)

我们使用"from scipy.ndimage import zoom"。为了调整由于CNN而调整热图的大小,特征提取图像的形状小于原始图像。

4.1 迁移学习

现在提取我们将使用的图层。
P.S:你可以从头开始训练你的模型,但需要很长时间,特征提取可能也需要大量的调优。

ax 复制代码
from tensorflow.keras.models import Model
conv_output = res_model.get_layer("conv5_block3_out").output
pred_ouptut = res_model.get_layer("predictions").output
model = Model(res_model.input, outputs=[conv_ouptut, pred_layer])

这里我们有两个输出(如上所述,图中的红色部分)。

  • 首先是卷积网络输出
  • 二是预测结果

并做预测

ax 复制代码
conv, pred = model.predict(X)
decode_predictions(pred)

结果如下所示。还不错

ax 复制代码
[[('n02123159', 'tiger_cat', 0.7185241),
  ('n02123045', 'tabby', 0.1784818),
  ('n02124075', 'Egyptian_cat', 0.034279127),
  ('n03958227', 'plastic_bag', 0.006443105),
  ('n03793489', 'mouse', 0.004671723)]]

4.2 输出

现在,让我们看看一些CNN输出。

ax 复制代码
scale = 224 / 7
plt.figure(figsize=(16, 16))
for i in range(36):
    plt.subplot(6, 6, i + 1)
    plt.imshow(img)
    plt.imshow(zoom(conv[0, :,:,i], zoom=(scale, scale)), cmap='jet', alpha=0.3)

CNN 输出

我们首先显示地面图像(plt.imshow(img) ),因此我们可以将其与地面图像进行比较。
(如果你不这样做,会得到这样的结果)
图无背景图像

4.3 输出的一次性组合

这是关键的。我们使用预测结果指数(目标)来获取权重。并乘以每个特征图与权重(点积)

ax 复制代码
target = np.argmax(pred, axis=1).squeeze()
w, b = model.get_layer("predictions").weights
weights = w[:, target].numpy()
heatmap = conv.squeeze() @ weights

然后显示带有地面图像的热图。

ax 复制代码
scale = 224 / 7
plt.figure(figsize=(12, 12))
plt.imshow(img)
plt.imshow(zoom(heatmap, zoom=(scale, scale)), cmap='jet', alpha=0.5)

CNN的热图

这就是我们想要的结果。

五、参考资源

海沌

相关推荐
sduwcgg8 分钟前
kaggle配置
人工智能·python·机器学习
DolphinScheduler社区9 分钟前
白鲸开源与亚马逊云科技携手推动AI-Ready数据架构创新
人工智能·科技·开源·aws·白鲸开源·whalestudio
欣然~38 分钟前
借助 OpenCV 和 PyTorch 库,利用卷积神经网络提取图像边缘特征
人工智能·计算机视觉
白熊1881 小时前
【计算机视觉】CV实战项目 - 基于YOLOv5的人脸检测与关键点定位系统深度解析
人工智能·yolo·计算机视觉
nenchoumi31191 小时前
VLA 论文精读(十六)FP3: A 3D Foundation Policy for Robotic Manipulation
论文阅读·人工智能·笔记·学习·vln
后端小肥肠2 小时前
文案号搞钱潜规则:日入四位数的Coze工作流我跑通了
人工智能·coze
LCHub低代码社区2 小时前
钧瓷产业原始创新的许昌共识:技术破壁·产业再造·生态重构(一)
大数据·人工智能·维格云·ai智能体·ai自动化·大禹智库·钧瓷码
-曾牛2 小时前
Spring AI 快速入门:从环境搭建到核心组件集成
java·人工智能·spring·ai·大模型·spring ai·开发环境搭建
阿川20152 小时前
云智融合普惠大模型AI,政务服务重构数智化路径
人工智能·华为云·政务·deepseek
自由鬼2 小时前
开源AI开发工具:OpenAI Codex CLI
人工智能·ai·开源·软件构建·开源软件·个人开发