文章目录

    • @[TOC](文章目录)
  • 前言
  • 1.特征可视化
  • 2.为了在mmdetection使用可视化
  • 效果图

前言

    在mmdetection里实现简单的特征可视化代码,不是像Grad-CAM算法那样对分类或检测直接通过反向传播值进行可视化的,而是就特征层里的最大像数值,我们认为是重要的,将其可视化出来。一般测试的时候用,能够可视化模型的预测效果。训练阶段可以看看,但没太大效果。

1.特征可视化

1.这个代码结果是将检测的时候特征层,对应像素值大的给可视化出来,附加在原图上。也可以不resize到原图大小,看对应的特征图整个像素的分布。

def draw_feature_map1(features, img_path, save_dir = './work_dirs/feature_map/',name = None):''':param features: 特征层。可以是单层,也可以是一个多层的列表:param img_path: 测试图像的文件路径:param save_dir: 保存生成图像的文件夹:return:'''img = cv2.imread(img_path)      #读取文件路径i=0if isinstance(features,torch.Tensor):   # 如果是单层features = [features]       # 转为列表for featuremap in features:     # 循环遍历heatmap = featuremap_2_heatmap1(featuremap)  #主要是这个,就是取特征层整个的求和然后平均,归一化heatmap = cv2.resize(heatmap, (img.shape[1], img.shape[0]))  # 将热力图的大小调整为与原始图像相同heatmap0 = np.uint8(255 * heatmap)  # 将热力图转换为RGB格式,0-255,heatmap0显示红色为关注区域,如果用heatmap则蓝色是关注区域heatmap = cv2.applyColorMap(heatmap0, cv2.COLORMAP_JET)  # 将热力图应用于原始图像superimposed_img = heatmap * 0.4 + img  # 这里的0.4是热力图强度因子plt.imshow(heatmap0)  # ,cmap='gray' ,这里展示下可视化的像素值# plt.imshow(superimposed_img)  # ,cmap='gray'plt.close() #关掉展示的图片# 下面是用opencv查看图片的# cv2.imshow("1",superimposed_img)# cv2.waitKey(0)     #这里通过安键盘取消显示继续运行。# cv2.destroyAllWindows()if not os.path.exists(save_dir):os.makedirs(save_dir)cv2.imwrite(os.path.join(save_dir, name + str(i) + '.png'), superimposed_img) #superimposed_img:保存的是叠加在原图上的图,也可以保存过程中其他的自己看看print(os.path.join(save_dir, name + str(i) + '.png'))i = i + 1

featuremap_2_heatmap1函数:

def featuremap_2_heatmap1(feature_map):assert isinstance(feature_map, torch.Tensor)feature_map = feature_map.detach()# heatmap = feature_map[:,0,:,:]*0    #heatmap = feature_map[:1, 0, :, :] * 0 #取一张图片,初始化为0for c in range(feature_map.shape[1]):   # 按通道heatmap+=feature_map[:1,c,:,:]      # 像素值相加[1,H,W]heatmap = heatmap.cpu().numpy()    #因为数据原来是在GPU上的heatmap = np.mean(heatmap, axis=0) #计算像素点的平均值,会下降一维度[H,W]heatmap = np.maximum(heatmap, 0)  #返回大于0的数[H,W]heatmap /= np.max(heatmap)      #/最大值来设置透明度0-1,[H,W]#heatmaps.append(heatmap)return heatmap

2.对一层特征图里面包含的通道进行可视化,如256个通道,可以自己选择可视化哪些通道。
输入,可以是一层特征图,也可以是一个列表包含多个特征层,修改输入就行。这里,为了匹配mmdetection里的resnet输出4层特征图,就直接输入输出的特征层列表了:

def feature_map_channel(features,img_path,save_dir = 'work_dirs/feature_map',name = 'noresbnsie2ltft_'):# 随便定义a,b,c,d去取对应的特征层,把通道数变换到最后一个维度,将计算的环境剥离由GPU变成CPU,tensor变为numpya = torch.squeeze(features[0][:1, :, :, :], dim=0).permute(1, 2, 0).detach().cpu().numpy()b = torch.squeeze(features[1][:1, :, :, :], dim=0).permute(1, 2, 0).detach().cpu().numpy()c = torch.squeeze(features[2][:1, :, :, :], dim=0).permute(1, 2, 0).detach().cpu().numpy()d = torch.squeeze(features[3][:1, :, :, :], dim=0).permute(1, 2, 0).detach().cpu().numpy()img = cv2.imread(img_path)for j,x in enumerate([d]):# x.shape[-1]:表示所有通道数,不想可视化这么多,可以自己写对应的数量for i in range(x.shape[-1]): heatmap = x[:, :, i]# heatmap = np.maximum(heatmap, 0) #一个通道应该不用归一化了# heatmap /= np.max(heatmap)heatmap = cv2.resize(heatmap, (img.shape[1], img.shape[0]))  # 将热力图的大小调整为与原始图像相同heatmap0 = np.uint8(255 * heatmap)  # 将热力图转换为RGB格式,0-255,heatmap0显示红色为关注区域,如果用heatmap则蓝色是关注区域heatmap = cv2.applyColorMap(heatmap0, cv2.COLORMAP_JET)  superimposed_img = heatmap * 0.4 + img  # 将热力图应用于原始图像# plt.figure()  # 展示# plt.title(str(j))# plt.imshow(heatmap0) #, cmap='gray'# # plt.savefig(os.path.join(save_dir,  name+str(j)+str(i) + '.png'))# plt.close()cv2.imwrite(os.path.join(save_dir, name + str(j)+str(i) + '.png'), superimposed_img)

2.为了在mmdetection使用可视化

1.创建自己的一个检测框架方便专门用来进行可视化singlestage_heatmap.py
这里,只需要将原来的SingleStageDetector(mmdet/models/detectors/singlestage.py)里的代码复制,再对里面的训练和测试的整个流程里进行修改,添加个获取到的图片的全部信息的字典(img_metas)就行。如果熟悉的话,自己根据可视化的代码可以自己修改相应的代码

    def forward_train(self,img,img_metas,gt_bboxes,gt_labels,gt_bboxes_ignore=None):"""Args:img (Tensor): Input images of shape (N, C, H, W).Typically these should be mean centered and std scaled.img_metas (list[dict]): A List of image info dict where each dicthas: 'img_shape', 'scale_factor', 'flip', and may also contain'filename', 'ori_shape', 'pad_shape', and 'img_norm_cfg'.For details on the values of these keys see:class:`mmdet.datasets.pipelines.Collect`.gt_bboxes (list[Tensor]): Each item are the truth boxes for eachimage in [tl_x, tl_y, br_x, br_y] format.gt_labels (list[Tensor]): Class indices corresponding to each boxgt_bboxes_ignore (None | list[Tensor]): Specify which boundingboxes can be ignored when computing the loss.Returns:dict[str, Tensor]: A dictionary of loss components."""super(SingleStageDetectorHp, self).forward_train(img, img_metas)x = self.extract_feat(img,img_metas)    #修改losses = self.bbox_head.forward_train(x, img_metas, gt_bboxes,gt_labels, gt_bboxes_ignore)return lossesdef simple_test(self, img, img_metas, rescale=False):"""Test function without test-time augmentation.Args:img (torch.Tensor): Images with shape (N, C, H, W).img_metas (list[dict]): List of image information.rescale (bool, optional): Whether to rescale the results.Defaults to False.Returns:list[list[np.ndarray]]: BBox results of each image and classes.The outer list corresponds to each image. The inner listcorresponds to each class."""feat = self.extract_feat(img,img_metas)   #FPN的输出results_list = self.bbox_head.simple_test(feat, img_metas, rescale=rescale) bbox_results = [bbox2result(det_bboxes, det_labels, self.bbox_head.num_classes)for det_bboxes, det_labels in results_list  #就是将LABEL值与预测的det_bboxes进行匹配]return bbox_results

2.经过backbone后,可视化输出的特征层

    def extract_feat(self, img,img_metas):"""Directly extract features from the backbone+neck."""imgpath = img_metas[0]['filename']  # 主要是要图片的原始路径 x = self.backbone(img)from tools.feature_visualization import draw_feature_map1,feature_map_channeldraw_feature_map1(x,imgpath,name='inputs_') #特征层,图片路径,保存的文件名feature_map_channel(x,imgpath,name='chanel_')if self.with_neck:x = self.neck(x,imgpath)return x

3.在相应的检测器整体框架流程里,导入自己的检测框架
比如在ATSS里

效果图

测试时的可视化resnet50,最后两层

原图:

倒数第二层,C4层

最后一层,C5层

使用自己模块经过FPN后生成的,可以发现,更有利于分层检测。
生成的可视化图:

mmdetection里进行特征图可视化相关推荐

  1. 收藏 | PyTorch模型训练特征图可视化(TensorboardX)

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 仅作学术分享,不代表本公众号立场,侵权联系删除 转载于:作者丨Pa ...

  2. CNN可视化技术总结(一)--特征图可视化

    导言: 在CV很多方向所谓改进模型,改进网络,都是在按照人的主观思想在改进,常常在说CNN的本质是提取特征,但并不知道它提取了什么特征,哪些区域对于识别真正起作用,也不知道网络是根据什么得出了分类结果 ...

  3. caffe for windows的matlab接口(四):权重和特征图可视化的一个例子

    模型读取 参照三,想实现一个自己图像的可视化过程: 首先我发现自己训练出的model没有deploy文件.查阅了下:"如果要把训练好的模型拿来测试新的图片,那必须得要一个deploy.pro ...

  4. yolov5特征图可视化

    文章目录 前言 一.效果图 二.使用步骤 1.使用方法 2.注意事项 总结 参考 前言 最近写论文需要观察中间特征层的特征图,使用的是yolov5的代码仓库,但是苦于找不到很好的轮子,于是参考了很多, ...

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

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

  6. caffe之特征图可视化及特征提取

    上一篇博客,介绍了怎么对训练好的model的各层权重可视化,这篇博客,我们介绍测试图片输入网络后产生的特征图的可视化 记得上篇中,我们是写了一个新的文件test.cpp,然后编译运行那个文件的,这是因 ...

  7. CNN神经网络猫狗分类经典案例,深度学习过程中间层激活特征图可视化

    AI:CNN神经网络猫狗分类经典案例,深度学习过程中间层激活特征图可视化 基于前文 https://zhangphil.blog.csdn.net/article/details/103581736 ...

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

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

  9. 深度学习网络和特征图可视化的工具介绍

    1.深度学习网络结构画图工具: 网络结构画图工具https://cbovar.github.io/ConvNetDraw/ 输入:层信息 输出:网络结构图 网络结构图实例 2.caffe可视化工具 输 ...

最新文章

  1. 这54个docker命令!你必须懂!
  2. Design Pattern in Java[Challenge 2.1]
  3. 【C语言】C语言实现面向对象编程之多态
  4. 英特尔推出全新至强处理器E5 v4产品家族
  5. 2017计算机三级哪个好考,快速突破2017年计算机三级考试的几大复习阶段
  6. java getapplicationcontext_java – getApplicationContext()中的空指针
  7. LeetCode 320. 列举单词的全部缩写(回溯/位运算)
  8. AI和大数据结合,智能运维平台助力流利说提升核心竞争力
  9. Tomcat软连接访问配置(symbol link)
  10. NSGA-Ⅱ算法原理
  11. 为什么Eclipse Iceoryx使用Helix QAC
  12. 恩,今天把git和sublime结合了一下。。然后看了下《西部世界》
  13. [芦半山]Android native分析工具ASAN和HWASAN原理解析
  14. 2.2 华为-软件工程师-7.21笔试题
  15. 什么是谐振?什么是LC谐振电路?LC谐振电路有什么用呢?
  16. fegin get请求调用报错
  17. Delphi DBGridEh按标题进行排序
  18. Unity学习笔记——Unity基础一:unity界面、场景、游戏物体、组件等基本概念
  19. 2020.4.23工作记录————Regsvr32加载控件失败:“请确保该二进制存储在指定路径中。。。”
  20. 贡献15本超级经典Android教程,都是pdf完整版的

热门文章

  1. 西门子工业软件+Mendix,低代码让普通员工秒变技术员,你会被取代吗?
  2. 计算机求等级值的计算,2015年计算机一级MS OFFICE等级考试计算题
  3. 孟德尔随机化分析时,异质性太强怎么办
  4. 导数公式整理(更新中)
  5. 美团王兴的创业三原则
  6. css 两边到中间 渐变_怎么实现背景色从中间往两边渐变?_html/css_WEB-ITnose
  7. ClickHouse的入门、使用和优化
  8. Java-除数为0时会报错的情况(一个无法理解的例外-被除数为0)
  9. 你的命运不是一头骡子
  10. cuda-z/gpu-z/cpu-z工具分析GPU显卡和CPU算力信息