*免责声明:
1\此方法仅提供参考
2\搬了其他博主的操作方法,以贴上路径.
3*
场景一:可视化训练过程中的参数
场景二:计算数据集的mAP与PR曲线的绘制
场景三:训练可能出现的问题
场景四:yolov3如何在之前训练的基础上训练
场景五:linux修改文件夹权限
.
.
.
…
场景一:可视化训练过程中的参数
1.1 训练日志参数说明
1.2 生成训练过程log文件
下面命令将在训练的的过程中在myData文件夹下生成一个mytrain_log.txt,里面记录着训练迭代的日志记录。
./darknet detector train cfg/myvoc.data cfg/myyolov3.cfg darknet53.conv.74 2>1 | tee myData/mytrain_log.txt
1.3格式化训练过程生成的log文件
在生成的mytrain_log.txt同级目录下(myData下),创建extract_log.py脚本,用来格式化mytrain_log.txt。
# 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('mytrain_log.txt','mytrain_log_loss.txt','images') ###这里改为你上面生成的,如我的是mytrain_log.txt
extract_log('mytrain_log.txt','mytrain_log_iou.txt','IOU')
运行该脚本,
python extract_log.py
运行之后,会解析log文件的loss行和iou行得到两个txt文件
1.4根据格式化文件绘制loss变化曲线
在生成的格式化文件同级目录下(myData下),创建visualization_loss.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 = 1049
start_ite =1 #log_loss.txt里面的最小迭代次数
end_ite = 1049 #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 = 'mytrain_log_loss.txt' #log_loss的路径。
result_path = './mytrain_log_loss-result/avg_loss' #保存结果的路径。这里我在myData下创建了一个mytrain_log_loss-result文件夹,将来会生成avg_loss
####-----------------只需要改上面的,下面的可以不改动
names = ['loss', 'avg', 'rate', 'seconds', 'images']
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=\
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')
运行
python visualization_loss.py
如果提示如下面模块报错,进行相应的pip install安装
正常运行如下
结果如下:
结果如下:
发现一开始迭代计算loss,有点大,发现200以后趋于正常。我们直接取200以后开始计算。或者是ignore=200直接忽视前200。
1.5根据格式化文件绘制avg Iou变化曲线
在生成的格式化文件同级目录下(myData下),创建visualization_iou.py脚本,用来绘制avg-Iou变化曲线。
#!/usr/bin/python
#coding=utf-8
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
#根据log_iou修改行数
lines = 3336
step = 50
start_ite = 1
end_ite = 1049
igore = 200
data_path = 'mytrain_log_iou.txt' #log_loss的路径。
result_path = './mytrain_log_loss-result/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<lines*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)
运行脚本: python visualization_iou.py
结果:
说明:这一块内容讲述的训练到什么时候结束,当然你也可以不用管,直接迭代个50万次得了。
…
场景二:计算数据集的mAP与PR曲线的绘制
1.1性能说明(可以跳过)
1.2修改voc.data
运行darknet官方代码中的detector valid指令,生成对测试集的检测结果。
./darknet detector valid <voc.data文件路径> <cfg文件路径> <weights文件路径> -out ""
例如: ./darknet detector valid cfg/voc.data cfg/yolov3.cfg yolov3.weights
voc.data和cfg文件就是你当时训练用的配置文件,weights文件就是你训练出来的结果,其中需要修改的是
voc.data
文件,其中voc.data
内容如下:
classes= 1 #classes为训练样本集的类别总数
train = /darknet/scripts/2007_train.txt #train的路径为训练样本集所在的路径
valid = /darknet/scripts/2007_test.txt #valid的路径变为测试样本集所在的路径
names = data/voc.names #names的路径为data/voc.names文件所在的路径
backup = backup #backup为权值文件weight的路径
1.3输出记录目标位置信息的txt文件
执行上面命令,执行完之后应该会在程序的当前目录生产一个results文件夹,里面存有检测结果,文件名为
comp4_det_test_<你检测的类名>.txt
。
其中txt中数据格式为:
文件名 置信度 x y w h
。
1.4计算map,绘制pre-rec
在darknet下新建一个
compute_mAP.py
,内容为:
from voc_eval import voc_eval
import _pickle as cPickle
rec,prec,ap = voc_eval('/darknet/results/{}.txt', '/home/dbc/DATASET/1/anno/{}.xml', '/darknet/test.txt', 'person', '.')
rec,prec,ap = voc_eval('/darknet/results/{}.txt', '/darknet/scripts/VOCdevkit/VOC2007/Annotations/{}.xml', '/darknet/scripts/VOCdevkit/VOC2007/ImageSets/Main/test.txt', 'airplane', '.')
#第一个参数代表上面的1.3生成的.txt文件;
#第一个参数代表上面的1.3生成的.txt文件;
#第一个参数代表上面的1.3生成的.txt文件
#第四个参数代表评价peerson类的性能
print('rec',rec)
print('prec',prec)
print('ap',ap)
#开始画图
plt.title('Result Analysis')
#rec,prec反了
plt.plot(prec-0.1, rec, color='green', label='person')
plt.plot(prec-0.15, rec, color='red', label='cat')
plt.plot(prec-0.25, rec, color='skyblue', label='PN')
plt.plot(prec, rec, color='blue', label='plane')
plt.legend() # 显示图例
plt.xlabel('recall')
plt.ylabel('precion')
plt.savefig('test.JPG',transparent=True,pad_inches=0,dpi=300,bbox_inches='tight')
plt.show()
运行
python compute_mAP.py
计算出单类别的AP###tips:有关keyerror
每次运行前记得删掉annots.pkl,不然会报错
Python设置matplotlib.plot的坐标轴刻度间隔以及刻度范围
1.5(待修改)模型评估recall,生成测试结果
生成测试结果 ./darknet detector valid <data_cfg> <test_cfg> <weights> <out_file>
(1)<test_cfg>文件中batch和subdivisions两项需为1。
(2)测试结果生成在<data_cfg>的results指定的目录下以<out_file>开头的若干文件中,若<data_cfg>没有指定results,那么默认为 darknet/results。
计算recall(需要修改detectocr.c请参考第五部分优化与个性化——计算map与recall)
/darknet detector recall <data_cfg> <test_cfg> <weights>
(1)<test_cfg>文件中batch和subdivisions两项需为1
(2)RPs/Img、IOU、Recall都是到当前测试图片的均值(意义待续)
…
场景三:训练可能出现的问题
1.1命令执行行时出现:CUDA: out of memory
darknet: ./src/cuda.c:36: check_error: Assertion `0’ failed.
原因:显存不够
.
解决方案:关闭random,如果还是不行,可以适当调小batch(32或者16)
1.2出现大量的-nan
1.3检测不出来
训练了很多次itertation,但是还是什么都没有检测出来?
…
场景四:yolov3如何在之前训练的基础上训练
场景五:linux–>ubuntu修改文件夹权限
sudo nautilus
sudo nautilus
sudo nautilus
you did it