赞
踩
目录: YOLO有效改进系列及项目实战目录 包含卷积,主干 注意力,检测头等创新机制 以及 各种目标检测分割项目实战案例
mAP(Mean Average Precision)是用于评估对象检测和信息检索系统性能的重要指标。它综合考虑了检测结果的精确度(Precision)和召回率(Recall),提供了一个整体的性能评价。
你是否见过下面的表格?这是COCO版本的mAP(即平均精度,他们简称之为AP)。但这个指标到底代表什么呢?这些符号又都代表什么含义呢?在本文中,我们将详细讲解所有必要的理论知识,不仅帮助你解读表格中的数据,还能让你理解采用这种复杂指标的必要性。
Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.309
Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.519
Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.327
Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.173
Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.462
Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.547
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.297
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.456
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.511
Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.376
Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.686
Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.686
当我们评价一个目标检测器的质量时,主要考虑两个标准:
当我们评价一个目标检测器的质量时,通常会使用多种指标来全面评估其性能。以下是常用的评价指标:
在具体的评估过程中,我们通常会按照以下步骤进行:
生成检测结果:
匹配真实框和预测框:
绘制精确度-召回率曲线:
计算 AP 和 mAP:
通过这些评价指标,我们可以全面了解目标检测器在不同方面的性能,从而指导模型的优化和改进。
置信度(Confidence)是机器学习和统计学中的一个概念,用于表示模型对其预测结果的确定程度。在分类问题中,置信度通常表示模型认为某个实例属于某个类别的概率。置信度越高,表示模型对其预测结果越有信心。
例子
假设我们使用一个分类模型来预测图片中的物体类型,模型的输出结果包含每个类别的置信度分数。例如,一张包含水果的图片,模型预测如下:
- 苹果:置信度 0.8
- 香蕉:置信度 0.15
- 橙子:置信度 0.05
在这个例子中,模型认为图片中的物体是苹果的置信度最高(0.8),因此模型预测该物体是苹果。
使用置信度的场景
- 阈值设置:可以设定一个置信度阈值,仅当置信度超过该阈值时才接受模型的预测。例如,如果置信度低于 0.6,模型可能会输出“不确定”或请求人工验证。
- 排序和选择:在信息检索或推荐系统中,可以根据置信度对结果进行排序,优先展示置信度高的结果。
- 模型评估:在评估模型性能时,可以分析不同置信度下的精确率、召回率和 F1 Score,以确定模型在不同置信度水平下的表现。
置信度与置信区间
置信度与置信区间不同。置信区间在统计学中用于估计参数的范围,并附有一个置信水平(例如95%),表示估计的可靠性。而置信度是一个单一的概率值,表示模型对某个具体预测的信心。
总结
置信度在机器学习中是一个重要指标,用于衡量模型对其预测结果的确定程度。理解和正确使用置信度可以帮助提高模型的实际应用效果和决策准确性。
先看看下面的猫咪检测结果。 凭感觉1和2都挺准确的,但是到底哪个更准确呢?这个决策好像很难,这是因为这确实是一个复杂的问题,而且还会变得更加繁琐。我们通常对检测器处理不同尺寸物体的能力感兴趣。有些检测器在识别小型物体时可能表现不佳,但对大型物体的识别则较为出色。而另一些检测器虽然整体表现一般,但在小物体的识别上可能更为精准。那么,一个模型同时检测多个物体的能力如何?正如你所见,这并不是一个简单的问题。COCO评估指标就是为了全面评估这些性能而设计的。
在目标检测任务中,图像中的绿框和红框分别代表以下含义:
- Ground Truth(绿框):
- 定义:绿框表示图像中真实存在的目标的边界框。这些框通常是由人工标注或通过其他准确的标注方法获得的,是对图像中物体位置和类别的准确描述。
- 用途:绿框用于评估检测模型的性能。通过与预测框进行比较,可以判断模型的检测准确性。
- Prediction(红框):
- 定义:红框表示目标检测模型预测出的物体边界框。这些框由模型根据输入图像生成,并附带一个置信度分数,表示模型对该预测的信心程度。
- 用途:红框用于与真实框(绿框)进行比较,从而评估模型的性能指标如平均精确度(AP)和平均召回率(AR)。
下面这些名词你可以先不用理解,等看完文章后在回过头来看看。
COCO评估指标是用于评估目标检测算法性能的一套标准,广泛应用于计算机视觉领域。COCO(Common Objects in Context)是一个著名的数据集和挑战赛,包含大量不同场景中的物体。COCO评估指标设计精细,能够全面评估目标检测模型的各方面性能。
多样性:
全面性:
严格性:
标准化:
考虑实际应用需求:
要深入了解mAP(平均精度均值),首先需从IoU(intersection over Union )开始。
IoU(交并比) 是用于衡量两个边界框匹配程度的一个指标,通常用来评估预测边界框相对于真实边界框的准确性。
按照定义,IoU是预测框 P 和真实框 G两个边界框的交集与它们的并集之比:
如下图所示,你可以这样理解交集与并集:中间图表示的是并集,右边图标识交集
我们来分析一下这个公式。以下几点值得注意:
你可能有时会听到IoU被用一个更专业的名字来称呼:Jaccard指数或Jaccard相似度。
在目标检测领域中,这两者是相同的概念。Jaccard指数是一个更为广泛的数学形式,用于衡量两个有限集合之间的相似性。
在Python中,可以这样计算IoU:
def calculate_iou(box1, box2): # box1 and box2 are (x1, y1, x2, y2) format x1 = max(box1[0], box2[0]) y1 = max(box1[1], box2[1]) x2 = min(box1[2], box2[2]) y2 = min(box1[3], box2[3]) # Calculate the area of intersection rectangle intersection_area = max(0, x2 - x1 + 1) * max(0, y2 - y1 + 1) # Calculate the area of both the prediction and ground-truth rectangles box1_area = (box1[2] - box1[0] + 1) * (box1[3] - box1[1] + 1) box2_area = (box2[2] - box2[0] + 1) * (box2[3] - box2[1] + 1) # Calculate the union area union_area = box1_area + box2_area - intersection_area # Calculate the IoU iou = intersection_area / union_area return iou # 示例边界框 (x1, y1, x2, y2) box1 = [50, 50, 150, 150] box2 = [100, 100, 200, 200] iou = calculate_iou(box1, box2) print(f"IoU: {iou}")
现在我们有了一个衡量指标,可以描述一个预测的边界框与实际边界框相比的优劣。在目标检测任务中,选择合适的 IoU 阈值是评估预测边界框是否有效的关键。
让我们继续看看下面猫咪检测的例子。很明显,最右边的预测结果偏差较大,而左边的则是可以接受的。我们的大脑是如何这么快地做出这种判断的呢?那中间的预测结果呢?在比较模型性能时,我们不能仅依赖于主观判断。
通常你会看到这个阈值定义为IoU@0.5,这意味着:“只有那些与真实边界框的交并比大于或等于0.5(即50%)的边界框被认为是正确的。”
常见的 IoU 阈值
IoU @ 0.5:
IoU@0.75:
IoU@0.9 及以上:
IoU@[0.5:0.05:0.95]
前三种现在应该很清楚了。最后一种虽然看起来有些复杂,其实很好理解。它指的是多个阈值,意味着:“所有从0.5到0.9的IoU阈值,每隔0.05变化一次。” 如果展开这个表达式,
你会看到它包括了10个不同的IoU阈值:IoU@[0.5:0.05:0.95] = IoU@0.5, IoU@0.55, IoU@0.60, …, IoU@0.85, IoU@0.90, IoU@0.95
有时候作者可能会简化这种表达,仅写成IoU@[0.5:0.95]。
在评估目标检测器的性能时,如果作者没有明确指定IoU阈值,通常默认采用的是IoU=0.5。你可能会觉得将0.5作为默认阈值似乎太低了。但实际上,这正反映了目标检测问题的复杂性和挑战性!
以下是一个过滤低质量预测结果的示例代码:
def filter_predictions_by_iou(predictions, ground_truths, iou_threshold=0.5): """ 过滤掉 IoU 低于指定阈值的预测结果。 参数: - predictions: 预测边界框列表,每个元素为 (x1, y1, x2, y2) 格式。 - ground_truths: 真实边界框列表,每个元素为 (x1, y1, x2, y2) 格式。 - iou_threshold: IoU 阈值,低于该值的预测结果将被过滤掉。 返回: - 高质量预测边界框列表。 """ def calculate_iou(box1, box2): x1 = max(box1[0], box2[0]) y1 = max(box1[1], box2[1]) x2 = min(box1[2], box2[2]) y2 = min(box1[3], box2[3]) intersection_area = max(0, x2 - x1 + 1) * max(0, y2 - y1 + 1) box1_area = (box1[2] - box1[0] + 1) * (box1[3] - box1[1] + 1) box2_area = (box2[2] - box2[0] + 1) * (box2[3] - box2[1] + 1) union_area = box1_area + box2_area - intersection_area iou = intersection_area / union_area return iou high_quality_predictions = [] for pred in predictions: for gt in ground_truths: iou = calculate_iou(pred, gt) if iou >= iou_threshold: high_quality_predictions.append(pred) break # 只要有一个 IoU 满足条件,就保留该预测 return high_quality_predictions # 示例数据 predictions = [[50, 50, 150, 150], [100, 100, 200, 200], [200, 200, 300, 300]] ground_truths = [[55, 55, 145, 145], [105, 105, 195, 195]] # 过滤低于 IoU 阈值 0.5 的预测 filtered_predictions = filter_predictions_by_iou(predictions, ground_truths, iou_threshold=0.5) print(filtered_predictions)
True Positives,TP:预测为正样本,实际也为正样本的特征数
False Positives,FP:预测为正样本,实际为负样本的特征数
True Negatives,TN:预测为负样本,实际也为负样本的特征数
False Negatives,FN:预测为负样本,实际为正样本的特征数
在机器学习中,分类问题可以根据类别的数量分为二元分类和多类分类:
二元分类(Binary Classification):
- 这是最简单的分类类型,其中只有两个类别,通常被标记为正类(positive class)和负类(negative class)。
- 任务是预测给定输入数据点属于这两个类别中的哪一个。
- 例如,一个二元分类器可以用来判断电子邮件是否为垃圾邮件,或者一个患者是否患有特定疾病。
多类分类(Multi-class Classifiers):
- 在多类分类中,有三个或更多的类别,任务是将输入数据点分类到这些类别中的一个。
- 多类分类器不仅要识别数据点属于正类还是负类,还要确定它属于哪一个具体的类别。
- 例如,一个多类分类器可以用来识别图像中的物体,如猫、狗、车辆等。
在实际应用中,二元分类可以看作是多类分类的一个特例。在二元分类中,每个数据点的类别是相互排斥的,即要么是A要么是B。在多类分类中,每个数据点同样只能被分类到一个类别,但可选的类别数量大于两个。在一些更复杂的情形中,还有多标签分类(Multi-label Classification),其中一个数据点可以同时属于多个类别。
我们接下来将探讨的概念包括TP(真阳性)、FP(假阳性)、TN(真阴性)和FN(假阴性),这些术语均来源于二元分类任务。
假定我们现在有一个苹果分类器,他是二元分类任务,我们的目标是正确的找到苹果,
定义
上述概念在多类分类器中并不完全适用。二元分类器的问题是“此对象是否属于该类别?”,而多类分类器的问题是“此对象属于哪些类别之一?”。幸运的是,我们可以通过采用“一对所有(One-vs-All )”或“一对余(One-vs-Rest )”方法进行推广。这个思路很简单:我们单独评估每个类别,并将其视作一个二元分类器。然后,以下情况成立:
在多类模型中,通常不常用TN(真阴性)这一术语,但其可以理解为“那些被正确识别为其他类别的样本”。
以下是从苹果类的视角出发的示例。也就是我们需要找出苹果是正例。
定义
现在让我们从香蕉的角度来做一个相似的练习,也就是香蕉是正例。
定义
True Positive (TP):把香蕉认成了香蕉。
False Negative (FN): 把香蕉认成了苹果。
False Positive (FP): 把苹果认成了香蕉(我们需要找的苹果是正例。但香蕉是不对的。所有叫假阳或假正);
你是否注意到了什么?
在苹果类的视角中,(
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。