用于记录mmdetection(mmdet2.2版本)目标检测框架中可能使用到的可视化方法。
一、检测结果可视化
--show-dir用于将检测结果绘制在图像上并保存到自己指定的目录中。注意,自己指定的保存路径需提前建立。
python tools/test.py [配置文件.py] [训练出的权重.pth] --show-dir [保存结果的指定路径]
=========================================================================
输出结果如图:
二、绘制热力图
#coding: utf-8
import cv2
import mmcv
import numpy as np
import os
import torch
from mmdet.apis import inference_detector, init_detector
def featuremap_2_heatmap(feature_map):
assert isinstance(feature_map, torch.Tensor)
feature_map = feature_map.detach()
heatmap = feature_map[:,0,:,:]*0
for c in range(feature_map.shape[1]):
heatmap+=feature_map[:,c,:,:]
heatmap = heatmap.cpu().numpy()
heatmap = np.mean(heatmap, axis=0)
heatmap = np.maximum(heatmap, 0)
heatmap /= np.max(heatmap)
return heatmap
def draw_feature_map(model, img_path, save_dir):
'''
model: 加载参数的模型
img_path: 测试图像的文件路径
save_dir: 保存生成图像的文件夹
'''
img = mmcv.imread(img_path)
modeltype = str(type(model)).split('.')[-1].split('\'')[0]
model.eval()
model.draw_heatmap = True
featuremaps = inference_detector(model, img) # 这里需要稍微改动检测模型里的simple_test,具体见下面步骤②
i=2
for featuremap in featuremaps:
heatmap = featuremap_2_heatmap(featuremap)
heatmap = cv2.resize(heatmap, (img.shape[1], img.shape[0])) # 将热力图的大小调整为与原始图像相同
heatmap = np.uint8(255 * heatmap) # 将热力图转换为RGB格式
heatmap = cv2.applyColorMap(heatmap, cv2.COLORMAP_JET) # 将热力图应用于原始图像
superimposed_img = heatmap * 0.5 + img*0.3 # 这里的0.5是热力图强度因子
cv2.imwrite(os.path.join(save_dir,'cam_'+'P'+str(i)+'.png'), superimposed_img) # 保存图像
i=i+1
from argparse import ArgumentParser
def main():
parser = ArgumentParser()
parser.add_argument('img', help='Image file')
parser.add_argument('save_dir', help='Dir to save heatmap image')
parser.add_argument('config', help='Config file')
parser.add_argument('checkpoint', help='Checkpoint file')
parser.add_argument('--device', default='cuda:0', help='Device used for inference')
args = parser.parse_args()
# build the model from a config file and a checkpoint file
model = init_detector(args.config, args.checkpoint, device=args.device)
draw_feature_map(model,args.img,args.save_dir)
if __name__ == '__main__':
main()
(代码参考自基于mmdetection的热力图可视化绘制 - aimhabo - 博客园 (cnblogs.com) )
① 在tools目录下建立visualization.py,然后插入上述代码。
②针对featuremaps = inference_detector(model, img)中提到的修改模型,以two_stage两阶段模型为例,如果输出backbone+fpn的P2~P6层特征图的热力图,更改mmdet/models/detectors/obb/obb_two_stage.py中simple_test,在调用extract_feat后直接return x(这里的x是一个包含5个tesnor变量的tuple,每一个tensor对应一个FPN的输出特征层),并将后续内容注释掉(直接return x仅用于生成热力图时使用,记得使用后把这里还原)。具体visualization.py调用模型的流程等可以通过调试代码自行了解。
def simple_test(self, img, img_metas, proposals=None, rescale=False):
"""Test without augmentation."""
assert self.with_bbox, 'Bbox head must be implemented.'
x = self.extract_feat(img)
return x
#
# if proposals is None:
# proposal_list = self.rpn_head.simple_test_rpn(x, img_metas)
# else:
# proposal_list = proposals
#
# return self.roi_head.simple_test(
# x, proposal_list, img_metas, rescale=rescale)
③最后终端执行如下命令生成热力图:
python tools/visualization.py [输入的图片路径] [保存输出结果的文件路径] [配置文件.py] [权重文件.pth]
注意,这里只能单个图片进行测试(如输入的图片路径为demo/dota_demo.jpg),此外保存输出结果的文件路径也需要自己先行创建。
=========================================================================
输出结果如图: