(转)YOLO-V3可视化训练过程中的参数,绘制loss、IOU、avg Recall等的曲线图

https://blog.csdn.net/qq_34806812/article/details/81459982

看了好几个博客,发现了些问题,有些博客是有bug的,此博客亲测无误。

可视化中间参数需要用到训练时保存的log文件(命令中的路径根据自己实际修改):

 ./darknet detector train pds/fish/cfg/fish.data pds/fish/cfg/yolov3-fish.cfg darknet53.conv.74 2>1 | tee visualization/train_yolov3.log 
  
  

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


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

运行之后,会解析log文件的loss行和iou行得到两个txt文件

使用train_loss_visualization.py脚本可以绘制loss变化曲线 
train_loss_visualization.py脚本如下(也是同一目录新建py文件):


  
  
  1. import pandas as pd
  2. import numpy as np
  3. import matplotlib.pyplot as plt
  4. #%matplotlib inline
  5. lines = 5124 #改为自己生成的train_log_loss.txt中的行数
  6. result = pd.read_csv( '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'])
  7. result.head()
  8. result[ 'loss']=result[ 'loss'].str.split( ' ').str.get( 1)
  9. result[ 'avg']=result[ 'avg'].str.split( ' ').str.get( 1)
  10. result[ 'rate']=result[ 'rate'].str.split( ' ').str.get( 1)
  11. result[ 'seconds']=result[ 'seconds'].str.split( ' ').str.get( 1)
  12. result[ 'images']=result[ 'images'].str.split( ' ').str.get( 1)
  13. result.head()
  14. result.tail()
  15. # print(result.head())
  16. # print(result.tail())
  17. # print(result.dtypes)
  18. print(result[ 'loss'])
  19. print(result[ 'avg'])
  20. print(result[ 'rate'])
  21. print(result[ 'seconds'])
  22. print(result[ 'images'])
  23. result[ 'loss']=pd.to_numeric(result[ 'loss'])
  24. result[ 'avg']=pd.to_numeric(result[ 'avg'])
  25. result[ 'rate']=pd.to_numeric(result[ 'rate'])
  26. result[ 'seconds']=pd.to_numeric(result[ 'seconds'])
  27. result[ 'images']=pd.to_numeric(result[ 'images'])
  28. result.dtypes
  29. fig = plt.figure()
  30. ax = fig.add_subplot( 1, 1, 1)
  31. ax.plot(result[ 'avg'].values,label= 'avg_loss')
  32. # ax.plot(result['loss'].values,label='loss')
  33. ax.legend(loc= 'best') #图列自适应位置
  34. ax.set_title( 'The loss curves')
  35. ax.set_xlabel( 'batches')
  36. fig.savefig( 'avg_loss')
  37. # fig.savefig('loss')

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

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

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

可以通过分析损失变化曲线,修改cfg中的学习率变化策略。

除了可视化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脚本如下(#lines根据train_log_iou.txt的行数修改):


  
  
  1. import pandas as pd
  2. import numpy as np
  3. import matplotlib.pyplot as plt
  4. #%matplotlib inline
  5. lines = 122956 #根据train_log_iou.txt的行数修改
  6. result = pd.read_csv( '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'])
  7. result.head()
  8. result[ 'Region Avg IOU']=result[ 'Region Avg IOU'].str.split( ': ').str. get( 1)
  9. result[ 'Class']=result[ 'Class'].str.split( ': ').str. get( 1)
  10. result[ 'Obj']=result[ 'Obj'].str.split( ': ').str. get( 1)
  11. result[ 'No Obj']=result[ 'No Obj'].str.split( ': ').str. get( 1)
  12. result[ 'Avg Recall']=result[ 'Avg Recall'].str.split( ': ').str. get( 1)
  13. result[ 'count']=result[ 'count'].str.split( ': ').str. get( 1)
  14. result.head()
  15. result.tail()
  16. # print(result.head())
  17. # print(result.tail())
  18. # print(result.dtypes)
  19. print(result[ 'Region Avg IOU'])
  20. result[ 'Region Avg IOU']=pd.to_numeric(result[ 'Region Avg IOU'])
  21. result[ 'Class']=pd.to_numeric(result[ 'Class'])
  22. result[ 'Obj']=pd.to_numeric(result[ 'Obj'])
  23. result[ 'No Obj']=pd.to_numeric(result[ 'No Obj'])
  24. result[ 'Avg Recall']=pd.to_numeric(result[ 'Avg Recall'])
  25. result[ 'count']=pd.to_numeric(result[ 'count'])
  26. result.dtypes
  27. fig = plt.figure()
  28. ax = fig.add_subplot( 1, 1, 1)
  29. ax.plot(result[ 'Region Avg IOU'].values,label= 'Region Avg IOU')
  30. # ax.plot(result[ 'Class'].values,label= 'Class')
  31. # ax.plot(result[ 'Obj'].values,label= 'Obj')
  32. # ax.plot(result[ 'No Obj'].values,label= 'No Obj')
  33. # ax.plot(result[ 'Avg Recall'].values,label= 'Avg Recall')
  34. # ax.plot(result[ 'count'].values,label= 'count')
  35. ax.legend(loc= 'best')
  36. # ax.set_title( 'The Region Avg IOU curves')
  37. ax.set_title( 'The Region Avg IOU curves')
  38. ax.set_xlabel( 'batches')
  39. # fig.savefig( 'Avg IOU')
  40. fig.savefig( 'Region Avg IOU')

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

参考:

https://blog.csdn.net/yudiemiaomiao/article/details/72469135

https://blog.csdn.net/cgt19910923/article/details/80783614

https://blog.csdn.net/cgt19910923/article/details/80783614#commentBox

***20181113***

评论区的一位做的表格很棒,很值得借鉴学习:

https://blog.csdn.net/qq_33614902/article/details/83418441

一、extract_log.py


  
  
  1. #!/usr/bin/python
  2. #coding=utf-8
  3. #该文件用于提取训练log,去除不可解析的log后使log文件格式化,生成新的log文件供可视化工具绘图
  4. import inspect
  5. import os
  6. import random
  7. import sys
  8. def extract_log(log_file, new_log_file, key_word):
  9. with open(log_file, 'r') as f:
  10. with open(new_log_file, 'w') as train_log:
  11. for line in f:
  12. #去除多GPU的同步log;去除除零错误的log
  13. if ( 'Syncing' in line) or ( 'nan' in line):
  14. continue
  15. if key_word in line:
  16. train_log.write(line)
  17. f.close()
  18. train_log.close()
  19. extract_log( './2048/train_log2.txt', './2048/log_loss2.txt', 'images')
  20. extract_log( './2048/train_log2.txt', 'log_iou2.txt', 'IOU')


二、visualization_loss.py


  
  
  1. #!/usr/bin/python
  2. #coding=utf-8
  3. import pandas as pd
  4. import numpy as np
  5. import matplotlib.pyplot as plt
  6. #根据自己的log_loss.txt中的行数修改lines, 修改训练时的迭代起始次数(start_ite)和结束次数(end_ite)。
  7. lines = 4500
  8. start_ite = 6000 #log_loss.txt里面的最小迭代次数
  9. end_ite = 15000 #log_loss.txt里面的最大迭代次数
  10. step = 10 #跳行数,决定画图的稠密程度
  11. igore = 0 #当开始的loss较大时,你需要忽略前igore次迭代,注意这里是迭代次数
  12. y_ticks = [ 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3, 1.4] #纵坐标的值,可以自己设置。
  13. data_path = '2048/log_loss2.txt' #log_loss的路径。
  14. result_path = './2048/avg_loss' #保存结果的路径。
  15. ####-----------------只需要改上面的,下面的可以不改动
  16. names = [ 'loss', 'avg', 'rate', 'seconds', 'images']
  17. result = pd.read_csv(data_path, skiprows=[x for x in range(lines) if (x<lines* 1.0/((end_ite - start_ite)* 1.0)*igore or x%step!= 9)], error_bad_lines=\
  18. False, names=names)
  19. result.head()
  20. for name in names:
  21. result[name] = result[name].str.split( ' ').str.get( 1)
  22. result.head()
  23. result.tail()
  24. for name in names:
  25. result[name] = pd.to_numeric(result[name])
  26. result.dtypes
  27. print(result[ 'avg'].values)
  28. fig = plt.figure()
  29. ax = fig.add_subplot( 1, 1, 1)
  30. ###-----------设置横坐标的值。
  31. x_num = len(result[ 'avg'].values)
  32. tmp = (end_ite-start_ite - igore)/(x_num* 1.0)
  33. x = []
  34. for i in range(x_num):
  35. x.append(i*tmp + start_ite + igore)
  36. #print(x)
  37. print( 'total = %d\n' %x_num)
  38. print( 'start = %d, end = %d\n' %(x[ 0], x[ -1]))
  39. ###----------
  40. ax.plot(x, result[ 'avg'].values, label= 'avg_loss')
  41. #ax.plot(result['loss'].values, label='loss')
  42. plt.yticks(y_ticks) #如果不想自己设置纵坐标,可以注释掉。
  43. plt.grid()
  44. ax.legend(loc = 'best')
  45. ax.set_title( 'The loss curves')
  46. ax.set_xlabel( 'batches')
  47. fig.savefig(result_path)
  48. #fig.savefig('loss')


三、visualization_iou.py


  
  
  1. #!/usr/bin/python
  2. #coding=utf-8
  3. import pandas as pd
  4. import numpy as np
  5. import matplotlib.pyplot as plt
  6. #根据log_iou修改行数
  7. lines = 1736397
  8. step = 5000
  9. start_ite = 0
  10. end_ite = 50200
  11. igore = 1000
  12. data_path = './my_coco3/log_iou.txt' #log_loss的路径。
  13. result_path = './my_coco3/Region Avg IOU' #保存结果的路径。
  14. names = [ 'Region Avg IOU', 'Class', 'Obj', 'No Obj', '.5_Recall', '.7_Recall', 'count']
  15. #result = pd.read_csv('log_iou.txt', skiprows=[x for x in range(lines) if (x%10==0 or x%10==9)]\
  16. result = pd.read_csv(data_path, skiprows=[x for x in range(lines) if (x<lines* 1.0/((end_ite - start_ite)* 1.0)*igore or x%step!= 0)]\
  17. , error_bad_lines= False, names=names)
  18. result.head()
  19. for name in names:
  20. result[name] = result[name].str.split( ': ').str.get( 1)
  21. result.head()
  22. result.tail()
  23. for name in names:
  24. result[name] = pd.to_numeric(result[name])
  25. result.dtypes
  26. ####--------------
  27. x_num = len(result[ 'Region Avg IOU'].values)
  28. tmp = (end_ite-start_ite - igore)/(x_num* 1.0)
  29. x = []
  30. for i in range(x_num):
  31. x.append(i*tmp + start_ite + igore)
  32. #print(x)
  33. print( 'total = %d\n' %x_num)
  34. print( 'start = %d, end = %d\n' %(x[ 0], x[ -1]))
  35. ####-------------
  36. fig = plt.figure()
  37. ax = fig.add_subplot( 1, 1, 1)
  38. ax.plot(x, result[ 'Region Avg IOU'].values, label= 'Region Avg IOU')
  39. #ax.plot(result['Avg Recall'].values, label='Avg Recall')
  40. plt.grid()
  41. ax.legend(loc= 'best')
  42. ax.set_title( 'The Region Avg IOU curves')
  43. ax.set_xlabel( 'batches')
  44. fig.savefig(result_path)

猜你喜欢

转载自blog.csdn.net/zyb418/article/details/88058357
今日推荐