有效感受野可视化学习

有效感受野可视化

  • 过程记录
    • 创建环境
    • 准备数据、脚本
    • 脚本测试
  • 其他参考
    • 尝试运行

过程记录

创建环境

conda create -n ERF python=3.8 -y
conda activate ERF
pip3 install empy rospkg pyyaml catkin_pkg
conda install pytorch==2.1.0 torchvision==0.16.0 torchaudio==2.1.0 pytorch-cuda=11.8 -c pytorch -c nvidia
pip3 install numpy opencv-contrib-python

准备数据、脚本

创建ERF_VIS目录,管理项目,根目录下创建test_imgs目录管理测试图片。
根目录下创建脚本ERF_visualizetion.py(参考代码):

import warnings
warnings.filterwarnings('ignore')
warnings.simplefilter('ignore')
from torchvision.models.segmentation import deeplabv3_resnet50
import torch
from torchvision import transforms
import numpy as np
import torchvision
from PIL import Image
import cv2
import os
#这里随机拿100张测试集图像,放到一个文件夹中,img_dir是文件夹路径
img_dir = "./test_imgs"
images=os.listdir(img_dir)
model = deeplabv3_resnet50(pretrained=True, progress=False)
model = model.eval()
#定义输入图像的长宽,这里需要保证每张图像都要相同
input_H, input_W = 512, 512
#生成一个和输入图像大小相同的0矩阵,用于更新梯度
heatmap = np.zeros([input_H, input_W])
#打印一下模型,选择其中的一个层
print(model)#这里选择骨干网络的最后一个模块
layer = model.backbone.layer4[-1]
print(layer)def farward_hook(module, data_input, data_output):fmap_block.append(data_output)input_block.append(data_input)#为了简单,这里直接一张一张图来算,遍历文件夹中所有图像  
for img in images:read_img = os.path.join(img_dir,img)image = Image.open(read_img)#图像预处理,将图像缩放到固定分辨率,并进行标准化image = image.resize((input_H, input_W))image = np.float32(image) / 255input_tensor = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.485,0.456,0.406), (0.229,0.224,0.225))])(image)#添加batch维度input_tensor = input_tensor.unsqueeze(0)if torch.cuda.is_available():model = model.cuda()input_tensor = input_tensor.cuda()#输入张量需要计算梯度input_tensor.requires_grad = Truefmap_block = list()input_block = list()#对指定层获取特征图layer.register_forward_hook(farward_hook)#进行一次正向传播output = model(input_tensor)#特征图的channel维度算均值且去掉batch维度,得到二维张量feature_map = fmap_block[0].mean(dim=1,keepdim=False).squeeze()#对二维张量中心点(标量)进行backwardfeature_map[(feature_map.shape[0]//2-1)][(feature_map.shape[1]//2-1)].backward(retain_graph=True)#对输入层的梯度求绝对值grad = torch.abs(input_tensor.grad)#梯度的channel维度算均值且去掉batch维度,得到二维张量,张量大小为输入图像大小grad = grad.mean(dim=1,keepdim=False).squeeze()#累加所有图像的梯度,由于后面要进行归一化,这里可以不算均值heatmap = heatmap + grad.cpu().numpy()cam = heatmap#对累加的梯度进行归一化
cam = cam / cam.max()#可视化,蓝色值小,红色值大
cam = cv2.applyColorMap(np.uint8(cam*255), cv2.COLORMAP_JET)
cam = cv2.cvtColor(cam, cv2.COLOR_BGR2RGB)
map_image = Image.fromarray(cam)
map_image.show()

根目录下创建脚本Img_copy.py(从之前下载的ADE20K数据集的验证集中拷贝图片):

import os
import shutil# 源文件夹路径
source_folder = '/media/lcy-magic/Dataset/Segment_Dataset/ade/ADEChallengeData2016/images/validation'
# 目标文件夹路径
destination_folder = '/home/lcy-magic/Segment_TEST/ERF_VIS/test_imgs'# 获取源文件夹中所有的.png图片文件
png_files = [f for f in os.listdir(source_folder) if f.endswith('.jpg')]# 确保目标文件夹存在
if not os.path.exists(destination_folder):os.makedirs(destination_folder)# 复制前100张图片到目标文件夹
for i, png_file in enumerate(png_files):if i < 100:source_file = os.path.join(source_folder, png_file)destination_file = os.path.join(destination_folder, png_file)shutil.copyfile(source_file, destination_file)print(f'Copied {png_file} to {destination_folder}')print('Copying completed.')

脚本测试

运行:

python ERF_visualizetion.py

运行结果为:
在这里插入图片描述

其他参考

尝试运行

发现一个这个项目做了可视化感受野参考博客,看看他是怎么怎么做的。
我先从github上下载了他的ERF代码:
在这里插入图片描述
先尝试运行visualize_erf.py。
看样子需要这几个参数:

  • –model:先不传,用他默认的resnet101
  • –weights:看后面代码:model = resnet101(pretrained=args.weights is None),对于resnet101并不需要提供权重
  • –data_path:看后面代码:root = os.path.join(args.data_path, 'val'),会对其中val文件夹内所有图片进行操作;我自己做个val文件夹,内含10张图片
  • –save_path:用npy文件保存ERF矩阵,指定地点;我先保存到根目录下新建result目录
  • –num_images:处理多少张图片,默认是50,我改成10

运行:

python other/visualize_erf.py --data_path test_imgs  --save_path result/ --num_images 10

报错:

ModuleNotFoundError: No module named 'timm'

安装就好:

pip3 install timm

报错:

ModuleNotFoundError: No module named 'erf'

把脚本的目录改名为erf,再添加环境变量,就能本地import了:
在这里插入图片描述

export PYTHONPATH=$PYTHONPATH:~/Segment_TEST/ERF_VIS

在这里插入图片描述
报错:

Traceback (most recent call last):File "erf/visualize_erf.py", line 15, in <module>from erf.resnet_for_erf import resnet101, resnet152File "/home/lcy-magic/Segment_TEST/ERF_VIS/erf/resnet_for_erf.py", line 7, in <module>from torchvision.models.resnet import ResNet, Bottleneck, BasicBlock, load_state_dict_from_url, model_urls
ImportError: cannot import name 'load_state_dict_from_url' from 'torchvision.models.resnet' (/home/lcy-magic/anaconda3/envs/ERF/lib/python3.8/site-packages/torchvision/models/resnet.py)

参考参考博客改为:

from torchvision.models.resnet import ResNet, Bottleneck, BasicBlock, model_urls
try:from torch.hub import load_state_dict_from_url
except ImportError:from torch.utils.model_zoo import load_url as load_state_dict_from_url

解决。但报错:

ImportError: cannot import name 'model_urls' from 'torchvision.models.resnet' (/home/lcy-magic/anaconda3/envs/ERF/lib/python3.8/site-packages/torchvision/models/resnet.py)

无法这样解决。应该是torchvision版本问题。查看我的版本是0.16.0:

pip show torchvision
Name: torchvision
Version: 0.16.0
Summary: image and video datasets and models for torch deep learning
Home-page: https://github.com/pytorch/vision
Author: PyTorch Core Team
Author-email: soumith@pytorch.org
License: BSD
Location: /home/lcy-magic/anaconda3/envs/ERF/lib/python3.8/site-packages
Requires: numpy, pillow, requests, torch
Required-by: timm

我不想牵就作者的版本。于是查看pytorch关于torchvision的官方文档:官方文档 。然后搜索load_state_dict_from_url关键词,点击链接进入相关文档:
在这里插入图片描述
看起来和上一篇参考博客说的吻合,也就是从torch.hub下载。可能model_urls在torch.hub里也没有。搜索下这个关键词,结果并没有搜到。查看代码中使用model_urls的部分:

def _resnet(arch, block, layers, pretrained, progress, **kwargs):model = ResNetForERF(block, layers, **kwargs)if pretrained:state_dict = load_state_dict_from_url(model_urls[arch],progress=progress)model.load_state_dict(state_dict, strict=False)return model

发现model_urls只是根据输入参数arch(网络架构),给load_state_dict_from_url提供输入参数。参考load_state_dict_from_url的官方说明:
在这里插入图片描述
这个参数就是URL.我看到这篇博客参考博客就没有import,直接给出的。那我也不import。只添加:

model_urls = {'resnet18': 'https://download.pytorch.org/models/resnet18-5c106cde.pth','resnet34': 'https://download.pytorch.org/models/resnet34-333f7ec4.pth','resnet50': 'https://download.pytorch.org/models/resnet50-19c8e357.pth','resnet101': 'https://download.pytorch.org/models/resnet101-5d3b4d8f.pth','resnet152': 'https://download.pytorch.org/models/resnet152-b121ed2d.pth','resnext50_32x4d': 'https://download.pytorch.org/models/resnext50_32x4d-7cdf4587.pth','resnext101_32x8d': 'https://download.pytorch.org/models/resnext101_32x8d-8ba56ff5.pth','wide_resnet50_2': 'https://download.pytorch.org/models/wide_resnet50_2-95faca4d.pth','wide_resnet101_2': 'https://download.pytorch.org/models/wide_resnet101_2-32ee1156.pth',
}

果然成功了。
报错:

ModuleNotFoundError: No module named 'replknet'

发现这个replknet是那个论文自己的模型,我对这个没有兴趣。把所有用到他的地方都注释掉。
报错:

Traceback (most recent call last):File "erf/visualize_erf.py", line 116, in <module>main(args)File "erf/visualize_erf.py", line 54, in maindataset = datasets.ImageFolder(root, transform=transform)File "/home/lcy-magic/anaconda3/envs/ERF/lib/python3.8/site-packages/torchvision/datasets/folder.py", line 309, in __init__super().__init__(File "/home/lcy-magic/anaconda3/envs/ERF/lib/python3.8/site-packages/torchvision/datasets/folder.py", line 144, in __init__classes, class_to_idx = self.find_classes(self.root)File "/home/lcy-magic/anaconda3/envs/ERF/lib/python3.8/site-packages/torchvision/datasets/folder.py", line 218, in find_classesreturn find_classes(directory)File "/home/lcy-magic/anaconda3/envs/ERF/lib/python3.8/site-packages/torchvision/datasets/folder.py", line 42, in find_classesraise FileNotFoundError(f"Couldn't find any class folder in {directory}.")
FileNotFoundError: Couldn't find any class folder in test_imgs/val.

原来他对数据集还有要求,得按照imagenet的格式来。我尝试改代码,但太麻烦了。又不想再下个数据集。就随便给我的图片归成dog和cat两类,但实际一点关系都没。
运行成功:
在这里插入图片描述
但发现result文件夹内没有结果,打印下保存文件的代码信息:
在这里插入图片描述
发现就是计数不对。改为:

if meter.count == args.num_images - 1:np.save(args.save_path, meter.avg)exit()

改了之后还是不对,发现这样不对,不应该-1。同时指定的保存地点应该是具体的npy文件。于是我给dog里加了一张图片。然后命令改为:

python erf/visualize_erf.py --data_path test_imgs  --save_path result/ERF.npy --num_images 10

成功。

接下来可视化,应该是analyze_erf.py脚本,只有两个参数:

  • –source:也就是刚生成的result/ERF.npy
  • –heatmap_save:热力图地址
    执行:
python erf/analyze_erf.py --source result/ERF.npy --heatmap_save result/heatmap.png

先后报错:

ModuleNotFoundError: No module named 'matplotlib'
pykitti 0.3.1 requires pandas, which is not installed.
ModuleNotFoundError: No module named 'seaborn'

安装就好:

pip3 install matplotlib
pip3 install pandas
pip3 install seaborn

报错:

ModuleNotFoundError: No module named 'mpl_toolkits.axes_grid1.colorbar'

搜了下,好像是把matplotlib升级下就行。我尝试了upgrade和用conda install,都不行。发现现在的matplotlib已经没这个东西了。我也没找到现在版本对应的实现是什么。算了退一下版本吧。发现seabon又必须让matplotlib在3.4以上。然后发现,seabon本来就可以绘制colorbar,代码注释里也写了,于是把color bar那个都注释掉,改用seabon:

def heatmap(data, camp='RdYlGn', figsize=(10, 10.75), ax=None, save_path=None):plt.figure(figsize=figsize, dpi=40)ax = sns.heatmap(data,xticklabels=False,yticklabels=False, cmap=camp,center=0, annot=False, ax=ax, cbar=True, annot_kws={"size": 24}, fmt='.2f')#   =========================== Add a **nicer** colorbar on top of the figure. Works for matplotlib 3.3. For later versions, use matplotlib.colorbar#   =========================== or you may simply ignore these and set cbar=True in the heatmap function above.from mpl_toolkits.axes_grid1.axes_divider import make_axes_locatable# from matplotlib_colorbar import colorbar# from mpl_toolkits.axes_grid1.colorbar import colorbar# ax_divider = make_axes_locatable(ax)# cax = ax_divider.append_axes('top', size='5%', pad='2%')# colorbar(ax.get_children()[0], cax=cax, orientation='horizontal')# cax.xaxis.set_ticks_position('top')#   ================================================================#   ================================================================plt.savefig(save_path)

运行成功:
在这里插入图片描述
这个代码计算梯度的方法和之前的一致,没啥参考价值。主要是他中间有个保存梯度图为npy文件的过程和用seabon画更好看的图的想法不错,以及通过arg传参。借用下。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/794034.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于k8s的高性能综合web服务器搭建

目录 基于k8s的高性能综合web服务器搭建 项目描述&#xff1a; 项目规划图&#xff1a; 项目环境&#xff1a; k8s&#xff0c; docker centos7.9 nginx prometheus grafana flask ansible Jenkins等 1.规划设计整个集群的架构&#xff0c;k8s单master的集群环境&…

【R】Error in library(foreach) : 不存在叫‘foreach’这个名字的程辑包

Error in library(foreach) : 不存在叫‘foreach’这个名字的程辑包 此外: Warning message: package ‘parallel’ is a base package, and should not be updated 解决方法 缺少名为 foreach 的包&#xff0c;使用install.packages("foreach")将名为foreach 的包…

Qt事件学习案例

视频链接 https://www.bilibili.com/video/BV18B4y1K7Cs?p7&spm_id_frompageDriver&vd_sourcefa4ef8f26ae084f9b5f70a5f87e9e41bQt5跟着视频做即可&#xff0c;Qt6部分代码需要改动,改动的地方注释有写 素材 百度云 链接&#xff1a;https://pan.baidu.com/s/158j…

Mybatis——一对一映射

一对一映射 预置条件 在某网络购物系统中&#xff0c;一个用户只能拥有一个购物车&#xff0c;用户与购物车的关系可以设计为一对一关系 数据库表结构&#xff08;唯一外键关联&#xff09; 创建两个实体类和映射接口 package org.example.demo;import lombok.Data;import …

STM32H5 读取温度传感器校准值时进 HardFault 的原因分析

1.前言 有客户反馈&#xff0c;在使用 STM32H5 读取温度传感器校准值地址时&#xff0c;会进入 HardFault&#xff0c;而在其他系列芯片中读取这个参数时并没有此现象。在 NUCLEO-H563ZI 开发板上去复现此问题&#xff0c;发现只有开启 ICACHE 后才会复现&#xff0c;初步验证…

【旅行商问题TSP】基于大邻域搜索算法LNS

课题名称&#xff1a;大规模邻域搜索算法LNS求解TSP问题 版本时间&#xff1a;2024-04-01 程序运行&#xff1a;直接运行LNS_TSP.m 文件即可 代码获取方式&#xff1a; QQ&#xff1a;491052175 VX&#xff1a;Matlab_Lover 模型介绍&#xff1a; 第一步&#xff1a;设定…

如何对抓取的文本进行分词、词频统计、词云可视化和情感分析

目录 一、引言 二、文本分词 三、词频统计 四、词云可视化 五、情感分析 六、总结 一、引言 在大数据时代&#xff0c;文本数据的处理和分析显得尤为重要。对于爬虫抓取的大量文本数据&#xff0c;如何进行高效、准确的处理和分析&#xff0c;是每一个数据分析师和开发…

9Proxy,跨境电商一站式解决方案

文章目录 跨境电商什么是跨境电商跨境电商的机遇跨境电商技术支撑 海外代理IP什么是海外代理IP海外代理IP的作用如何选择海外代理IP 9Proxy9Proxy的优势9Proxy的解决方案价格汇总搜索引擎优化市场调查多重核算数据抓取广告技术 价格上手体验注册登录下载安装数据采集 总结福利 …

【Unity每日一记】如何从0到1将特效图集制作成一个特效

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

Java毕业设计 基于SSM jsp商城系统 美妆系统

Java毕业设计 基于SSM jsp商城系统 美妆系统 SSM jsp 商城系统 美妆系统 功能介绍 首页 分类展示商品 搜索商品 登录 注册 邮箱激活 购物车 结算 支付 我的订单 个人信息设置 后台管理 登录 商品管理 添加修改下架商品 商品类型管理 添加修改删除分类 订单管理 确认发货 取消…

Vue使用高德地图(快速上手)

1.在高德平台注册账号 2.我的 > 管理管理中添加Key 3.安装依赖 npm i amap/amap-jsapi-loader --save 或 yarn add amap/amap-jsapi-loader --save 4.导入 AMapLoade import AMapLoader from amap/amap-jsapi-loader; 5.直接上代码&#xff0c;做好了注释&#xff08;初…

Lafida多目数据集实测

Lafida 数据集 paper&#xff1a;J. Imaging | Free Full-Text | LaFiDa—A Laserscanner Multi-Fisheye Camera Dataset 官网数据&#xff1a;https://www.ipf.kit.edu/english/projekt_cv_szenen.php 官网&#xff1a;KIT-IPF-Software and Datasets - LaFiDa 标定数据下载&…

Spring 详细总结

文章目录 第一章 IOC容器第一节 Spring简介1、一家公司2、Spring旗下的众多项目3、Spring Framework①Spring Framework优良特性②Spring Framework五大功能模块 第二节 IOC容器概念1、普通容器①生活中的普通容器②程序中的普通容器 2、复杂容器①生活中的复杂容器②程序中的复…

单细胞RNA测序(scRNA-seq)SRA数据下载及fastq-dumq数据拆分

单细胞RNA测序&#xff08;scRNA-seq&#xff09;入门可查看以下文章&#xff1a; 单细胞RNA测序&#xff08;scRNA-seq&#xff09;工作流程入门 单细胞RNA测序&#xff08;scRNA-seq&#xff09;细胞分离与扩增 1. NCBI查询scRNA-seq SRA数据 NCBI地址&#xff1a; https…

[RV1106-LINUX-IPC] 关于 rndis 功能无法使用的解决办法

问题描述 按照开发文档文档&#xff0c;修改对应的BoardConfig.mk&#xff0c;增加 export RK_ENABLE_RNDISy 使用编译命令&#xff1a; ./build.sh sysdrv ./build.sh firmware 烧录固件后&#xff0c;开机使用命令&#xff1a; rndis.sh&#xff0c;出现 rndis 无法识别的情…

腾讯云(CVM)托管进行权限维持

前言 刚好看到一个师傅分享了一个阿里云ECS实战攻防&#xff0c;然后想到了同样利用腾讯云CVM的托管亦可实现在实战攻防中的权限维持。 简介 腾讯云自动化助手&#xff08;TencentCloud Automation Tools&#xff0c;TAT&#xff09;是一个原生运维部署工具&#xff0c;它可…

SD-WAN组网面临的安全挑战?如何提供有效的安全措施

SD-WAN&#xff08;软件定义广域网&#xff09;技术的广泛应用&#xff0c;企业面临着越来越多的网络安全挑战。尽管SD-WAN带来了灵活性和效率的提升&#xff0c;但其开放性和基于云的特性也带来了一系列安全威胁。本文将探讨SD-WAN组网面临的安全挑战&#xff0c;并提供一些有…

Mybatis--TypeHandler使用手册

TypeHandler使用手册 场景&#xff1a;想保存user时 teacher自动转String &#xff0c;不想每次保存都要手动去转String&#xff1b;从DB查询出来时&#xff0c;也要自动帮我们转换成Java对象 Teacher Data public class User {private Integer id;private String name;priva…

JS继承与原型、原型链

在 JavaScript 中&#xff0c;继承是实现代码复用和构建对象关系的重要概念。本文将讨论原型链继承、构造函数继承以及组合继承等几种常见的继承方式&#xff0c;并提供相应的示例代码&#xff0c;并分析它们的特点、优缺点以及适用场景。 在开始讲解 JavaScript 的继承方式之…

基于javassmJSP的家用电器销售网站

开发语言&#xff1a;Java 框架&#xff1a;ssm 技术&#xff1a;JSP JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclip…