题记:之期训练了YOLOv3模型,详见博文Darknet-Yolov3训练自己的数据,现需要对其评估,计算其mAP值。
一、修改cfg文件
将my_yolov3-voc.cfg文件修改成测试模式:
PS:这里看大部分博文都是说打开测试模式,但是我发现训练模式也可以出结果。
二、修改测试集路径:
修改my_voc.data中的valid路径:改成自己要测试路径,具体文件格式见题记中提到的博文,其中有详细介绍。
三、运行detector的valid命令:
1、将以下命令里的文件换成自己的文件即可。
./darknet detector valid myData/my_cfg/my_voc.data myData/my_cfg/my_yolov3-voc.cfg myData/weights-voc/my_yolov3-voc_final.weights -out "" -gpus 0
-out "":这里是输出的文件名前缀,双引号不加内容默认类别名称,可加可不加。
-gpus 0:指定使用第几块卡,但是我自己发现不管换成几号卡,都会用第0号卡,不知道如何解决,求大佬告知。
2、运行结果如下:
最后有运行时间,运行结束后,测试结果默认保存在当前路径下的./results文件夹下,如果没有,新建一个。有几个类别,就产生几个txt文件:
四、计算AP
1、下载faster-rcnn中的voc_eval.py文件,下载地址:https://github.com/rbgirshick/py-faster-rcnn/blob/master/lib/datasets/pascal_voc.py
2、新建文件compute_mAP.py,写入代码:
from voc_eval import voc_eval
rec, prec, ap = voc_eval(
'/opt/darknet/results/{}.txt',
'/opt/darknet/myData/Annotations/{}.xml',
'/opt/darknet/myData/ImageSets/Main/test.txt',
'car',
'.')
print('rec', rec)
print('prec', prec)
print('ap', ap)
注意:
1)将上述一些参数修改成自己的路径和文件;
2)在python2的环境下运行,或将代码改成python3的;
3)运行完成后,会在当前路径下生成一个annots.pkl,下次计算如果更换数据集或新的类别,则需要将其删掉,才能正常重新计算。
上述计算的是类别car的AP,输出的结果如下:
若需计算别的类的AP,需将代码中的car改成别的,如bus,然后重新运行compute_mAP.py即可。
五、计算总mAP
上述需要挨个计算每个类别的AP,然后求平均,计算总的mAP,偷懒不想写,发现果然有大佬写了,伸手党太感谢了,大佬博文点这里,参考博文链接。
1、新建文件computer_Single_ALL_mAP.py,写入代码:
from voc_eval import voc_eval
import os
current_path = os.getcwd()
results_path = current_path+"/results"
sub_files = os.listdir(results_path)
mAP = []
for i in range(len(sub_files)):
class_name = sub_files[i].split(".txt")[0]
rec, prec, ap = voc_eval(
'/opt/darknet/results/{}.txt',
'/opt/darknet/myData/Annotations/{}.xml',
'/opt/darknet/myData/ImageSets/Main/test.txt'',
class_name,
'.')
print("{} :\t {} ".format(class_name, ap))
mAP.append(ap)
mAP = tuple(mAP)
print("***************************")
print("mAP :\t {}".format(float(sum(mAP)/len(mAP))))
2、运行结果如下:
六、参考博文:
YOLOv3 mAP计算教程
后记:pytorch-YOLOv4的计算以及V3和V4的coco指标计算,后续再更新,写博文真的需要很大动力啊,加油!