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一下就可以了