mmdetection相关可视化(检测结果可视化+绘制热力图)

 用于记录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),此外保存输出结果的文件路径也需要自己先行创建。

=========================================================================

输出结果如图: 

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值