# Copyright (c) Facebook, Inc. and its affiliates. import contextlib import copy import io import json import numpy as np import os import tempfile import unittest import torch from pycocotools.coco import COCO from pycocotools.cocoeval import COCOeval from detectron2.data import DatasetCatalog from detectron2.evaluation import COCOEvaluator from detectron2.evaluation.fast_eval_api import COCOeval_opt from detectron2.structures import Boxes, Instances class TestCOCOeval(unittest.TestCase): def test_fast_eval(self): # A small set of images/categories from COCO val # fmt: off detections = [{"image_id": 139, "category_id": 1, "bbox": [417.3332824707031, 159.27003479003906, 47.66064453125, 143.00193786621094], "score": 0.9949821829795837, "segmentation": {"size": [426, 640], "counts": "Tc`52W=3N0N4aNN^E7]:4XE1g:8kDMT;U100000001O1gE[Nk8h1dFiNY9Z1aFkN]9g2J3NdN`FlN`9S1cFRN07]9g1bFoM6;X9c1cFoM=8R9g1bFQN>3U9Y30O01OO1O001N2O1N1O4L4L5UNoE3V:CVF6Q:@YF9l9@ZF 0 else 0.0 msg = "%s: comparing COCO APIs, %s differs by %f" % (name, k, abs_diff) self.assertTrue(abs_diff < 1e-4, msg=msg) def test_unknown_category(self): dataset = "coco_2017_val_100" evaluator = COCOEvaluator(dataset) evaluator.reset() inputs = DatasetCatalog.get(dataset)[:2] pred = Instances((100, 100)) pred.pred_boxes = Boxes(torch.rand(2, 4)) pred.scores = torch.rand(2) pred.pred_classes = torch.tensor([10, 80]) output = {"instances": pred} evaluator.process(inputs, [output, output]) with self.assertRaises(AssertionError): evaluator.evaluate()