评估

评估是一个将多个输入/输出对聚合在一起的过程。 你始终可以直接 使用模型 并手动解析其输入/输出以执行评估。 或者,评估在 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 能够评估任何自定义数据集的语义分割指标。