召回(recall),查准(precision),平均精度(ap) 之间的关系

召回率(tp/(tp+fn))和查准率(tp/(tp+fp))相对比较好理解,平均精度的理解相对比较难些,主要是物理意义不够明确,可参考(ap的计算 - 程序员大本营),至少对我来讲是这样的,做项目的使用用到openmmlab,一个很好的ai框架,在使用他们的检测框架时,默认会打印出上述三个参数。他们其实也会受一些超参数(阈值)的影响。比如,NMS_thresh,  iou_thresh, confidence_thresh, 分别对应的物理意义是:

conf_thresh, 就是检测物体框的置信度,它包含物体的概率或分数

Nms_thresh, 就是极大值抑制里面的一个参数,主要用于减少重复预测框的数量

iou_thresh,  就是预测和GT两个框的交并比参数,高于就代表有正,低于代表负

下面主要针对这三个参数的调整进行直观的说明:

conf_thresh=0.05,  nms_thresh=0.6, iou_thresh=0.25

图表中gts是每个类的框的个数,dets是最终预测框的个数,它是和上面的三个参数有关的额

conf_thresh=0.25,  nms_thresh=0.6, iou_thresh=0.25

把conf_thresh从0.05提高的0.25, dets的数量明显减少,这是因为提高了预测框的置信度门槛,从而减少了预测框,一定程度会使recall降低, 同时也就减少了fp,precsition从而提高了。因为训练的模型预测处的框会远远多于实际框数量,所以才进行后续的滤除,若部滤除的话,如果一张图里面有5个目标,也就是需要预测5个框即可,但是可能预测处1000个框,那这100个框就很容易包括那真实的5个框,这样的话查全率(recall)比如很高,但是这又造成了大量的fp,所以查准率(precision)会很低,如上图所示。

conf_thresh=0.05,  nms_thresh=0.5, iou_thresh=0.25

把nms_thr从0.6降低为0.5,这样极大值抑制时,使消除框门槛降低,从而使消除框的数量增加,fp数量进一步减少,precision进一步提高,同时recall的也受影响并微弱降低。

### 精确召回率、精度和平均精度的定义及计算方法 #### 精确Precision精确是指在所有被模型预测为正类的样本中,实际为正类的比例。其公式如下: \[ \text{Precision} = \frac{\text{True Positives (TP)}}{\text{True Positives (TP)} + \text{False Positives (FP)}} \] 其中,`TP` 表示预测为正且实际为正的样本数量,`FP` 表示预测为正但实际为负的样本数量[^2]。 #### 召回率Recall召回率衡量的是在所有实际为正类的样本中,被正确预测为正类的比例。其公式如下: \[ \text{Recall} = \frac{\text{True Positives (TP)}}{\text{True Positives (TP)} + \text{False Negatives (FN)}} \] 这里 `FN` 是指预测为负但实际上为正的样本数量[^4]。 #### 精度(Accuracy) 精度表示分类器整体预测正确的比例,适用于数据分布较为均衡的情况。其公式为: \[ \text{Accuracy} = \frac{\text{True Positives (TP)} + \text{True Negatives (TN)}}{\text{Total Samples}} \] 其中,`TN` 表示预测为负且实际为负的样本数量[^1]。 #### 平均精度(Average Precision, AP平均精度是一种用于评价检索系统的指标,在不同阈值下计算多个精确-召回率对并取加权平均。具体来说,AP 的计算方式可以基于 PR 曲线下面积或者通过插值法实现。对于二分类问题,通常采用以下形式: \[ \text{AP} = \sum_{n} (\text{Recall}_n - \text{Recall}_{n-1}) \cdot \text{Precision}_n \] 这表明它关注于每次增加新的召回时对应的精确变化情况[^3]。 以下是 Python 中使用 Scikit-Learn 库来计算这些指标的一个简单例子: ```python from sklearn.metrics import accuracy_score, precision_score, recall_score, average_precision_score import numpy as np y_true = np.array([0, 1, 1, 0, 1]) # 实际标签 y_pred = np.array([0, 1, 0, 0, 1]) # 预测标签 # 计算 Accuracy acc = accuracy_score(y_true, y_pred) # 计算 Precision prec = precision_score(y_true, y_pred) # 计算 Recall rec = recall_score(y_true, y_pred) # 假设我们有概估计值来进行 Average Precision 的计算 probs = np.array([0.1, 0.8, 0.3, 0.2, 0.9]) ap = average_precision_score(y_true, probs) print(f"Accuracy: {acc}") print(f"Precision: {prec}") print(f"Recall: {rec}") print(f"Average Precision: {ap}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值