YOLOv4画PR曲线

YOLOv4使用自己的数据集画PR曲线

前言:本文是在yolov4训练和测试结束之后进行的。训练及测试过程不做阐述。

1.使用官方命令生成results文件

darknet.exe detector valid data/obj.data yolov4-first.cfg backup/yolov4-first_last.weights
其中,".data"、".cfg"文件是训练时用到的。权重是训练之后得到的。训练中的样子:
在这里插入图片描述
结束后会在所在目录下的results文件中生成你所训练的每一类的txt文件。这里要注意,在开始前目录下一定要有results文件,否则会报错。生成的结果如下:
在这里插入图片描述
这是其中一类的样子。

2.生成pkl文件
python reval_voc_py3.py --voc_dir D:\darknet-master\build\darknet\x64\data\VOCdevkit --year 2018 --image_set test --classes data/obj.names testfor

reval_voc_py3.py是官方darknet-master下x64文件中就有的,我在网上找了好久画pr曲线的程序,结果大部分都不好用,结果官方下就有,不需要下载。
可能由于我的标注软件的问题,所有标注后的xml都是"DIfficult",所以可能会出现这样的错误:
在这里插入图片描述
这个时候根据提示把"difficult"改为"DIfficult"即可。
所有的数据命名不要有空格,要不会报错,这真的是个巨坑。。
还有一个可能遇到的错误就是:
R = [obj for obj in recs[imagename] if obj[‘name’] == classname] KeyError:‘1’
这个时候要把annotations_cache的缓存删掉,删掉后即可正常运行。

classes训练过程中有用到。
testfor是自己为生成的pkl文件夹起个名字。
image_set test不需要加".txt"。
voc dir 是指你的数据所在的文件夹,因为训练的是自己的数据集,在data文件夹下新建VOCdevkit文件夹,这里年份我是随便写的,VOCdevkit下新建VOC2018,然后VOC2018中包括以下几个文件夹:
在这里插入图片描述
把训练时用到的数据集都放在里面。
其中ImagesSets下有一个Main文件夹中要有test.txt。这里的test.txt文件只包含测试集的名字,没有后缀,具体长这个样子:

在这里插入图片描述
生成test文件代码如下:

import os
import random

trainval_percent = 1  # 训练数据和交叉验证数据占的比例,自己根据实际调节
train_percent = 1  # 训练数据占trainval的比例,即用来训练的数据
xmlfilepath = 'testxml'
txtsavepath = 'ImageSets\Main'
total_xml = os.listdir(xmlfilepath)

num = len(total_xml)
list = range(num)
tv = int(num * trainval_percent)
tr = int(tv * train_percent)
trainval = random.sample(list, tv)
train = random.sample(trainval, tr)

ftrainval = open('ImageSets/Main/trainval.txt', 'w')  # 需要提前建立Main文件
ftest = open('ImageSets/Main/test.txt', 'w')
ftrain = open('ImageSets/Main/train.txt', 'w')
fval = open('ImageSets/Main/val.txt', 'w')

for i in list:
    name = total_xml[i][:-4] + '\n'
    if i in trainval:
        ftrainval.write(name)
        if i in train:
            ftrain.write(name)
        else:
            fval.write(name)
    else:
        ftest.write(name)

ftrainval.close()
ftrain.close()
fval.close()
ftest.close()

3.画PR曲线
针对不同的权重得到不同的pkl文件之后,把他们画在同一张图中,具体代码如下:

import _pickle as cPickle
import matplotlib.pyplot as plt

fr1= open('C:/Users/officer/Desktop/pkl/yolov4_fire_pr.pkl', 'rb')  # 这里open中第一个参数需要修改成自己生产的pkl文件
inf1 = cPickle.load(fr1)
fr1.close()

x1= inf1['rec']
y1= inf1['prec']



fr2= open('C:/Users/officer/Desktop/pkl/v3sppfire_pr.pkl', 'rb')  # 这里open中第一个参数需要修改成自己生产的pkl文件
inf2 = cPickle.load(fr2)
fr2.close()

x2= inf2['rec']
y2= inf2['prec']

fr3= open('C:/Users/officer/Desktop/pkl/v3fire_pr.pkl', 'rb')  # 这里open中第一个参数需要修改成自己生产的pkl文件
inf3 = cPickle.load(fr3)
fr3.close()

x3= inf3['rec']
y3= inf3['prec']

fr4= open('C:/Users/officer/Desktop/pkl/v2fire_pr.pkl', 'rb')  # 这里open中第一个参数需要修改成自己生产的pkl文件
inf4 = cPickle.load(fr4)
fr4.close()

x4= inf4['rec']
y4= inf4['prec']

fr5= open('C:/Users/officer/Desktop/pkl/oursfire_pr.pkl', 'rb')  # 这里open中第一个参数需要修改成自己生产的pkl文件
inf5 = cPickle.load(fr5)
fr5.close()

x5= inf5['rec']
y5= inf5['prec']

plt.figure()
plt.xlabel('recall')
plt.ylabel('precision')
plt.title('PR cruve')

plt.plot(x5, y5, color="red")
plt.plot(x1, y1, color="purple")
plt.plot(x2, y2, color="blue")
plt.plot(x3, y3, color="green")
plt.plot(x4, y4, color="orange")

plt.show()

到这里就大功告成啦!
有问题可以互相探讨。
如果对大家有帮助记得关注点赞哦~

参考链接:
https://blog.csdn.net/qq_33350808/article/details/83178002

  • 6
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 18
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值