| |
| import json |
| import numpy as np |
| import os |
| import tempfile |
| import unittest |
| import pycocotools |
|
|
| from detectron2.data import DatasetCatalog, MetadataCatalog |
| from detectron2.data.datasets.coco import convert_to_coco_dict, load_coco_json |
| from detectron2.structures import BoxMode |
|
|
|
|
| def make_mask(): |
| """ |
| Makes a donut shaped binary mask. |
| """ |
| H = 100 |
| W = 100 |
| mask = np.zeros([H, W], dtype=np.uint8) |
| for x in range(W): |
| for y in range(H): |
| d = np.linalg.norm(np.array([W, H]) / 2 - np.array([x, y])) |
| if d > 10 and d < 20: |
| mask[y, x] = 1 |
| return mask |
|
|
|
|
| def make_dataset_dicts(mask): |
| """ |
| Returns a list of dicts that represents a single COCO data point for |
| object detection. The single instance given by `mask` is represented by |
| RLE. |
| """ |
| record = {} |
| record["file_name"] = "test" |
| record["image_id"] = 0 |
| record["height"] = mask.shape[0] |
| record["width"] = mask.shape[1] |
|
|
| y, x = np.nonzero(mask) |
| segmentation = pycocotools.mask.encode(np.asarray(mask, order="F")) |
| min_x = np.min(x) |
| max_x = np.max(x) |
| min_y = np.min(y) |
| max_y = np.max(y) |
| obj = { |
| "bbox": [min_x, min_y, max_x, max_y], |
| "bbox_mode": BoxMode.XYXY_ABS, |
| "category_id": 0, |
| "iscrowd": 0, |
| "segmentation": segmentation, |
| } |
| record["annotations"] = [obj] |
| return [record] |
|
|
|
|
| class TestRLEToJson(unittest.TestCase): |
| def test(self): |
| |
| mask = make_mask() |
| DatasetCatalog.register("test_dataset", lambda: make_dataset_dicts(mask)) |
| MetadataCatalog.get("test_dataset").set(thing_classes=["test_label"]) |
|
|
| |
| json_dict = convert_to_coco_dict("test_dataset") |
| with tempfile.TemporaryDirectory() as tmpdir: |
| json_file_name = os.path.join(tmpdir, "test.json") |
| with open(json_file_name, "w") as f: |
| json.dump(json_dict, f) |
| |
| dicts = load_coco_json(json_file_name, "") |
|
|
| |
| anno = dicts[0]["annotations"][0] |
| loaded_mask = pycocotools.mask.decode(anno["segmentation"]) |
| self.assertTrue(np.array_equal(loaded_mask, mask)) |
|
|