【yolov5】改进系列——特征图可视化(V7.0 的一个小bug)

文章目录

  • 前言
  • 一、特征图可视化
    • 1.1 V7.0的小bug
  • 二、可视化指定层
  • 三、合并通道可视化
  • 总结


前言

对于特征图可视化感兴趣可以参考我的另一篇记录:六行代码实现:特征图提取与特征图可视化,可以实现分类网络的特征图可视化

最近忙论文,想在yolov5上面做一些改进,看源码看了一段时间,动手改改代码做一些改进,所以做个一系列改进的记录。


一、特征图可视化

yolov5最近的版本提供了特征图可视化的功能,在使用detect.py进行推理时,在命令行参数传入--visualize即可。

python detect.py --weights best.pt --conf 0.5 --source ../dog.png --visualize

传入visualize参数后会可视化所有层的特征图,文件默认保存在runs/detect/exp 文件夹下

在这里插入图片描述

1.1 V7.0的小bug

我给官方提了个issue,回复应该是源码出错了,不应该把visualize赋值给save_dir

针对这个可视化的代码其实有个疑问:可视化的代码是在models/yolo.py文件下调用的,下面是调用特征图可视化的代码,在类BaseModel中定义了模型的前向传播过程,这里的visualize参数是一个bool类型,用于判断是否要可视化特征图,但是在可视化函数feature_visualization(x, m.type, m.i, save_dir=visualize)却把visualize传给了save_dir,save_dir应该是特征图的保存路径而不是bool,所以这里其实应该做一个更改否则会报错。

这里可以选择不传入save_dir,特征图会默认保存到runs/detect/exp 路径下,否则可以传入指定路径,比如:
save_dir=Path('../feature_map')

......
# models/yolo.py文件class BaseModel(nn.Module):# YOLOv5 base modeldef forward(self, x, profile=False, visualize=False):return self._forward_once(x, profile, visualize)  # single-scale inference, traindef _forward_once(self, x, profile=False, visualize=False):y, dt = [], []  # outputsfor m in self.model:if m.f != -1:  # if not from previous layerx = y[m.f] if isinstance(m.f, int) else [x if j == -1 else y[j] for j in m.f]  # from earlier layersif profile:self._profile_one_layer(m, x, dt)x = m(x)  # runy.append(x if m.i in self.save else None)  # save output"""这里的visualize是一个bool类型,但是却传给了save_dir,save_dir应该是特征图的保存路径所以这里其实应该做一个更改否则会报错"""if visualize:# 更改前	 # feature_visualization(x, m.type, m.i, save_dir=visualize)#更改后 feature_visualization(x, m.type, m.i)return x
......

yolov5 这里是针对单个通道进行可视化(默认最多可视化32个通道),参考GitHub的相关issue,可以自行修改feature_visualization的各个参数


# utils/plots.pydef feature_visualization(x, module_type, stage, n=32, save_dir=Path('runs/detect/exp')):"""x:              输入即可视化的Tensormodule_type:    Module type 用于命名区分各层特征图stage:          Module stage within model 用于命名区分各层特征图n:              Maximum number of feature maps to plot 可视化的通道个数(通道数太多不可能全部可视化)save_dir:       Directory to save results 特征图的保存路径"""if 'Detect' not in module_type:batch, channels, height, width = x.shape  # batch, channels, height, widthif height > 1 and width > 1:# 文件的命名格式 层名+层的索引 	f = save_dir / f"stage{stage}_{module_type.split('.')[-1]}_features.png"  # filename# 按通道数拆分Tensor# 进行逐通道的可视化blocks = torch.chunk(x[0].cpu(), channels, dim=0)  # select batch index 0, block by channelsn = min(n, channels)  # number of plotsfig, ax = plt.subplots(math.ceil(n / 8), 8, tight_layout=True)  # 8 rows x n/8 colsax = ax.ravel()plt.subplots_adjust(wspace=0.05, hspace=0.05)for i in range(n):ax[i].imshow(blocks[i].squeeze())  # cmap='gray'ax[i].axis('off')LOGGER.info(f'Saving {f}... ({n}/{channels})')plt.savefig(f, dpi=300, bbox_inches='tight')plt.close()np.save(str(f.with_suffix('.npy')), x[0].cpu().numpy())  # npy save

在这里插入图片描述

二、可视化指定层

如果不想可视化所有的特征层,比如只需要可视化第一个卷积层的输出那么只需要修改判断条件即可,
if visualize: 修改为 if m.type == 'models.common.Conv' and m.i == 0:

# models/yolo.py文件class BaseModel(nn.Module):# YOLOv5 base modeldef forward(self, x, profile=False, visualize=False):return self._forward_once(x, profile, visualize)  # single-scale inference, traindef _forward_once(self, x, profile=False, visualize=False):y, dt = [], []  # outputsfor m in self.model:if m.f != -1:  # if not from previous layerx = y[m.f] if isinstance(m.f, int) else [x if j == -1 else y[j] for j in m.f]  # from earlier layersif profile:self._profile_one_layer(m, x, dt)x = m(x)  # runy.append(x if m.i in self.save else None)  # save output"""可视化指定层只需要更改一下判断条件即可将 if visualize:修改为 if m.type == 'models.common.Conv' and m.i == 0:"""# 修改前# if visualize:# 修改后if m.type == 'models.common.Conv' and m.i == 0:feature_visualization(x, m.type, m.i)return x
......

m.type 表示模块名称,m.i表示层的索引(即第几层),因为有重名的层需要索引加以区分
m.type的命名以 models.common. + 模块名,比如可视化SPPF就是 models.common.SPPF
m.i 即每个层对应得索引,SPPF对应得索引是9
在这里插入图片描述

三、合并通道可视化

如果不想分通道可视化,可以直接可视化整个Tensor。把下面得函数定义加入到utils/plots.py文件下

def feature_visualization_all(x, module_type, stage,  save_dir=Path('runs/detect/exp')):"""x:              Features to be visualizedmodule_type:    Module typestage:          Module stage within modeln:              Maximum number of feature maps to plotsave_dir:       Directory to save results"""if 'Detect' not in module_type:batch, channels, height, width = x.shape  # batch, channels, height, widthif height > 1 and width > 1:f = save_dir / f"stage{stage}_{module_type.split('.')[-1]}_features.png"  # filenameimg = x[0].cpu().transpose(0, 1).sum(1).detach().numpy()plt.imsave(f, img)LOGGER.info(f'Saving {f}...')

随后在models/yolo.py文件下导入并调用

from models.common import *  # noqa
from models.experimental import *  # noqa
from utils.autoanchor import check_anchor_order
from utils.general import LOGGER, check_version, check_yaml, make_divisible, print_args# 导入feature_visualization_all
from utils.plots import feature_visualization, feature_visualization_all
from utils.torch_utils import (fuse_conv_and_bn, initialize_weights, model_info, profile, scale_img, select_device, time_sync)......class BaseModel(nn.Module):# YOLOv5 base modeldef forward(self, x, profile=False, visualize=False):return self._forward_once(x, profile, visualize)  # single-scale inference, traindef _forward_once(self, x, profile=False, visualize=False):y, dt = [], []  # outputsfor m in self.model:if m.f != -1:  # if not from previous layerx = y[m.f] if isinstance(m.f, int) else [x if j == -1 else y[j] for j in m.f]  # from earlier layersif profile:self._profile_one_layer(m, x, dt)x = m(x)  # runy.append(x if m.i in self.save else None)  # save output# 修改后if m.type == 'models.common.Conv' and m.i == 0:feature_visualization_all(x, m.type, m.i)return x......

原图及检测效果:
在这里插入图片描述
合并通道特征图可视化:
在这里插入图片描述

总结

对于特征图可视化感兴趣可以参考我的另一篇记录:六行代码实现:特征图提取与特征图可视化,可以实现分类网络得特征图可视化

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

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

相关文章

Docker开启远程访问+idea配置docker+dockerfile发布java项目

一、docker开启远程访问 1.编辑docker服务文件 vim /usr/lib/systemd/system/docker.servicedocker.service原文件如下: [Unit] DescriptionDocker Application Container Engine Documentationhttps://docs.docker.com Afternetwork-online.target docker.socke…

natapp内网穿透-将本地运行的程序/服务器通过公网IP供其它人访问

文章目录 1.几个基本概念1.1 局域网1.2 内网1.3 内网穿透1.4 Natapp 2.搭建内网穿透环境3.本地服务测试 1.几个基本概念 1.1 局域网 LAN(Local Area Network,局域网)是一个可连接住宅,学校,实验室,大学校…

【需求侧响应】综合能源中多种需求响应——弹性电价、可平移及可削减研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

【数据结构】:栈的实现

1 栈 1.1栈的概念及结构 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则 压栈…

搭建一个Chatbot需要哪些条件呢?

在当今的数字世界中,Chatbot已经成为企业的重要工具。它们提供了一种方便高效的方式来与客户互动、提供支持和自动化任务。随着对即时通信和个性化体验的需求不断增加,Chatbot已成为一种有价值的解决方案。他们可以同时处理多个对话,确保快速…

07-网络篇-抓包分析TCP

为了抓包方便一些&#xff0c;我在ubuntu虚拟机运行服务端程序&#xff0c;而在windows运行客户端程序&#xff0c;关于客户端与服务端程序如下。 ##1.程序 客户端&#xff1a; vs_client.cpp #include "stdafx.h" #include <iostream> #include <winsock2…

洛谷【入门6】函数与结构体-P5735 【深基7.例1】距离函数

## 题目描述 给出平面坐标上不在一条直线上三个点坐标 (x1​,y1​),(x2​,y2​),(x3​,y3​)&#xff0c;坐标值是实数&#xff0c;且绝对值不超过 100.00&#xff0c;求围成的三角形周长。保留两位小数。 对于平面上的两个点 (x1​,y1​),(x2​,y2​)&#xff0c;则这两个点…

7 使用Docker容器管理的tomcat容器中的项目连接mysql数据库

1、查看容器的IP 1&#xff09;进入容器 docker exec -it mysql-test /bin/bash 2&#xff09;显示hosts文件内容 cat /etc/hosts 这里容器的ip为172.17.0.2 除了上面的方法外&#xff0c;也可以在容器外使用docker inspect查看容器的IP docker inspect mysql-test 以下为…

Kafka 开启SASL/SCRAM认证 及 ACL授权(三)验证

Kafka 开启SASL/SCRAM认证 及 ACL授权(三)验证。 官网地址:https://kafka.apache.org/ 本文说明如何做client验证ACL是否生效,我们之前开启了无acl信息不允许访问的配置。涉及的client有以下几个场景:shell脚本、python脚本、java应用、flink流。 kafka shell script验证…

UGUI交互组件ScrollView

一.ScrollView的结构 对象说明Scroll View挂有Scroll Rect组件的主体对象Viewport滚动显示区域&#xff0c;有Image和mask组件Content显示内容的父节点&#xff0c;只有个Rect Transform组件Scrollbar Horizontal水平滚动条Scrollbar Vertical垂直滚动条 二.Scroll Rect组件的属…

基于SSM的失物招领信息交互平台

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

14.4 Socket 双向数据通信

所谓双向数据传输指的是客户端与服务端之间可以无差异的实现数据交互&#xff0c;此类功能实现的核心原理是通过创建CreateThread()函数多线程分别接收和发送数据包&#xff0c;这样一旦套接字被建立则两者都可以异步发送消息&#xff0c;本章将实现简单的双向交互功能。 首先…

视频美颜SDK,提升企业视频通话质量与形象

在今天的数字时代&#xff0c;视频通话已经成为企业与客户、员工之间不可或缺的沟通方式。然而&#xff0c;由于网络环境、设备性能等因素的影响&#xff0c;视频通话中的画面质量往往难以达到预期效果。为了提升视频通话的质量与形象&#xff0c;美摄美颜SDK应运而生&#xff…

C#,数值计算——数据建模Plog的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { public class Plog { private int ndat { get; set; } private double[] dat { get; set; } private double[] stau { get; set; } private double[] slogtau { get; set; …

如何使用Net2FTP搭建免费web文件管理器打造个人网盘

文章目录 1.前言2. Net2FTP网站搭建2.1. Net2FTP下载和安装2.2. Net2FTP网页测试 3. cpolar内网穿透3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 文件传输可以说是互联网最主要的应用之一&#xff0c;特别是智能设备的大面积使用&#xff0c;无论是个人…

2023年中国尾气净化催化材料产量、需求量及行业市场规模分析[图]

尾气处理催化单元系由催化剂厂商将以催化材料和活性组分物质为主要组成的催化剂涂覆在蜂窝陶瓷或金属等载体上而成&#xff0c;催化剂则起到处理尾气中有害物质的各类化学反应的关键催化作用&#xff0c;主要由稀土材料、氧化铝材料、贵金属材料等催化材料和增强催化材料性能的…

【论文阅读】面向抽取和理解基于Transformer的自动作文评分模型的隐式评价标准(实验结果部分)

方法 结果 在这一部分&#xff0c;我们展示对于每个模型比较的聚合的统计分析当涉及到计算特征和独立的特征组&#xff08;表格1&#xff09;&#xff0c;抽取功能组和对齐重要功能组&#xff08;表格2&#xff09;&#xff0c;并且最后&#xff0c;我们提供从模型比较&#x…

容器化应用程序管理与分发工具集 | 开源专题 No.34

kubernetes/kubernetes Stars: 101.7k License: Apache-2.0 Kubernetes 是一个开源系统&#xff0c;用于管理跨多个主机的容器化应用程序。它提供了部署、维护和扩展应用程序的基本机制。Kubernetes 借鉴了 Google 在大规模运行生产负载方面十五年的经验&#xff0c;并结合了社…

安装Docker(Linux:CentOS)

大家好我是苏麟今安装一下Docker. 安装Docker Docker 分为 CE 和 EE 两大版本。CE 即社区版&#xff08;免费&#xff0c;支持周期 7 个月&#xff09;&#xff0c;EE 即企业版&#xff0c;强调安全&#xff0c;付费使用&#xff0c;支持周期 24 个月。 Docker CE 分为 stab…

linux中单节点安装greenplum数据库

目录 一、安装包准备 二、关闭防火墙 三、安装greenplum依赖包 四、添加配置 五、新建greenplum用户 六、安装greenplum安装包 七、设置环境变量 八、权限互通 九、修改数据库配置文件 十、初始化数据库 十一、配置远程连接文件 十二、说明 一、安装包准备 下载准备…