关于YOLOv3对VOC类型数据集的mAP计算与PR曲线的绘制
windows和linux均适⽤
前⾔
本⽂所做的⼯作均建⽴在已经已经⽤darknet训练好⾃⼰的模型的基础上的,不提供与YOLO训练有关的东西(因为别⼈已经发够多了)。尽量写得傻⽠⼀些,保持⼀步⼀次截图,因为能看这种博客的基本都没啥程序员基础的,连脚本都没听说的菜鸟,只是单纯跑跑发个⽔⽂的,所以多图和啰嗦警告,(图中有些路径打上马赛克了,没有影响)。
1 运⾏darknet官⽅代码中的detector valid指令,⽣成对测试集的检测结果。
.\darknet detector valid <voc.data⽂件路径> <cfg⽂件路径> <weights⽂件路径> -out ""
上⾯写的通⽤格式(请不要直接复制粘贴运⾏,将<>⾥的内容替换为⾃⼰需要的路径,其中"<>"不需要,只是⽤来分隔的!还有windows和linux下⽂件路径的格式不同,并且每个参数之间都需要空格间隔)。(windows通过打开cmd或者power shell来输⼊指令,linux通过ctrl+shift+t打开终端来输⼊指令,要记住输⼊指令时你需要通过cd来定位到当前需要运⾏程序的⽬录⾥)
voc.data和cfg⽂件就是你当时训练⽤的配置⽂件,weights⽂件就是你训练出来的结果,其中需要修改的是voc.data⽂件,其中应该是有五⾏的,其中第三⾏是valid就是需要验证测试集的路径,其指向的txt⽂件格式与第⼆⾏train⼀致(已经训练过的应该知道是啥了),这⾥需要修改成你需要的,画风如下。
执⾏完之后应该会在程序的当前⽬录⽣产⼀个results⽂件夹,⾥⾯存有检测结果,⽂件名为comp4_det_test_<;你检测的类名>.txt,画风如下所⽰。
左边是执⾏valid指令的过程,右边是⽣产的txt⽂件,其中txt中数据格式为: ⽂件名 置信度 x y w h。
2 下载检测⽤脚本⽂件 reval_voc_py.py和voc_eval_py.py
(因为没在CSDN⾥⾯到添加附件的功能,所以这⾥只能放个传送门了,⽽且需求积分最低都要1分,所以我也不能改成0分免费给你们。)
windows下python安装请百度,anaconda就可以了;linux默认就有安装的,不过是默认的Python2版本的。
如果遇到缺少库的,请打开⼀下python⽂件,看看开头那⾥有哪些,⼀般不会少的,都是些基本的库。
3 使⽤reval_voc_py.py计算出mAP值并且⽣成pkl⽂件
python reval_voc_py3.py --voc_dir <voc⽂件路径> --year <;年份> --image_set <;验证集⽂件名> --classes <;类名⽂件路径> <;输出⽂件夹名>
先将第⼀部⽣成的results⽂件夹移动到当前脚本⽂件所在的位置,然后执⾏上述指令。
⾸先python表⽰运⾏python代码
reval_voc_py3.py表⽰当前运⾏的脚本⽂件名,python3的话就⽤这个,python2的话⽤reval_voc.py。
voc⽂件路径就是当时训练⽤的VOC数据集的路径,⽐如windows下 d:\darknet\scripts\VOCdevkit,linux就是
\home\xxx\darknet\scripts\VOCdevkit,这⾥只是打个⽐⽅,读者请替换成⾃⼰需要的路径
年份就是VOC数据集⾥VOC⽂件名⾥的时间,⽐如2007、2012这样的。
验证集⽂件名⼀般是VOCdevkit\VOC2017\ImageSets\Main中的⽂件中txt⽂件名,⽐如,把需要测试的图⽚名全部塞进去就可以了,如果没有的话⾃⾏创建(不过没有的话怎么训练的呢)。注意:这⾥只需要填⽂件名,txt后缀都不需要的。
类名⽂件路径就是voc.names⽂件的路径,在voc.data⽂件⾥⾯是有的,第4⾏names那⾥。
输出⽂件夹名就⾃⼰随便写了,⽐如我这⾥写的testForCsdn。
参数全部替换好就可以跑了,⼤概画风如下所⽰:
这时会在脚本当前⽬录⽣成⼀个存放了pkl⽂件的⽂件夹,名字就是刚才输⼊的输出⽂件夹名。(这⾥的名字不需要和我的⼀样,如果你有多个类的话,就会⽣成多个⽂件,⽂件名就是你的类名)
注意,这时已经能看到mAP值了。(我这⾥的验证集较⼩,⽬标较简单,所以mAP⼤了些,不⽤在意)
4 ⽤matplotlib绘制PR曲线
在得到pkl⽂件⽬录⾥直接创建⼀个python⽂件,⽐如PR_draw.py,内容如下,记得把第三⾏⾥的参数修改⼀下。
import _pickle as cPickle
import matplotlib.pyplot as plt
fr = open('apple_pr.pkl','rb')#这⾥open中第⼀个参数需要修改成⾃⼰⽣产的pkl⽂件
inf = cPickle.load(fr)
fr.close()
x=inf['rec']
y=inf['prec']
plt.figure()
eval是做什么的plt.xlabel('recall')
plt.ylabel('precision')
plt.title('PR cruve')
plt.plot(x,y)
plt.show()
print('AP:',inf['ap'])
然后直接运⾏
python PR_draw.py
最后结果就出来了,当当当当,画风如下所⽰:
Ps:⽬前就写这么多了,应该没啥问题,⾃我感觉已经够傻⽠了,有问题请私信我再修改。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。