什么是类激活图?
类激活图(Class Activation Map,CAM)是一种用于可视化深度学习模型在图画中感兴趣区域的技能。它一般与卷积神经网络(Convolutional Neural Networks,CNN)结合运用。CAM 能够协助理解模型在图画分类任务中的决议计划进程,显示模型以为关于某个特定类别的分类而言,图画中哪些区域是要害的。具体来说,经过类激活图,咱们能够看到模型在进行分类时对图画的不同部分给予了不同的注意力。 直接看作用图:
怎么获取类激活图?
1. 练习模型,提取特征
首先,你需要练习一个卷积神经网络(CNN)模型,保证模型在练习集上学到了有用的特征表明。接着,在模型结构中挑选一个卷积层,该层的输出将包含输入图画的特征图,这一般是在网络的最后几个卷积层之一。 本文挑选选用ResNet50作为主干网络,并经过屡次实验发现,第四层即网络的最后一层的特征图作用最佳。以下是简略的流程和代码示例:
# 读取图片
img = Image.open(img_path).convert('RGB')
# 预处理,transform只是调整img的巨细以及将其转为张量
img_tensor = transform(img)
# 添加批次维度,因为是单张图片
img_tensor = img_tensor.unsqueeze(0) # 维度:[C,H,W] ---> [B,C,H,W]
# 创建模型
model = build_model(cfg)
# 获取特征图
feature_map = model(img_tensor)
2. 核算类激活图:
针对给定的类别,咱们需要核算与该类别对应的特征图的权重。一般,这能够经过大局平均池化(Global Average Pooling)来实现。具体来说,关于每个特征图,核算其所有元素的平均值,然后将这个平均值与相应的权重相乘,得到每个特征图的权重。最终,将所有特征图按照它们的权重进行加权求和,得到最终的类激活图。以下是相应的代码示例:
#大局平均池化、展平
feat = model.gap(feature_map)
feat = feat.view(feat.shape[0], -1)
# 核算类别概率
output = model.classifier(feat)
# 获取最相关类别的索引和权重
_, class_index = output.max(1)
weight = model.classifier.weight[class_index[0]]
# 运用权重对特征图进行加权求和
cam = feature_map[0] * weight[:, None, None]
# 沿着第一个轴对 cam 进行求和
cam = cam.sum(axis=0)
# 应用ReLU激活并进行归一化,得到最终的类激活图
cam = F.relu(cam)
cam = (cam - cam.min()) / (cam.max() - cam.min())
3. 可视化:
将得到的类激活图叠加到原始图画上,能够运用热图(heatmap)来表明不同区域的重要性。这样,就能够看到模型关于特定类别的决议计划是依据图画的哪些区域。代码如下:
def show_cam(img_path, cam):
# 用cv2加载原始图画
img = cv2.imread(img_path)
# 将cam从核算图中别离(不会影响后续梯度的核算)并转化为NumPy数组,重命名为heatmap
heatmap = cam.detach().numpy()
# 调整图画和CAM的巨细。因为前面临图画的预处理是将图片调整为(256,256)
img = cv2.resize(img, (256, 256))
heatmap = cv2.resize(heatmap, (256, 256))
heatmap = np.uint8(255 * heatmap) # 将热力求转化为RGB格局
heatmap = cv2.applyColorMap(heatmap, cv2.COLORMAP_JET) # 将灰度热力求转化为彩色热力求
heatmap = cv2.cvtColor(heatmap, cv2.COLOR_BGR2RGB) # 转化颜色映射
# 图画混合,依据具体作用调整参数
result = cv2.addWeighted(heatmap, 0.4, img, 0.6, 0)
# 制作
plt.imshow(result) # 运用默认颜色映射
plt.xticks([]) # 禁用 x 轴刻度
plt.yticks([]) # 禁用 y 轴刻度
plt.show()
总结
以上是单张图片获取类激活图的进程,仅供参考。假如处理一个批次的图片,再做相应调整。
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。