参考1:https://blog.csdn.net/qq_33350808/article/details/83178002
2:https://blog.csdn.net/weixin_43717579/article/details/89380229
3:https://blog.csdn.net/babyzbb636/article/details/100535563
训练指令:./darknet.exe detector train data/obj.data yolo-obj.cfg darknet53.conv.74 | tee train_yolov3.log
ps:For training with mAP (mean average precisions) calculation for each 4 Epochs (set valid=valid.txt or train.txt in obj.data file) and run: darknet.exe detector train data/obj.data yolo-obj.cfg darknet53.conv.74 -map
测试:
第一步:./darknet detector valid data/obj.data yolo-obj.cfg backup/yolo-obj_last.weights
第二部:python .\reval_voc_py3.py --voc_dir E:\darknet-master\build\darknet\x64\data\VOCdevkit
--year 2007 --image_set test --classes E:\darknet-master\build\darknet\x64\data\obj.names testForTower
1:测试集的ImageSets\Main里面只需要test.txt 这里的test和(命令中--image_set test中的test)
和(comp4_det_test_tower.txt中的test)需要一致
2: 每次都需要删除缓存文件annots.pkl
绘制PR曲线并输出AP值:
#coding=utf-8
import _pickle as cPickle
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=[u'NSimSun']
plt.rcParams['axes.unicode_minus']=False
fr = open('tower_pr.pkl','rb')#这里open中第一个参数需要修改成自己生产的pkl文件
inf = cPickle.load(fr)
fr.close()
# fbad = open('tower_pr.pkl','rb')#这里open中第一个参数需要修改成自己生产的pkl文件
# inf_bad = cPickle.load(fbad)
# fbad.close()
x=inf['rec']
y=inf['prec']
plt.figure()
plt.xlabel('召回率',size=15)
plt.ylabel('精确率',size=15)
plt.xticks(fontproperties = 'Times New Roman', size = 14)
plt.yticks(fontproperties = 'Times New Roman', size = 14)
plt.plot(x,y)
plt.savefig("PR曲线.svg",bbox_inches='tight') #plt保存需要在show之前
plt.show()
print('AP:',inf['ap'])
测试单张图片:darknet.exe detector test data/obj.data yolo-obj.cfg yolo-obj_100.weights(最后的权重改为自己的权重)。
然后终端会提醒你输入图片路径,然后你输入测试图片的绝对路径即可看到效果
批量测试:https://blog.csdn.net/yuyifan1991/article/details/94614130
按照上述链接配置好后,命令:./darknet detector test data/obj.data yolo-obj.cfg backup/yolo-obj_1800.weights test.txt
画损失值曲线:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=[u'SimHei']
plt.rcParams['axes.unicode_minus']=False
#根据自己的log_loss.txt中的行数修改lines, 修改训练时的迭代起始次数(start_ite)和结束次数(end_ite)。
lines = 1800
start_ite = 0 #log_loss.txt里面的最小迭代次数
end_ite = 1800 #log_loss.txt里面的最大迭代次数
step = 2 #跳行数,决定画图的稠密程度
igore = 190 #当开始的loss较大时,你需要忽略前igore次迭代,注意这里是迭代次数b
data_path = 'train_log_loss.txt' #log_loss的路径。
result_path = './quanju_loss0607'
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!=0)], error_bad_lines=False, names=names)
for name in names:
result[name] = result[name].str.split(' ').str.get(1)
for name in names:
result[name] = pd.to_numeric(result[name],errors='ignore')
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)
plt.plot(x, result['avg'].values)
plt.xticks(fontproperties = 'Times New Roman', size = 12)
plt.yticks(fontproperties = 'Times New Roman', size = 12)
plt.xlabel('迭代次数',size=15)
plt.ylabel('损失值',size=15)
plt.savefig("损失曲线1.svg",bbox_inches='tight')
plt.show()