单张测试命令:./darknet detector test cfg/voc.data cfg/yolov3-voc.cfg backup/yolov3-voc_final.weights
会显示测试结果图片并保存
命令: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文件名为类名,后米再慢慢摸索。
代码地址: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]
建文件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)) ))
命令:./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批量测试图片并保存在自定义文件夹下