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、以下是我的代码可视化结果: 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_path", type=str)
parser.add_argument("--out_dir", type=str,default='./')
args = parser.parse_args()
select = args.select # 选择绘图的指标
mode = args.mode # 选择log文件中的模式
json_path = args.json_path
out_dir=args.out_dir
x = [] # 存放epoch
y = [] # 存放指标
y_min = 1000000 # 存放指标最大值 ap不会超过1000000 绘制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 isFirst: # mmdetection生成的log json文件第一行是配置信息 跳过
isFirst = False
continue
row_data = json.loads(jsonstr)
if row_data['mode'] == mode: # 选择train或者val模式中的指标数据
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.argmax呢? 因为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.figure(figsize=(12, 8), dpi=300)
plt.grid(True, linestyle='--', alpha=0.5)
#plt.ylim(0.8, 1.0) # 设置y轴坐标范围
plt.xlabel('epoch')
plt.ylabel(select)
plt.plot(x, y)
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.savefig(args.out_dir+'/'+select+'.jpg', dpi=300)
4、运行参数解析
- --mode train或val 非必选,默认为val,选择绘制train还是val中的指标,train中有loss,没有mAP等指标,需要与--select配合使用,如图:
- --select bbox_mAP或loss 等等 非必选,默认为bbox_mAP_50,选择绘制的指标,只要json文件中出现的均可以选择,需要与--mode配合使用
- --json_path 待解析的json位置 必选,无默认值
- --out_dir 分析结果图片的父文件夹位置 非必选,默认是当前目录下
- 指令模板
-
python [visual_log.py文件位置] [--json_path log.json文件位置] [--mode train或val模式] [--select 绘制的指标名称] [--out_dir 图片保存的父文件夹]
- 将visual_log.py存放在mmdetection的tools文件夹下(当然你也可以放在其它地方),按照模板运行python脚本并传入对应的参数,如图:
- 可见mmdetection-master/recordSwinRetina文件夹下有分析的结果图片:
- 代码处理的是这种**.log.json文件,即mmdetection默认生成的json结果文件,如图:
- --out_dir 参数末尾不要加'/'
- json文件中的某一次'val'未生成mAP等指标,代码会报错KeyError,请将未生成的epoch记录整行删去
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)