如何高亮图像中使神经网络将其分类为新冠肺炎的特征区域
类激活区域高亮相关技术说明
对应技术名称
你要找的是计算机视觉可解释AI领域的类激活映射(Class Activation Mapping,简称CAM) 系列技术,专门用于定位卷积神经网络在做出某一类别的分类决策时,重点参考的图像区域。
常用的适配Keras模型的变种有以下几种:
- 基础CAM:仅支持最后一层连接全局平均池化(GAP)的分类模型,无需修改训练好的模型即可直接生成激活热力图
- Grad-CAM:适用所有卷积分类模型,不需要模型包含GAP层,是目前使用最广泛的类激活区域生成方案,完全适配你的三分类场景
- Grad-CAM++:优化了Grad-CAM在多目标、小目标场景下的定位精度,同样可以直接用于你的任务
Keras环境实现思路
你可以直接在tf.keras框架下调用Grad-CAM,核心实现逻辑如下:
- 从你训练好的模型中提取出最后一层卷积层的输出,以及新冠肺炎对应分类类别的输出值
- 计算新冠类别输出相对于最后一层卷积层特征图的梯度
- 对梯度做全局平均池化得到每个特征通道的权重
- 用权重加权求和所有特征通道,经过ReLU激活后缩放到原始图像尺寸,即可得到激活热力图
- 将热力图与原始图像叠加,就能得到高亮的模型响应区域
核心代码参考
import tensorflow as tf from tensorflow import keras import numpy as np # 加载你训练好的三分类模型 model = keras.models.load_model("your_trained_model.h5") # 替换为你的模型最后一层卷积层的名称,可通过model.summary()查询 last_conv_layer = model.get_layer("last_conv_layer_name") # 替换为新冠类别对应的标签索引,和你训练时的标签顺序保持一致 COVID_CLASS_IDX = 2 # 构建梯度计算模型 grad_model = keras.Model( inputs=model.inputs, outputs=[last_conv_layer.output, model.output] ) # 输入为预处理后的图像张量,shape为(1, img_height, img_width, 3) with tf.GradientTape() as tape: conv_output, preds = grad_model(preprocessed_img_tensor) # 仅保留新冠类别的输出值 target_class_output = preds[:, COVID_CLASS_IDX] # 计算梯度 grads = tape.gradient(target_class_output, conv_output) # 全局平均池化得到通道权重 pooled_grads = tf.reduce_mean(grads, axis=(0, 1, 2)) # 加权求和得到热力图 heatmap = conv_output[0] @ pooled_grads[..., tf.newaxis] heatmap = tf.squeeze(heatmap) # 归一化热力图到0-1区间 heatmap = tf.maximum(heatmap, 0) / tf.math.reduce_max(heatmap) heatmap = heatmap.numpy()
内容的提问来源于stack exchange,提问作者Raul Rzayev
相关产品推荐
相关产品推荐

