模型的评估指标——IoU、混淆矩阵、Precision、Recall、P-R曲线、F1-score、mAP、AP、AUC-ROC
文章目录
- 预测框的预测指标——IoU(交并比)
- 分类预测指标
- 混淆矩阵(Confusion Matrix,TP、FP、FN、TN)
- Precision(精度)
- Recall(召回率)
- P-R曲线
- F1-score
- TPR、TNR、FPR、FNR
- ROC曲线下面积(AUC-ROC)
- TPR(真实阳性率)/召回率/敏感度
- Specificity
- FPR
- 如何推测模型的表现?
- ROC (Receiver Operating Characteristic) Curve
- 敏感性和特异性之间的权衡
- ROC Curve
- AUC(Area Under the Curve曲线下面积)
- 有了预测框的预测指标与分类预测的指标,接下来将二者结合即为评价目标检测模型的指标。
- AP(average precision 平均精度)
- 方法 1 — 用矩形近似 PR 曲线
- 方法 2——插值和 11 点平均值
- mAP(mean of Average Precision)
- mAP@0.5
- mAP@[0.5:0.95]
YOLO是最先进的目标检测模型之一。目标检测问题相比分类问题要更加复杂,因为目标检测不仅要把类别预测正确,还要预测出这个类别具体在哪个位置。
我将目标识别的评估指标总结为两部分,一部分为预测框的预测指标,另一部分为分类预测指标
预测框的预测指标——IoU(交并比)
IoU 代表 Intersection over Union,IoU 量化了两个边界框(真实值和预测值)的接近程度。该值介于 0 和 1 之间。如果两个边界框完全重叠,则预测完美,因此 IoU 为 1。另一方面,如果两个边界框不重叠,则 IoU 为 0。IoU 是通过计算两个边界框的交集面积与并集面积之比来计算的,它显示两个边界框彼此重叠的程度。公式如下所示
Bounding box(边界框)是目标检测(Object Detection)中用来框定图像中目标区域的一种矩形框。它定义了一个矩形区域,该区域包含了图像中的一个或多个目标。
预测框的准确率用IoU来反映。交并比是目标检测问题中的一项重要指标,它在训练阶段反映的是标注框与预测框的重合程度,用于衡量预测框的正确程度。
在我们的示例中,我们将使用 IoU = 50% 作为接受标准。如果 IoU 大于或等于 50%,则我们说位置预测是好的。如果 IoU 小于 50%,则预测与真实边界框相差太远。
如上图所示,IoU指的就是两框的重叠部分的面积,与两框总共部分的面积之比。IoU又称交并比,从字面意思也可以理解,IoU就是两框交集与并集之比。IoU越接近于0,两框重叠越少;IoU越接近于1,两框的重叠程度越高,当IoU等于1时,两框完全重叠。
IoU要搭配IoU阈值一起使用。
IoU阈值一般被定为0.5,当两框的IoU大于阈值时,则判断预测框预测正确。IoU阈值可以修改,IoU阈值越高,则判断预测框预测正确的条件越严格。
分类预测指标
混淆矩阵(Confusion Matrix,TP、FP、FN、TN)
如果预测边界框和真实边界框的类标签相同,并且它们之间的 IoU 大于阈值,则认为预测正确。
- True Positive(TP): Values that are actually positive and predicted positive.模型预测边界框存在于某个位置(阳性),并且是正确的(真)
- False Positive(FP): Values that are actually negative but predicted to positive.模型预测某个特定位置存在边界框(阳性),但预测错误(假)
- False Negative(FN): Values that are actually positive but predicted to negative.模型预测某个位置的边界框(阴性),并且它是错误的(假),即在该位置存在一个阳性边界框。
- True Negative (TN): Values that are actually negative and predicted to negative.模型预测某个位置的边界框(阴性),并且预测结果正确(真)。这对应于背景,即没有边界框的区域,不用于计算最终指标。
技巧:两个字母,第一个字母表示结果是否预测正确,第二个字母表示预测
我在学习这块知识的时候,一直有一个疑问。在多分类的任务中,如何界定某个类别是正例或负例?后来才理解,这里的正例和负例其实只是针对某一类别而言的。例如,coco数据集有80个类别,针对person类而言,person类别就是正例,其他79个类别就是负例;针对car类而言,car类别就是正例,其他79个类别就是负例。
Precision(精度)
从上图可以看出,分类器预测的非常准确。当它说这是一只猫(狗)时,80% 的时间是正确的。但是,如果图像中有一只猫(狗),分类器只能在 40%(80%)的时间内检测到它。因此,该模型很难记住猫。
准确率衡量的是模型所有正向预测中,真阳性预测所占的比例。计算方法是将真阳性的数量除以真阳性和假阳性的总和。
准确率 = 真实阳性/(真实阳性+假阳性)
例如,考虑一个垃圾邮件检测系统,其中模型将电子邮件归类为垃圾邮件。如果电子邮件确实是垃圾邮件,则将其视为真阳性。但是,如果电子邮件不是垃圾邮件,但被模型归类为垃圾邮件,则将其视为假阳性。在这种情况下,模型的精度将是:
准确率 = 真实阳性/(真实阳性+假阳性)
分析式子可知,Precision关心的是预测的正例,以及真实的正例和负例。当Precision越大时,FP越小,此时将其他类别预测为本类别的个数也就越少,可以理解为预测出的正例纯度越高。Precision越高,误检越少。
Precision 衡量的是模型预测为正类的样本中有多少实际是正类,强调的是预测结果的准确性。
Recall(召回率)
召回率,也称为敏感度,衡量的是数据集中所有实际阳性样本中真正阳性预测的比例。它的计算方法是将真正阳性的数量除以真正阳性和假阴性的总和。
根据定义,Recall的分母时TP与FN之和,TP是预测为正例,真实值也为正例的个数;FN是预测为负例,实际是正例的个数。
分析式子可知,Recall关心的是预测的正例和负例,以及真实的正例。当Recall越大时,FN越小,此时将正例预测为负例的个数越少,可以理解为把全部的正例挑出来的越多。Recall越高,漏检越少。
Recall 衡量的是模型识别出所有正类样本的能力,强调的是识别正类的全面性。如果你不希望漏掉正类样本,Recall 很重要。
假设你正在开发一个疾病筛查的模型:
Precision 关注的是被检测为阳性的人中,实际上有多少是得了病的,减少误诊。
Recall 关注的是所有得了病的人中,有多少被模型正确诊断出来,减少漏诊。
P-R曲线
理想情况下,我们希望准确率和召回率都很高,即检测到的任何东西都是正确的,并且模型可以检测到某个类别的所有出现。准确率和召回率的值取决于模型检测到了多少个真阳性。分配边界框 TP、FP 和 FN 取决于以下两个因素
- 预测标签与真实标签的比较
- 两个框之间的 IoU
对于多类分类问题,模型输出边界框属于某个类的条件概率。某个类的概率越大,边界框包含该类的可能性就越大。概率分布以及用户定义的阈值(介于 0 到 1 之间)用于对边界框进行分类。
这个概率置信度阈值越小,模型检测的次数就越多,错过真实标签的几率就越低,因此召回率就越高(通常如此,但并非总是如此)。另一方面,置信度阈值越高,模型对其预测的结果就越有信心,因此准确率就越高(通常如此,但并非总是如此)。我们希望准确率和召回率都尽可能高,因此,根据置信度阈值的值,在准确率和召回率之间存在权衡。
精确度-召回率曲线绘制了不同置信度阈值的精确度与召回率的值。
不同颜色的线代表不同类别的PR曲线,蓝色的粗线条表示所有类别平均的PR曲线
通过精确度-召回率曲线,我们可以直观地看到哪个置信度阈值最适合我们(对于我们给定的应用程序)。下面是 PR 曲线的一个过于简化的示例
P-R曲线与坐标轴围成的面积,可作为衡量一个模型预测结果的参考。若一个模型的P-R曲线完全将另一模型的P-R曲线包裹,那么这个模型预测结果一定优于另一模型。
在 PR 曲线中,y 轴表示精确度,x 轴表示召回率。曲线上的每个点代表不同的阈值。随着阈值的变化,精确度和召回率之间的平衡也会发生变化:
- 高精度和低召回率:这表明该模型在正面预测方面非常准确,但未能捕捉到大量实际正面案例。
- 低准确率和高召回率:这表明该模型捕获了大多数阳性情况,但是却以更多的假阳性错误为代价。
理想的情况是曲线尽可能接近右上角,同时表示高精度和高召回率。
精确度-召回率曲线适用于不平衡的数据集。精确度和召回率都集中在正类(少数类)上,与真负类(多数类)无关。当数据集中每个类中的观察值不平衡时,PR 曲线是确定我们模型性能的良好指标。
精确度 x 召回率曲线是评估物体检测器性能的好方法,因为置信度会通过为每个物体类别绘制曲线来改变。如果某个特定类别的物体检测器的精确度在召回率增加时保持较高水平,则该检测器被认为是好的,这意味着如果您改变置信度阈值,精确度和召回率仍然会很高。识别良好物体检测器的另一种方法是寻找一个只能识别相关物体(0 误报 = 高精度)的检测器,找到所有地面真实物体(0 误报 = 高召回率)。
较差的物体检测器需要增加检测到的物体数量(增加误报 = 降低精度)才能检索所有地面真实物体(高召回率)。这就是为什么精度 x 召回率曲线通常以高精度值开始,随着召回率的增加而降低。您可以在下一个主题(平均精度)中看到精度 x 召回率曲线的示例。这种曲线由 PASCAL VOC 2012 挑战赛使用,并且在我们的实现中可用。这就是为什么准确率 x 召回率曲线通常从高精度值开始,并随着召回率的增加而降低。
F1-score
F-1 分数是准确率和召回率的加权平均值,其中权重相等。它用于平衡准确率和召回率之间的权衡。
如果有不同的几个模型,他们有着不同的Precision与Recall,那么我们应该如何挑最优的模型?
最直接的办法就是取Precision与Recall的平均值,但取平均值并不可取。因为有时二者有一个极高,一个极低时,这样平均值是高的,但实际的效果并不会好。这时就要用F1-score来权衡Precision与Recall的平均值。
根据F1-score的定义式可知,F1-score也是取平均值,只不过强调的是二者之间的较小值。通过F1-score的方式来权衡Precision与Recall,可以有效的避免短板效应,这在数学上被称为调和平均数。
F 1 score = 1 1 2 ( 1 Precision + 1 Recall ) F_{1 \, \text{score}} = \frac{1}{\frac{1}{2} \left( \frac{1}{\text{Precision}} + \frac{1}{\text{Recall}} \right)} F1score=21(Precision1+Recall1)1
例如,如果一个模型的准确率高但召回率低,这意味着它产生的假阳性较少,但会漏掉很多真阳性。相反,一个具有高召回率但准确率低的模型会产生更多的假阳性,但会捕获更多的真阳性。在这种情况下,F-1 分数可以帮助我们确定哪个模型更好。
高 Precision,低 Recall:当模型的 Precision 很高但 Recall 很低时,意味着它很少产生误报(假阳性少),但是它的识别范围有限,漏掉了很多正样本(假阴性多)。这种情况在一些要求极高的准确性的场景中可能适用,比如在疾病诊断中不希望轻易误诊健康人,但也有可能导致漏诊。
高 Recall,低 Precision:当模型的 Recall 很高但 Precision 很低时,意味着它识别了大部分正样本(假阴性少),但是产生了很多误报(假阳性多)。这种情况适用于需要全面覆盖正样本的场景,比如安全监控中宁可多误报,也不希望漏掉潜在的威胁。
TPR、TNR、FPR、FNR
=> TPR(真阳性率)或召回率是真阳性与真阳性和假阴性之和的比率。它衡量模型正确识别的实际阳性病例的比例。高 TPR 意味着该模型擅长识别阳性病例。
T
P
R
=
T
P
(
T
P
+
F
N
)
TPR = \frac{TP}{(TP + FN)}
TPR=(TP+FN)TP
=> TNR(真阴性率)或特异性是真阴性与真阴性和假阳性之和的比率。它衡量模型正确识别的实际阴性病例的比例。高 TNR 意味着该模型擅长识别阴性病例。
=> FPR(假阳性率)是假阳性与假阳性和真阴性之和的比率。它衡量模型错误地将实际阴性情况归类为阳性的比例。高 FPR 意味着该模型犯了很多假阳性错误。
F
P
R
=
F
P
(
F
P
+
T
N
)
FPR = \frac{FP}{(FP + TN)}
FPR=(FP+TN)FP
=> FNR(假阴性率)是假阴性与假阴性和真阳性之和的比率。它衡量模型错误地将实际阳性病例归类为阴性的比例。高 FNR 意味着该模型犯了很多假阴性错误。
ROC曲线下面积(AUC-ROC)
ROC 曲线建立在从混淆矩阵得出的两个指标之上:真实阳性率 ( TPR ) 和假阳性率 ( FPR )。TPR与召回率相同。它是正确预测的正样本除以数据集中所有实际可用的正样本的比率。 TPR 关注实际的正类
反过来,FPR 是假阳性预测与实际阴性样本总数的比率
AUC - ROC 曲线是针对不同阈值设置下的分类问题的性能测量。ROC 是概率曲线,AUC 表示可分离性的程度或度量。它表示模型区分类别的能力。AUC 越高,模型将 0 类预测为 0 和将 1 类预测为 1 的能力就越强。类似地,AUC 越高,模型区分患病患者和无患病患者的能力就越强。
ROC 曲线以 TPR 与 FPR 的关系绘制,其中 TPR 在 y 轴上,FPR 在 x 轴上。
TPR(真实阳性率)/召回率/敏感度
TPR / Recall / Sensitivity = TP TP + FN \text{TPR / Recall / Sensitivity} = \frac{\text{TP}}{\text{TP} + \text{FN}} TPR / Recall / Sensitivity=TP+FNTP
Specificity
Specificity = TN TN + FP \text{Specificity} = \frac{\text{TN}}{\text{TN} + \text{FP}} Specificity=TN+FPTN
FPR
FPR = 1 − Specificity = FP TN + FP \text{FPR} = 1 - \text{Specificity} \\ = \frac{\text{FP}}{\text{TN} + \text{FP}} FPR=1−Specificity=TN+FPFP
如何推测模型的表现?
优秀模型的 AUC 接近 1,这意味着它具有良好的可分离性度量。较差模型的 AUC 接近 0,这意味着它具有最差的可分离性度量。事实上,这意味着它正在倒推结果。它将 0 预测为 1,将 1 预测为 0。当 AUC 为 0.5 时,这意味着该模型根本没有类别分离能力。
让我们来解读一下上述说法。
我们知道,ROC 是一条概率曲线。因此,让我们绘制这些概率的分布:
注:红色分布曲线为阳性类(有病患者),绿色分布曲线为阴性类(无病患者)。
这是理想情况。当两条曲线完全不重叠时,意味着模型具有理想的可分离性度量。它能够完美区分正类和负类。
当两个分布重叠时,我们会引入 1 类和 2 类错误。根据阈值,我们可以最小化或最大化它们。当 AUC 为 0.7 时,意味着模型有 70% 的机会能够区分正类和负类。
这是最糟糕的情况,当AUC约为0.5时,模型已经没有区分正类和负类的判别能力。
当 AUC 接近 0 时,模型实际上正在对类别进行交换。这意味着模型将负类预测为正类,反之亦然。
ROC (Receiver Operating Characteristic) Curve
ROC(接收者操作特性)曲线告诉我们模型区分两件事的能力有多好(例如 ,患者是否有疾病)。更好的模型可以准确地区分两者。而较差的模型将很难区分两者。
假设我们有一个模型可以预测患者是否患有某种疾病。该模型预测每个患者的概率(在 Python 中我们使用“ predict_proba ”函数)。使用这些概率,我们绘制分布,如下所示:
这里,红色分布代表所有没有患病的患者,绿色分布代表所有患有该疾病的患者。
现在我们要选择一个值,我们需要设置截止值,即阈值,高于该值我们将预测每个人都为阳性(他们患有疾病),低于该值我们将预测为阴性(他们没有疾病)。我们将阈值设置为“ 0.5 ”,如下所示:
所有高于阈值的正值都将是“真阳性”,而高于阈值的负值将成为“假阳性”,因为它们被错误地预测为阳性。
所有低于阈值的负值都将是“真负值”,而低于阈值的正值将是“假负值”,因为它们被错误地预测为负值。
敏感性和特异性之间的权衡
当我们降低阈值时,我们会得到更多的正值,从而增加敏感度。同时,这会降低特异性。
同样,当我们增加阈值时,我们会得到更多的负值,从而增加特异性并降低敏感性。
敏感性⬇️特异性⬆️
特异性⬇️敏感性⬆️
但是,这不是我们绘制 ROC 曲线的方式。要绘制 ROC 曲线,我们使用 (1 - 特异性) 而不是特异性,图形将如下所示:
ROC Curve
因此,现在,当敏感度增加时,(1 - 特异性)也会增加。这条曲线称为 ROC 曲线。
AUC(Area Under the Curve曲线下面积)
AUC 是 ROC 曲线下的面积。这个分数可以让我们很好地了解模型的表现。
如我们所见,第一个模型在区分正值和负值方面做得相当好。因此,由于 ROC 曲线下的面积很大,AUC 分数为 0.9。
然而,如果我们看到最后一个模型,预测完全重叠,我们得到的 AUC 分数为 0.5。这意味着该模型表现不佳,其预测几乎是随机的。
有了预测框的预测指标与分类预测的指标,接下来将二者结合即为评价目标检测模型的指标。
AP(average precision 平均精度)
对象检测和定位算法的性能通过称为平均精度(AP)的指标来评估。
为您的应用程序选择置信度值可能很困难且主观。平均精度是一个关键性能指标,它试图消除选择一个置信度阈值的依赖性,其定义为
平均精度是 PR 曲线下的面积。
AP 将 PR 曲线总结为一个标量值。在一系列置信度阈值范围内,当准确率和召回率都较高时,平均精度较高;当准确率和召回率其中之一较低时,平均精度较低。AP 的范围在 0 到 1 之间。
方法 1 — 用矩形近似 PR 曲线
- 对于每个精确度-召回率对 (j=0, …, n-1), 可以通过使用矩形近似曲线来找到 PR 曲线下的面积。
- 此类矩形的宽度可以通过取两个连续召回率值 (r(k), r(k-1)) 的差值来找到,高度可以通过取所选召回率值的精度的最大值来找到,即 w = r(k)-r(k-1) ,max(p(k), p(k-1))
- AP 可以通过这些矩形面积的总和来计算,如下所示
方法 2——插值和 11 点平均值
- 计算从 0.0 到 1.0 的 11 个召回率值的精度值,增量为 0.1
- 这 11 个点可以在右图中看作橙色样本
- 可以通过取这 11 个精度值的平均值来计算 AP,如下所示
AP(average precision 平均精度):虽然名为平均精度,但AP的计算方法并不是计算Precision的平均值,而是计算每个类别的PR曲线与坐标轴围成的面积,可以用积分的方法进行计算。如果一个模型的AP越大,也就是说PR曲线与坐标轴围成的面积越大,Precision与Recall在整体上也相对较高。
AP 是借助其他几个指标来计算的,例如 IoU、混淆矩阵(TP、FP、FN)、精度和召回率等,如下图所示
mAP(mean of Average Precision)
mAP(mean of Average Precision) : 对所有类别的AP值求平均值。AP可以反映每个类别预测的准确率,mAP就是对所有类的AP求平均值,用于反映整个模型的准确率。mAP越大,PR曲线与坐标轴围城的面积越大。平时我们说的,某一目标检测算法的准确率达到了多少,这个准确率就泛指mAP。
mAP@0.5
在YOLO模型中,你会见到mAP@0.5这样的表现形式,这种形式表示在IOU阈值为0.5的情况下,mAP的值为多少。当预测框与标注框的IOU大于0.5时,就认为这个对象预测正确,在这个前提下再去计算mAP。一般来说,mAP@0.5即为评价YOLO模型的指标之一。
mAP@[0.5:0.95]
YOLO模型中还存在mAP@[0.5:0.95]这样一种表现形式,这形式是多个IOU阈值下的mAP,会在区间[0.5,0.95]内,以0.05为步长,取10个IOU阈值,分别计算这10个IOU阈值下的mAP,再取平均值。mAP@[0.5:0.95]越大,表示预测框越精准,因为它去取到了更多IOU阈值大的情况。
之后我会持续更新,如果喜欢我的文章,请记得一键三连哦,点赞关注收藏,你的每一个赞每一份关注每一次收藏都将是我前进路上的无限动力 !!!↖(▔▽▔)↗感谢支持!