성능평가

성능평가는 여러 입/출력 쌍을 입력받아 집계(aggregate)하는 절차입니다. 누구든 모델의 입/출력을 파싱하면 성능평가를 수행할 수 있습니다. 다른 방법으로, detectron2에서는 DatasetEvaluator 인터페이스를 통해 성능평가를 할 수 있습니다.

Detectron2는 몇 가지 DatasetEvaluator 를 제공하는데, 이들은 데이터셋 별 표준 API(e.g. COCO, LVIS)를 사용해 성능지표를 계산합니다. 입/출력 쌍을 사용해 다른 작업을 수행하는 여러분만의 DatasetEvaluator 를 직접 구현할 수도 있습니다. 예를 들어 다음과 같이 검증셋(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):
    # self.count를 어딘가 저장하거나, 출력하거나, 반환하십시오.
    return {"count": self.count}

evaluators 사용

다음처럼 evaluator의 메서드를 사용해 직접 성능평가를 할 수 있습니다.

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()

또한 evaluator를 inference_on_dataset 과 함께 사용할 수도 있습니다. 다음 예시를 확인하십시오.

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

위 코드는 data_loader 의 모든 입력에 대해 model 을 실행하고 evaluator를 호출해 성능을 평가합니다.

모델을 사용하여 직접 성능평가를 하는 것에 비해 이 함수의 이점은 다음과 같습니다. 첫째, DatasetEvaluators 를 사용해 evaluator들을 하나로 병합할 수 있습니다. 둘째, 데이터셋을 한 번만 순회하고도 모든 성능평가를 끝낼 수 있습니다. 셋째, 평가하는 모델 및 데이터셋에 대한 정확한 속도 측정 벤치마크를 제공합니다.

커스텀 데이터셋을 위한 evaluator

detectron2에는 특정 데이터셋을 위한 evaluator가 다수 존재하는데, 이는 각 데이터셋의 공식 API를 통해 성능을 측정하기 위한 목적입니다. 이외에도 detectron2의 표준 데이터셋 포맷 을 따르는 일반(generic) 데이터셋에 대해 성능을 평가하기 위한 evaluator가 두 개 있으며, 이를 커스텀 데이터셋의 성능을 평가하는 데에도 사용할 수 있습니다.

  • COCOEvaluator 는 모든 커스텀 데이터셋에 대해 박스 검출(box detection), 객체 세그멘테이션(instance segmentation), 키포인트 검출(keypoint detection) AP(평균 정밀도)를 평가할 수 있습니다.

  • SemSegEvaluator 는 모든 커스텀 데이터셋에서 시맨틱 세그멘테이션(semantic segmentation) 성능지표를 평가할 수 있습니다.