Evaluation is a process that takes a number of inputs/outputs pairs and aggregate them. You can always use the model directly and just parse its inputs/outputs manually to perform evaluation. Alternatively, evaluation is implemented in detectron2 using the DatasetEvaluator interface.

Detectron2 includes a few DatasetEvaluator that computes metrics using standard dataset-specific APIs (e.g., COCO, LVIS). You can also implement your own DatasetEvaluator that performs some other jobs using the inputs/outputs pairs. For example, to count how many instances are detected on the validation set:

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}

Once you have some DatasetEvaluator, you can run it with inference_on_dataset. For example,

val_results = inference_on_dataset(
    DatasetEvaluators([COCOEvaluator(...), Counter()]))

Compared to running the evaluation manually using the model, the benefit of this function is that you can merge evaluators together using DatasetEvaluators. In this way you can run all evaluations without having to go through the dataset multiple times.

The inference_on_dataset function also provides accurate speed benchmarks for the given model and dataset.