python可视化热力图_Pytorch可视化神经网络热力图(CAM)

最近在做一个细粒度识别的项目,具体而言是为了做一个特定场景的车辆/车种检测,因为摄像头角度问题,大多时候只有车辆的一部分处于画面内,所以没有走检测的方式,而是尝试了一下通过各种数据增强(主要是裁剪)来指导网络对不同车种车辆的各个部位进行学习,从而指导车种分类以及有无车辆检测,最终达到监控车辆(车种)的目的。

但是因为数据集不大,尽管模型收敛很好,但心里还是没底,担心是过拟合。于是想到可以可视化一下网络的CAM,观察一下指导分类的高响应区域是否落在目标核心部位上。

Class Activation Mapping(CAM)是一个帮助可视化CNN的工具,通过它我们可以观察为了达到正确分类的目的,网络更侧重于哪块区域。比如,下面两幅图,一个是刷牙,一个是砍树,我们根据热力图可以看到高响应区域的确集中在我们认为最有助于作出判断的部位。

其计算方法如下图所示。对于一个CNN模型,对其最后一个featuremap做全局平均池化(GAP)计算各通道均值,然后通过FC层等映射到class score,找出argmax,计算最大的那一类的输出相对于最后一个featuremap的梯度,再把这个梯度可视化到原图上即可。直观来说,就是看一下网络抽取到的高层特征的哪部分对最终的classifier影响更大。

找到了一篇基于Keras的CAM实现,感谢:https://blog.csdn.net/Einstellung/article/details/82858974。但是我还是习惯用Pytorch一点,所以参考着改了一版Pytorch的实现。其中,有一个地方困扰了一下,因为Pytorch的自动求导机制,一般只会保存函数值对输入的导数值,而中间变量的导数值都没有保留,而此处我们需要计算输出层相对于最后一个feature map梯度,所以参考https://blog.csdn.net/qq_27061325/article/details/84728539解决了该问题。

基于Pytorch的CAM计算与绘制,具体代码如下:

#coding: utf-8

import os

from PIL import Image

import torch

import numpy as np

import cv2

import matplotlib.pyplot as plt

def draw_CAM(model, img_path, save_path, transform=None, visual_heatmap=False):

'''

绘制 Class Activation Map

:param model: 加载好权重的Pytorch model

:param img_path: 测试图片路径

:param save_path: CAM结果保存路径

:param transform: 输入图像预处理方法

:param visual_heatmap: 是否可视化原始heatmap(调用matplotlib)

:return:

'''

# 图像加载&预处理

img = Image.open(img_path).convert('RGB')

if transform:

img = transform(img)

img = img.unsqueeze(0)

# 获取模型输出的feature/score

model.eval()

features = model.features(img)

output = model.classifier(features)

# 为了能读取到中间梯度定义的辅助函数

def extract(g):

global features_grad

features_grad = g

# 预测得分最高的那一类对应的输出score

pred = torch.argmax(output).item()

pred_class = output[:, pred]

features.register_hook(extract)

pred_class.backward() # 计算梯度

grads = features_grad # 获取梯度

pooled_grads = torch.nn.functional.adaptive_avg_pool2d(grads, (1, 1))

# 此处batch size默认为1,所以去掉了第0维(batch size维)

pooled_grads = pooled_grads[0]

features = features[0]

# 512是最后一层feature的通道数

for i in range(512):

features[i, ...] *= pooled_grads[i, ...]

# 以下部分同Keras版实现

heatmap = features.detach().numpy()

heatmap = np.mean(heatmap, axis=0)

heatmap = np.maximum(heatmap, 0)

heatmap /= np.max(heatmap)

# 可视化原始热力图

if visual_heatmap:

plt.matshow(heatmap)

plt.show()

img = cv2.imread(img_path) # 用cv2加载原始图像

heatmap = cv2.resize(heatmap, (img.shape[1], img.shape[0])) # 将热力图的大小调整为与原始图像相同

heatmap = np.uint8(255 * heatmap) # 将热力图转换为RGB格式

heatmap = cv2.applyColorMap(heatmap, cv2.COLORMAP_JET) # 将热力图应用于原始图像

superimposed_img = heatmap * 0.4 + img # 这里的0.4是热力图强度因子

cv2.imwrite(save_path, superimposed_img) # 将图像保存到硬盘

表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
相关推荐
<p> <strong><span> </span></strong> </p> <p class="ql-long-16800510"> <span style="color:#333333;"><strong><span style="color:#333333;"> </span></strong></span> </p> <p class="ql-long-24357476"> <span style="color:#E53333;font-size:14px;">每天前100人再送5门编程课!</span> </p> <p class="ql-long-24357476"> <span style="color:#E53333;font-size:14px;">AI+5门300元课程+社群闭门分享会</span> </p> <p class="ql-long-24357476"> <span style="color:#E53333;font-size:14px;">源码开源下载:<a href="https://github.com/DjangoPeng/keras-101/tree/master/code_samples">https://github.com/DjangoPeng/keras-101/tree/master/code_samples</a></span> </p> <p> <br /> </p> <h3 class="ql-long-26664262"> <div class="ql-long-26664262"> <span style="font-size:14px;color:#337FE5;">【为什么学AI】</span> </div> </h3> <p class="ql-long-26664262"> <span style="font-size:14px;">归功于近年来大规模数据和硬件计算能力的大幅度提升,人工智能的概念近两年一直是市场追捧的对象。目前各大厂都争先恐后地布局AI,落地各类AI的的商业应用,也随之打响了一场激烈的人才争夺战。长远来看,越快将 AI 用于自己的工作中就能越早体会到AI带来的收益。</span> </p> <p> <br /> </p> <p> <br /> </p> <p> <strong><span style="font-size:14px;color:#337FE5;">【讲师介绍】</span></strong> </p> <p class="ql-long-16800510"> <span style="font-size:14px;">彭靖田 Google Developer Experts。</span> </p> <p class="ql-long-16800510"> <span style="font-size:14px;">曾为 TensorFlow Top级 的贡献者,著书《深入理解TensorFlow》,是国内第一本深度剖析 Google AI 框架的畅销书。</span> </p> <p class="ql-long-16800510"> <span style="font-size:14px;">曾从0到1深入参与了华为 2012 实验室深度学习平台和华为深度学习云服务的设计与研发工作。</span> </p> <p class="ql-long-16800510"> <br /> </p> <h3 class="ql-long-26664262"> <p> <span style="color:#337FE5;"><span style="font-size:14px;color:#337FE5;">【课程设计】</span></span> </p> </h3> <p class="ql-long-26664262"> <br /> </p> <p class="ql-long-26664262"> <span style="font-size:14px;">课程内容基于最新的Keras版本(你也可以使用 TensorFlow 2 的 tf.keras 模块),其中有大量独家解读、案例,以及不少讲师一线实战多年的方法论和深度思考。同时,在层次划分上,难易兼顾,循序渐进。既有核心的基础知识,也有高级的进阶操作,尽量做到“老少皆宜”。</span> </p> <p class="ql-long-26664262"> <br /> </p> <p class="ql-long-26664262"> <span style="font-size:14px;"><strong>课程分为基础篇、入门篇和实战篇:</strong></span> </p> <p class="ql-long-26664262"> <span style="font-size:14px;"><br /> </span> </p> <p class="ql-long-26664262"> <strong><span style="font-size:14px;">一、基础篇:</span></strong> </p> <p class="ql-long-26664262"> <span style="font-size:14px;">主要讲解人工智能发展史和深度学习脱颖而出的原由,以及神经网络的基础概念、理论实现、优化原理和计算方法。</span> </p> <p class="ql-long-26664262"> <span style="font-size:14px;"><br /> </span> </p> <p class="ql-long-26664262"> <strong><span style="font-size:14px;">二、入门篇:</span></strong> </p> <p class="ql-long-26664262"> <span style="font-size:14px;">主攻快速上手,通过7个小节让你从0到1实现环境搭建、模型优化,直接试水2个实战项目。同时,增强AI的理论学习,系统掌握机器学习3大分支、模型评估方法、数据预处理常用手段与过拟合问题的解决方案。</span> </p> <p class="ql-long-26664262"> <span style="font-size:14px;"><br /> </span> </p> <p class="ql-long-26664262"> <strong><span style="font-size:14px;">三、实战篇:</span></strong> </p> <p class="ql-long-26664262"> <span style="font-size:14px;">通过4个实战全面掌握深度学习理论与实现,涵盖目标检测、图像分类、可视化和可解释性学习、迁移学习、特征提取、数据增强等。带你综合运用前面所学的所有知识,逐渐熟练AI开发流程与技能。</span> </p> <p> <br /> </p> <p> <br /> </p> <p class="MsoNormal"> <br /> </p> <p> <img src="https://img-bss.csdn.net/202002271330419257.png" alt="" /> </p> <p> <span style="font-size:14px;">课程包含思维导图上的所有内容(价值199元)前500名立减100元,仅99元买完就能学!</span> </p>
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页