目标检测中的mAP计算原理和源码实现

简介

目标检测任务中,mAP(mean Average Precision,平均精度均值)是一个非常重要的评价指标,用于衡量模型在多个类别上的平均性能。它综合考虑了模型在不同召回率下的精确率,能够全面反映模型在检测任务中的表现。
作用
综合性评估:mAP能够综合考虑模型在不同召回率下的精确率,避免了单一指标(如准确率或召回率)可能带来的片面性。
多类别比较:对于多类别的目标检测任务,mAP可以计算每个类别的AP,然后取平均值得到全局的mAP,从而方便比较模型在不同类别上的性能。
模型选择和调优:通过比较不同模型或不同参数设置下的mAP值,可以选择性能更优的模型或确定最佳的参数配置。
计算方法
计算每个类别的AP:
对于每个类别,首先根据模型输出的预测框和真实的标注框计算交并比(IOU)。
根据设定的IOU阈值(通常为0.5),将预测框分为真正例(TP)、假正例(FP)和假反例(FN)。
对于每个预测框,根据当前的TP和FP数量计算精确率(Precision)和召回率(Recall)。
绘制该类别的PR曲线,即Precision随Recall变化的曲线。
计算PR曲线下方的面积,得到该类别的AP值。这通常可以通过插值法实现,如11点插值法,即在Recall坐标轴上选择11个点(如0, 0.1, 0.2, …, 1),然后计算这些点对应的Precision的平均值作为AP的近似值。
计算全局的mAP:
对于所有类别,分别计算得到各自的AP值。
将所有类别的AP值取平均值,得到全局的mAP值。
需要注意的是,mAP的计算过程可能因使用的数据集和评估标准而有所不同。例如,COCO数据集和PASCAL VOC数据集在计算mAP时可能采用不同的IOU阈值或插值方法。因此,在实际应用中,需要根据具体的数据集和评估要求来确定mAP的计算方法。

实现过程

假定我的输入为3D的目标检测的pred_boxes和gt_boxes

image_idx cls_id x y z l w h yaw score(for pred_boxes)
pred_boxes = py.array([[0, 1, 13, 13, 0, 6, 6, 2, 0, 0.9],
[0, 0, 35, 30, 0, 10, 8, 2, 0, 0.9],
[1, 0, 12, 30, 0, 6, 9, 2, 0, 0.5]])
gt_boxes = py.array([[0, 1, 10, 10, 0, 6, 6, 2, 0],
[0, 0, 30, 30, 0, 10, 8, 2, 0],
[0, 0, 10, 30, 0, 6, 9, 2, 0]])

可视化一下image_idx=0的boxes:
在这里插入图片描述
在每个类别中提取每个样本的这个类别的pred_boxes和gt_boxes,并计算iou值,根据iou阈值划分tp(正确检测)和fp(误检).

over_laps = iou(pred_boxes=pred_boxes_cls_img[:, [2, 3, 5, 6]],
                                    gt_boxes=gt_boxes_cls_img[:, [2, 3, 5, 6]])
corr_gts = np.argmax(over_laps, axis=1)
corr_iou = np.max(over_laps, axis=1)
visited_gt = []
for id, pred_box in enumerate(pred_boxes_cls_img):
    if corr_iou[id] >= iou_threshold and corr_gts[id] not in visited_gt:
         visited_gt.append(corr_gts[id])  # if pred got gt, the gt should be ignore
         fp_or_tp.append(1)
    else:
         fp_or_tp.append(0)

统计所有样本的pred_boxes的tp/fp类型及其score,安照score降序排序.

scores = pred_boxes_cls[:, -1]
index = np.argsort(-scores, )
# sort fp_or_tp by decending order of scores
fp_or_tp = fp_or_tp[index]

根据score列表依次选择有效的pred_boxes,计算precision=tp/(tp+fp)和recall=tp/gt_boxes.size().
precision和recall列表形成pr曲线,计算pr曲线面积即可.

# 根据>=score的是有效pred,有效pred中,0是f,1是检测到了目标, 1的数量除以总的有效pred就precious
# 1的数量除以真值数量就是recall
tp_num_list = np.cumsum(fp_or_tp)
pred_num_list = np.cumsum(np.ones_like(fp_or_tp))
precision_array = tp_num_list / pred_num_list
recall_array = tp_num_list / tp_and_tn
ap = compute_ap(recall_array, precision_array, class_name)

注意求pr曲线面积时,横坐标(长)要是recall,而不能是用score求平均precision.

思考下:
pr曲线会不会出现左低右高的情况?是有的,当fp的score较高时候就会出现这个问题.比如score最高的第一个就是fp.那么这时recall很小时,precision为0.
解决方法:recall_list和precision_list的首尾补上(0,1)或者(1,0),然后单调性处理
在这里插入图片描述

再分析下:score降序,recall肯定是递增的,但是precision不一定是递减,因此需要使得它单调,具体操作:

    for i in range(len(precision_array)-1, 0,-1):
        precision_array[i-1] = np.max(precision_array[i-1], precision_array[i])

参考:b站视频


http://www.niftyadmin.cn/n/5449002.html

相关文章

人工智能 | 一文介绍五种基本 Agent

人工智能 | 一文介绍五种基本 Agent 1. 背景介绍 在人工智能领域,Agent 是一个核心概念。Agent 是指具有感知环境、决策和执行能力的实体。它可以是一个简单的程序,也可以是一个复杂的系统。Agent 的研究可以追溯到 20 世纪 50 年代,当时被…

P1719 最大加权矩形(洛谷)

文章目录 最大加权矩形题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示二维前缀和易错 最大加权矩形 题目描述 为了更好的备战 NOIP2013,电脑组的几个女孩子 LYQ,ZSC,ZHQ 认为,我们不光需要机房,我们还需要运动,于…

Django(一)- 环境搭建和快速入门

一、搭建环境 1、创建Python虚拟环境 (base) C:\Users\35351>conda create -n django_study python3.9 2、安装Django (django_study) C:\Users\35351>pip install Django >> 查看安装版本 (django_study) C:\Users\35351>python -m django --version 3、安…

统计文件夹下所有文件的字数

统计文件夹下所有.md文件的字数 import java.io.*; import java.nio.charset.StandardCharsets; import java.nio.file.*; import java.nio.file.attribute.BasicFileAttributes; import java.util.regex.Pattern;public class WordCounter {private static final Pattern WOR…

探索LLaMA模型:架构创新与Transformer模型的进化之路

引言 在人工智能和自然语言处理领域,预训练语言模型的发展一直在引领着前沿科技的进步。Meta AI(前身为Facebook)在2023年2月推出的LLaMA(Large Language Model Meta AI)模型引起了广泛关注。LLaMA模型以其独特的架构…

nodejs+vue高校社团管理小程序的设计与实现python-flask-django-php

相比于以前的传统手工管理方式,智能化的管理方式可以大幅降低学校的运营人员成本,实现了高校社团管理的标准化、制度化、程序化的管理,有效地防止了高校社团管理的随意管理,提高了信息的处理速度和精确度,能够及时、准…

jmeter链路压测

比如登录后返回token,业务打印上传的操作需要用到token 线程组中添加登录请求,并执行 1、添加登录并执行,查看结果 2、结果树中下拉选择正则表达式,将token参数和值复制粘贴到下方,将token值改为(.*?)&#xff0…

[BT]BUUCTF刷题第6天(3.24)

第6天 Web [极客大挑战 2019]PHP Payload: O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";s:3:"100";}这道题考点是网站源码备份文件泄露和PHP反序列化,有篇介…