基于vgg16网络的特征图可视化

参考:
https://blog.csdn.net/qq_44442727/article/details/112977805
https://blog.csdn.net/random_repick/article/details/115526700
https://blog.csdn.net/weixin_39450145/article/details/104801730

一、设备及环境
win7
anaconda3 2019.03(Python 3.7.3 64-bit)
PyCharm 2021.1.3

二、遇到过的问题
1、import cv2出错ModuleNotFoundError: No module named ‘cv2’

解决:
pip install opencv-python (如果只用主模块,使用这个命令安装)
pip install opencv-contrib-python (如果需要用主模块和contrib模块,使用这个命令安装)

pip list查看已有包
在这里插入图片描述
2、运行报错

在这里插入图片描述
解决:查看发现只存在D:\PycharmProjects\pythonProject2路径,因此手动在pythonProject2文件夹中新建文件夹fm,fm中新建名称为2的文件夹。

运行成功
在这里插入图片描述

三、完整代码

import torch
from torchvision import models, transforms
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
import scipy.misc
import cv2, imageio
 
 
# 将输入图片转化为卷积运算格式tensor数据
def transfer_image(image_dir):
    # 以RGB格式打开图像
    # Pytorch DataLoader就是使用PIL所读取的图像格式
    # 建议就用这种方法读取图像,当读入灰度图像时convert('')
    image_info = Image.open(image_dir).convert('RGB')
    # 数据预处理方法
    image_transform = transforms.Compose([
        transforms.Resize(1024),#放缩图片大小至1024*1024
        transforms.CenterCrop(672),#从图象中间剪切672*672大小
        transforms.ToTensor(),#将图像数据转化为tensor
        transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])#归一化处理
    ])
    image_info = image_transform(image_info)#更新载入图像的数据格式
    #下面这部分是tensor张量转化为图片的过程,opencv画图和PIL、torch画图方式
    # array1 = image_info.numpy()
    # maxvalue = array1.max()
    # array1 = array1*255 / maxvalue
    # mat = np.uint8(array1)
    # print('mat_shape',mat.shape)
    # mat = mat.transpose(1,2,0)
    # cv2.imwrite('convert_cocomi1.jpg',mat)
    # mat=cv2.cvtColor(mat,cv2.COLOR_BGR2RGB)
    # cv2.imwrite('convert_cocomi2.jpg',mat)

    image_info = image_info.unsqueeze(0)#增加tensor维度,便于卷积层进行运算
    return image_info
 
# 获取第k层的特征图
def get_k_layer_feature_map(feature_extractor, k, x):
    with torch.no_grad():
   		 #feature_extractor是特征提取层,后面可以具体看一下vgg16网络
        for index,layer in enumerate(feature_extractor):
            x = layer(x)#x是输入图像的张量数据,layer是该位置进行运算的卷积层,就是进行特征提取
            # print('k values:',k)
            # print('feature_extractor layer:',index)
            if k == index:#k代表想看第几层的特征图
          
                return x
 
#  可视化特征图
def show_feature_map(feature_map, k):
    feature_map = feature_map.squeeze(0)#squeeze(0)实现tensor降维,开始将数据转化为图像格式显示
    feature_map = feature_map.cpu().numpy()#进行卷积运算后转化为numpy格式
    feature_map_num = feature_map.shape[0]#特征图数量等于该层卷积运算后的特征图维度
    # row_num = np.ceil(np.sqrt(feature_map_num))
    # plt.figure()
    for index in range(1, feature_map_num+1):
        fw = np.int64(feature_map[index-1] > 0)
        imageio.imwrite("fm/"+str(k)+'/'+str(index)+".png", fw)
    # plt.show()
 

if __name__ ==  '__main__':
    # 初始化图像的路径
    image_dir = 'images/hw.jpg'
    # 定义提取第几层的feature map
    k = 2
    # 导入Pytorch封装的vgg16网络模型
    model = models.vgg16(pretrained=False)
    # 是否使用gpu运算
    use_gpu = torch.cuda.is_available()
    use_gpu =False
    # 读取图像信息
    image_info = transfer_image(image_dir)
    # 判断是否使用gpu
    if use_gpu:
        model = model.cuda()
        image_info = image_info.cuda()
    # vgg16包含features和classifier,但只有features部分有特征图
    # classifier部分的feature map是向量
    feature_extractor = model.features
    feature_map = get_k_layer_feature_map(feature_extractor, k, image_info)
    show_feature_map(feature_map, k)

四、以下内容是粘贴别人的,暂时先放着,等我理解了再回来改

首先是一张三通道的彩色图像进入卷积层,进行运算的时候,图像是分成三个通道单独进行卷积操作再相加得到特征图,经过第一层卷积层时,有64个卷积核(人为设置),与每一个卷积核运算都会产生一张特征图,这时,一张图像的输出就变成了64维的特征图,就是64张特征图,并以tensor的形式流动,后续的卷积池化都是这个原理。
有时一次处理多张图片时,tensor的形式又会有新变化,大家可以看这个:mini-batch批处理https://blog.csdn.net/qq_44442727/article/details/112972167
进行卷积运算后,特征图仍然以张量的形式存在,要想特征图可视化,就要将tensor转化为numpy形式可以让cv库画出来。这些可以从贴出代码去理解,具体画图方式的区别是:opencv支持的图像数据是numpy格式,数据类型为uint8,像素值分布在[0,255], 但是tensor数据像素值并不是分布在[0,255],且数据类型为float32,所以需要做一下normalize和数据变换,将图像数据扩展到[0,255]。还有一点是tensor和numpy存储的数据维度顺序不同,需要transpose进行转化对应。还有是opencv中的颜色通道顺序是BGR而PIL、torch里面的图像颜色通道是RGB,利用cvtColor对颜色通道进行转换。

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: VGG16是一个非常流行的深度卷积神经网络,用于像识别和分类任务。它由Simonyan等人在2014年首次提出,这个模型具有16个卷积层和3个完全连接层,这些层被认为是非常深的网络结构。在Matlab中,要使用VGG16模型,就需要使用深度学习工具箱的模型库,在这个库中可以找到vgg-16网络的支持。这意味着,如果想要在Matlab中实现VGG16模型,需要在深度学习工具箱中安装vgg-16网络的支持包。这个支持包提供了VGG16网络的预训练模型,可以用于像分类任务和其他深度学习应用。因此,这个支持包非常重要,是使用VGG16网络的必要条件。总的来说,VGG16是一个非常强大的深度卷积神经网络,在Matlab中使用需要深度学习工具箱的模型库的支持。 ### 回答2: VGG16是一种经典的卷积神经网络模型,它适用于像分类、目标检测等深度学习任务。在MATLAB中使用VGG16网络时,需要首先安装“深度学习工具箱”模型以便提供VGG16网络的支持。 深度学习工具箱是MATLAB中的一个重要工具,它包含了许多深度学习算法和网络模型的实现,用户可以通过这个工具箱灵活地搭建、训练和测试自己的深度学习模型。而VGG16模型正是深度学习工具箱提供的其中一种预定义网络模型。 在安装了深度学习工具箱后,用户可以通过简单的命令来加载预训练好的VGG16模型,该模型可以在不同的像数据集上进行微调,以更好地适应用户自己的任务。此外,深度学习工具箱还提供了大量的像处理函数,例如数据增强、卷积层可视化特征可视化等,可以帮助用户更好地了解和优化自己的深度学习模型。 总之,VGG16需要深度学习工具箱模型的支持,在MATLAB中使用VGG16网络时需要先安装并加载该模型,并结合其他像处理函数进行模型训练和优化。 ### 回答3: vgg16是深度学习中常用的卷积神经网络模型,在使用时需要使用深度学习工具箱配合使用,以支持vgg16网络。深度学习工具箱是基于MATLAB编写的一款深度学习工具,该工具箱提供了许多深度学习模型的支持,包括vgg16等经典模型。使用深度学习工具箱可以简化模型实现的步骤,使得深度学习的实现更加便捷和高效。 在使用vgg16模型时,需要先在深度学习工具箱中将模型加载进入MATLAB环境中,然后再进行训练和测试操作。深度学习工具箱提供的vgg16模型支持包括了许多经典的网络层,如卷积层、池化层、全连接层等,同时还提供了一些预训练好的模型参数,使得模型的训练和调整更加方便。 除了vgg16,深度学习工具箱还支持其他许多深度学习模型,如AlexNet、ResNet等,使用起来也十分方便。如果想要进行深度学习的开发和研究,深度学习工具箱是一个十分不错的选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值