yolov5 三个yolo层可视化

news2024/7/6 18:51:16

CAM方法

  • 拉yolov5源码

在V5的模型中:第17-C3,20-C3,23-C3是三个yolo层的输出,需要明确一下哪一层的输出捕获到了目标?

  • C3的前向传播:C3的 conv3是C3模块的最后输出;通过看C3和bottleNeck的forward代码可以看出;self.cv3(torch.cat((self.m(self.cv1(x)), self.cv2(x)), 1))
class C3(nn.Module):
    # CSP Bottleneck with 3 convolutions
    def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5):  # ch_in, ch_out, number, shortcut, groups, expansion
        super().__init__()
        c_ = int(c2 * e)  # hidden channels
        self.cv1 = Conv(c1, c_, 1, 1)
        self.cv2 = Conv(c1, c_, 1, 1)
        self.cv3 = Conv(2 * c_, c2, 1)  # optional act=FReLU(c2)
        self.m = nn.Sequential(*(Bottleneck(c_, c_, shortcut, g, e=1.0) for _ in range(n)))

    def forward(self, x):
        return self.cv3(torch.cat((self.m(self.cv1(x)), self.cv2(x)), 1))

C3(
  (cv1): Conv(
    (conv): Conv2d(256, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)
    (bn): BatchNorm2d(64, eps=0.001, momentum=0.03, affine=True, track_running_stats=True)
    (act): SiLU(inplace=True)
  )
  (cv2): Conv(
    (conv): Conv2d(256, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)
    (bn): BatchNorm2d(64, eps=0.001, momentum=0.03, affine=True, track_running_stats=True)
    (act): SiLU(inplace=True)
  )
  (cv3): Conv(
    (conv): Conv2d(128, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)
    (bn): BatchNorm2d(128, eps=0.001, momentum=0.03, affine=True, track_running_stats=True)
    (act): SiLU(inplace=True)
  )
  (m): Sequential(
    (0): Bottleneck(
      (cv1): Conv(
        (conv): Conv2d(64, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)
        (bn): BatchNorm2d(64, eps=0.001, momentum=0.03, affine=True, track_running_stats=True)
        (act): SiLU(inplace=True)
      )
      (cv2): Conv(
        (conv): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
        (bn): BatchNorm2d(64, eps=0.001, momentum=0.03, affine=True, track_running_stats=True)
        (act): SiLU(inplace=True)
      )
    )
  )
)

 C3的cv3有:conv, bn, act三部分,选择这三个分别来看特征图的激活情况,如下:

  • 大目标层:20x20的层,车有高激活
  • 但经过BN后,这个激活减弱了
  • 经过act激活层,这个激活就更弱了! 

import sys
sys.path.insert(0, '/home/helen/code/deep-learning-for-image-processing/pytorch-grad-cam')

from pytorch_grad_cam import EigenCAM

import warnings
# warnings.filterwarnings('ignore')
# warnings.simplefilter('ignore')
import torch    
import cv2
import numpy as np
import requests
import torchvision.transforms as transforms
from pytorch_grad_cam import EigenCAM
from pytorch_grad_cam.utils.image import show_cam_on_image, scale_cam_image
from PIL import Image

COLORS = np.random.uniform(0, 255, size=(80, 3))

img_path = '/home/helen/dataset/FLIR/FLIR_ADAS/val/images/FLIR_00106.jpeg'
# img = np.array(Image.open(img_path))
img = cv2.imread(img_path)

# padded_image = cv2.resize(img, (640,640))
# padded_image = np.pad(img, ((0, 128),(0,0), (0,0)), mode='constant')#, constant_values=img.mean())
# padded_image = np.pad(img, ((0, 128),(0,0), (0,0)), mode='constant', constant_values=img.mean())
padded_image = img
img = np.float32(padded_image) / 255
transform = transforms.ToTensor()
tensor = transform(img).unsqueeze(0)

import yaml
from models.yolo import Model
device = 'cuda:0'
cfg = '/home/helen/code/yolov5/models/yolov5s.yaml'
nc = 2
hypfile = '/home/helen/code/yolov5/data/hyps/hyp.scratch-low.yaml'
with open(hypfile, errors='ignore') as f:
    hyp = yaml.safe_load(f)
model = Model(cfg, ch=3, nc=nc, anchors=hyp.get('anchors')).to(device)

weights = '/home/helen/code/yolov5/best.pt'
ckpt = torch.load(weights, map_location='cpu')
model.load_state_dict(ckpt['model'].float().state_dict(), strict=False)
model.eval()
target_layers = [model.model[17].cv3, model.model[20].cv3, model.model[23].cv3]
tensor = tensor.to('cuda:0')

all_cam_image = None
all_gray_cam = None
for l in target_layers:
    cam = EigenCAM(model, target_layers=[l], use_cuda=True)
    grayscale_cam = cam(tensor.to('cuda:0'), targets=[0])[0, :, :]
    cam_image = show_cam_on_image(img, grayscale_cam, use_rgb=True)

    if all_cam_image is None:
        all_cam_image = cam_image
        all_gray_cam = grayscale_cam
    else:
        all_cam_image = np.hstack((all_cam_image,cam_image))
        all_gray_cam = np.hstack((all_gray_cam, grayscale_cam))
plt.imshow(all_cam_image)
plt.title('yolo_layrs: 1大目标, 2中目标, 3小目标')
plt.show()

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

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

相关文章

Linux系统下的文件目录结构

一、单用户操作系统和多用户操作系统 单用户操作系统:指一台计算机在同一时间内只能由一个用户使用,一个用户独自享用系统的全部硬件和软件资源 Windows XP之前的版本都是单用户操作系统 多用户操作系统:指一台计算机在同一时间可以由多个用户使用&…

【C++STL基础入门】深入理解string类重新赋值(assign)与删除(erase)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、重新赋值1.重新赋值指定元素2.assign函数 二、删除指定元素1.erase函数2.删除全部使用erase()使用clear() 总结 前言 本系列STL使用的是VS2022,…

龙讯旷腾PWmat已部署至曙光智算平台

编者荐语: 近期,龙讯旷腾核心产品PWmat已成功部署至曙光智算AC.sugon.com平台,可为用户提供包括分子建模、第一性原理计算、数据可视化等在内的完备的超级计算云服务,让大家能够轻松上手具有完全自主知识产权的大尺度高性能材料计…

公用医学数据库有哪些?

公共卫生领域的科学研究和知识获取正日益依赖于医学数据库。本文整理了一些公用医学数据库,希望对你有帮助。先收藏,再继续看。 一、中国营养健康调查CHNS数据库 https://www.cpc.unc.edu/projects/china 中国健康与营养调查(China Heal…

看完天才少年稚辉君智元机器人发布会后的一点感受

(点击即可收听) 智辉君,在科技圈里是一位非常有名的技术大佬,华为天才少年,年入百万招入,破圈于B站 人称科技圈里的野生钢铁侠,凡是看过他B站里一些科技硬核作品,外行人看了直呼666,内行人看了惊…

Sience子刊 新研究揭示:COVID-19病毒影响人体线粒体功能,或成治疗新途径

自SARS-CoV-2病毒引发的COVID-19大流行暴发以来,研究人员一直致力于探索为何该病毒相较于其他冠状病毒,会引发如此严重和长期的影响。近期,费城儿童医院(CHOP)团队和COVID-19国际研究小组(COV-IRT)合作发现,新冠病毒对线粒体(人体细胞的能量工厂&#xf…

测试框架pytest教程(6)钩子函数hook开发pytest插件

pytest hook 函数也叫钩子函数,pytest 提供了大量的钩子函数,可以在用例的不同生命周期自动调用。 比如,在测试用例收集阶段,可利用 hook 函数修改测试用例名称的编码。 pytest的hook是基于Python的插件系统实现的,使…

k8s挂载映射操作详解

k8s投射数据卷 Projected Volume 在 k8s 中,有几种特殊的 Volume,它们的意义不是为了存放容器里的数据,也不是用来进行容器和宿主机之间的数据交换。"而是为容器提供预先定义好的数据。" 从容器的角度来看,这些 Volume…

xlsx工作表隐藏了?不用担心,这些方法帮你恢复

在进行数据整理或保护时,很多用户可能会选择隐藏XLSX工作表。然而,当需要重新显示之前隐藏的工作表时,可能会感到困惑。不过,不用担心,下面将向您介绍xlsx工作表隐藏怎么恢复。 ▌第一部分:XLSX工作表隐藏…

结构型(三) - 享元模式

一、概念 享元模式(Flyweight Pattern):所谓“享元”,顾名思义就是被共享的单元。享元模式的意图是复用对象,节省内存,前提是享元对象是不可变对象。 优点:可以极大地减少内存中对象的数量&am…

鉴源实验室丨软件代码结构化覆盖测试-语句覆盖

作者 | 李伟 上海控安安全测评部总监 来源 | 鉴源实验室 社群 | 添加微信号“TICPShanghai”加入“上海控安51fusa安全社区” 引言: 之前我们一直在讲功能、性能、以及专项等相关的测试,这些测试主要集中在集成测试,系统验证等阶段&#x…

【快速傅里叶变换(fft)和逆快速傅里叶变换】生成雷达接收到的经过多普勒频移的脉冲雷达信号(Matlab代码实现)

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

颜值爆表!这款开源的API工具用起来更优雅!

作为一名后端开发者,我们经常会使用API工具来调试接口,之前一直使用的Postman,用多了感觉它有点不够轻量级,有时候打开也比较慢。最近发现了一款轻量级的开源API工具Insomnia,界面挺炫酷,功能也很实用&…

井下空气质量检测预警系统,煤矿生产、事故应急检测和实时监测

井下空气质量检测预警系统,煤矿生产、事故应急检测和实时监测 在煤矿生产中,空气质量是关系到矿工生命安全的重要因素。煤矿内部存在着各种有害气体,如甲烷、一氧化碳等,高浓度的有害气体会导致矿工中毒、窒息等危险情况,因此煤矿…

Linux journalctl命令详解(journalctl指令)(systemd服务默认日志管理工具)

文章目录 Linux Journalctl命令详解1. Journalctl简介2. Journalctl基础使用3. 过滤日志条目4. 时间戳和日志轮转5. 高级应用6. journalctl --help指令文档英文中文 注意事项journal日志不会将程序输出的空行显示,日志会被压缩得满满当当。journal日志不会自动持久化…

HTML5+CSS3+JS小实例:环形文字动画特效

实例:环形文字动画特效 技术栈:HTML+CSS+JS 效果: 源码: 【html】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport" content=&quo…

排序算法之详解冒泡排序

引入 冒泡排序顾名思义&#xff0c;就是像冒泡一样&#xff0c;泡泡在水里慢慢升上来&#xff0c;由小变大。虽然冒泡排序和冒泡并不完全一样&#xff0c;但却可以帮助我们理解冒泡排序。 思路 一组无序的数组&#xff0c;要求我们从小到大排列 我们可以先将最大的元素放在数组…

关于图像分类、图像识别和目标检测异同

计算机视觉是人工智能领域的一个重要分支&#xff0c;它旨在构建能够理解和处理图像、视频等视觉信息的计算机系统。在计算机视觉领域中&#xff0c;图像分类、图像识别和目标检测是三个重要的任务&#xff0c;当然目标跟踪、图像生成也是新的方向和延伸。 其实下面这幅图已经非…

A. Two Semiknights Meet

题目描述 可知走法为中国象棋中的象的走法 解题思路 利用结构体来存储两个 K K K的位置 x , y x,y x,y&#xff0c;因为两个 K K K同时走&#xff0c;所以会出现两种情况 相向而行&#xff0c;两者距离减少 相反而行&#xff0c;两者距离不变 我们完全可以不考虑格子是好…

记一次从Redis弱口令到RCE

Fscan扫描网段发现了一些开启了6379的服务器&#xff0c;逐个尝试了下未授权&#xff0c;然后尝试了下爆破 hydra爆破redis hydra -P [字典目录] redis://xxx.xxx.xxx.xxx结果还真让爆出来一个 得到密码后&#xff0c;连接上去&#xff0c;这里用的是Another Redis Desktop M…