Press "Enter" to skip to content

目标检测排行榜

欢迎来到我们最新的排行榜和模型评估领域的深入探索。在之前的一篇文章中,我们探索了对大型语言模型进行评估的方法。今天,我们将转向一个不同但同样具有挑战性的领域-目标检测。

最近,我们发布了我们的目标检测排行榜,根据一些指标对Hub中可用的目标检测模型进行排名。在这篇博客中,我们将演示模型是如何进行评估的,并揭示目标检测中常用的指标,从交并比(IoU)到平均精度(AP)和平均召回率(AR)。更重要的是,我们将重点介绍在评估过程中可能出现的差异和陷阱,确保您具备不仅能理解而且能够批判性评估模型性能的知识。

每个开发者和研究人员都希望拥有一个能够准确检测和描绘对象的模型。我们的目标检测排行榜是找到最适合其应用需求的开源模型的正确地方。但在这个背景下,“准确”到底意味着什么?应该相信哪些指标?它们是如何计算的?而且,更关键的是,为什么一些模型在不同的报告中可能呈现出不同的结果?所有这些问题将在本博客中得到回答。

因此,让我们一起展开这次探索,揭开目标检测排行榜的秘密!如果您想跳过介绍,直接了解如何计算目标检测指标,请前往指标部分。如果您想了解如何根据目标检测排行榜选择最佳模型,请查看目标检测排行榜部分。

目录

  • 介绍
  • 什么是目标检测
  • 指标
    • 什么是平均精度,如何计算?
    • 什么是平均召回率,如何计算?
    • 平均精度和平均召回率的变体有哪些?
  • 目标检测排行榜
    • 根据指标选择最佳模型的方法
    • 哪些参数可能会影响平均精度的结果?
  • 结论
  • 其他资源

什么是目标检测?

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

例如,下面的图像显示了五个检测结果:一个“球”置信度为98%,以及四个“人”置信度分别为98%、95%、97%和97%。

目标检测模型具有各种各样的应用,涵盖各个领域。其中一些用例包括自动驾驶中的视觉、人脸检测、监控和安全、医学成像、增强现实、体育分析、智慧城市、手势识别等。

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

一种特殊类型的目标检测模型称为零样本模型,它可以接收额外的文本查询,以搜索在文本中描述的目标对象。这些模型可以检测到它们在训练期间没有见过的对象,而不仅仅局限于训练时使用的类别集合。

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

用于评估目标检测模型预测准确性的一种常用指标是平均精度(AP)及其变体,这将在本博客中详细解释。

评估目标检测模型涉及多个组件,如带有真实边界框注释的数据集、检测结果(输出预测)和指标。该过程如图2所示:

首先,选择一个包含具有真实边界框注释的图像的基准数据集,并将其输入目标检测模型中。模型为每个图像预测边界框,为每个框分配相关的类别标签和置信度分数。在评估阶段,将这些预测的边界框与数据集中的真实边界框进行比较。评估得出一组指标,每个指标的取值范围在[0, 1]之间,反映了特定的评估标准。在下一节中,我们将详细介绍如何计算这些指标。

指标

本节将深入介绍平均精确度(Average Precision)和平均召回率(Average Recall)的定义、变体以及与其相关的计算方法。

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

平均精确度(AP)是一个单一的数值,用于总结精确度与召回率曲线。在解释如何计算平均精确度之前,我们首先需要了解交并比(Intersection over Union,IoU)的概念,以及如何将检测结果分类为真正例(True Positive)或假正例(False Positive)。

交并比是一个介于0和1之间的度量标准,用于衡量预测的边界框与实际(真实)边界框之间的重叠程度。它通过将两个边界框重叠的区域除以两个边界框的总面积来计算。图3使用一个预测框和其对应的真实框的示例直观地展示了交并比。

如果真实边界框和检测边界框具有相同的坐标,表示它们在图像中表示同一区域,它们的交并比值为1。相反,如果两个边界框在任何像素上都不重叠,交并比被认为是0。

在期望检测的精确度较高的场景中(例如自动驾驶汽车),预测的边界框应与真实边界框紧密对齐。为此,更接近1的交并比阈值(TIOU)是首选。另一方面,在对检测边界框相对于目标对象的精确位置不是关键的应用程序中,可以放宽阈值,将交并比阈值设置得更接近0。

模型预测的每个边界框都被视为“正例”检测。根据我们定义的置信度阈值,交并比准则将每个预测分类为真正例(TP)或假正例(FP)。

基于预定义的交并比阈值,我们可以定义真正例和真反例:

  • 真正例(TP):交并比 ≥ TIOU 的正确检测。
  • 假正例(FP):交并比 < TIOU 的错误检测(漏掉的对象)。

相反,负例根据真实边界框进行评估,可以定义为假反例(FN)或真反例(TN):

  • 假反例(FN):指模型未能检测到的真实对象。
  • 真反例(TN):表示正确的非检测。在目标检测领域中,图像中应该不被识别的边界框数量是无穷多的,因为它们不表示目标对象。考虑一下图像中所有不表示目标对象的可能边界框 – 是不是非常庞大的数量? 🙂 这就是为什么我们不考虑真反例来计算目标检测指标的原因。

现在我们可以确定我们的真正例、假正例和假反例,我们可以定义精确度和召回率:

  • 精确度是模型仅识别相关对象的能力。它是正确正例预测的百分比,计算公式如下:

精确度=TP(TP+FP)=TP所有检测 \text{精确度} = \frac{TP}{(TP + FP)} = \frac{TP}{\text{所有检测}} 精确度=(TP+FP)TP​=所有检测TP​

即真正例占所有检测到的边界框的比例。

  • 召回率评估模型在找到所有相关情况(所有真实边界框)方面的能力。它表示在所有真实情况中检测到的真正例的比例,计算公式如下:

召回率=TP(TP+FN)=TP所有真实情况 \text{召回率} = \frac{TP}{(TP + FN)} = \frac{TP}{\text{所有真实情况}} 召回率=(TP+FN)TP​=所有真实情况TP​

注意,真正例、假正例和假反例取决于预定义的交并比阈值,精确度和召回率也是如此。

平均精确度捕捉了模型根据不同的精确度和召回率值正确分类和定位对象的能力。为此,我们将为特定目标类别(例如“狗”)绘制精确度和召回率曲线,采用适度的交并比阈值= 75% 来确定我们的真正例、假正例和假反例。随后,我们可以计算精确度和召回率值。为此,我们需要改变检测结果的置信度分数。

图4显示了Precision x Recall曲线的一个示例。要深入探索计算这个曲线的方法,可以参考论文“A Comparative Analysis of Object Detection Metrics with a Companion Open-Source Toolkit”(Padilla等)和“A Survey on Performance Metrics for Object-Detection Algorithms”(Padilla等),这些论文提供了更详细的玩具示例,演示如何计算这个曲线。

Precision x Recall曲线说明了在不同置信度水平下,检测器边界框的Precision和Recall的平衡。绘图的每个点都使用不同的置信度值计算。

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

我们假设的目标检测器在数据集中检测到了24个对象,用红色框表示。为了计算Precision和Recall,我们使用Precision和Recall的公式,在所有置信度水平上评估检测器在基准数据集上对这个特定类别的性能。为此,我们需要建立一些规则:

  • 规则1:为了简化起见,如果IOU ≥ 30%,我们将考虑我们的检测为真正阳性(TP),否则为假正阳性(FP)。
  • 规则2:对于检测与多个真实对象重叠的情况(如图2至7),我们将考虑具有最高IOU的预测框为TP,其他框为FP。

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

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

现在,我们需要根据每个检测的置信度值计算Precision和Recall。一种很好的方法是按照置信度值对检测进行排序,如表2所示。然后,对于每行中的每个置信度值,我们根据累积TP(acc TP)和累积FP(acc FP)计算Precision和Recall。每行中的“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 精确率= \frac{\text{acc TP}}{(\text{acc TP} + \text{acc FP})} = \frac{4}{(4+8)} = 0.3333 精确率=(acc TP+acc FP)acc TP​=(4+8)4​=0.3333 ,Recall=acc TP所有真实对象=4 15=0.2667 召回率= \frac{\text{acc TP}}{\text{所有真实对象}} = \frac{4}{15} = 0.2667 召回率=所有真实对象acc TP​=154​=0.2667 。

现在,我们可以使用这些值绘制Precision x Recall曲线,如图6所示:

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

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

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

对于大型数据集,检测器通常会输出具有不同置信度的边界框,导致精确度 x 召回率曲线不平滑,从而使得计算其AUC(平均精确度)变得具有挑战性。不同的方法使用不同的途径来近似曲线的面积。一种常用的方法是称为N插值,其中N表示从精确度 x 召回率蓝线中采样的点的数量。

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

红色点的放置方式如下:

ρinterp(R)=max⁡r~:r~≥rρ(r~)

其中ρ(r~)是召回率r~处的测量精确度。

在这个定义中,与在每个召回率水平R观察到的精确度值ρ(R)不同,通过考虑召回率值大于R的最大精确度来获得精确度ρinterp(R)。

对于这种方法,表示平均精确度的AUC是通过所有点的平均值来近似计算的:

AP11=111=∑R∈{0,0.1,…,1}ρinterp(R)

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

平均召回率(AR)是经常与AP一起用于评估目标检测模型的指标。AP通过评估不同置信度阈值下的精确度和召回率来提供模型性能的单个数字总结,而AR则专注于召回率方面,不考虑置信度并将所有检测结果都视为正样本。

COCO的方法将AR计算为IOU > 0.5和类别之间获得的最大召回率的平均值。

通过在区间[0.5, 1]内使用IOU并对召回率值进行平均,AR评估了模型对其对象定位的预测。因此,如果您的目标是评估模型的高召回率和精确的物体定位,则AR可能是一个有价值的评估指标。

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

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

  • AP@.5:将IoU阈值设置为0.5,并计算图像数据集中每个目标类别的精确度 x 召回率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@[.5:.05:0.95=10AP0.5​+AP0.55​+…+AP0.95​​

  • AP-S: 对于面积小于322的(小)ground-truth对象,应用AP@[.5:.05:.95]。
  • AP-M: 对于322<面积<962(VoAGI大小)的ground-truth对象,应用AP@[.5:.05:.95]。
  • AP-L: 对于322<面积<962(大)的ground-truth对象,应用AP@[.5:.05:.95]。

对于平均召回率(AR),使用10个IoU阈值(0.5, 0.55, 0.6,…,0.95)计算召回率值。根据每个图像的检测数或基于对象面积限制,计算AR值。

  • AR-1: 每个图像最多考虑1个检测。
  • AR-10: 每个图像最多考虑10个检测。
  • AR-100: 每个图像最多考虑100个检测。
  • AR-S: 考虑面积小于322的对象。
  • AR-M: 考虑322<面积<962的对象(VoAGI大小)。
  • AR-L: 考虑面积大于962的对象。

对象检测排行榜

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

为了衡量准确性,我们使用了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
  • 移植的模型与原始模型输出的逻辑不同。
  • 评估器可能会忽略一些真实对象。
  • 计算IoU可能会很复杂。
  • 文本条件模型需要精确的提示。

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

评估前的阈值检测

我们的示例模型使用DetrImageProcessor类处理边界框和逻辑,如下面的代码片段所示:

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参数用于根据置信度分数过滤检测到的边界框。

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

变化的批处理大小

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

如DETR文档中所述,默认情况下,DetrImageProcessor将输入图像调整大小,使最短边为800像素,并再次调整大小,使最长边最多为1333像素。由于这个原因,批处理中的图像大小可能不同。DETR通过将图像填充到批处理中最大大小,并创建一个像素掩码来指示哪些像素是实际的/哪些是填充的来解决这个问题。

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

图10展示了批处理大小为2的过程,同样的两个图像在同一个批处理中使用DetrImageProcessor进行处理。两个图像被调整为具有相同的形状(873, 1201),并应用了填充,以保持带有内容的图像部分具有其原始的长宽比。然而,例如,第一张图像输出了不同数量的对象:31个类为vase的边界框,20个类为chair的边界框,八个类为bottle的边界框等。请注意,对于批处理大小为2的第二张图像,检测到了一个新的类dog。这是由于模型具有根据图像分辨率检测不同尺寸对象的能力。

迁移的模型应该与原始模型输出相同的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,我们使用提示”一张{}的图像”来预测对象,其中{}被替换为基准数据集的类别。

结论

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

正如我们所提到的,评估目标检测模型可能需要比看起来更多的工作。必须仔细考虑每个模型的特殊性,以防止结果偏倚。此外,每个指标代表同一模型的不同观点,选择”最佳”指标取决于模型的应用和所选基准数据集的特征。

下面是一个表格,说明了特定用例的推荐指标,并提供了实际场景作为示例。但是,重要的是要注意,这些仅仅是建议,理想的指标可能会根据每个应用的不同特性而有所变化。

我们在🤗目标检测排行榜中展示的结果是使用社区广泛使用的独立工具PyCOCOtools计算的,用于模型基准测试。我们的目标是收集不同领域(例如医学图像、体育、自动驾驶等)的数据集。您可以使用讨论页面请求数据集、模型和特性。期待看到您的模型或数据集在我们的排行榜上展示!🥇

其他资源

  • 目标检测指南
  • 目标检测任务
  • 论文:有效检测提案的特点
  • 论文:伴随开源工具包的目标检测度量的比较分析
  • 论文:目标检测算法性能度量的综述

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

Leave a Reply

Your email address will not be published. Required fields are marked *