Yolov3-Darknet版本计算mAP

题记:之期训练了YOLOv3模型,详见博文Darknet-Yolov3训练自己的数据,现需要对其评估,计算其mAP值。

一、修改cfg文件

my_yolov3-voc.cfg文件修改成测试模式:

Yolov3-Darknet版本计算mAP_第1张图片

PS:这里看大部分博文都是说打开测试模式,但是我发现训练模式也可以出结果。

二、修改测试集路径:

修改my_voc.data中的valid路径:改成自己要测试路径,具体文件格式见题记中提到的博文,其中有详细介绍。

Yolov3-Darknet版本计算mAP_第2张图片

三、运行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、运行结果如下:

Yolov3-Darknet版本计算mAP_第3张图片

Yolov3-Darknet版本计算mAP_第4张图片

Yolov3-Darknet版本计算mAP_第5张图片

最后有运行时间,运行结束后,测试结果默认保存在当前路径下的./results文件夹下,如果没有,新建一个。有几个类别,就产生几个txt文件:

Yolov3-Darknet版本计算mAP_第6张图片

四、计算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,输出的结果如下:

Yolov3-Darknet版本计算mAP_第7张图片

若需计算别的类的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-Darknet版本计算mAP_第8张图片

六、参考博文:

YOLOv3 mAP计算教程

后记:pytorch-YOLOv4的计算以及V3和V4的coco指标计算,后续再更新,写博文真的需要很大动力啊,加油!

 

你可能感兴趣的:(Yolov3-Darknet版本计算mAP)