MMRazor 中,将使用 MMEngine 提供的 Visualizer
可视化器搭配 MMRazor 自带的 Recorder
组件的数据记录功能,进行特征图可视化,其具备如下功能:
- 支持基础绘图接口以及特征图可视化。
- 支持选择模型中的任意位点来得到特征图,包含
pixel_wise_max
,squeeze_mean
,select_max
,topk
四种显示方式,用户还可以使用arrangement
自定义特征图显示的布局方式。
你可以调用 tools/visualizations/vis_configs/feature_visualization.py
来简单快捷地得到单张图片单个模型的可视化结果。
为了方便理解,将其主要参数的功能梳理如下:
-
img
:选择要用于特征图可视化的图片,支持单张图片或者图片路径列表。 -
config
:选择算法的配置文件。 -
vis_config
:可视化功能需借助可配置的Recorder
组件获取模型中用户自定义位点的特征图, 用户可以将Recorder
相关配置文件放入vis_config
中。 MMRazor提供了对backbone及neck 输出进行可视化对应的config文件,详见configs/visualizations
-
checkpoint
:选择对应算法的权重文件。 -
--out-file
:将得到的特征图保存到本地,并指定路径和文件名。若没有选定,则会直接显示特征图。 -
--device
:指定用于推理图片的硬件,--device cuda:0
表示使用第 1 张 GPU 推理,--device cpu
表示用 CPU 推理。 -
--repo
:模型对应的算法库。--repo mmdet
表示模型为检测模型。 -
--use-norm
:是否将获取的特征图进行batch normalization后再显示。 -
--overlaid
:是否将特征图覆盖在原图之上。若设为True,考虑到输入的特征图通常非常小,函数默认将特征图进行上采样后方便进行可视化。 -
--channel-reduction
:输入的 Tensor 一般是包括多个通道的,channel_reduction
参数可以将多个通道压缩为单通道,然后和图片进行叠加显示,有以下三个参数可以设置:pixel_wise_max
:将输入的 C 维度采用 max 函数压缩为一个通道,输出维度变为 (1, H, W)。squeeze_mean
:将输入的 C 维度采用 mean 函数压缩为一个通道,输出维度变成 (1, H, W)。select_max
:从输入的 C 维度中先在空间维度 sum,维度变成 (C, ),然后选择值最大的通道。None
:表示不需要压缩,此时可以通过topk
参数可选择激活度最高的topk
个特征图显示。
-
--topk
:只有在channel_reduction
参数为None
的情况下,topk
参数才会生效,其会按照激活度排序选择topk
个通道,然后和图片进行叠加显示,并且此时会通过--arrangement
参数指定显示的布局,该参数表示为一个数组,两个数字需要以空格分开,例如:--topk 5 --arrangement 2 3
表示以2行 3列
显示激活度排序最高的 5 张特征图,--topk 7 --arrangement 3 3
表示以3行 3列
显示激活度排序最高的 7 张特征图。- 如果 topk 不是 -1,则会按照激活度排序选择 topk 个通道显示。
- 如果 topk = -1,此时通道 C 必须是 1 或者 3 表示输入数据是图片,否则报错提示用户应该设置
channel_reduction
来压缩通道。
-
--arrangement
:特征图的排布。当channel_reduction
不是None且topk > 0时才会有用。 -
--resize-shape
:当--overlaid
为True时,是否需要将原图和特征图resize为某一尺寸。 -
--cfg-options
:由于不同算法库的visualizer拥有特例化的add_datasample方法,如mmdet的visualizer 拥有pred_score_thr
作为输入参数,可以在--cfg-options
加入一些特例化的设置。
类似的,用户可以通过调用 tools/visualizations/vis_configs/feature_diff_visualization.py
来得到
单张图片两个模型的特征差异可视化结果,用法与上述类似,差异为:
config1
/config2
:选择算法1/2的配置文件。checkpoint1
/checkpoint2
:选择对应算法1/2的权重文件。
以预训练好的 RetinaNet-r101 与 RetinaNet-r50 模型为例:
请提前下载 RetinaNet-r101 与 RetinaNet-r50 模型权重到本仓库根路径下:
cd mmrazor
wget https://download.openmmlab.com/mmdetection/v2.0/retinanet/retinanet_r101_fpn_2x_coco/retinanet_r101_fpn_2x_coco_20200131-5560aee8.pth
wget https://download.openmmlab.com/mmdetection/v2.0/retinanet/retinanet_r50_fpn_2x_coco/retinanet_r50_fpn_2x_coco_20200131-fdb43119.pth
(1) 将多通道特征图采用 pixel_wise_max
参数压缩为单通道并显示, 通过提取 neck
层输出进行特征图可视化(这里只显示了前4个stage的特征图):
python tools/visualizations/feature_visualization.py \
tools/visualizations/demo.jpg \
PATH/TO/THE/CONFIG \
tools/visualizations/vis_configs/fpn_feature_visualization.py \
retinanet_r101_fpn_2x_coco_20200131-5560aee8.pth \
--repo mmdet --use-norm --overlaid
--channel-reduction pixel_wise_max
(2) 将多通道特征图采用 select_max
参数压缩为单通道并显示, 通过提取 neck
层输出进行特征图可视化(这里只显示了前4个stage的特征图):
python tools/visualizations/feature_visualization.py \
tools/visualizations/demo.jpg \
PATH/TO/THE/CONFIG \
tools/visualizations/vis_configs/fpn_feature_visualization.py \
retinanet_r101_fpn_2x_coco_20200131-5560aee8.pth \
--repo mmdet --overlaid
--channel-reduction select_max
(3) 将多通道特征图采用 squeeze_mean
参数压缩为单通道并显示, 通过提取 neck
层输出进行特征图可视化(这里只显示了前4个stage的特征图):
python tools/visualizations/feature_visualization.py \
tools/visualizations/demo.jpg \
PATH/TO/THE/CONFIG \
tools/visualizations/vis_configs/fpn_feature_visualization.py \
retinanet_r101_fpn_2x_coco_20200131-5560aee8.pth \
--repo mmdet --overlaid
--channel-reduction squeeze_mean
(4) 将多通道特征图采用 squeeze_mean
参数压缩为单通道并显示, 通过提取 neck
层输出进行特征图可视化(这里只显示了前4个stage的特征图):
python tools/visualizations/feature_visualization.py \
tools/visualizations/demo.jpg \
PATH/TO/THE/CONFIG \
tools/visualizations/vis_configs/fpn_feature_visualization.py \
retinanet_r101_fpn_2x_coco_20200131-5560aee8.pth \
--repo mmdet --overlaid
--channel-reduction squeeze_mean
(5) 将多通道的两个模型的特征图差异采用 pixel_wise_max
参数压缩为单通道并显示, 这里只显示了前4个stage的特征图差异:
python tools/visualizations/feature_diff_visualization.py \
tools/visualizations/demo.jpg \
PATH/TO/THE/CONFIG1 \
PATH/TO/THE/CONFIG2 \
tools/visualizations/vis_configs/fpn_feature_diff_visualization.py.py \
retinanet_r101_fpn_2x_coco_20200131-5560aee8.pth \
retinanet_r50_fpn_2x_coco_20200131-fdb43119.pth \
--repo mmdet --use-norm --overlaid
--channel-reduction pixel_wise_max