darknet——YOLOv3测试

一、训练好后计算mAP

单张测试命令:./darknet detector test cfg/voc.data cfg/yolov3-voc.cfg backup/yolov3-voc_final.weights

会显示测试结果图片并保存

第一步:生成txt测试结果文件

命令:valid

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

分析:改成自己对应的数据配置文件路径,yolov3的cfg配置文件,要测试的权重文件路径,指定GPU以及阈值即可

默认情况下,结果会得到在results下的各类别的txt检测结果文件

每行代表一个预测框,分别为:不带路径与后缀的图片名,置信度分数,四个绝对坐标值

此处的-out后面直接" "即可,因为不论你写什么,他都会根据voc_names中配置的类名来生成对应txt,有几个类就生成几个txt,并且会将类名自动写入txt文件名中。

一开始不懂生成机制的话可以生成后手动修改txt文件名为类名,后米再慢慢摸索。

第二步:使用faster R-CNN的voc_eval进行计算

代码地址:voc_eval.py

新建一个compute_mAP.py(单类别计算AP,即单类别的mAP),写入以下内容

from voc_eval import voc_eval
print voc_eval('/xxx/darknet/results/{}.txt', '/xxx/darknet/scripts/VOCdevkit/VOC2007/Annotations/{}.xml', '/xxx/darknet/scripts/VOCdevkit/VOC2007/ImageSets/Main/test.txt', 'person', '.')

print()中五个参数,分别是第一步生成的txt文件路径,xml标注文件的路径,不含路径与后缀名的测试集txt文件路径,类别名,生成dpkl文件保的存的路径。(运行完成后,其实会在当前路径下生成一个annots.pkl。这个文件很重要,如果你换了数据集,对新的类别来计算mAP,则需要将之前生成的annots.pkl删掉,才能正常计算。)

需要xml是因为第一步生成的txt中预测框坐标为绝对坐标值且一个类检测结果一个txt,而训练时候用的labels中的txt中是归一化后的相对坐标且是一张图一个txt,无法进行对比计算,故需要使用xml文件中的绝对值坐标。

补充:两种方式计算map,

第一种,本文所用方式,一个类(包含了所有图片检测结果)存于一个txt,进行计算。

第二种,参考第二种方式,每一张图片的检测结果(包含各种类的检测结果)放于一个txt,进行对比计算。

无论哪种方式,都需要真实框与预测框统一格式,进行对比计算

注意:为防止出现全nan与0,应该  第四个参数类别名=第一步生成的txt文件名中类别名=data/voc.names中类别名=xml文件中标注的类别名=scripts/voc_label.py中的classes名。一句话就是各处的类别名最好统一,以防出现错误。

此时命令行界面输出三部分,前两个分别为re与,prec的array,第三个为ap,单类别ap即为mAP。(为阈值0.005,nms阈值下的结果)

如果只想计算大于0.3的输出结果的mAP,把 voc_eval.py文件中如下代码更改
sorted_ind = np.argsort(-confidence)
sorted_ind1 = np.where(confidence[sorted_ind] >= .3)[0]#np.argsort(-confidence<=-.3)
sorted_ind = sorted_ind[sorted_ind1]

多类别算mAP

建文件computer_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('/home/cxx/Amusi/Object_Detection/YOLO/darknet/results/{}.txt', '/home/cxx/Amusi/Object_Detection/YOLO/darknet/datasets/pjreddie-VOC/VOCdevkit/VOC2007/Annotations/{}.xml', '/home/cxx/Amusi/Object_Detection/YOLO/darknet/datasets/pjreddie-VOC/VOCdevkit/VOC2007/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)) )) 

二、训练后计算召回率Recall

命令:./darknet detector recall cfg/voc.data cfg/yolov3-voc.cfg backup/yolov3-voc_final.weights -out .txt -gpu 0 -thresh .5

报错:Couldn't open file: data/coco_val_5k.list

解决方式:

修改detector.c下的validate_detector_recall函数

替换list *plist = get_paths("data/coco_val_5k.list");为list *plist=get_paths("train.txt");自己的训练集文本

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


参考链接:

voc_eval.py解析

YOLO-V3计算单类ap、mAP、recall

YOLOv3 mAP计算教程

YOLOv3批量测试图片并保存在自定义文件夹下


 

 

你可能感兴趣的:(深度学习)