YOLO模型训练可视化训练过程中的中间参数

来源:互联网 发布:手绘地图软件 编辑:程序博客网 时间:2024/06/01 12:48

转自:http://blog.csdn.net/yudiemiaomiao/article/details/72469135

YOLO v2训练输出中间参数含义参考:http://blog.csdn.net/hysteric314/article/details/54093734

等待训练结束后(有时还没等结束模型就开始发散了),因此需要检测各项指标(如loss)是否达到了我们期望的数值,如果没有,要分析为什么。可视化训练过程的中间参数可以帮助我们分析问题。 
可视化中间参数需要用到训练时保存的log文件:

./darknet detector train cfg/tiny-yolo.cfg tiny-yolo_8000.conv.9 2>1 | tee person_train_log.txt

命令:

tee person_train_log.txt

保存log时会生成两个文件,文件1里保存的是网络加载信息和checkout点保存信息,person_train_log.txt中保存的是训练信息。

训练log中各参数的意义

Region Avg IOU:平均的IOU,代表预测的bounding box和ground truth的交集与并集之比,期望该值趋近于1。

Class:是标注物体的概率,期望该值趋近于1.

Obj:期望该值趋近于1.

No Obj:期望该值越来越小但不为零.

Avg Recall:期望该值趋近1

avg:平均损失,期望该值趋近于0

rate:当前学习率

在使用脚本绘制变化曲线之前,需要先使用extract_log.py脚本,格式化log,用生成的新的log文件供可视化工具绘图,格式化log的extract_log.py脚本如下:

# coding=utf-8# 该文件用来提取训练log,去除不可解析的log后使log文件格式化,生成新的log文件供可视化工具绘图def extract_log(log_file,new_log_file,key_word):f = open(log_file)train_log = open(new_log_file, 'w')for line in f:    # 去除多gpu的同步log    if 'Syncing' in line:        continue    # 去除除零错误的log    if 'nan' in line:        continue    if key_word in line:        train_log.write(line)f.close()train_log.close()extract_log('person_train_log.txt','person_train_log_loss.txt','images')   #voc_train_log.txt 用于绘制loss曲线extract_log('person_train_log.txt','person_train_log_iou.txt','IOU')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

使用train_loss_visualization.py脚本可以绘制loss变化曲线 
train_loss_visualization.py脚本如下:

import pandas as pdimport numpy as npimport matplotlib.pyplot as plt#%matplotlib inlinelines =9873result = pd.read_csv('person_train_log_loss.txt', skiprows=[x for x in range(lines) if ((x%10!=9) |(x<1000))] ,error_bad_lines=False, names=['loss', 'avg', 'rate', 'seconds', 'images'])result.head()result['loss']=result['loss'].str.split(' ').str.get(1)result['avg']=result['avg'].str.split(' ').str.get(1)result['rate']=result['rate'].str.split(' ').str.get(1)result['seconds']=result['seconds'].str.split(' ').str.get(1)result['images']=result['images'].str.split(' ').str.get(1)result.head()result.tail()#print(result.head())# print(result.tail())# print(result.dtypes)print(result['loss'])print(result['avg'])print(result['rate'])print(result['seconds'])print(result['images'])result['loss']=pd.to_numeric(result['loss'])result['avg']=pd.to_numeric(result['avg'])result['rate']=pd.to_numeric(result['rate'])result['seconds']=pd.to_numeric(result['seconds'])result['images']=pd.to_numeric(result['images'])result.dtypesfig = plt.figure()ax = fig.add_subplot(1, 1, 1)ax.plot(result['avg'].values,label='avg_loss')#ax.plot(result['loss'].values,label='loss')ax.legend(loc='best')ax.set_title('The loss curves')ax.set_xlabel('batches')fig.savefig('avg_loss')#fig.savefig('loss')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44

修改train_loss_visualization.py中lines为log行数,并根据需要修改要跳过的行数:

skiprows=[x for x in range(lines) if ((x%10!=9) |(x<1000))]

运行train_loss_visualization.py会在脚本所在路径生成avg_loss.png。

可以通过分析损失变化曲线,修改cfg中的学习率变化策略,比如上图:模型在100000万次迭代后损失下降速度非常慢,几乎没有下降。结合log和cfg文件发现,自定义的学习率变化策略在十万次迭代时会减小十倍,十万次迭代后学习率下降到非常小的程度,导致损失下降速度降低。修改cfg中的学习率变化策略,10万次迭代时不改变学习率,30万次时再降低。

除了可视化loss,还可以可视化Avg IOU,Avg Recall等参数 
可视化’Region Avg IOU’, ‘Class’, ‘Obj’, ‘No Obj’, ‘Avg Recall’,’count’这些参数可以使用脚本train_iou_visualization.py,使用方式和train_loss_visualization.py相同,train_iou_visualization.py脚本如下:

import pandas as pdimport numpy as npimport matplotlib.pyplot as plt#%matplotlib inlinelines =9873result = pd.read_csv('voc_train_log_iou.txt', skiprows=[x for x in range(lines) if (x%10==0 or x%10==9) ] ,error_bad_lines=False, names=['Region Avg IOU', 'Class', 'Obj', 'No Obj', 'Avg Recall','count'])result.head()result['Region Avg IOU']=result['Region Avg IOU'].str.split(': ').str.get(1)result['Class']=result['Class'].str.split(': ').str.get(1)result['Obj']=result['Obj'].str.split(': ').str.get(1)result['No Obj']=result['No Obj'].str.split(': ').str.get(1)result['Avg Recall']=result['Avg Recall'].str.split(': ').str.get(1)result['count']=result['count'].str.split(': ').str.get(1)result.head()result.tail()#print(result.head())# print(result.tail())# print(result.dtypes)print(result['Region Avg IOU'])result['Region Avg IOU']=pd.to_numeric(result['Region Avg IOU'])result['Class']=pd.to_numeric(result['Class'])result['Obj']=pd.to_numeric(result['Obj'])result['No Obj']=pd.to_numeric(result['No Obj'])result['Avg Recall']=pd.to_numeric(result['Avg Recall'])result['count']=pd.to_numeric(result['count'])result.dtypesfig = plt.figure()ax = fig.add_subplot(1, 1, 1)ax.plot(result['Region Avg IOU'].values,label='Region Avg IOU')#ax.plot(result['Class'].values,label='Class')#ax.plot(result['Obj'].values,label='Obj')#ax.plot(result['No Obj'].values,label='No Obj')#ax.plot(result['Avg Recall'].values,label='Avg Recall')#ax.plot(result['count'].values,label='count')ax.legend(loc='best')#ax.set_title('The Region Avg IOU curves')ax.set_title('The Region Avg IOU curves')ax.set_xlabel('batches')#fig.savefig('Avg IOU')fig.savefig('Region Avg IOU')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

运行train_iou_visualization.py会在脚本所在路径生成相应的曲线图。

原创粉丝点击