转载:https://blog.csdn.net/weixin_43472830/article/details/90517811
可视化中间参数需要用到训练时保存的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文件同一目录):
-
# coding=utf-8
-
# 该文件用来提取训练log,去除不可解析的log后使log文件格式化,生成新的log文件供可视化工具绘图
-
-
import inspect
-
import os
-
import random
-
import sys
-
def extract_log(log_file,new_log_file,key_word):
-
with open(log_file,
'r')
as f:
-
with open(new_log_file,
'w')
as train_log:
-
#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(
'train_yolov3.log',
'train_log_loss.txt',
'images')
-
extract_log(
'train_yolov3.log',
'train_log_iou.txt',
'IOU')
运行之后,会解析log文件的loss行和iou行得到两个txt文件
使用train_loss_visualization.py脚本可以绘制loss变化曲线
-
#!/usr/bin/python
-
#coding=utf-8
-
-
import pandas
as pd
-
import numpy
as np
-
import matplotlib.pyplot
as plt
-
-
-
#根据自己的log_loss.txt中的行数修改lines, 修改训练时的迭代起始次数(start_ite)和结束次数(end_ite)。
-
lines =
4500
-
start_ite =
6000
#log_loss.txt里面的最小迭代次数
-
end_ite =
15000
#log_loss.txt里面的最大迭代次数
-
step =
10
#跳行数,决定画图的稠密程度
-
igore =
0
#当开始的loss较大时,你需要忽略前igore次迭代,注意这里是迭代次数
-
-
-
y_ticks = [
0.4,
0.5,
0.6,
0.7,
0.8,
0.9,
1.0,
1.1,
1.2,
1.3,
1.4]
#纵坐标的值,可以自己设置。
-
data_path =
'2048/log_loss2.txt'
#log_loss的路径。
-
result_path =
'./2048/avg_loss'
#保存结果的路径。
-
-
####-----------------只需要改上面的,下面的可以不改动
-
names = [
'loss',
'avg',
'rate',
'seconds',
'images']
-
result = pd.read_csv(data_path, skiprows=[x
for x
in range(lines)
if (x
1.0/((end_ite - start_ite)*
1.0)*igore
or x%step!=
9)], error_bad_lines=\
-
False, names=names)
-
result.head()
-
for name
in names:
-
result[name] = result[name].str.split(
' ').str.get(
1)
-
-
result.head()
-
result.tail()
-
-
for name
in names:
-
result[name] = pd.to_numeric(result[name])
-
result.dtypes
-
print(result[
'avg'].values)
-
-
fig = plt.figure()
-
ax = fig.add_subplot(
1,
1,
1)
-
-
-
###-----------设置横坐标的值。
-
x_num = len(result[
'avg'].values)
-
tmp = (end_ite-start_ite - igore)/(x_num*
1.0)
-
x = []
-
for i
in range(x_num):
-
x.append(i*tmp + start_ite + igore)
-
#print(x)
-
print(
'total = %d\n' %x_num)
-
print(
'start = %d, end = %d\n' %(x[
0], x[
-1]))
-
###----------
-
-
-
ax.plot(x, result[
'avg'].values, label=
'avg_loss')
-
#ax.plot(result['loss'].values, label='loss')
-
plt.yticks(y_ticks)
#如果不想自己设置纵坐标,可以注释掉。
-
plt.grid()
-
ax.legend(loc =
'best')
-
ax.set_title(
'The loss curves')
-
ax.set_xlabel(
'batches')
-
fig.savefig(result_path)
-
#fig.savefig('loss')
使用visualization_iou.py脚本可以绘制IOU变化曲线
-
#!/usr/bin/python
-
#coding=utf-8
-
-
import pandas
as pd
-
import numpy
as np
-
import matplotlib.pyplot
as plt
-
-
#根据log_iou修改行数
-
lines =
1736397
-
step =
5000
-
start_ite =
0
-
end_ite =
50200
-
igore =
1000
-
data_path =
'./my_coco3/log_iou.txt'
#log_loss的路径。
-
result_path =
'./my_coco3/Region Avg IOU'
#保存结果的路径。
-
-
names = [
'Region Avg IOU',
'Class',
'Obj',
'No Obj',
'.5_Recall',
'.7_Recall',
'count']
-
#result = pd.read_csv('log_iou.txt', skiprows=[x for x in range(lines) if (x%10==0 or x%10==9)]\
-
result = pd.read_csv(data_path, skiprows=[x
for x
in range(lines)
if (x
1.0/((end_ite - start_ite)*
1.0)*igore
or x%step!=
0)]\
-
, error_bad_lines=
False, names=names)
-
result.head()
-
-
for name
in names:
-
result[name] = result[name].str.split(
': ').str.get(
1)
-
result.head()
-
result.tail()
-
for name
in names:
-
result[name] = pd.to_numeric(result[name])
-
result.dtypes
-
-
-
####--------------
-
x_num = len(result[
'Region Avg IOU'].values)
-
tmp = (end_ite-start_ite - igore)/(x_num*
1.0)
-
x = []
-
for i
in range(x_num):
-
x.append(i*tmp + start_ite + igore)
-
#print(x)
-
print(
'total = %d\n' %x_num)
-
print(
'start = %d, end = %d\n' %(x[
0], x[
-1]))
-
####-------------
-
-
-
fig = plt.figure()
-
ax = fig.add_subplot(
1,
1,
1)
-
ax.plot(x, result[
'Region Avg IOU'].values, label=
'Region Avg IOU')
-
#ax.plot(result['Avg Recall'].values, label='Avg Recall')
-
plt.grid()
-
ax.legend(loc=
'best')
-
ax.set_title(
'The Region Avg IOU curves')
-
ax.set_xlabel(
'batches')
-
fig.savefig(result_path)
参考:https://blog.csdn.net/qq_34806812/article/details/81459982
1 运行darknet官方代码中的detector valid指令,生成对测试集的检测结果。
格式: ./darknet detector valid
./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
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值:
这时会在脚本当前目录生成一个存放了pkl文件的文件夹,名字就是刚才输入的输出文件夹名。
4.用matplotlib绘制PR曲线
-
import _pickle
as cPickle
-
import matplotlib.pyplot
as plt
-
fr = open(
'apple_pr.pkl',
'rb')
#这里open中第一个参数需要修改成自己生产的pkl文件
-
inf = cPickle.load(fr)
-
fr.close()
-
-
x=inf[
'rec']
-
y=inf[
'prec']
-
plt.figure()
-
plt.xlabel(
'recall')
-
plt.ylabel(
'precision')
-
plt.title(
'PR cruve')
-
plt.plot(x,y)
-
plt.show()
-
-
print(
'AP:',inf[
'ap'])
参考:https://blog.csdn.net/qq_33350808/article/details/83178002