PR curve, AP, mAP, AUC, f1-score ??

不同检测网络的性能好坏我们经常使用AP来表示, AP越高表示网络的学习能力越好。那么什么是AP呢? mAP又是什么? AUC又是啥?这里简单做下汇总。

  • True positive(TP)
    检测正确, iou>=threshold

  • False positive(FP)
    检测错误, iou < threshold

  • False Negative(FN)
    漏检, 目标没有被检测到。

  • True Negative (TN)
    意思为正确的漏检, 也就是说, 不是检测目标的地方没有被检测出来, 对于检测网络来说,这个指标没有用。
    在这里插入图片描述

有了以上基础,那么就有了precision和recall的概念。

  • Accuracy

    accuracy = 预测对的/所有 = (TP+TN)/(TP+FN+FP+TN)

  • Precision
    在这里插入图片描述

  • Recall
    在这里插入图片描述
    如果把Precision和Recall分别作为y和x, 那么可以画在一张图上。
    在这里插入图片描述
    对于不同的detector可以画一个不同的曲线,那么怎么比较两个曲线哪个好呢? 那么怎么用一个数字就能看出检测的好坏呢? 这是就要考虑AUC(曲线下面积), 对于PR曲线来说, 曲线下的面积称为AP。

  • TPR和FPR
    在这里插入图片描述
    TPR和FPR计算参考上图

  • ROC 曲线

对于不同的阈值, 我们可以算出不同fp,tp等数值,对应的tpr和fpr也可以得到, 那么把tpr和fpr放在一个坐标系下可以画出下面这张图, 曲线下的面积可以表示出一个模型的性能好坏.在这里插入图片描述

实现代码可以参考sklearn.metrics.roc_curve.

  • AP计算

下面开始尝试手动计算AP, 对于一个数据集图片总数为5, 总gt bbox个数有15个,用红框表示预测框, 绿色表示gt框。如下图:
在这里插入图片描述
下面将所有检测框分类为tp和fp, 分类的标准是IOU > threshold, 比如上面的AP50,指的就是这个threshold=50%. 这个例子中,我们使用threshold=30%, 也就是说iou>30%就认为是tp。但是也有一个特例, 比如一个gt box有多个预测框与其iou都大于30%, 那么只有第一个预测框为tp, 剩下的都是fp(参考了VOC 2012 metric计算要求)。按照这么个规则区分tp和fp,我们可以得到下面一个表格。
在这里插入图片描述
接下来按照confidence排序,则有:
在这里插入图片描述
可以看出precision和recall递减,一个递增, 画出来如下:
在这里插入图片描述
至此,我们就得到了一个PR curve, 这种犬牙交错的曲线算AP有两种方法。11点插值法所有点插值法

  • 11点插值法
    故名思意, 从[0, 1]之间均匀采样11点, 用这11个点的precision均值作为ap。
    在这里插入图片描述
    如图, 红色点为采样点,采样点基本不会刚好落在真实的pr曲线上, 那么采样点的precision就取pr曲线上最近的precision值。

  • 所有点插值法
    在这里插入图片描述
    如上上, 算出红色曲线下的面积即为AP。

所以,算AP的总过程为:

  1. 所有预测框按照iou 阈值分为tp和fp
  2. 将预测框按照confidence排序,计算出不同confidence下的precision和recall
  3. 按照11点或者全部点插值算法计算出AP。
    论文里经常看到AP50, AP75, APs, APm, APl的等值, 他们是什么意思呢?
  • AP50
    iou 阈值大于0.5时AP值

  • AP75
    iou阈值大于0.75时的AP值

  • APs
    像素面积小于32*32目标框的AP值

  • APm
    像素面积小于32*32 ~96 * 96之间目标框的AP值

  • APl
    像素面积大于96*96的目标框 AP值

  • mAP
    一般AP是指单个类下,mAP则是所有类别AP的平均。

f score

f s c o r e = ( 1 + β 2 ) ∗ P ∗ R / ( β 2 ∗ P + R ) fscore=(1+ β^2)*P*R/(β^2*P + R) fscore=(1+β2)PR/(β2P+R)
β为1即为f1score, 表示P和R一样重要.

参考资料:https://github.com/rafaelpadilla/Object-Detection-Metrics

机器学习中,评估模型性能常用的指标包括AUC、准确度(Accuracy)、精确度(Precision)、召回率(Recall)和F1-score。以下是使用Python中的`sklearn`库计算这些指标的一个简单示例: 首先,你需要有一个训练好的机器学习模型,并对其做预测,得到预测结果和真实的标签。然后,使用`sklearn.metrics`中的相关函数来计算这些性能指标。 ```python from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_score from sklearn.metrics import confusion_matrix # 假设 y_true 是真实的标签数组,y_pred 是模型预测的标签数组,y_pred_proba 是模型预测的概率数组(对于二分类问题) y_true = [...] # 真实标签 y_pred = [...] # 模型预测的标签 y_pred_proba = [...] # 模型预测的概率 # 准确度(Accuracy) accuracy = accuracy_score(y_true, y_pred) print(f'准确度: {accuracy}') # 精确度(Precision) precision = precision_score(y_true, y_pred) print(f'精确度: {precision}') # 召回率(Recall) recall = recall_score(y_true, y_pred) print(f'召回率: {recall}') # F1-score f1 = f1_score(y_true, y_pred) print(f'F1-score: {f1}') # AUC (Area Under the Curve) # 注意:AUC只能应用于二分类问题的ROC曲线 if len(np.unique(y_true)) == 2: # 确保标签只有两个类别 auc = roc_auc_score(y_true, y_pred_proba) print(f'AUC: {auc}') ``` 请确保你已经安装了`sklearn`库,并且你的`y_true`和`y_pred`是适当格式的数组或列表,`y_pred_proba`是一个包含概率值的数组。对于二分类问题,`y_pred_proba`应该是一个二维数组,其中每一行对应一个样本,每一列对应一个类别的预测概率。 在多分类问题中,`precision_score`、`recall_score`和`f1_score`函数默认计算所有类别的加权平均值。你也可以通过设置参数`average=None`来得到一个针对每个类别的性能指标列表。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值