目标检测排行榜:解读指标及其潜在陷阱

发布日期:2023年9月18日
在 GitHub 上更新

欢迎来到我们最新一期的排行榜和模型评估深度探索。在上一篇文章中,我们探讨了大型语言模型的评估。今天,我们将航向一个不同但同样具有挑战性的领域——目标检测。

最近,我们发布了目标检测排行榜,根据某些指标对Hub中可用的目标检测模型进行排名。在这篇博客中,我们将展示模型的评估方式,并揭示目标检测中常用的指标,从交并比(IoU)到平均精度(AP)和平均召回率(AR)。更重要的是,我们将重点关注评估过程中可能出现的固有差异和陷阱,确保您不仅能够理解,还能批判性地评估模型性能。

每位开发者和研究人员都希望模型能够准确地检测和描绘目标。我们的目标检测排行榜是寻找最适合其应用需求的开源模型的理想场所。但是,在这种背景下,“准确”究竟意味着什么?应该相信哪些指标?它们是如何计算的?更重要的是,为什么有些模型在不同报告中会呈现出不同的结果?所有这些问题都将在本博客中得到解答。

那么,让我们一起开始这次探索,揭开目标检测排行榜的秘密!如果您想跳过介绍,直接了解目标检测指标的计算方法,请转到指标部分。如果您希望根据目标检测排行榜了解如何选择最佳模型,您可以查看目标检测排行榜部分。

目录

什么是目标检测?

在计算机视觉领域,目标检测是指在图像中识别和定位单个对象的任务。与图像分类不同(图像分类的任务是确定图像中主要的物体或场景),目标检测不仅对存在的物体类别进行分类,还提供空间信息,在每个检测到的物体周围绘制边界框。目标检测器还可以为每次检测输出一个“分数”(或“置信度”)。它表示模型认为检测到的物体属于每个边界框预测类别的概率。

例如,下图显示了五次检测:一个“球”,置信度为98%;四个人“,置信度分别为98%、95%、97%和97%。

intro_object_detection.png
图1:目标检测器输出示例。

目标检测模型用途广泛,在各个领域都有广泛的应用。一些用例包括自动驾驶汽车中的视觉、人脸检测、监控和安全、医学图像处理、增强现实、体育分析、智慧城市、手势识别等。

Hugging Face Hub上拥有数百个目标检测模型,这些模型在不同的数据集上进行了预训练,能够识别和定位各种目标类别。

零样本(zero-shot)是一种特殊的目标检测模型,它可以接收额外的文本查询来搜索文本中描述的目标对象。这些模型可以检测它们在训练期间从未见过的对象,而不受训练期间使用的类别集的限制。

检测器的多样性不仅限于它们可以识别的输出类别范围。它们在底层架构、模型大小、处理速度和预测精度方面都有所不同。

一个用于评估目标检测模型预测准确性的流行指标是**平均精度(Average Precision,AP)**及其变体,这将在本博客后面进行解释。

评估目标检测模型包括几个组成部分,如带有真实标注的数据集、检测结果(输出预测)和指标。这个过程如图2所示:

pipeline_object_detection.png
图2:传统目标检测模型评估过程示意图。

首先,选择一个包含带有真实边界框标注的图像的基准数据集,并将其输入到目标检测模型中。模型预测每个图像的边界框,为每个框分配相关的类别标签和置信度分数。在评估阶段,这些预测的边界框与数据集中的真实框进行比较。评估会产生一组指标,每个指标都在[0, 1]之间,反映特定的评估标准。在下一节中,我们将详细探讨这些指标的计算。

指标

本节将深入探讨平均精度和平均召回率的定义、它们的变体以及相关的计算方法。

什么是平均精度以及如何计算?

平均精度(AP)是一个汇总“精度-召回率”曲线的单一数值。在解释如何计算它之前,我们首先需要理解交并比(IoU)的概念,以及如何将一次检测分类为真阳性(True Positive)或假阳性(False Positive)。

IoU 是一个介于 0 和 1 之间的数值指标,用于衡量预测边界框与实际(真实)边界框之间的重叠程度。它的计算方法是,将两个框重叠区域的面积除以两个框组合覆盖的总面积。图 3 通过一个预测框及其对应的真实框的示例直观地展示了 IoU。

iou.png
图3:检测结果(绿色)和真实值(蓝色)之间的交并比(IoU)。

如果真实框和检测框共享相同的坐标,表示图像中的同一区域,则它们的 IoU 值为 1。相反,如果框在任何像素处都不重叠,则 IoU 被视为 0。

在对检测精度有高期望(例如自动驾驶汽车)的场景中,预测的边界框应与真实框紧密对齐。为此,首选接近1的IoU阈值( TIOU \text{T}_{\text{IOU}} )。另一方面,对于检测到的边界框相对于目标对象的精确位置不重要的应用,阈值可以放宽,将 TIOU \text{T}_{\text{IOU}} 设置得更接近0。

模型预测的每个框都被认为是“阳性”检测。交并比(IoU)标准根据我们定义的置信度阈值,将每个预测分类为真阳性(TP)或假阳性(FP)。

根据预定义的 TIOU \text{T}_{\text{IOU}} ,我们可以定义真阳性和真阴性

  • 真阳性(TP):一次正确检测,其中 IoU ≥ TIOU \text{T}_{\text{IOU}}
  • 假阳性(FP):一次不正确检测(漏检),其中 IoU < TIOU \text{T}_{\text{IOU}}

相反,负样本是根据真实边界框进行评估的,可以定义为假阴性(FN)或真阴性(TN)。

  • 假阴性(FN):指模型未能检测到的真实物体。
  • 真阴性(TN):表示正确的未检测。在目标检测领域,图像中无数的边界框不应该被识别,因为它们不代表目标对象。考虑图像中所有可能不代表目标对象的框——数量相当庞大,不是吗?:) 这就是为什么我们不考虑TN来计算目标检测指标。

现在我们已经能够识别我们的TP、FP和FN,我们可以定义精度和召回率了。

  • 精度(Precision)是模型仅识别相关对象的能力。它是正确阳性预测的百分比,由以下公式给出:

Precision=TP(TP+FP)=TPall detections \text{Precision} = \frac{TP}{(TP + FP)} = \frac{TP}{\text{all detections}}

它表示正确阳性预测在所有检测框中的比例。

  • 召回率(Recall)衡量模型找到所有相关案例(所有真实边界框)的能力。它表示在所有真实值中检测到的TP的比例,公式如下:

Recall=TP(TP+FN)=TPall ground truths \text{Recall} = \frac{TP}{(TP + FN)} = \frac{TP}{\text{all ground truths}}

请注意,TP、FP和FN取决于预定义的IoU阈值,精度和召回率也是如此。

平均精度衡量模型正确分类和定位对象的能力,同时考虑不同的精度和召回率值。为此,我们将通过绘制特定目标类别(例如“狗”)的“精度-召回率”曲线来阐释精度和召回率之间的关系。我们将采用一个中等IoU阈值=75%来划分我们的TP、FP和FN。随后,我们可以计算精度和召回率值。为此,我们需要改变我们检测的置信度分数。

图 4 展示了一个精度-召回率曲线的示例。要更深入地探讨此曲线的计算方法,Padilla 等人的论文《An Empirical Study of Object Detection Metrics with a Companion Open-Source Toolkit》和《A Survey on Performance Metrics for Object-Detection Algorithms》提供了更详细的玩具示例,演示了如何计算此曲线。

pxr_te_iou075.png
图4:目标对象“狗”的精度-召回率曲线,考虑IoU_thresh = 0.75下的TP检测。

精度-召回率曲线说明了精度和召回率之间基于检测器边界框不同置信度水平的平衡。每个绘图点都是使用不同的置信度值计算的。

为了演示如何计算平均精度图,我们将使用前面提到的一篇论文中的一个实际例子。考虑一个包含7张图像的数据集,其中有15个相同类别的真实对象,如图5所示。为简化起见,我们假设所有框都属于同一类别,“狗”。

dataset_example.png
图5:由目标检测器执行的24次检测(红色框)示例,该检测器经过训练以检测属于同一类别的15个真实对象(绿色框)。

我们的假设目标检测器在数据集中检索了24个对象,用红色框表示。为了计算精度和召回率,我们使用所有置信度水平下的精度和召回率方程来评估检测器在该基准数据集上针对该特定类别的表现。为此,我们需要建立一些规则:

  • 规则1:为简单起见,如果IoU≥30%,我们认为我们的检测结果为真阳性(TP);否则,为假阳性(FP)。
  • 规则2:对于一个检测框与多个真实框重叠的情况(如图像2至7),IoU最高的预测框被视为TP,其他则为FP。

根据这些规则,我们可以将每次检测分类为TP或FP,如表1所示。

表1:图5中的检测结果,在TIOU=30% \text{T}_{\text{IOU}} = 30\% 下分类为TP或FP。
table_1.png

请注意,根据规则2,在图像1中,“E”是TP,而“D”是FP,因为“E”与真实值之间的IoU大于“D”与真实值之间的IoU。

现在,我们需要考虑每次检测的置信度值来计算精度和召回率。一个好的方法是按置信度值对检测结果进行排序,如表2所示。然后,对于每一行的每个置信度值,我们计算精度和召回率,同时考虑累积TP(acc TP)和累积FP(acc FP)。每一行的“acc TP”在每次检测到TP时增加1,“acc FP”在每次检测到FP时增加1。“acc TP”和“acc FP”列基本上告诉我们给定特定置信度水平下的TP和FP值。表2中每个值的计算可以在此电子表格中查看。

例如,考虑表2的第12行(检测“P”)。“acc TP = 4”的值意味着,如果我们将模型在这个特定数据集上以0.62的置信度进行基准测试,我们将正确检测到四个目标对象,并错误检测到八个目标对象。这将导致:

Precision=acc TP(acc TP+acc FP)=4(4+8)=0.3333 \text{Precision} = \frac{\text{acc TP}}{(\text{acc TP} + \text{acc FP})} = \frac{4}{(4+8)} = 0.3333 Recall=acc TPall ground truths=415=0.2667 \text{Recall} = \frac{\text{acc TP}}{\text{all ground truths}} = \frac{4}{15} = 0.2667

表2:表1中检测结果的精度和召回率计算。
table_2.png

现在,我们可以用这些值绘制精度-召回率曲线,如图6所示

precision_recall_example.png
图6:表2中计算的检测结果的精度-召回率曲线。

通过检查曲线,可以推断精度和召回率之间的潜在权衡,并根据选定的置信度阈值找到模型的最佳工作点,即使该阈值未明确显示在曲线上。

如果检测器的置信度导致少量假阳性(FP),则它可能具有高精度。然而,这可能会导致错过许多真阳性(TP),从而导致高假阴性(FN)率,进而导致低召回率。另一方面,接受更多阳性检测可以提高召回率,但也可能增加FP计数,从而降低精度。

为目标类别计算的精度-召回率曲线下的面积(AUC)代表该特定类别的平均精度值。COCO评估方法将“AP”称为图像数据集中所有目标类别之间的平均AUC值,其他方法也称之为平均平均精度(mAP)。

对于大型数据集,检测器可能会输出具有各种置信度水平的框,从而导致锯齿状的精度-召回率曲线,使其难以精确计算其AUC(平均精度)。不同的方法采用不同的方法来近似曲线面积。一种流行的方法称为N插值,其中N表示从精度-召回率蓝色线中采样的点数。

例如,COCO方法使用101点插值,它计算等间隔的召回率值(0、0.01、0.02、...、1.00)的101个点,而其他方法使用11个点(11点插值)。图7显示了具有11个等间隔召回点(蓝色)的精度-召回率曲线。

11-pointInterpolation.png
图7:使用11点插值法绘制的精度-召回率曲线示例。11个红点是使用精度和召回率方程计算的。

红色点的位置按照以下方式确定:

ρinterp(R)=maxr~:r~rρ(r~) \rho_{\text{interp}} (R) = \max_{\tilde{r}:\tilde{r} \geq r} \rho \left( \tilde{r} \right)

其中 ρ(r~) \rho \left( \tilde{r} \right) 是在召回率 r~ \tilde{r} 处测量的精度值。

在这个定义中,插值精度 ρinterp(R) \rho_{\text{interp}} (R) 是通过考虑召回率值大于 R R 的最大精度获得的,而不是使用在每个召回率水平 R R 处观察到的精度值 ρ(R) \rho(R)

对于这种方法,代表平均精度的AUC由所有点的平均值近似表示,并由以下公式给出:

AP11=111=R{0,0.1,...,1}ρinterp(R) \text{AP}_{11} = \frac{1}{11} = \sum\limits_{R\in \left \{ 0, 0.1, ...,1 \right \}} \rho_{\text{interp}} (R)

什么是平均召回率以及如何计算?

平均召回率(AR)是常与AP一起使用的指标,用于评估目标检测模型。AP在不同置信度阈值下评估精度和召回率以提供模型性能的单一数值摘要,而AR则只关注召回率方面,不考虑置信度并将所有检测视为阳性。

COCO 的方法将 AR 计算为在 IoU > 0.5 和类别下的最大召回率的平均值。

通过使用 IoU 范围 [0.5, 1] 并在该区间内平均召回值,AR 评估模型预测的对象定位能力。因此,如果您的目标是评估模型的高召回率和精确对象定位,AR 可能是一个值得考虑的有价值的评估指标。

平均精度和平均召回率有哪些变体?

根据预定义的IoU阈值以及与真实对象相关的区域,可以获得不同版本的AP和AR:

  • AP@.5:设置IoU阈值为0.5,并计算图像数据集中每个目标类别的精度-召回率AUC。然后,将每个类别的计算结果相加并除以类别数量。
  • AP@.75:使用与AP@.50相同的方法,但IoU阈值为0.75。由于更高的IoU要求,AP@.75被认为比AP@.5更严格,应用于评估在检测中需要达到高水平定位精度的模型。
  • AP@[.5:.05:.95]:也被cocoeval工具称为AP。这是AP@.5和AP@.75的扩展版本,因为它使用不同的IoU阈值(0.5、0.55、0.6、...、0.95)计算AP,并对计算结果进行平均,如以下公式所示。与AP@.5和AP@.75相比,此指标提供了全面的评估,涵盖了模型在更广泛定位精度范围内的性能。

AP@[.5:.05:0.95=AP0.5+AP0.55+...+AP0.9510 \text{AP@[.5:.05:0.95} = \frac{\text{AP}_{0.5} + \text{AP}_{0.55} + ... + \text{AP}_{0.95}}{10}

  • AP-S:它应用AP@[.5:.05:.95],考虑面积小于 322 32^2 像素的(小)真实对象。
  • AP-M:它应用AP@[.5:.05:.95],考虑面积在 322 32^2 962 96^2 像素之间的(中等大小)真实对象。
  • AP-L:它应用AP@[.5:.05:.95],考虑面积在 322 32^2 像素之间的(大)真实对象。

对于平均召回率(AR),使用10个IoU阈值(0.5、0.55、0.6、...、0.95)来计算召回率值。AR的计算方法是限制每张图像的检测数量,或者根据对象的面积限制检测数量。

  • AR-1:每张图像最多考虑1个检测结果。
  • AR-10:每张图像最多考虑10个检测结果。
  • AR-100:每张图像最多考虑100个检测结果。
  • AR-S:考虑面积小于 322 32^2 像素的(小)对象。
  • AR-M:考虑面积在 322 32^2 962 96^2 像素之间的(中等大小)对象。
  • AR-L:考虑面积大于 962 96^2 像素的(大)对象。

目标检测排行榜

我们最近发布了目标检测排行榜,用于比较Hub中开源模型的准确性和效率。

screenshot-leaderboard.png
图8:目标检测排行榜。

为了衡量准确性,我们使用12种涉及平均精度和平均召回率的指标,采用COCO样式,在COCO val 2017数据集上进行基准测试。

如前所述,不同的工具在评估过程中可能采用不同的特殊性。为了防止结果不匹配,我们选择不实现我们自己的指标版本。相反,我们选择使用COCO的官方评估代码,也称为PyCOCOtools,代码可在此处获取。

在效率方面,我们通过计算整个数据集(包括预处理和后处理步骤)的平均评估时间来计算每个模型的每秒帧数(FPS)。鉴于每个模型的GPU内存需求不同,我们选择使用批量大小为1进行评估(此选择也受到我们预处理步骤的影响,我们将在后面深入探讨)。然而,值得注意的是,这种方法可能与实际性能不完全一致,因为通常使用更大的批量(通常包含多张图像)以获得更好的效率。

接下来,我们将提供基于指标选择最佳模型的提示,并指出哪些参数可能会影响结果。理解这些细微差别至关重要,因为这可能会在社区内引发疑问和讨论。

如何根据指标选择最佳模型?

选择合适的指标来评估和比较目标检测器需要考虑几个因素。主要考虑因素包括应用目的和用于训练和评估模型的数据集特征。

对于整体性能,如果您希望模型在不同IoU阈值下具有全面的性能,并且对检测到的对象的定位没有严格要求,那么AP(AP@[.5:.05:.95])是一个不错的选择。

如果您需要一个具有良好物体识别能力且物体位置大致正确的模型,您可以关注 AP@.5。如果您更喜欢一个在边界框放置上更精确的模型,AP@.75 更合适。

如果您对对象大小有限制,那么AP-SAP-MAP-L就派上用场了。例如,如果您的数据集或应用程序主要包含小对象,AP-S可以提供关于检测器识别这些小目标的有效性的见解。这在检测远距离车辆或医学成像中的小伪影等场景中至关重要。

哪些参数会影响平均精度结果?

从Hub中选择目标检测模型后,如果我们使用模型预处理和后处理步骤中不同的参数,我们可以改变输出框。这些可能会影响评估指标。我们确定了一些可能导致结果变化的常见因素:

  • 忽略置信度低于某个阈值的检测结果。
  • 使用batch_sizes > 1进行推理。
  • 移植的模型输出的logits与原始模型不同。
  • 一些真实对象可能会被评估器忽略。
  • 计算 IoU 可能很复杂。
  • 文本条件模型需要精确的提示。

让我们以DETR(DEtection TRansformer)(facebook/detr-resnet-50)模型为例。我们将展示这些因素如何影响输出结果。

评估前设置检测阈值

我们的示例模型使用DetrImageProcessor来处理边界框和 logits,如下所示:

from transformers import DetrImageProcessor, DetrForObjectDetection
import torch
from PIL import Image
import requests

url = "http://images.cocodataset.org/val2017/000000039769.jpg"
image = Image.open(requests.get(url, stream=True).raw)

processor = DetrImageProcessor.from_pretrained("facebook/detr-resnet-50")
model = DetrForObjectDetection.from_pretrained("facebook/detr-resnet-50")

inputs = processor(images=image, return_tensors="pt")
outputs = model(**inputs)

# PIL images have their size in (w, h) format
target_sizes = torch.tensor([image.size[::-1]])
results = processor.post_process_object_detection(outputs, target_sizes=target_sizes, threshold=0.5)

post_process_object_detection 函数中的 threshold 参数用于根据检测框的置信度分数过滤检测结果。

如前所述,精度-召回率曲线是通过测量[0,1]范围内所有置信度值的精度和召回率构建的。因此,在评估前限制检测结果会产生偏差,因为我们会遗漏一些检测结果。

改变批处理大小

批处理大小不仅影响处理时间,还可能导致检测到的框不同。图像预处理步骤可能会根据输入图像的大小改变其分辨率。

正如DETR 文档中所述,默认情况下,DetrImageProcessor 会调整输入图像的大小,使其最短边为 800 像素,然后再次调整大小,使其最长边最多为 1333 像素。因此,批处理中的图像可以具有不同的大小。DETR 通过将图像填充到批处理中的最大大小,并创建像素掩码来指示哪些像素是真实的/哪些是填充来解决此问题。

为了说明这个过程,让我们考虑图9和图10中的例子。在图9中,我们考虑批量大小=1,因此两张图像都使用DetrImageProcessor独立处理。第一张图像被调整为(800,1201),使检测器预测28个带有vase类别的框,22个带有chair类别的框,10个带有bottle类别的框等。

example_batch_size_1.png
图9:使用批量大小=1通过`DetrImageProcessor`处理两张图像。

图10显示了批量大小=2时的处理过程,其中相同的两张图像在同一批量中由DetrImageProcessor处理。两张图像都调整为相同的形状(873,1201),并应用了填充,因此图像中包含内容的部分保持其原始宽高比。然而,例如,第一张图像输出了不同数量的对象:31个带有vase类别的框,20个带有chair类别的框,8个带有bottle类别的框等。请注意,对于第二张图像,当批量大小=2时,检测到一个新类别dog。这发生是因为模型能够根据图像分辨率检测不同大小的对象。

example_batch_size_2.png
图10:使用批量大小=2通过`DetrImageProcessor`处理两张图像。

移植模型应输出与原始模型相同的 logits

在Hugging Face,我们将模型移植到代码库时非常小心。不仅要考虑架构、清晰的文档和编码结构,我们还需要保证移植后的模型在给定相同输入的情况下,能够生成与原始模型相同的logits。

模型输出的logits经过后处理以生成置信度分数、标签ID和边界框坐标。因此,logits的微小变化可能会影响指标结果。您可能还记得上面的示例,我们讨论了计算平均精度的过程。我们展示了置信度水平会排序检测结果,微小变化可能导致不同的顺序,从而导致不同的结果。

重要的是要认识到,模型可以生成各种格式的框,这也可能需要考虑在内,以便进行评估器所需的正确转换。

  • (x, y, width, height):这表示左上角坐标,后跟绝对尺寸(宽度和高度)。
  • (x, y, x2, y2):此格式表示左上角和右下角的坐标。
  • (rel_x_center, rel_y_center, rel_width, rel_height):这些值表示中心点的相对坐标和框的相对尺寸。

某些基准测试数据集中的一些真实值被忽略

某些数据集有时会使用特殊标签,这些标签在评估过程中会被忽略。

例如,COCO 使用标签 iscrowd 来标记大量对象(例如,篮子里有很多苹果)。在评估过程中,标记为 iscrowd=1 的对象会被忽略。如果不考虑这一点,您可能会得到不同的结果。

计算 IoU 需要仔细考虑

根据定义,IoU 的计算可能看起来很简单。然而,有一个关键的细节需要注意:如果真值和检测结果完全没有重叠,甚至连一个像素都没有,那么 IoU 应该为 0。为了避免在计算并集时出现除以零的情况,可以在分母中添加一个很小的值(称为 epsilon)。但是,必须仔细选择 epsilon:大于 1e-4 的值可能不够中立,无法给出准确的结果。

文本条件模型需要正确的提示

在某些情况下,我们可能希望评估文本条件模型,例如 OWL-ViT,它可以接收文本提示并提供所需对象的位置。

对于此类模型,不同的提示(例如“找到狗”和“狗在哪里?”)可能会导致相同的结果。但是,我们决定遵循每篇论文中描述的程序。例如,对于 OWL-ViT,我们使用提示“一张{}的图像”来预测对象,其中 {} 被基准数据集的类别替换。

结论

在这篇文章中,我们介绍了目标检测问题,并描绘了用于评估它们的主要指标。

如前所述,评估目标检测模型可能比看起来要复杂。必须仔细考虑每个模型的特殊性,以防止出现偏差结果。此外,每个指标代表同一模型的不同视角,选择“最佳”指标取决于模型的应用和所选基准数据集的特征。

下表说明了特定用例的推荐指标,并提供了现实世界场景作为示例。但是,需要注意的是,这些仅是建议,理想的指标可能因每个应用程序的独特特殊性而异。

用例 真实世界场景 推荐指标
通用目标检测性能 监控,体育分析 AP
低精度要求(宽泛检测) 增强现实,手势识别 AP@.5
高精度要求(紧密检测) 人脸检测 AP@.75
检测小物体 自动驾驶汽车中的远处车辆,医学影像中的微小伪影 AP-S
中等大小物体检测 机场安检中的行李检测 AP-M
大型物体检测 停车场中的车辆检测 AP-L
每张图像检测 1 个对象 视频中的单目标跟踪 AR-1
每张图像最多检测 10 个对象 街头摄像机中的行人检测 AR-10
每张图像最多检测 100 个对象 人群计数 AR-100
小物体召回率 用于微小异常的医学影像 AR-S
中等大小物体召回率 运动员体育分析 AR-M
大型物体召回率 广阔景观中的野生动物追踪 AR-L

我们 🤗 目标检测排行榜中显示的结果是使用社区广泛用于模型基准测试的独立工具 PyCOCOtools 计算的。我们的目标是收集不同领域的数据集(例如医学图像、体育、自动驾驶车辆等)。您可以使用讨论页面来请求数据集、模型和功能。渴望在我们的排行榜上看到您的模型或数据集功能?不要犹豫!介绍您的模型和数据集,进行微调,然后让我们将其排名!🥇

附加资源

特别感谢 🙌 @merve@osanseviero@pcuenq 提供的反馈和精彩评论。🤗

社区

注册登录以评论