本篇主要介绍基于类激活映射(Class Activation Mapping, CAM)的热度图绘制

算法原理出自论文: Learning Deep Features for Discriminative Localization

框架结构如下图所示:

作者在文中指出当前网络中普遍使用的GAP层,能够有效的反映目标物体周围的

特征;故作者采用了全连接层的特征来与CNN 网络的最后一个卷积层进行点乘运

算,用以增加feature map中目标物体的权重。

具体代码如下:

# simple implementation of CAM in PyTorch for the networks such as ResNet, DenseNet, SqueezeNet, Inceptionimport io
import requests
from PIL import Image
from torchvision import models, transforms
from torch.autograd import Variable
from torch.nn import functional as F
import numpy as np
import cv2
import pdb# input image
LABELS_URL = 'https://s3.amazonaws.com/outcome-blog/imagenet/labels.json'
IMG_URL = 'http://media.mlive.com/news_impact/photo/9933031-large.jpg'# networks such as googlenet, resnet, densenet already use global average pooling at the end, so CAM could be used directly.
model_id = 1
if model_id == 1:net = models.squeezenet1_1(pretrained=True)finalconv_name = 'features' # this is the last conv layer of the network
elif model_id == 2:net = models.resnet18(pretrained=True)finalconv_name = 'layer4'
elif model_id == 3:net = models.densenet161(pretrained=True)finalconv_name = 'features'net.eval()# hook the feature extractor
features_blobs = []
def hook_feature(module, input, output):features_blobs.append(output.data.cpu().numpy())net._modules.get(finalconv_name).register_forward_hook(hook_feature)# get the softmax weight
params = list(net.parameters())
weight_softmax = np.squeeze(params[-2].data.numpy())def returnCAM(feature_conv, weight_softmax, class_idx):# generate the class activation maps upsample to 256x256size_upsample = (256, 256)bz, nc, h, w = feature_conv.shapeoutput_cam = []for idx in class_idx:cam = weight_softmax[idx].dot(feature_conv.reshape((nc, h*w)))cam = cam.reshape(h, w)cam = cam - np.min(cam)cam_img = cam / np.max(cam)cam_img = np.uint8(255 * cam_img)output_cam.append(cv2.resize(cam_img, size_upsample))return output_camnormalize = transforms.Normalize(mean=[0.485, 0.456, 0.406],std=[0.229, 0.224, 0.225]
)
preprocess = transforms.Compose([transforms.Resize((224,224)),transforms.ToTensor(),normalize
])response = requests.get(IMG_URL)
img_pil = Image.open(io.BytesIO(response.content))
img_pil.save('test.jpg')img_tensor = preprocess(img_pil)
img_variable = Variable(img_tensor.unsqueeze(0))
logit = net(img_variable)# download the imagenet category list
classes = {int(key):value for (key, value)in requests.get(LABELS_URL).json().items()}h_x = F.softmax(logit, dim=1).data.squeeze()
probs, idx = h_x.sort(0, True)
probs = probs.numpy()
idx = idx.numpy()# output the prediction
for i in range(0, 5):print('{:.3f} -> {}'.format(probs[i], classes[idx[i]]))# generate class activation mapping for the top1 prediction
CAMs = returnCAM(features_blobs[0], weight_softmax, [idx[0]])# render the CAM and output
print('output CAM.jpg for the top1 prediction: %s'%classes[idx[0]])
img = cv2.imread('test.jpg')
height, width, _ = img.shape
heatmap = cv2.applyColorMap(cv2.resize(CAMs[0],(width, height)), cv2.COLORMAP_JET)
result = heatmap * 0.3 + img * 0.5
cv2.imwrite('CAM.jpg', result)

运行结果:

    

Pytorch 中 CAM绘制热度图相关推荐

  1. python绘制热度图(heatmap)

    1.简单的代码 from matplotlib import pyplot as plt import seaborn as sns import numpy as np import pandas ...

  2. python生成热度图_Python 绘制热度图(seaborn)

    原博文 2020-05-08 15:16 − 进行数据处理时,对于数据的可视化展示可以更好的表现数据的关系 论文中,漂亮的热度图会让人眼前一亮 Seaborn 中的 heatmap就可以用来创建热度图 ...

  3. 星座图matlab是什么意思,matalb中画星座图 matlab中怎么绘制星座图

    看看这个程序是否符合你的要求:按下鼠标左键开始绘制一个星座图,点击右键结束当前星座 function xingzuo figure('WindowButtonDownFcn',@wbdcb) ah = ...

  4. EA中如何绘制泳道图

    在EA工具使用过程中根据业务需要,有的时候我们需要绘制泳道图,针对系统不同的角色,进行不同的操作进行说明,本文将分享经验,如何利用EA工具绘制泳道图. 工具/原料 EA(Enterprise Arch ...

  5. java sin函数图像_java中怎样绘制正弦函数图象

    展开全部 一下32313133353236313431303231363533e4b893e5b19e31333361326238为一个代码示例import javax.swing.*; import ...

  6. python生成热度图_Python - 场景热力图绘制[转]

    在做诸如人群密集度等可视化的时候,可能会考虑使用热力图,在Python中能很方便地绘制热力图. 以识别图片中的行人,并绘制热力图为例. 步骤1:首先识别图像中的人,得到bounding box的中心坐 ...

  7. 【MATLAB】基本绘图 ( 绘制多图 | 设置图形对话框在 Windows 界面的位置和大小 | 在一个图形上绘制多个小图形 )

    文章目录 一.绘制多图 1.绘制多图 2.代码示例 二.设置图形对话框在 Windows 界面的位置和大小 三.在一个图形上绘制多个小图形 一.绘制多图 1.绘制多图 存在一种绘图情况 , 需要同时展 ...

  8. Python可视化 | Matplotlib绘制圆环图的两种方法!

    人生苦短,快学Python!今天给大家介绍Python可视化之环形图的绘制. 环形图,也被称为圆环图.它在功能上与饼图相同,只是中间有一个空白,并且能够同时支持多个统计数据.与标准饼图相比,环形图提供 ...

  9. python 日历热力图_Python绘制日历图和热力图

    本文以2019年全国各城市的空气质量观测数据为例,利用matplotlib.calmap.pyecharts绘制日历图和热力图.在绘图之前先利用pandas对空气质量数据进行处理. 2019年全国各城 ...

最新文章

  1. HTML5CANVAS画布教程
  2. android 生成签名命令
  3. FTP匿名用户的配置
  4. 计算机生物学美国直博,毕业生说 | 生物学全奖直博女生,遍访名校书写芳华
  5. 1088 最长回文子串
  6. SpringBoot基础重难点
  7. [Python图像处理] 四.图像平滑之均值滤波、方框滤波、高斯滤波及中值滤波
  8. echarts formatter鼠标悬停显示信息
  9. 上新了三星堆!“金面具”网友P图大赛又双叒开始了……
  10. python使用协程实现udp_python-socket和进程线程协程(代码展示)
  11. IP和网段及子网掩码基础知识
  12. JDK 动态代理与 CGLIB 动态代理,它俩真的不一样
  13. java与can总线开发_CANdbc编辑器的下载和入门介绍
  14. leetcode *1818. 绝对差值和(2021.7.14)
  15. 农林牧渔行业S2B2C系统网站提升品牌知名度,提升盈利水平
  16. 大疆FPGA/芯片开发工程师(B卷)笔试题(含详解)
  17. mysql存储手机号
  18. python并发编程之semaphore(信号量)_python 之 并发编程(守护进程、互斥锁、IPC通信机制)...
  19. java maincase 电影票的售卖与购买 day10-11
  20. (信贷风控十五)评分卡分数切分、授信额度与利率定价

热门文章

  1. 华为畅享6怎么找回计算机,华为荣耀畅玩6双清解屏幕锁格机恢复出厂设置方法...
  2. tcp communication btw c# and C++
  3. win10蓝屏代码:BAD_SYSTEM_CONFIG_INFO
  4. Day4 管理用户和组、tar备份与恢复、crom计划
  5. apk 反编译工具和方法
  6. opencv HoughLine 理解
  7. 简单抽奖软件java程序设计
  8. 为什么比尔·盖茨可以有大成就?
  9. (附源码)springboot球鞋文化交流论坛 毕业设计 141436
  10. 标准曲线制作、SEM检验、使用知识大全