当前位置:   article > 正文

万字长文精解目标检测中的TP、FP、FN、TN、Precision、Recall 、 F1 Score、AP、mAP与AR 。附代码实现。_计算yolov5tp, fp, fn, recall和precision

计算yolov5tp, fp, fn, recall和precision

YOLO目标检测创新改进与实战案例专栏

专栏目录: YOLO有效改进系列及项目实战目录 包含卷积,主干 注意力,检测头等创新机制 以及 各种目标检测分割项目实战案例

专栏链接: YOLO基础解析+创新改进+实战案例

1 .前言

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

2. “优秀”的目标检测器?

2.1. 两个标准

当我们评价一个目标检测器的质量时,主要考虑两个标准:

  1. 模型是否预测了物体的正确类别。
  2. 预测的边界框是否与真实值非常接近。

2.2. 六个指标

当我们评价一个目标检测器的质量时,通常会使用多种指标来全面评估其性能。以下是常用的评价指标:

  1. Precision(精确度):
    • 精确度表示检测出的对象中,实际为正样本的比例。
    • 公式: Precision = True Positives True Positives + False Positives \text{Precision} = \frac{\text{True Positives}}{\text{True Positives} + \text{False Positives}} Precision=True Positives+False PositivesTrue Positives
  2. Recall(召回率):
    • 召回率表示所有实际存在的正样本中,被正确检测出来的比例。
    • 公式: Recall = True Positives True Positives + False Negatives \text{Recall} = \frac{\text{True Positives}}{\text{True Positives} + \text{False Negatives}} Recall=True Positives+False NegativesTrue Positives
  3. F1-Score:
    • F1分数是精确度和召回率的调和平均值,用来综合衡量模型的性能。
    • 公式: F1-Score = 2 × Precision × Recall Precision + Recall \text{F1-Score} = 2 \times \frac{\text{Precision} \times \text{Recall}}{\text{Precision} + \text{Recall}} F1-Score=2×Precision+RecallPrecision×Recall
  4. IoU(Intersection over Union):
    • IoU 衡量的是预测边界框和真实边界框之间的重叠程度。
    • 公式: IoU = Area of Overlap Area of Union \text{IoU} = \frac{\text{Area of Overlap}}{\text{Area of Union}} IoU=Area of UnionArea of Overlap
    • 通常在计算 True Positives 时会设定一个 IoU 阈值(如 0.5 或 0.75),当预测框与真实框的 IoU 大于等于阈值时,视为正确检测。
  5. AP(Average Precision):
    • 平均精确度是精确度-召回率曲线下的面积,用来评价单个类别的检测性能。通常在多个不同的 IoU 阈值下计算 AP。
  6. mAP(Mean Average Precision):
    • 平均精确度均值是对所有类别的 AP 取平均值,综合反映整个模型的检测性能。

2.3 评价步骤

在具体的评估过程中,我们通常会按照以下步骤进行:

  1. 生成检测结果:

    • 对测试数据集进行检测,生成预测边界框及其对应的置信度分数和类别标签。
  2. 匹配真实框和预测框:

    • 依据 IoU 阈值,将预测框与真实框进行匹配,确定 True Positives、False Positives 和 False Negatives。
  3. 绘制精确度-召回率曲线:

    • 计算不同置信度阈值下的精确度和召回率,并绘制精确度-召回率曲线。
  4. 计算 AP 和 mAP:

    • 通过插值方法计算每个类别的 AP,再取所有类别的平均值得到 mAP。

通过这些评价指标,我们可以全面了解目标检测器在不同方面的性能,从而指导模型的优化和改进。

2.4 补充:置信度

置信度(Confidence)是机器学习和统计学中的一个概念,用于表示模型对其预测结果的确定程度。在分类问题中,置信度通常表示模型认为某个实例属于某个类别的概率。置信度越高,表示模型对其预测结果越有信心。

例子

假设我们使用一个分类模型来预测图片中的物体类型,模型的输出结果包含每个类别的置信度分数。例如,一张包含水果的图片,模型预测如下:

  • 苹果:置信度 0.8
  • 香蕉:置信度 0.15
  • 橙子:置信度 0.05

在这个例子中,模型认为图片中的物体是苹果的置信度最高(0.8),因此模型预测该物体是苹果。

使用置信度的场景

  1. 阈值设置:可以设定一个置信度阈值,仅当置信度超过该阈值时才接受模型的预测。例如,如果置信度低于 0.6,模型可能会输出“不确定”或请求人工验证。
  2. 排序和选择:在信息检索或推荐系统中,可以根据置信度对结果进行排序,优先展示置信度高的结果。
  3. 模型评估:在评估模型性能时,可以分析不同置信度下的精确率、召回率和 F1 Score,以确定模型在不同置信度水平下的表现。

置信度与置信区间

置信度与置信区间不同。置信区间在统计学中用于估计参数的范围,并附有一个置信水平(例如95%),表示估计的可靠性。而置信度是一个单一的概率值,表示模型对某个具体预测的信心。

总结

置信度在机器学习中是一个重要指标,用于衡量模型对其预测结果的确定程度。理解和正确使用置信度可以帮助提高模型的实际应用效果和决策准确性。

2.5 示例

先看看下面的猫咪检测结果。 凭感觉1和2都挺准确的,但是到底哪个更准确呢?这个决策好像很难,这是因为这确实是一个复杂的问题,而且还会变得更加繁琐。我们通常对检测器处理不同尺寸物体的能力感兴趣。有些检测器在识别小型物体时可能表现不佳,但对大型物体的识别则较为出色。而另一些检测器虽然整体表现一般,但在小物体的识别上可能更为精准。那么,一个模型同时检测多个物体的能力如何?正如你所见,这并不是一个简单的问题。COCO评估指标就是为了全面评估这些性能而设计的。

在目标检测任务中,图像中的绿框和红框分别代表以下含义:

  1. Ground Truth(绿框):
    • 定义:绿框表示图像中真实存在的目标的边界框。这些框通常是由人工标注或通过其他准确的标注方法获得的,是对图像中物体位置和类别的准确描述。
    • 用途:绿框用于评估检测模型的性能。通过与预测框进行比较,可以判断模型的检测准确性。
  2. Prediction(红框):
    • 定义:红框表示目标检测模型预测出的物体边界框。这些框由模型根据输入图像生成,并附带一个置信度分数,表示模型对该预测的信心程度。
    • 用途:红框用于与真实框(绿框)进行比较,从而评估模型的性能指标如平均精确度(AP)和平均召回率(AR)。

image-20240515155119631

3. COCO评价指标

下面这些名词你可以先不用理解,等看完文章后在回过头来看看。

COCO评估指标是用于评估目标检测算法性能的一套标准,广泛应用于计算机视觉领域。COCO(Common Objects in Context)是一个著名的数据集和挑战赛,包含大量不同场景中的物体。COCO评估指标设计精细,能够全面评估目标检测模型的各方面性能。

  1. 多样性:

    • COCO 数据集包含了多种类、多尺度、多样化的场景和物体,覆盖了自然场景中广泛存在的物体类型和环境,能够更好地反映目标检测器在实际应用中的表现。
  2. 全面性:

    • COCO 评价指标不仅考虑了平均精确度(AP),还包括了不同 IoU 阈值(如 AP50 和 AP75)下的精确度,以及对不同大小物体(小物体、中等物体、大物体)的检测性能,提供了全面的评估维度。
    • 除了精确度,COCO 还提供了召回率(AR)的评估,使得对模型的检测能力有更全面的了解。
  3. 严格性:

    • 主指标 AP@[IoU=0.50:0.95] 要求在多个 IoU 阈值下计算平均精确度,从而避免了仅关注单一阈值可能带来的偏差,更加严格地评估了模型的精度和稳定性。
    • 这种严格的评估方法能够有效防止模型在某些特定条件下表现优异,但在其他条件下表现不佳的情况。
  4. 标准化:

    • COCO 数据集和其评价指标已成为目标检测领域的标准,广泛应用于学术研究和工业界。使用 COCO 评价指标可以方便地与其他模型进行对比,促进了公平和标准化的比较。
  5. 考虑实际应用需求:

    • 在实际应用中,目标检测器需要处理不同大小、不同置信度和不同复杂度的物体,COCO 的多维度评价指标能够更好地模拟和衡量这种复杂性。
    • 例如,小物体(AP_S)、中等物体(AP_M)和大物体(AP_L)的评估,可以帮助开发者发现模型在不同尺寸物体检测上的优缺点,从而进行有针对性的改进。

4. IoU:交并比

4.1 概念

要深入了解mAP(平均精度均值),首先需从IoU(intersection over Union )开始。

IoU(交并比) 是用于衡量两个边界框匹配程度的一个指标,通常用来评估预测边界框相对于真实边界框的准确性。

按照定义,IoU是预测框 P 和真实框 G两个边界框的交集与它们的并集之比:

image-20240515155523381

如下图所示,你可以这样理解交集与并集:中间图表示的是并集,右边图标识交集

  1. 交集面积(Intersection Area)PG 重叠的区域。
  2. 并集面积(Union Area)PG 的总面积,去除重叠部分的重复计算。

image-20240515155548395

我们来分析一下这个公式。以下几点值得注意:

  • 并集的大小永远大于或等于交集。
  • 如果两个边界框没有重合部分,交集为零,从而IoU为0。
  • 如果两个边界框完全重合,交集与并集相等,从而IoU为1。
  • IoU的值总在0到1之间,包括0和1。
  • 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}")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

现在我们有了一个衡量指标,可以描述一个预测的边界框与实际边界框相比的优劣。在目标检测任务中,选择合适的 IoU 阈值是评估预测边界框是否有效的关键。

4.2 IoU阈值

让我们继续看看下面猫咪检测的例子。很明显,最右边的预测结果偏差较大,而左边的则是可以接受的。我们的大脑是如何这么快地做出这种判断的呢?那中间的预测结果呢?在比较模型性能时,我们不能仅依赖于主观判断。

image-20240515160303918

通常你会看到这个阈值定义为IoU@0.5,这意味着:“只有那些与真实边界框的交并比大于或等于0.5(即50%)的边界框被认为是正确的。”

常见的 IoU 阈值

  1. IoU @ 0.5

    • 常用阈值:在许多目标检测任务中,IoU ≥ 0.5 被视为一个预测边界框与真实边界框的合理重叠。
    • 解释:如果预测边界框与真实边界框的 IoU 大于等于 0.5,则认为该预测是有效的;否则认为是无效的或错误的预测。
  2. IoU@0.75

    • 高精度阈值:在一些要求较高精度的应用中,IoU ≥ 0.75 更为严格,用于过滤掉低质量的预测结果。
    • 解释:要求预测边界框与真实边界框高度重叠,以保证检测结果的准确性。
  3. IoU@0.9 及以上:

    • 非常高精度阈值:在一些特定的高精度应用(如医疗图像分析)中,可能需要 IoU ≥ 0.9
  4. 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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

5. 目标检测中的TP、FP、FN、TN

  • True Positives,TP:预测为正样本,实际也为正样本的特征数

  • False Positives,FP:预测为正样本,实际为负样本的特征数

  • True Negatives,TN:预测为负样本,实际也为负样本的特征数

  • False Negatives,FN:预测为负样本,实际为正样本的特征数

在机器学习中,分类问题可以根据类别的数量分为二元分类和多类分类:

  1. 二元分类(Binary Classification)

    • 这是最简单的分类类型,其中只有两个类别,通常被标记为正类(positive class)和负类(negative class)。
    • 任务是预测给定输入数据点属于这两个类别中的哪一个。
    • 例如,一个二元分类器可以用来判断电子邮件是否为垃圾邮件,或者一个患者是否患有特定疾病。
  2. 多类分类(Multi-class Classifiers)

    • 在多类分类中,有三个或更多的类别,任务是将输入数据点分类到这些类别中的一个。
    • 多类分类器不仅要识别数据点属于正类还是负类,还要确定它属于哪一个具体的类别。
    • 例如,一个多类分类器可以用来识别图像中的物体,如猫、狗、车辆等。

在实际应用中,二元分类可以看作是多类分类的一个特例。在二元分类中,每个数据点的类别是相互排斥的,即要么是A要么是B。在多类分类中,每个数据点同样只能被分类到一个类别,但可选的类别数量大于两个。在一些更复杂的情形中,还有多标签分类(Multi-label Classification),其中一个数据点可以同时属于多个类别。

5.1 二元分类中的TP、FP、FN、TN

我们接下来将探讨的概念包括TP(真阳性)、FP(假阳性)、TN(真阴性)和FN(假阴性),这些术语均来源于二元分类任务。

假定我们现在有一个苹果分类器,他是二元分类任务,我们的目标是正确的找到苹果,

定义

  1. True Positive (TP):把苹果认成了苹果。
  2. False Positive (FP): 把香蕉认成了苹果;
  3. False Negative (FN): 把苹果认成了香蕉。
  4. True Negative (TN):把香蕉认成了香蕉。也就是没有把香蕉是识别为苹果。

image-20240515160604076

5.2 多类分类中的TP、FP、FN、TN

上述概念在多类分类器中并不完全适用。二元分类器的问题是“此对象是否属于该类别?”,而多类分类器的问题是“此对象属于哪些类别之一?”。幸运的是,我们可以通过采用“一对所有(One-vs-All )”或“一对余(One-vs-Rest )”方法进行推广。这个思路很简单:我们单独评估每个类别,并将其视作一个二元分类器。然后,以下情况成立:

  • 正例:正确预测该对象为讨论中的类别
  • 反例:预测该对象为其他任何类别

在多类模型中,通常不常用TN(真阴性)这一术语,但其可以理解为“那些被正确识别为其他类别的样本”。

以下是从苹果类的视角出发的示例。也就是我们需要找出苹果是正例。

定义

  1. True Positive (TP):把苹果认成了苹果。
  2. False Positive (FP): 把香蕉认成了苹果(我们需要找的苹果是正例。但香蕉是不对的。所有叫假阳或假正);
  3. False Negative (FN): 把苹果认成了香蕉。
  4. True Negative (TN):把苹果认成了芒果。

image-20240515160631796

现在让我们从香蕉的角度来做一个相似的练习,也就是香蕉是正例。

定义

  1. True Positive (TP):把香蕉认成了香蕉。

  2. False Negative (FN): 把香蕉认成了苹果。

  3. False Positive (FP): 把苹果认成了香蕉(我们需要找的苹果是正例。但香蕉是不对的。所有叫假阳或假正);

image-20240515160645667

你是否注意到了什么?

在苹果类的视角中,(

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/644523
推荐阅读
相关标签