一、mAP指标
mean Average Precision(平均精度均值),它是目标检测和信息检索等任务中的重要性能指标。mAP 通过综合考虑精度和召回率来衡量模型的总体性能。
1.1 精度(Precision)
表示检索到的目标中实际为正确目标的比例,计算公式为
1.2 召回率(Recall)
表示所有目标中成功被检索到的比例,计算公式为
1.3 平均精度(AP)
-
平均精度表示的是在不同的召回率阈值下,计算模型的平均精度。通常通过绘制 PR 曲线(Precision-Recall 曲线)计算。
-
PR 曲线的横轴为召回率,纵轴为精度。AP 是 PR 曲线下的面积,即对该曲线进行积分的结果。
1.4 mAP的计算
-
mAP 是对多个类别的 AP 求平均得出的数值。
-
如果目标检测任务中包含 N 个类别,则计算每个类别的 AP,并对所有类别的 AP 取平均,即:
1.5 mAP在2D目标检测的计算
在目标检测中,通常设定一个置信度阈值,用于判定检测结果是否被认为是正例(即预测的目标)。常见的阈值有0.5,即 IOU(交并比)≥ 0.5 被视为有效检测。
比如mAP@0.5表示将IoU设为0.5时,计算每一类的所有图片的AP,然后所有类别求平均得到mAP;
mAP@.5:.95表示在不同IoU阈值(从0.5到0.95,步长0.05)(0.5、0.55、0.6、0.65、0.7、0.75、0.8、0.85、0.9、0.95)上的平均mAP。
def ap_per_class(tp, conf, pred_cls, target_cls, eps=1e-16):i = np.argsort(-conf)tp, conf, pred_cls = tp[i], conf[i], pred_cls[i]unique_classes, nt = np.unique(target_cls, return_counts=True)nc = unique_classes.shape[0]ap = np.zeros((nc, tp.shape[1]))p, r = np.zeros((nc, 1000)), np.zeros((nc, 1000))for ci, c in enumerate(unique_classes):i = pred_cls == cn_l = nt[ci]n_p = i.sum()if n_p == 0 or n_l == 0:continuefpc = (1 - tp[i]).cumsum(0)tpc = tp[i].cumsum(0)recall = tpc / (n_l + eps)precision = tpc / (tpc + fpc)for j in range(tp.shape[1]):ap[ci, j], _, _ = compute_ap(recall[:, j], precision[:, j])return ap.mean(0)
结合YOLO仓库中的代码进行说明,
np.argsort: 按检测置信度对预测框排序。
unique_classes: 获取数据集中存在的目标类别。
compute_ap 函数:计算PR曲线,并从中得到每个类别的平均精度。通过曲线下面积得到AP,计算上是使用插值方法在固定的召回率点(例如 [0, 0.01, 0.02, ..., 1])计算精度值,并通过梯形法则对这些点进行积分,得到 AP。
def compute_ap(recall, precision):mrec = np.concatenate(([0.0], recall, [1.0]))mpre = np.concatenate(([1.0], precision, [0.0]))mpre = np.flip(np.maximum.accumulate(np.flip(mpre)))method = "interp"if method == "interp":x = np.linspace(0, 1, 101)ap = np.trapz(np.interp(x, mrec, mpre), x)else:i = np.where(mrec[1:] != mrec[:-1])[0]ap = np.sum((mrec[i + 1] - mrec[i]) * mpre[i + 1])return ap, mpre, mrec
输入参数:recall: 一个列表或数组,表示不同阈值下的召回率值。precision: 一个列表或数组,表示不同阈值下的精确度值。
输出值:返回三个值:平均精确度(AP),处理过的精确度曲线,以及处理过的召回率曲线。
选择一种计算PR曲线下面积的方法,函数中提供了两种方法:
-
interp:使用插值方法,在 [0, 1] 范围内将召回率分为 101 个点,然后使用 np.interp 进行插值计算,并通过 np.trapz 计算面积,这是COCO 评价标准下的插值方法。
-
continuous:直接根据召回率变化的点计算面积。
说明一下这里的细节:
-
翻转精确度曲线: 使用 np.flip 将精确度曲线倒置。假设原始精确度数组是 [0.5, 0.6, 0.4, 0.7],翻转后为 [0.7, 0.4, 0.6, 0.5]。
-
计算累积最大值: 倒置后的精确度数组作为输入,传递给 np.maximum.accumulate 计算累积最大值。该函数在遍历输入数组时,将输出元素设置为从当前索引开始到数组末尾范围内的最大值。np.maximum.accumulate 的计算结果是 [0.7, 0.7, 0.7, 0.7],确保所有值都大于或等于前一个值。
-
翻转回原始顺序: 最后再使用 np.flip 将累积最大值的数组翻转回原始顺序,得到 [0.7, 0.7, 0.7, 0.7],这样得到的曲线就是非递减的包络线。在现实情况下,精确度曲线有时可能会因为某个特定的召回率阈值而出现波动,使得曲线有时会上升,有时会下降。然而,在计算PR曲线下面积时,为了使结果更具稳定性和准确性,需要将这些下降的部分“填平”以形成一个包络线,确保整个曲线是平滑和非递减的。
1.6 mAP在3D目标检测的计算
在3D目标检测任务中,为了顾及小目标物体,不再适用2D中基于IoU的mAP计算方式,而是计算框在BEV视图下的2D中心点之间的欧氏距离。
设置一个阈值(如2米),如果预测框和真实框的中心点距离小于这个阈值,则认为这两个框匹配。
这种方法特别有利于提高小物体的匹配率。在3D环境中,小物体的IoU可能由于深度和遮挡问题而较难计算或得到较低的匹配度。使用中心点距离作为匹配标准简化了匹配过程,使得评估对于各种尺寸的物体都更为公平。
通过BEV的2D中心距离d来计算。这样解耦了物体的尺寸和方向对AP计算的影响。d设置为{0.5,1,2,4}米。在计算AP时,去除了低于10%的recall和precision并用0来代替这些区域(所以这里的PR曲线表示10%以上的召回率和精度,以降低噪声影响)。不同类C以及不同距离难度D用来计算mAP。
二、NDS
2.1 mATE(Average Translation Error)
平均平移误差(ATE)衡量的是预测的物体中心点与真实物体中心点之间的平均欧几里得距离,单位为米。
2.2 mASE(Average Scale Error)
平均尺度误差(ASE)衡量的是预测的物体尺寸与真实物体尺寸之间的一致性,通过计算1减去角度对齐后的三维交并比(IoU)。
2.3 mAOE(Average Orientation Error)
平均角度误差(AOE)衡量的是预测物体方向与真实物体方向之间的最小偏航角差异。所有角度均在整个360度周期内测量,但障碍物除外,它们是在180度周期内测量的。
2.4 mAVE(Average Velocity Error)
平均速度误差(AVE)是预测物体速度与真实物体速度之间的二维L2范数差(m/s)。
其中 vx 和 vy 表示速度在x轴和y轴上的分量。
2.5 mAAE(Average Attribute Error)
平均属性错误(AAE)被定义为类别分类的错误率,即1减去分类准确度。
其中 acc 是分类的准确度,即正确分类的样本数占总样本数的比例。
2.6 NDS计算
上述指标称为True Positive 指标。所有TP指标都是在匹配时使用 d=2 米中心距计算的,并且都被设计为正标量。如果特定类别未实现10%以上召回率,则该类别的所有 TP 错误都将设置为1。同时,忽略了一些类别的测量。
-
AVE(平均速度误差):不适用于路标锥和障碍物,因为它们是固定不动的,没有速度可测量。
-
AOE(平均角度误差):不适用于路标锥,因为它们没有明确的方向或朝向,无法评估其角度误差。
-
AAE(平均属性误差):不适用于路标锥和障碍物,因为这些类别没有定义明确的属性,无法计算属性相关的错误率。
NDS 的一半基于检测性能,而另一半则根据框位置、大小、方向、属性和速度来量化检测质量。由于 mAVE、mAOE 和 mATE 可能大于 1 ,因此会将每个指标限制在 0 和 1 之间。