1 批处理测试图输出检测结果文本
./darknet detector valid cfg/voc_birds.data cfg/yolov3-voc-birds.cfg backup/yolov3-voc-birds.backup -out ""
以上代码是使用的yolo网络自带的valid函数接口来测试大量的图片,把检测结果保存在txt文件里, -out 后面的“”会自动生成 “类名.txt” 在darknet / result 目录下。
具体函数是detector.c下的validate_detector函数:
2 使用py-faster-rcnn下的voc_eval.py计算mAP
2.1 将py-faster-rcnn/lib/datasets/voc_eval.py拷贝到darknet根目录
voc_eval.py下载:https://github.com/rbgirshick/py-faster-rcnn/blob/master/lib/datasets/voc_eval.py
2.2 新建compute_mAP.py
from voc_eval import voc_eval
print(voc_eval('/home/peidashun/projects/darknet/results/{}.txt', '/home/peidashun/projects/darknet/voc/VOCdevkit/VOC2018/Annotations/{}.xml', '/home/peidashun/projects/darknet/voc/2018_val.txt', 'egret', '.'))
lines 3 参数第一个为上一步的txt路径,第二个为验证集对应的xml标签路径,第三个为验证集txt文本路径,第四个为待验证的类别名,第五个为pkl文件保存的路径
注意:验证机txt内容必须是无路径无后缀的图片名。
voc_eval.py中的定义:
2.3 用python 2 执行 compute_mAP.py
重复执行,检测其他类别需要删除 ./darknet/annots.pkl ,或者改变compute_mAP.py中pkl文件保存的路径
voc_eval.py中返回的最后一个值即AP,检测单类就是mAP
结果:
输出两个array(),分别是rec和prec,最后一个为单类mAP,我偷懒没有做验证集,用了训练集去valid,因此ap很高。
3 计算recall
修改detector.c下的validate_detector_recall函数
替换list *plist = get_paths("data/coco_val_5k.list");为list *plist=get_paths("voc/train.txt");自己的训练集文本
./darknet detector recall cfg/voc_birds.data cfg/yolov3-voc-birds.cfg backup/yolov3-voc-birds.backup
结果:最后一列为recall值。
4 直接计算出所有单类别的mAP和总的mAP
写入如下内容:
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('/home/peidashun/projects/darknet/results/{}.txt', '/home/peidashun/projects/darknet/voc/VOCdevkit/VOC2018/Annotations/{}.xml', '/home/peidashun/projects/darknet/voc/2018_test.txt', class_name, '/home/peidashun/projects/darknet/voc/VOCdevkit/VOC2018/mAP')
print("{} :\t {} ".format(class_name, ap))
mAP.append(ap)
mAP = tuple(mAP)
print("***************************")
print("mAP :\t {}".format( float( sum(mAP)/len(mAP)) ))
注意: results文件夹只能有 '类名.txt'文件,2018_test.txt文件包含所有results中txt文件的图片名(保证是共同的验证集),保证最后的输出路径下无pkl文件。
上述代码中的ap就是针对输入单一类别计算出的AP。
结果:
5 出现的问题
5.1 recall出现问题:Learning Rate: 0.001, Momentum: 0.9, Decay: 0.0005
Couldn't open file: data/coco_val_5k.list
解决:改动了darknet源码,要重新编译。在darknet目录下:
make clean
make -j8
5.2运行conpute_map.py 出现问题:IOError: [Errno 2] No such file or directory: 'xxx.jpg.xml'
解决方式一:修改txt文件中内容为不带路径不带后缀的图片名(推荐)
解决方式二:修改voc_eval.py,通过用splitext和basename,去掉路径和后缀,修改图如下,再运行通过该error:
5.3 recall时出现问题: IOU: inf% iou最大为1,怎么会爆炸的大?
尝试解决:
raw:
修改:
重编译,运行失败,出现IOU和recall都很小的情况。此问题待解决。
参考:
https://blog.csdn.net/qq_42141945/article/details/80285971
https://blog.csdn.net/lucky__ing/article/details/78310510?utm_source=debugrun&utm_medium=referral