关于yolov2的mAP、recall计算方法(yolov3同样适用)

1.计算mAP

./darknet detector valid cfg/voc.data cfg/yolov3-voc.cfg yolo-voc_final.weights -out [类名] -gpu 0 -thresh .5

cfg文件需要自己根据改,权重数值也是自己改。类名修改成自己数据集的名字,比如我要识别orange,就写orange 

输出的txt文件在results下,记得修改一下输出文件的名称,因为得到的文件名和你的类名会不一样。 

我的txt文件名就是orange.txtorange.txt,这里需要修改成orange.txt。

注意:输出的文件名要求为类名,不然后面计算时会出现ap = nan。我觉得出现nan的人应该还是有的。 

2.去fasterrcnn的caffe代码项目下,在faster-rcnn/lib/datasets/文件夹下,下载voc_eval.py文件,不过这个文件有点问题,我给稍微修改了下,文件我放到网盘里了,地址为https://pan.baidu.com/s/1ARsLRaKSaTRYI7lyo-4WUQ

如果文件报错:write() argument must be str, not bytes,就把

with open(cachefile, 'w')as f:

cPickle.dump(recs, f)

中的'w‘改成'wb’即可。

之后自己写一个脚本文件:

可以命名为compute_mAP.py,内容如下:

from voc_eval import voc_evalrec,prec,ap = voc_eval('/home/liwanzhi/YOLO/darknet/results/{}.txt', '/home/liwanzhi/YOLO/darknet/scripts/VOCdevkit/VOC2007/Annotations/{}.xml', '/home/liwanzhi/YOLO/darknet/scripts/VOCdevkit/VOC2007/ImageSets/Main/test.txt', 'orange')

print('rec',rec)

print('prec',prec)

print('ap',ap)

运行结果如下:

('rec', array([0.00163132, 0.00326264, 0.00489396, ..., 0.92169657, 0.92169657,

      0.92169657]))

('prec', array([1.        , 1.        , 1.        , ..., 0.05681818, 0.05681247,

      0.05680676]))

('ap', '0.8525477095943402')

其中的ap就是我们要的mAP了

2.计算recall值

修改detector.c下的validate_detector_recall函数

替换list *plist = get_paths("data/coco_val_5k.list");为list *plist=get_paths("scripts/2007_test.txt");自己的测试集文本

./darknet detector recall cfg/voc.data cfg/yolov3-voc.cfg results/yolov3-voc_final.weights

最后一列为recall值。

另外修改一个bug,不然IOU会逐渐变小,直至出现大批量的nan:

修改完之后make一下就可以了

你可能感兴趣的:(关于yolov2的mAP、recall计算方法(yolov3同样适用))