这段代码的步骤大致如下:

1.处理单张图作为网络的输入。
2.根据给定的layer层,获取该层输出结果features。
3.考虑到features的形状为[batch_size, filter_nums, H, W],提取其中第一个过滤器得到的结果的feature。
4.以一张图作为输入的情况下,我们得到的feature即为[H,W]大小的tensor
5.将tensor转为numpy,然后归一化[0,1],最后乘以255,使得范围为[0,255]
6.得到灰度图像保存。

————————————————————————————————

import cv2
import numpy as np
import torch
from torch.autograd import Variable
from torchvision import modelsdef preprocess_image(cv2im, resize_im=True):"""Processes image for CNNsArgs:PIL_img(PIL_img):Image to processresize_im(bool):Resize to 224 or not:return:im_as_var(Pytorch variable):Variable that contains processed float tensor"""# mean and std list for channels (ImageNet)mean = [0.485, 0.456, 0.406]std = [0.229, 0.224, 0.225]# Resize imageif resize_im:cv2im = cv2.resize(cv2im, (224, 224))im_as_arr = np.float32(cv2im)im_as_arr = np.ascontiguousarray(im_as_arr[..., ::-1])im_as_arr = im_as_arr.transpose(2, 0, 1)  # Convert array to D,W,H# Normalize the channelsfor channel, _ in enumerate(im_as_arr):im_as_arr[channel] /= 255im_as_arr[channel] -= mean[channel]im_as_arr[channel] /= std[channel]# Convert to float tensorim_as_ten = torch.from_numpy(im_as_arr).float()# Add one more channel to the beginning. Tensor shape =1,3,224,224im_as_ten.unsqueeze(0)# Convert to Pytorch variableim_as_var = Variable(im_as_ten, requires_grad=True)return im_as_varclass FeatureVisualization():def __init__(self, img_path, selected_layer):self.img_path = img_pathself.selected_layer = selected_layerself.pretrained_model = models.vgg16(pretrained=True).featuresdef process_image(self):img = cv2.imread(self.img_path)img = preprocess_image(img)return imgdef get_feature(self):# input = Variable(torch.randn(1, 3, 224, 224))input = self.process_image()x = inputx = x.unsqueeze(0)for index, layer in enumerate(self.pretrained_model):x = layer(x)if (index == self.selected_layer):return xdef get_single_feature(self):features = self.get_feature()# print("get_single_features: ", features.shape)feature = features[:, 0, :, :]# print("get_single_feature: ", feature.shape)feature = feature.view(feature.shape[1], feature.shape[2])return featuredef save_feature_to_img(self, i):# to numpyfeature = self.get_single_feature()feature = feature.data.numpy()# use sigmod to [0,1]feature = 1.0 / (1 + np.exp(-1 * feature))# to [0,255]feature = np.round(feature * 255)print("ok feature.shape: ", feature.shape)cv2.imwrite(str(i) + ".jpg", feature)if __name__ == "__main__":for i in range(30):myClass = FeatureVisualization("31.jpg", i)# print(myClass.pretrained_model)myClass.save_feature_to_img(i)

原图如下


—————————————————————————————————

可视化结果如下

第1层

—————————————————————————————————
第2层

—————————————————————————————————
第3层

—————————————————————————————————
第4层
—————————————————————————————————
第5层
—————————————————————————————————
第6层

—————————————————————————————————
第7层
—————————————————————————————————
第8层
—————————————————————————————————
第9层
—————————————————————————————————
第10层
—————————————————————————————————
第11层
—————————————————————————————————
第12层
—————————————————————————————————
第13层
—————————————————————————————————
第14层
—————————————————————————————————
第15层

—————————————————————————————————
第16层
—————————————————————————————————
第17层

—————————————————————————————————
第18层

—————————————————————————————————
第19层
—————————————————————————————————
第20层
___________________________________________________________
第21层
___________________________________________________________

第22层
—————————————————————————————————
第23层

—————————————————————————————————
第24层

—————————————————————————————————
第25层

—————————————————————————————————
第26层

—————————————————————————————————
第27层

—————————————————————————————————
第28层

—————————————————————————————————
第29层

—————————————————————————————————
第30层

—————————————————————————————————

计算机视觉可解释性——卷积神经网络中间层的可视化相关推荐

  1. 卷积神经网络特征图可视化(自定义网络和VGG网络)

    借助Keras和Opencv实现的神经网络中间层特征图的可视化功能,方便我们研究CNN这个黑盒子里到发生了什么. 自定义网络特征可视化 代码: # coding: utf-8from keras.mo ...

  2. 计算机视觉学习10_LeNet_卷积神经网络_Mnist数据集分析

    文章目录 原理部分 LeNet5 数据与实验可视化 匹配结果分析 个人数据匹配 代码节选 原理部分 卷积神经网络参考:https://my.oschina.net/u/876354/blog/1620 ...

  3. 【深度学习】cs231n计算机视觉 CNN(卷积神经网络)

    CNN(卷积神经网络)理论知识 完成课程笔记:Convolutional Neural Networks for Visual Recognition的理解,便于实现CNN~ 1. 结构概述 卷积神经 ...

  4. 大数据分析和计算机视觉笔记 (8) - 卷积神经网络图像分析(Convolution Neural Network Image Analytic)

    深度学习 - 卷积神经网络 图片分析步骤 视觉词袋法流程 (Bag-of-Visual-Word) 深度学习 (Deep Learning) 神经网络知识背景 其他名词 损失函数(loss funct ...

  5. 谈谈怎么可以得到显著性图 特征图 featuremap 深度学习的可解释性 卷积神经网络表征可视化研究综述

    特征图 显著性图很重要 图 对应的原始图形的数据 然后可以进行显著性图和特征图的显示研究 上面是一个特诊图cost time: 99.35089445114136 Duration: 0.07 sec ...

  6. 卷积神经网络特征图可视化及其意义

    文章目录 特征图可视化方法 1. tensor->numpy->plt.save 2. register_forward_pre_hook函数实现特征图获取 3. 反卷积可视化 特征图可视 ...

  7. 卷积神经网络特征图可视化热图可视化

    文章目录 前言 一.可视化特征图 二.热力图可视化(图像分类) 总结 前言 使用pytorch中的钩子将特征图和梯度勾出来,从而达到可视化特征图(featuremap)和可视化热图(heatmap)的 ...

  8. 二、ZFNet可视化卷积神经网络——可解释性机器学习(DataWhale组队学习)

    目录 引言 ZFNet的网络结构 可视化反卷积 反池化 反激活 反卷积 训练细节 特征可视化 特征演化 特征不变性 局部遮挡测试 敏感性分析 相关性分析 消融实验 宽度影响 深度影响 迁移学习能力 有 ...

  9. CVPR 2019 | 基于可解释性以及细粒度的可视化解释卷积神经网络

    作者丨张彪 学校丨北京交通大学硕士生 研究方向丨卷积神经网络的内部可视化(可解释性) 研究目的 卷积神经网络(CNN)已经被证明在许多视觉基准测试上产生了最先进的结果,尽管如此,CNN 的黑盒特性使得 ...

  10. 关于卷积神经网络可视化的一点心得

    1.具体的内容我就不展开了,我只说说,在可视化方面,我们需要知道些什么? (1)什么是可视化 (2)为什么要可视化 (3)有哪些可视化工具可以使用 (4)卷积神经网络为什么要可视化 (5)卷积神经网络 ...

最新文章

  1. java aio_java中的AIO
  2. opencv亚像素点检测
  3. IPv4的核心管理功能/proc/sys/net/ipv4/*
  4. PHP在WPS中的应用,PHP+Laravel的简单应用教程【ajax的使用】,wps的使用教程
  5. python 测试mysql数据库_Python操作MySQL数据库----继续安装和测试
  6. 你知道技术委员会吗?嗯,一个既重要却又鸡肋的神秘组织
  7. jbpm 和 drools_Drools和jBPM KIE A​​pps平台
  8. react学习(53)--传参payload
  9. 连接 Windows 防火墙
  10. 云大计算机昆工,云南最好的7所大学,分3档!本地人青看中昆医大,外省更爱昆工!...
  11. Logitech Control Center 3.9.8 特别版 Mac 罗技USB键盘和鼠标管理软件
  12. EPLAN小知识——如何在西门子(SIEMENS)官网下载EDZ部件
  13. 关于为什么不能减小rb来消除截止失真
  14. Bandizip安装教程
  15. java jmf实现本地视频播放_Java的JMF实现视频播放器
  16. 解决oracle异常ORA-01012: not logged on
  17. 网络分布视频技术与盈利性视频站点技术
  18. vcg函数值_几个经典的数学库之一学习---VCGlib(2)
  19. QueryRunner中query方法
  20. 【BZOJ5314】【JSOI2018】—潜入行动(树形dp)

热门文章

  1. LTE-5G学习笔记14--VoLTE常用12大知识点
  2. 【- Light 计划 -】新建了一台Linux云服务器我该干嘛
  3. NLP - 词法分析
  4. 2019-11软考报名网站汇总,陆续更新
  5. 一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只。这样他经过了七个村子后还剩两只鸭子,问他出发时共赶多少只鸭子?经过每个村子卖出多少只鸭子以及角谷定理的计算
  6. linux查看m2网卡驱动,求助 华硕P5M2-E的千兆网卡驱动如何安装?
  7. rust大量科技零件_20世纪的黑科技有上万个零件,复杂程度10个人9个看不懂!
  8. 深入浅出VA函数的使用技巧
  9. 在本地运行scala程序报错 requirement failed: Can only call getServletHandlers on a running MetricsSystem
  10. 测试开发工作者日记:2020.6.10-6.11