可以使用valid命令,如下:
./darknet detector valid cfg/voc.data cfg/yolov3-voc.cfg backup/yolov3-voc_900.weights
其中voc.data内容如下:记得修改val
classes= 1 #classes为训练样本集的类别总数
train = /home/zbb/darknet/scripts/2007_train.txt #train的路径为训练样本集所在的路径
valid = /home/zbb/darknet/scripts/2007_test.txt #valid的路径变为测试样本集所在的路径
names = data/voc.names #names的路径为data/voc.names文件所在的路径
backup = backup
执行完在./results/comp4_det_test_[类名].txt里会保存测试结果
txt内容为:按列,分别为:图像名称 | 置信度 | xmin,ymin,xmax,ymax
2.准备所需文件
这里,你需要准备:
3.计算map,绘制pre-rec
新建一个compute_mAP.py,和eval_voc.py一个目录下:
from voc_eval import voc_eval
import _pickle as cPickle
import numpy as np
import matplotlib.pyplot as plt
rec,prec,ap = voc_eval('/home/zbb/darknet/results/{}.txt', '/home/zbb/darknet/scripts/VOCdevkit/VOC2007/Annotations/{}.xml', '/home/zbb/darknet/scripts/VOCdevkit/VOC2007/ImageSets/Main/test.txt', 'airplane', '.')
print('rec',rec)
print('prec',prec)
print('ap',ap)
'''
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax.plot(prec, rec, label='plane')
plt.grid()
ax.legend(loc = 'best')
ax.set_title('precion_recall')
ax.set_xlabel('recall')
ax.set_ylabel('precion')
fig.savefig('prec_recall.JPG',transparent=True,pad_inches=0,dpi=300,bbox_inches='tight')
'''
#开始画图
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
这里我只有一类,就模拟了其它数据:
map=ap之和/n
keyerror:每次运行前记得删掉annots.pkl,不然会报错
限制画图间隔,参考文献:https://blog.csdn.net/weixin_44520259/article/details/89917026
参考文献https://blog.csdn.net/yinhuan1649/article/details/82258703