是深度眸眸佬的代码课,好耶ヾ(✿゚▽゚)ノ~
安装:
就像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版本在使用前最好看一眼版本;虽然我其实没有怎么遇到因为这两个出现问题;