目标检测性能指标

1、关于TP、FP、FN、TN

TP正确且预测为正FP错误且预测为正(虚警)
FN错误且预测为负(漏检)TF正确且预测为负

对角线:预测正确;反对角线:预测错误

准确率:

准确率  = \frac{TP+TN}{TP+TN+FP+FN}

精确率:(实际为正 && 判断为正) / 判断为正 又叫查准率,看查得准不准

精确率 = \frac{TP}{TP+FP}

召回率:(实际为正 && 判断为正) / 实际为正又叫查全率,看查得全不全(看似和精确率是倒数关系,实际不然,从集合交并的角度考虑)

召回率 = \frac{TP}{TP+FN}


2、PR曲线

PR曲线:反映模型在不同的置信度阈值下,精确度和召回率之间的关系。

PR曲线的绘制:通过改变分类器的阈值,计算不同阈值下的精确率和召回率,绘制曲线。

具体而言:

设置不同的置信度阈值,就会筛选出不同数量的预测框,从而TP、FP的数量也会不同(只有置信度高于给定置信度阈值的预测框,才会纳入TP、FP的统计范围),进而得到不同的精确度和召回率,这就是一个精确度对应多个召回率,以及一个召回率对应多个精确度的原因。

从曲线上看,刚开始时,设置的置信度阈值较高,得到的精确度就高,但是可能存在大量漏检,所以召回率低;在最后,置信度阈值设置的比较低,不容易发生漏检,进而召回率较高,但是存在大量的虚警(FP),因此精度较低。

过程中,会涉及到两个阈值,一个是置信度阈值、一个是IOU阈值。

置信度阈值:用来筛选出哪些预测框将被纳入TP、FP的统计范围

IOU阈值:用来确定预测框是不是TP

举个例子:

假设一张图片当中恰有5个苹果,但是在对该图片进行目标检测时,一共得到了10个类别标签是苹果的锚框。那么怎么去获取该锚框的真实label,也就是它实际上是不是一个苹果?

方法是计算模型预测出来的锚框和人工标注的锚框(称之为Groud Truth,真实值)的交并比,如果交并比超过0.5,那么认为该预测是正确的,即实际上该锚框框起来的是一个苹果。但是在实际预测当中,经常会出现多个预测锚框跟同一个GT(Groud Truth)的IoU值都大于0.5, 这个时候只将这些预测框中置信度最大的算是一个苹果,其他不算苹果(非极大值抑制)。

precision和recall的值都在0和1之间,不同的置信度阈值可能会计算出相同的recall或者precision,也就是说,一个recall可能对应多个precision,或者一个precision对应多个recall,所以PR曲线类似下图

Precision Recall Curve

我们称之为PR曲线下面积 PR-AUC(Area Under Curve)


3. AP

定义:AP是在不同的召回率下计算得到的精确度的平均值

抛出个疑问:为什么不是不同精确度下计算得到的召回率的平均值呢?

召回率是一个覆盖面的度量,它表示了模型发现正实例的比例,它涵盖了从未检测出正类实例(召回率为0)到检测出所有正类实例(召回率为1)之间的所有情况。这种全面覆盖使得它成为衡量模型整体检测性能的基础。

如果在不同的精确度下计算召回率的平均值,则:精确度受负类样本影响较大:精确度的计算不仅涉及正类样本,还涉及负类样本,而召回率专注于正类样本。对于目标检测任务,尤其是当负类样本数量远大于正类样本时,使用召回率可以避免负类样本对评估结果的过大影响。

3.1 AP计算方法:11点插值方法

这种方法是早期的计算方法,在不同的召回率点上取精确度的值,并计算这些值的平均值

1. 定义11个召回率点:通常是0,0.1,0.2,0.3,...,1

2. 插值精确度:对于每一个召回率点r,取在该点及之后的所有召回率的对应的精确度的最大值     

                                                     $p_{interp}(r) = \max_{\tilde{r} \geq r} p(\tilde{r}) $

3. 计算这11个点精确度的平均值

3.2 AP计算方法:全插值方法

1. 对于每一个召回率r,同样取该点及之后的所有召回率的对应的精确度的最大值 

2. 计算插值后的PR曲线下的面积

                                                 $AP = \int_0^1 p_{interp}(r) d_r$

示例:

假设在不同的召回率下计算的精确度-召回率曲线仍然是上面的黄色折线,经过全插值后得到绿色折线

在这里插入图片描述

AP=绿色折线下围住的面积。

3.3  mAP

AP 是针对于一个类别而言的,把所有的类别的AP计算出来后,取平均值就是mAP

3.4 PR-AUC和AP的区别联系

  • PR-AUC 通常不涉及插值,直接计算曲线下的面积。
  • AP 通过插值方法处理精确度-召回率曲线,平滑曲线并消除波动。
  • 两者在大多数情况下会给出相似的结果,但 AP 由于插值处理,通常会给出一个更高的值,因为它考虑了在每个召回率上的最佳精确度。

3.5. AP的计算过程

1. 获取模型的检测结果

首先,模型会在测试集上进行预测,生成一系列的检测结果,包括预测的边界框、类别和置信度分数。

2. 计算IOU

对于每个预测边界框,计算它与所有真实边界框之间的交并比(IoU, Intersection over Union)

3. 排序预测结果,确定TP、FP

按照预测框的置信度分数从高到低对进行排序。对所有超过置信度阈值的预测框,按照给定的IOU阈值(如0.5),确定TP和FP

  • TP:预测边界框与某个真实边界框的 IoU 大于等于阈值,并且该真实边界框尚未被匹配。
  • FP:预测边界框与所有真实边界框的 IoU 小于阈值,或该真实边界框已经被匹配过。

4. 计算精确度和召回率

设置置信度阈值递减,逐步计算累积的 TP 和 FP,并计算精确度和召回率:

  • 累积 TP累积 FP:遍历过程中累加 TP 和 FP 的数量。

  • 精确度(Precision):每次累积的 TP 数量除以当前遍历的检测结果数量(TP + FP)。

  • 召回率(Recall):每次累积的 TP 数量除以总的真实正样本数量(实际目标的数量)。

5. 绘制PR曲线

根据不同的置信度阈值,绘制精确度-召回率(PR, Precision-Recall)曲线。X 轴为召回率,Y 轴为精确度。

6. 计算AP

对于每一对相邻的召回率点(ri,ri+1),计算矩形的面积并累加得到AP

AP= \sum _i {(r_{i+1}-r_i)*P(r_{i+1}))}

7. 计算mAP

3.6 CoCo的AP评价标准

  • 17
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测性能指标包括精度和速度两个方面。常用的精度指标有mAP(mean average precision)、PR曲线、ROC曲线等;常用的速度指标有FPS(frames per second,每秒处理帧数)、推理时间等。以下是使用Python和OpenCV计算mAP的示例代码: ```python import numpy as np def calculate_iou(box1, box2): x1, y1, w1, h1 = box1 x2, y2, w2, h2 = box2 xi1 = max(x1, x2) yi1 = max(y1, y2) xi2 = min(x1 + w1, x2 + w2) yi2 = min(y1 + h1, y2 + h2) iw = max(xi2 - xi1, 0) ih = max(yi2 - yi1, 0) ua = (w1 * h1 + w2 * h2 - iw * ih) iou = iw * ih / ua return iou def calculate_ap(gt_boxes, pred_boxes, iou_threshold=0.5): tp = [0] * len(pred_boxes) fp = [0] * len(pred_boxes) gt_detected = [False] * len(gt_boxes) pred_scores = [box[0] for box in pred_boxes] order = np.argsort(pred_scores)[::-1] for i in order: _, pred_box, pred_class = pred_boxes[i] max_iou = -float('inf') max_idx = -1 for j, gt_box in enumerate(gt_boxes): if pred_class != gt_box[0]: continue iou = calculate_iou(pred_box, gt_box[1:]) if iou > max_iou: max_iou = iou max_idx = j if max_iou >= iou_threshold: if not gt_detected[max_idx]: tp[i] = 1 gt_detected[max_idx] = True else: fp[i] = 1 else: fp[i] = 1 tp_acc = np.cumsum(tp) fp_acc = np.cumsum(fp) recall = tp_acc / len(gt_boxes) precision = tp_acc / (tp_acc + fp_acc) ap = 0 for t in np.arange(0, 1.1, 0.1): if np.sum(recall >= t) == 0: p = 0 else: p = np.max(precision[recall >= t]) ap += p / 11 return ap def calculate_map(gt_boxes_list, pred_boxes_list, iou_threshold=0.5): aps = [] for c in range(len(gt_boxes_list)): gt_boxes = gt_boxes_list[c] pred_boxes = pred_boxes_list[c] ap = calculate_ap(gt_boxes, pred_boxes, iou_threshold) aps.append(ap) map = sum(aps) / len(aps) return map ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值