评估

评估是一个处理多个输入/输出对并将其汇总的过程。 您始终可以直接使用模型并手动解析其输入/输出来执行评估。 或者,detectron2中通过DatasetEvaluator接口实现了评估功能。

Detectron2 包含一些 DatasetEvaluator,它们使用标准数据集特定的 API(例如 COCO、LVIS)来计算指标。 您也可以实现自己的 DatasetEvaluator,使用输入/输出对执行其他任务。 例如,统计验证集上检测到的实例数量:

class Counter(DatasetEvaluator):
  def reset(self):
    self.count = 0
  def process(self, inputs, outputs):
    for output in outputs:
      self.count += len(output["instances"])
  def evaluate(self):
    # save self.count somewhere, or print it, or return it.
    return {"count": self.count}

使用评估器

手动使用评估器方法进行评估:

def get_all_inputs_outputs():
  for data in data_loader:
    yield data, model(data)

evaluator.reset()
for inputs, outputs in get_all_inputs_outputs():
  evaluator.process(inputs, outputs)
eval_results = evaluator.evaluate()

评估器也可以与inference_on_dataset一起使用。 例如,

eval_results = inference_on_dataset(
    model,
    data_loader,
    DatasetEvaluators([COCOEvaluator(...), Counter()]))

这将在来自data_loader的所有输入上执行model,并调用评估器进行处理。

与手动使用模型运行评估相比,该函数的优势在于评估器可以通过DatasetEvaluators合并在一起,并且所有评估可以在数据集的一次前向传递中完成。此函数还为给定模型和数据集提供准确的速度基准。

自定义数据集的评估器

detectron2中的许多评估器是为特定数据集设计的,目的是使用每个数据集的官方API获取评分。除此之外,还有两个评估器能够评估任何遵循detectron2标准数据集格式的通用数据集,因此它们可用于评估自定义数据集:

  • COCOEvaluator 能够评估任何自定义数据集上的边界框检测、实例分割和关键点检测的AP(平均精度)。

  • SemSegEvaluator 能够在任何自定义数据集上评估语义分割指标。