yolov3/4训练参数说明与终止条件和模型评估 ; 可视化训练过程中的参数; 计算数据集的mAP与PR曲线的绘制;训练可能出现的问题;yolov3如何在之前训练的基础上训练;修改文件夹权限

*免责声明:
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
在这里插入图片描述

  • 7
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值