参考  PASCAL VOC的评估代码voc_eval.py解析 - 云+社区 - 腾讯云

目录

1、读检测的结果

2、解析一幅图像中的目标数

3、计算AP

4、VOC的评估

5、进行python评估

6、voc的检测评估


1、读检测的结果

def write_voc_results_file(all_boxes, test_imgid_list, det_save_dir):for cls, cls_id in NAME_LABEL_MAP.items():if cls == 'back_ground':continueprint("Writing {} VOC resutls file".format(cls))mkdir(det_save_dir)det_save_path = os.path.join(det_save_dir, "det_"+cls+".txt")with open(det_save_path, 'wt') as f:for index, img_name in enumerate(test_imgid_list):this_img_detections = all_boxes[index]this_cls_detections = this_img_detections[this_img_detections[:, 0]==cls_id]if this_cls_detections.shape[0] == 0:continue # this cls has none detections in this imgfor a_det in this_cls_detections:f.write('{:s} {:.3f} {:.1f} {:.1f} {:.1f} {:.1f}\n'.format(img_name, a_det[1],a_det[2], a_det[3],a_det[4], a_det[5]))  # that is [img_name, score, xmin, ymin, xmax, ymax]

参数:

  • all_boxes:一个列表,每个部件代表一幅图像的检测,检测的结果是一个数组,形状为[-1,6],形式为[category, score, xmin, ymin, xmax, ymax],如果检测到的结果不在图像中,检测是空数组。
  • test_imgid_list:测试的图像列表。
  • det_save_path:检测保存的地址。

2、解析一幅图像中的目标数

def parse_rec(filename):""" Parse a PASCAL VOC xml file """tree = ET.parse(filename)objects = []for obj in tree.findall('object'):obj_struct = {}obj_struct['name'] = obj.find('name').textobj_struct['pose'] = obj.find('pose').textobj_struct['truncated'] = int(obj.find('truncated').text)obj_struct['difficult'] = int(obj.find('difficult').text)bbox = obj.find('bndbox')obj_struct['bbox'] = [int(bbox.find('xmin').text),int(bbox.find('ymin').text),int(bbox.find('xmax').text),int(bbox.find('ymax').text)]objects.append(obj_struct)return objects

因为PASCAL VOC的标记格式是xml,此函数作用主要是解析xml文件。

3、计算AP

def voc_ap(rec, prec, use_07_metric=False):if use_07_metric:# 11 point metricap = 0.for t in np.arange(0., 1.1, 0.1):if np.sum(rec >= t) == 0:p = 0else:p = np.max(prec[rec >= t])ap = ap + p / 11.else:# correct AP calculation# first append sentinel values at the endmrec = np.concatenate(([0.], rec, [1.]))mpre = np.concatenate(([0.], prec, [0.]))# compute the precision envelopefor i in range(mpre.size - 1, 0, -1):mpre[i - 1] = np.maximum(mpre[i - 1], mpre[i])# to calculate area under PR curve, look for points# where X axis (recall) changes valuei = np.where(mrec[1:] != mrec[:-1])[0]# and sum (\Delta recall) * precap = np.sum((mrec[i + 1] - mrec[i]) * mpre[i + 1])return ap

给定精度和召回率计算VOC的AP,如果use_07_metric为真,使用VOC 07 11点方法。

4、VOC的评估

def voc_eval(detpath, annopath, test_imgid_list, cls_name, ovthresh=0.5,use_07_metric=False, use_diff=False):# 1. parse xml to get gtboxes# read list of imagesimagenames = test_imgid_listrecs = {}for i, imagename in enumerate(imagenames):recs[imagename] = parse_rec(os.path.join(annopath, imagename+'.xml'))# if i % 100 == 0:#   print('Reading annotation for {:d}/{:d}'.format(#     i + 1, len(imagenames)))# 2. get gtboxes for this class.class_recs = {}num_pos = 0# if cls_name == 'person':#   print ("aaa")for imagename in imagenames:R = [obj for obj in recs[imagename] if obj['name'] == cls_name]bbox = np.array([x['bbox'] for x in R])if use_diff:difficult = np.array([False for x in R]).astype(np.bool)else:difficult = np.array([x['difficult'] for x in R]).astype(np.bool)det = [False] * len(R)num_pos = num_pos + sum(~difficult)  # ignored the diffcult boxesclass_recs[imagename] = {'bbox': bbox,'difficult': difficult,'det': det} # det means that gtboxes has already been detected# 3. read the detection filedetfile = os.path.join(detpath, "det_"+cls_name+".txt")with open(detfile, 'r') as f:lines = f.readlines()# for a line. that is [img_name, confidence, xmin, ymin, xmax, ymax]splitlines = [x.strip().split(' ') for x in lines]  # a list that include a listimage_ids = [x[0] for x in splitlines]  # img_id is img_nameconfidence = np.array([float(x[1]) for x in splitlines])BB = np.array([[float(z) for z in x[2:]] for x in splitlines])nd = len(image_ids) # num of detections. That, a line is a det_box.tp = np.zeros(nd)fp = np.zeros(nd)if BB.shape[0] > 0:# sort by confidencesorted_ind = np.argsort(-confidence)sorted_scores = np.sort(-confidence)BB = BB[sorted_ind, :]image_ids = [image_ids[x] for x in sorted_ind]  #reorder the img_name# go down dets and mark TPs and FPsfor d in range(nd):R = class_recs[image_ids[d]]  # img_id is img_namebb = BB[d, :].astype(float)ovmax = -np.infBBGT = R['bbox'].astype(float)if BBGT.size > 0:# compute overlaps# intersectionixmin = np.maximum(BBGT[:, 0], bb[0])iymin = np.maximum(BBGT[:, 1], bb[1])ixmax = np.minimum(BBGT[:, 2], bb[2])iymax = np.minimum(BBGT[:, 3], bb[3])iw = np.maximum(ixmax - ixmin + 1., 0.)ih = np.maximum(iymax - iymin + 1., 0.)inters = iw * ih# unionuni = ((bb[2] - bb[0] + 1.) * (bb[3] - bb[1] + 1.) +(BBGT[:, 2] - BBGT[:, 0] + 1.) *(BBGT[:, 3] - BBGT[:, 1] + 1.) - inters)overlaps = inters / uniovmax = np.max(overlaps)jmax = np.argmax(overlaps)if ovmax > ovthresh:if not R['difficult'][jmax]:if not R['det'][jmax]:tp[d] = 1.R['det'][jmax] = 1else:fp[d] = 1.else:fp[d] = 1.# 4. get recall, precison and APfp = np.cumsum(fp)tp = np.cumsum(tp)rec = tp / float(num_pos)# avoid divide by zero in case the first detection matches a difficult# ground truthprec = tp / np.maximum(tp + fp, np.finfo(np.float64).eps)ap = voc_ap(rec, prec, use_07_metric)return rec, prec, ap

参数:

  • param detpath.
  • param annopath.
  • param test_imgid_list: it 's a list that contains the img_name of test_imgs.
  • param cls_name.
  • param ovthresh.
  • param use_07_metric.
  • param use_diff.

5、进行python评估

def do_python_eval(test_imgid_list, test_annotation_path):AP_list = []# import matplotlib.pyplot as plt# import matplotlib.colors as colors# color_list = colors.cnames.keys()[::6]for cls, index in NAME_LABEL_MAP.items():if cls == 'back_ground':continuerecall, precision, AP = voc_eval(detpath=os.path.join(cfgs.EVALUATE_DIR, cfgs.VERSION),test_imgid_list=test_imgid_list,cls_name=cls,annopath=test_annotation_path,use_07_metric=cfgs.USE_07_METRIC)AP_list += [AP]print("cls : {}|| Recall: {} || Precison: {}|| AP: {}".format(cls, recall[-1], precision[-1], AP))# plt.plot(recall, precision, label=cls, color=color_list[index])# plt.legend(loc='upper right')# print(10*"__")# plt.show()# plt.savefig(cfgs.VERSION+'.jpg')print("mAP is : {}".format(np.mean(AP_list)))

6、voc的检测评估

def voc_evaluate_detections(all_boxes, test_annotation_path, test_imgid_list):''':param all_boxes: is a list. each item reprensent the detections of a img.The detections is a array. shape is [-1, 6]. [category, score, xmin, ymin, xmax, ymax].Note that: if none detections in this img. that the detetions is : []:return:'''test_imgid_list = [item.split('.')[0] for item in test_imgid_list]write_voc_results_file(all_boxes, test_imgid_list=test_imgid_list,det_save_dir=os.path.join(cfgs.EVALUATE_DIR, cfgs.VERSION))do_python_eval(test_imgid_list, test_annotation_path=test_annotation_path)

参数:

  • 一个列表,每个部件代表检测到的一幅图像,检测结果是一个数组。

PASCAL VOC的评估代码voc_eval.py解析相关推荐

  1. python解析xml+得到pascal voc xml格式用于目标检测+美化xml

    1.python解析xml img_path='./data/001.tif'xml_path='./xml/001.xml'img=cv2.imread(img_path)# cv2.imshow( ...

  2. YOLOV5训练代码train.py注释与解析

    YOLOv5代码注释版更新啦,注释的是最近的2021.07.14的版本,且注释更全 github: https://github.com/Laughing-q/yolov5_annotations Y ...

  3. YOLOV5测试代码test.py注释与解析

    YOLOv5代码注释版更新啦,注释的是最近的2021.07.14的版本,且注释更全 github: https://github.com/Laughing-q/yolov5_annotations Y ...

  4. 英文数据集txt_如何用自己的数据制作 Pascal VOC 格式的数据集 详细教程(文中有所有代码)...

    目前object detection这块主流的数据集主要就是COCO和Pascal VOC格式的.github上现成的检测算法基本都是自带VOC格式数据集的输入接口的,所以想要跑起来一个算法,我们需要 ...

  5. YOLOV5dataset.py代码注释与解析

    YOLOv5代码注释版更新啦,注释的是最近的2021.07.14的版本,且注释更全 github: https://github.com/Laughing-q/yolov5_annotations Y ...

  6. YOLOv3 代码详解(2) —— 数据处理 dataset.py解析:输入图片增强、制作模型的每层输出的标签

    前言: yolo系列的论文阅读 论文阅读 || 深度学习之目标检测 重磅出击YOLOv3 论文阅读 || 深度学习之目标检测yolov2 论文阅读 || 深度学习之目标检测yolov1   该篇讲解的 ...

  7. YOLOV5检测代码detect.py注释与解析

    YOLOv5代码注释版更新啦,注释的是最近的2021.07.14的版本,且注释更全 github: https://github.com/Laughing-q/yolov5_annotations Y ...

  8. Deep Learning---py-faster-rcnn基于PASCAL VOC数据集训练模型

    0 说明 系统环境为Ubuntu14.04, 已经安装好了CUDA和cuDNN以及Python等基础包. 1 设置和编译py-faster-rcnn 1.1 下载py-faster-rcnn $ gi ...

  9. 对PASCAL VOC 数据集进行数据增强

    对PASCAL VOC 数据集进行数据增强 1.GitHub仓库位置 目的:对VOC数据集的对象检测的数据进行数据增强.如果能帮到您请给本人一颗⭐,拜托了!!!!! https://github.co ...

最新文章

  1. ASP.NET Core 中文文档 第三章 原理(12)托管
  2. STM32 进阶教程 6 -  汇编与C混合编程
  3. 当孩子面对困难的时候,家人可能的鼓励的方式
  4. php bloginfo templatedirectory,WordPress函数:bloginfo(显示博客信息)
  5. C/C++中near和far的区别
  6. socket网络编程多线程
  7. 突然听到一只公鸡的局域网聊天软件
  8. 最详细的SLAM综述
  9. 【redis源码】(九)Redis
  10. 在linux上,为什么不用配置环境变量还能运行java程序呢?
  11. php codeigniter 语言,关于php:CodeIgniter:语言文件编辑器?
  12. 计算机出现硬盘数据丢失,硬盘数据丢失后的处理方法
  13. char强制类型转换为int_为强制类型转换正名
  14. 阿里架构师教你处理高并发:2种方法,解决Redis和Mysql一致性
  15. linux启动关闭脚本,Linux中启动/停止/重启/状态的startup脚本
  16. Kotlin — 运行代码片段(以轻量级方式编写和无需创建整个应用程序的方法)
  17. DPDK 21.08 hygon (海光) CPU 环境构建
  18. 【python绘图】Matplotlib绘图及设置(使用python制图)
  19. 拳王虚拟项目公社:0成本卖虚拟教程资源,月入2万的兼职副业项目
  20. oracle 触发器管理(以及行级触发器中有两个伪变量 :new 与 :old 的使用方法)(三个谓词inserting、deleting、updating的使用方法)

热门文章

  1. 定义边缘计算架构需考虑的三个方面
  2. 常见深度学习库mmlab系列安装(mmdetection/mmdetection3d/mmyolo/mmsegmentation/mmocr/mmselfup/mmdeploy/mmrazor)
  3. 扒一扒龙虎榜,交易公开信息探索
  4. P2251-03量产失败修复成功DT111
  5. vs2015安装qt插件提示QT in the given path was built using minGW
  6. 从参加广联达BIMFACE第二届开发者活动开始入BIM的坑
  7. C语言——文件相关函数
  8. 哈夫曼树编码的实现+图解(含全部代码)
  9. java 美工_为您解读UI设计和美工的区别
  10. 安装HTC VIVE COSMOS软件安装完成,缺少各种dll文件