可视化/绘制多个mmdetection的log.json日志文件(绝对好用)

1、(点个赞吧~)

mmdetection将训练的结果保存在****.log.json文件中,绘制其中的mAP、loss指标可使用mmdetection自带的py文件,官方可视化api如下:https://mmdetection.readthedocs.io/en/latest/useful_tools.htmlhttps://mmdetection.readthedocs.io/en/latest/useful_tools.html但我用了总是报错,干脆自己写一个~

2、以下是我的代码可视化结果:

可视化/绘制多个mmdetection的log.json日志文件(绝对好用)_第1张图片

3、代码如下(visual_log.py

import json
import matplotlib.pyplot as plt
import argparse

'''
解析参数
'''
parser = argparse.ArgumentParser()
parser.add_argument("--mode", type=str, default='val')
parser.add_argument("--select", type=str, default='bbox_mAP_50')
parser.add_argument("--json_paths", type=str, nargs='+')
parser.add_argument("--line_names", type=str, nargs='+')
parser.add_argument("--out_dir", type=str, default='./')
parser.add_argument("--epoch_num", type=int, default=20)
parser.add_argument("--pic_name", type=str,default="result")
args = parser.parse_args()

select=args.select
pic_name=args.pic_name
mode = args.mode  # 选择log文件中的模式
json_paths = args.json_paths
line_names = args.line_names
out_dir = args.out_dir
epoch_num = args.epoch_num

plt.figure(figsize=(12, 8), dpi=300)
for i, json_path in enumerate(json_paths):
    epoch_now = 0
    x = []  # 存放epoch
    y = []  # 存放指标
    y_min = 1000000  # 存放指标最大值   ap不会超过1  绘制loss可自由更改
    y_max = -1  # 存放指标最小值   ap不会小于-1  绘制loss可自由更改
    x_min = 0  # 出现最小值的epoch
    x_max = 0  # 出现最大值的epoch
    isFirst = True
    with open(json_path, 'r') as f:
        for jsonstr in f.readlines():
            if epoch_now == epoch_num:
                break
            if isFirst:  # mmdetection生成的log  json文件第一行是配置信息  跳过
                isFirst = False
                continue
            row_data = json.loads(jsonstr)
            if row_data['mode'] == mode:  # 选择train或者val模式中的指标数据
                epoch_now = epoch_now + 1
                item_select = float(row_data[select])
                x_select = int(row_data['epoch'])
                x.append(x_select)
                y.append(item_select)
                if item_select >= y_max:  # 选择最大值  为什么不用numpy.argmin呢?  因为epoch可能不从1开始  xmin和ymin可能匹配错误  比较麻烦
                    y_max = item_select
                    x_max = x_select
                if item_select <= y_min:  # 选择最大值
                    y_min = item_select
                    x_min = x_select

    plt.grid(True, linestyle='--', alpha=0.5)
    plt.plot(x, y, label=line_names[i])
    plt.plot(x_min, y_min, 'g-p', x_max, y_max, 'r-p')
    show_min = '[' + str(x_min) + ' , ' + str(y_min) + ']'
    show_max = '[' + str(x_max) + ' , ' + str(y_max) + ']'
    plt.annotate(show_min, xy=(x_min, y_min), xytext=(x_min, y_min))
    plt.annotate(show_max, xy=(x_max, y_max), xytext=(x_max, y_max))

plt.xlabel('epoch')
plt.legend()
plt.ylabel(select)

# plt.ylim(0.8, 1.0)  # 设置y轴坐标范围


plt.savefig(args.out_dir + '/' + pic_name + '.jpg', dpi=300)

 4、运行参数解析

  • --mode   train或val,非必选,默认为val,选择绘制train还是val中的指标,train中有loss,没有mAP等指标,需要与--select配合使用,如图:
  • 可视化/绘制多个mmdetection的log.json日志文件(绝对好用)_第2张图片
  • --select   bbox_mAP或loss 等等,非必选,默认为bbox_mAP_50,选择绘制的指标,只要json文件中出现的均可以选择,需要与--mode配合使用
  • --json_paths  待解析的json位置,必选,无默认值
  • --line_names 绘制多条曲线时,必选依次指定曲线名称
  • --out_dir  分析结果图片的父文件夹位置,非必选,默认是当前目录下
  • --epoch_num 选择绘制的世代数,非必选,默认为20
  • --pic_name 输出图片的名称(无需加文件尾缀),非必选,默认是result
  • 指令模板
  • python  [visual_log.py文件位置]  [--mode train或val模式] [--select 绘制的指标名称]  [--json_paths  log.json文件位置] [--line_names 绘制曲线的名称] [--out_dir  图片保存的父文件夹] [--epoch_num 绘制的世代数] [--pic_name 图片名称]

5、使用流程

  • 将visual_log.py存放在某文件夹下,按照指令模板运行python脚本并传入对应的参数,如图:
  • 运行完成后,可见record2文件夹下有分析的结果图片output.png:
  • 可视化/绘制多个mmdetection的log.json日志文件(绝对好用)_第3张图片

 6、注意事项

  • 代码处理的是这种**.log.json文件,即mmdetection默认生成的json结果文件,如图:
  • 可视化/绘制多个mmdetection的log.json日志文件(绝对好用)_第4张图片
  • --out_dir 参数末尾不要加'/'
  • json文件中的某一次'val'未生成mAP等指标,代码会报错KeyError,请将未生成的epoch记录整行删去

你可能感兴趣的:(mmdetection,python,object,detection)