mmdet代码课

是深度眸眸佬的代码课,好耶ヾ(✿゚▽゚)ノ~

安装:

就像pose中笔记说的一样,个人推荐3.0.0rc6,clone下来后mim install -e .即可安装完成~

本节课使用算法:RTMDET

眸佬推荐以以下流程来完成项目,每一次出现问题可以先归因属于以下哪一个环节出现了问题:

我最关心的是模型的推理、测试与可视化,因为之前有一个模型我想进行误差分析,但是使用test.py怎么也获取不了对应的文件 。

所以先来看看visualize的部分!

test的主要目的:1.隔久了忘记了指标是多少;2.将结果以json等格式存储下来,以便进行可视化脚本的运行。

补充: test.py --show-dir results 可以存储test的图片的真实值和预测值
 

import os
import matplotlib.pyplot as pltfrom PIL import Image


%matplotlib inline  # (jupyter文件内先是matplot图片)


plt.figure(figsize=(20,20))


root_path='work dirs/rtmdet_tiny_1xb12-40e cat/20230517_120933/results/'

image paths= [filename for filename in os,listdir(root path)][:4]

for i,filename in enumerate(image paths):

  name = os.path.splitext(filename)[0]

  image = Image.open(root path+filename).convert("RGB")

  plt.subplot(4,1,i+1)
  plt.imshow(image)
  plt.title(f"(filename)")
  plt.xticks([])
  plt.yticks([])

plt.tight layout()

上述代码来看test图片结果的话,左边是ground box,右边是pre box

很有用的可视化后端软件hook,记录在此,希望记牢了不要每次用到都要去翻log(笑)

在这里,LocalVisBackend指的是本地的后端hook

visualizer = dict(vis backends = [dict(type='LocalVisBackend'), dict(type='WandbVisBackend')])

visualizer = dict(vis backends = [dict(type='TensorboardVisBackend')])

上面说的是直接test整个val集,也许有时候需要单张图片的推理,可以使用mmdetecion/demo/image_demo.py这个demo脚本来完成

接下来是可视化分析部分:

包括了“特征图可视化”,“grad cam”(梯度图)等可视化分析手段,可以通过使用mmyolo库中提供的脚本来进行分析。(det库里面还没上传,暂时得clone yolo库来使用)

特征图可视化
MMYOLO 中,将使用 MMEngine 提供的 Visualizer 可视化器进行特征图可视化,其具备如下功能:

  • 支持基础绘图接口以及特征图可视化。
  • 支持选择模型中的不同层来得到特征图,包含 squeeze_mean , select_max,topk 三种显示方式,用户还可以使用arrangement 自定义特征图显示的布局方式。

调用 demo/featmap_vis demo.py 来简单快捷地得到可视化结果,主要参数的功能梳理如下:
img : 选择要用于特征图可视化的图片,支持单张图片或者图片路径列表
config: 选择算法的配置文件;
checkpoint: 选择对应算法的权重文件;
--out-file :将得到的特征图保存到本地,并指定路径和文件名;
--device: 指定用于推理图片的硬件,--device cuda: 0 表示使用第1张GPU 推理,--device cpu 表示用CPU 推理;

-score-thr: 设置检测框的置信度闻值,只有置信度高于这个值的框才会显示;


--preview-model:可以预览模型,方便用户理解模型的特征层结构。


更多的参数设置不摘录过来了,显得这部分太冗长。<- 这样的想法是不对的,因为我去找了一下demo/feature_vis_demo.py 文件看了眼,发现参数说明远远没有视频中眸佬解释那么清楚,所以还是乖乖摘录吧~

--target-layers:对于指定的层获取可视化的特征图。例如想要单独输出某一个层的特征图,可以这么用: --target-layers backbone, --target-layers neck, --target-layers backbone.stage4等;当参数为list时,也可以同时输出多个层的特征图,如: --targe-layers backbone.stage4 neck 可以同时输出backbong的stage4层和neck的三层一共四层特征图。

--channel-reduction: 可以将多个通道压缩为单通道(输入的tensor一般是多个通道的),然后和图片进行叠加显示,可以设置如下三种参数:

(1)squeeze_mean---将如数的C维度采用mean函数压缩为一个通道,输出维度变为(1,H,W); (2)select_max:将输入现在空间维度sum,维度为(C, ),然后选择值最大的通道;

(3)None:表示不压缩,此时可以通过topk参数可选择激活度最高的topk个特征图进行显示。

--topk:如上文所说,当--channel-reduction 设置为None时生效,按照激活度排序选择topk的通道,然后和图片进行叠加显示,并且此时会通过--arrangement参数指定显示的布局,该参数表示为一个tuple,两个数字需要以空格分开,如: --topk 5 --arrangement 2 3 表示以2行3列显示激活度排序最高的5张特征图。

 如果此处topk=-1,此时通道C必须是1或者3表示输入数据是图片,否则报错提示应该设置channel_reduction来压缩通道;

同时考虑到输入的特征图通常非常小,函数默认将特征图进行upsample后方便进行可视化。注意:当图片和特征图尺度不一致时,draw_featmap函数会自动upsample补齐。如果图片再推理过程中前处理存在类似pad操作,那么此时得到的特征特也会是pad过的,直接upsample依然会出现尺度无法对齐的问题。

# 可以使用opencv来缩放图片

import cv2

img = cv2.imread($path)
h,w = img.shape[:2]
resized_img = cv2.resize(img, (640,640))
cv2.imwrite('resized_img.jpg', resized_img)

让我们来试试这个feamap_vis_demo函数:

python demo/featmap_vis_demo.py resized_img.jpg $cfg $pth \
       --target-layers backbonge \ 
       --channel-reduction squeeze_mean

Image.open('output/resized_img.jpg')

# 可视化backbone并且输出3个通道

Grad_Based CAM可视化:

因为目标检测的原因,实际上可视化的是Grad Box AM 而不是CAM, 需要先安装grad_cam库

pip install "grad_cam"

使用代码为demo/boxam_vis_demo.py 而参数设置与上文所说的featmap_vis_demo基本一致,举例如下:

python demo/boxam_vis_demo.py resized_img.jpg cfg.py weigh.pth \
       --target-layer neck.out_convs[2] # 查看neck输出的最小输出特征图的grad cam;如要最大特征图,使用neck.out_convs[0]

Image.open('output/resized_img.jpg')

 

nvcc(GPU版本),gcc版本在使用前最好看一眼版本;虽然我其实没有怎么遇到因为这两个出现问题;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值