前言
本文所做的工作均建立在已经已经用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
https://download.csdn.net/download/qq_33350808/10731748
(因为没在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文件名,比如train.txt,把需要测试的图片名全部塞进去就可以了,如果没有的话自行创建(不过没有的话怎么训练的呢)。注意:这里只需要填文件名,txt后缀都不需要的。
类名文件路径就是voc.names文件的路径,在voc.data文件里面是有的,第4行names那里。
输出文件夹名就自己随便写了,比如我这里写的testForCsdn。
参数全部替换好就可以跑了,大概画风如下所示:
这时会在脚本当前目录生成一个存放了pkl文件的文件夹,名字就是刚才输入的输出文件夹名。(这里的名字不需要和我的一样,如果你有多个类的话,就会生成多个文件,文件名就是你的类名)
注意,这时已经能看到mAP值了。(我这里的验证集较小,目标较简单,所以mAP大了些,不用在意)
4 用matplotlib绘制PR曲线
在得到pkl文件目录里直接创建一个python文件,比如PR_draw.py,内容如下,记得把第三行里的参数修改一下。
import _pickle as cPickleimport matplotlib.pyplot as pltfr = open(‘apple_pr.pkl’,’rb’)#这里open中第一个参数需要修改成自己生产的pkl文件inf = cPickle.load(fr)fr.close()x=inf[‘rec’]y=inf[‘prec’]plt.figure()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:目前就写这么多了,应该没啥问题,自我感觉已经够傻瓜了,有问题请私信我再修改。