YOLO基础教程(十):YOLO训练过程中参数可视化

转载:https://blog.csdn.net/weixin_43472830/article/details/90517811


1.绘制loss、IOU、avg Recall等的曲线图

可视化中间参数需要用到训练时保存的log文件:

./darknet detector train cfg/voc.data cfg/yolov3-tiny.cfg yolov3-tiny.conv.15  -gpus 0,1  2>1 | tee visualization/tiny_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变化曲线 


 
   
   
   
   
  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 (x1.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脚本可以绘制IOU变化曲线 


 
   
   
   
   
  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 (x1.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)

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

2. 对VOC类型数据集的mAP计算与PR曲线的绘制

1 运行darknet官方代码中的detector valid指令,生成对测试集的检测结果。

格式: ./darknet detector valid   -out ""

 ./darknet detector valid cfg/voc.data cfg/yolov3-tiny.cfg backup/yolov3-tiny_final.weights -out ""
 
   
   
   
   

voc.data中 valid所指路径为测试图片所在路径,执行完之后应该会在程序的当前目录生产一个results文件夹,里面存有检测结果,文件名为<检测的类名>.txt。

2 下载检测用脚本文件 reval_voc_py.py和voc_eval_py.py     https://download.csdn.net/download/qq_33350808/10731748

3 使用reval_voc_py.py计算出mAP值并且生成pkl文件

首先将上面产生的results文件夹复制到当前目录,并将 .txt 改为 comp4_det_test_<检测的类名>.txt

格式:python reval_voc_py3.py --voc_dir --year <年份> --image_set <验证集文件名> --classes <类名文件路径> <输出文件夹名>

reval_voc_py3.py表示当前运行的脚本文件名,python3的话就用这个,python2的话用reval_voc.py。

voc文件路径就是当时训练用的VOC数据集的路径,比如windows下 d:\darknet\scripts\VOCdevkit,linux就是 \home\xxx\darknet\scripts\VOCdevkit,这里只是打个比方,读者请替换成自己需要的路径

类名文件路径就是voc.names文件的路径,在voc.data文件里面是有的,第4行names那里。

输出文件夹名就自己随便写了。

如:

python3 reval_voc_py3.py --voc_dir /data2/wym/VOCdevkit --year 2007 --image_set test --classes /data2/wym/darknet/data/voc.names testmAP

 
   
   
   
   

此时可得mAP值:

YOLO基础教程(十):YOLO训练过程中参数可视化_第1张图片

这时会在脚本当前目录生成一个存放了pkl文件的文件夹,名字就是刚才输入的输出文件夹名。

4.用matplotlib绘制PR曲线


 
   
   
   
   
  1. import _pickle as cPickle
  2. import matplotlib.pyplot as plt
  3. fr = open( 'apple_pr.pkl', 'rb') #这里open中第一个参数需要修改成自己生产的pkl文件
  4. inf = cPickle.load(fr)
  5. fr.close()
  6. x=inf[ 'rec']
  7. y=inf[ 'prec']
  8. plt.figure()
  9. plt.xlabel( 'recall')
  10. plt.ylabel( 'precision')
  11. plt.title( 'PR cruve')
  12. plt.plot(x,y)
  13. plt.show()
  14. print( 'AP:',inf[ 'ap'])

参考:https://blog.csdn.net/qq_33350808/article/details/83178002

你可能感兴趣的:(yolov3,可视化)