|
|
|
|
@ -4,7 +4,7 @@ import os.path as osp
|
|
|
|
|
|
|
|
|
|
from unittest import TestCase
|
|
|
|
|
|
|
|
|
|
from datumaro.components.project import Project
|
|
|
|
|
from datumaro.components.project import (Project, Dataset)
|
|
|
|
|
from datumaro.components.extractor import (Extractor, DatasetItem,
|
|
|
|
|
AnnotationType, Label, Mask, Points, Polygon, Bbox, Caption,
|
|
|
|
|
LabelCategories, PointsCategories
|
|
|
|
|
@ -26,9 +26,8 @@ DUMMY_DATASET_DIR = osp.join(osp.dirname(__file__), 'assets', 'coco_dataset')
|
|
|
|
|
|
|
|
|
|
class CocoImporterTest(TestCase):
|
|
|
|
|
def test_can_import(self):
|
|
|
|
|
class DstExtractor(Extractor):
|
|
|
|
|
def __iter__(self):
|
|
|
|
|
return iter([
|
|
|
|
|
|
|
|
|
|
expected_dataset = Dataset.from_iterable([
|
|
|
|
|
DatasetItem(id='000000000001', image=np.ones((10, 5, 3)),
|
|
|
|
|
subset='val', attributes={'id': 1},
|
|
|
|
|
annotations=[
|
|
|
|
|
@ -41,17 +40,12 @@ class CocoImporterTest(TestCase):
|
|
|
|
|
id=2, group=2, attributes={'is_crowd': True}),
|
|
|
|
|
]
|
|
|
|
|
),
|
|
|
|
|
])
|
|
|
|
|
|
|
|
|
|
def categories(self):
|
|
|
|
|
label_cat = LabelCategories()
|
|
|
|
|
label_cat.add('TEST')
|
|
|
|
|
return { AnnotationType.label: label_cat }
|
|
|
|
|
], categories=['TEST',])
|
|
|
|
|
|
|
|
|
|
dataset = Project.import_from(DUMMY_DATASET_DIR, 'coco') \
|
|
|
|
|
.make_dataset()
|
|
|
|
|
|
|
|
|
|
compare_datasets(self, DstExtractor(), dataset)
|
|
|
|
|
compare_datasets(self, expected_dataset, dataset)
|
|
|
|
|
|
|
|
|
|
def test_can_detect(self):
|
|
|
|
|
self.assertTrue(CocoImporter.detect(DUMMY_DATASET_DIR))
|
|
|
|
|
@ -71,9 +65,7 @@ class CocoConverterTest(TestCase):
|
|
|
|
|
compare_datasets(self, expected=target_dataset, actual=parsed_dataset)
|
|
|
|
|
|
|
|
|
|
def test_can_save_and_load_captions(self):
|
|
|
|
|
class TestExtractor(Extractor):
|
|
|
|
|
def __iter__(self):
|
|
|
|
|
return iter([
|
|
|
|
|
expected_dataset = Dataset.from_iterable([
|
|
|
|
|
DatasetItem(id=1, subset='train',
|
|
|
|
|
annotations=[
|
|
|
|
|
Caption('hello', id=1, group=1),
|
|
|
|
|
@ -87,23 +79,15 @@ class CocoConverterTest(TestCase):
|
|
|
|
|
DatasetItem(id=3, subset='val',
|
|
|
|
|
annotations=[
|
|
|
|
|
Caption('word', id=1, group=1),
|
|
|
|
|
], attributes={'id': 1}
|
|
|
|
|
),
|
|
|
|
|
], attributes={'id': 1}),
|
|
|
|
|
])
|
|
|
|
|
|
|
|
|
|
with TestDir() as test_dir:
|
|
|
|
|
self._test_save_and_load(TestExtractor(),
|
|
|
|
|
self._test_save_and_load(expected_dataset,
|
|
|
|
|
CocoCaptionsConverter.convert, test_dir)
|
|
|
|
|
|
|
|
|
|
def test_can_save_and_load_instances(self):
|
|
|
|
|
label_categories = LabelCategories()
|
|
|
|
|
for i in range(10):
|
|
|
|
|
label_categories.add(str(i))
|
|
|
|
|
categories = { AnnotationType.label: label_categories }
|
|
|
|
|
|
|
|
|
|
class TestExtractor(Extractor):
|
|
|
|
|
def __iter__(self):
|
|
|
|
|
return iter([
|
|
|
|
|
source_dataset = Dataset.from_iterable([
|
|
|
|
|
DatasetItem(id=1, subset='train', image=np.ones((4, 4, 3)),
|
|
|
|
|
annotations=[
|
|
|
|
|
# Bbox + single polygon
|
|
|
|
|
@ -143,14 +127,9 @@ class CocoConverterTest(TestCase):
|
|
|
|
|
attributes={ 'is_crowd': True },
|
|
|
|
|
label=4, group=3, id=3),
|
|
|
|
|
], attributes={'id': 1}),
|
|
|
|
|
])
|
|
|
|
|
|
|
|
|
|
def categories(self):
|
|
|
|
|
return categories
|
|
|
|
|
], categories=[str(i) for i in range(10)])
|
|
|
|
|
|
|
|
|
|
class DstExtractor(Extractor):
|
|
|
|
|
def __iter__(self):
|
|
|
|
|
return iter([
|
|
|
|
|
target_dataset = Dataset.from_iterable([
|
|
|
|
|
DatasetItem(id=1, subset='train', image=np.ones((4, 4, 3)),
|
|
|
|
|
annotations=[
|
|
|
|
|
Polygon([0, 1, 2, 1, 2, 3, 0, 3],
|
|
|
|
|
@ -179,26 +158,16 @@ class CocoConverterTest(TestCase):
|
|
|
|
|
),
|
|
|
|
|
attributes={ 'is_crowd': True },
|
|
|
|
|
label=4, group=3, id=3),
|
|
|
|
|
], attributes={'id': 1}),
|
|
|
|
|
])
|
|
|
|
|
|
|
|
|
|
def categories(self):
|
|
|
|
|
return categories
|
|
|
|
|
], attributes={'id': 1})
|
|
|
|
|
], categories=[str(i) for i in range(10)])
|
|
|
|
|
|
|
|
|
|
with TestDir() as test_dir:
|
|
|
|
|
self._test_save_and_load(TestExtractor(),
|
|
|
|
|
self._test_save_and_load(source_dataset,
|
|
|
|
|
CocoInstancesConverter.convert, test_dir,
|
|
|
|
|
target_dataset=DstExtractor())
|
|
|
|
|
target_dataset=target_dataset)
|
|
|
|
|
|
|
|
|
|
def test_can_merge_polygons_on_loading(self):
|
|
|
|
|
label_categories = LabelCategories()
|
|
|
|
|
for i in range(10):
|
|
|
|
|
label_categories.add(str(i))
|
|
|
|
|
categories = { AnnotationType.label: label_categories }
|
|
|
|
|
|
|
|
|
|
class SrcExtractor(Extractor):
|
|
|
|
|
def __iter__(self):
|
|
|
|
|
return iter([
|
|
|
|
|
source_dataset = Dataset.from_iterable([
|
|
|
|
|
DatasetItem(id=1, image=np.zeros((6, 10, 3)),
|
|
|
|
|
annotations=[
|
|
|
|
|
Polygon([0, 0, 4, 0, 4, 4],
|
|
|
|
|
@ -207,14 +176,9 @@ class CocoConverterTest(TestCase):
|
|
|
|
|
label=3, id=4, group=4),
|
|
|
|
|
]
|
|
|
|
|
),
|
|
|
|
|
])
|
|
|
|
|
|
|
|
|
|
def categories(self):
|
|
|
|
|
return categories
|
|
|
|
|
], categories=[str(i) for i in range(10)])
|
|
|
|
|
|
|
|
|
|
class DstExtractor(Extractor):
|
|
|
|
|
def __iter__(self):
|
|
|
|
|
return iter([
|
|
|
|
|
target_dataset = Dataset.from_iterable([
|
|
|
|
|
DatasetItem(id=1, image=np.zeros((6, 10, 3)),
|
|
|
|
|
annotations=[
|
|
|
|
|
Mask(np.array([
|
|
|
|
|
@ -231,25 +195,16 @@ class CocoConverterTest(TestCase):
|
|
|
|
|
attributes={ 'is_crowd': False }),
|
|
|
|
|
], attributes={'id': 1}
|
|
|
|
|
),
|
|
|
|
|
])
|
|
|
|
|
|
|
|
|
|
def categories(self):
|
|
|
|
|
return categories
|
|
|
|
|
], categories=[str(i) for i in range(10)])
|
|
|
|
|
|
|
|
|
|
with TestDir() as test_dir:
|
|
|
|
|
self._test_save_and_load(SrcExtractor(),
|
|
|
|
|
self._test_save_and_load(source_dataset,
|
|
|
|
|
CocoInstancesConverter.convert, test_dir,
|
|
|
|
|
importer_args={'merge_instance_polygons': True},
|
|
|
|
|
target_dataset=DstExtractor())
|
|
|
|
|
target_dataset=target_dataset)
|
|
|
|
|
|
|
|
|
|
def test_can_crop_covered_segments(self):
|
|
|
|
|
label_categories = LabelCategories()
|
|
|
|
|
for i in range(10):
|
|
|
|
|
label_categories.add(str(i))
|
|
|
|
|
|
|
|
|
|
class SrcTestExtractor(Extractor):
|
|
|
|
|
def __iter__(self):
|
|
|
|
|
return iter([
|
|
|
|
|
source_dataset = Dataset.from_iterable([
|
|
|
|
|
DatasetItem(id=1, image=np.zeros((5, 5, 3)),
|
|
|
|
|
annotations=[
|
|
|
|
|
Mask(np.array([
|
|
|
|
|
@ -264,14 +219,9 @@ class CocoConverterTest(TestCase):
|
|
|
|
|
label=1, id=2, z_order=1),
|
|
|
|
|
]
|
|
|
|
|
),
|
|
|
|
|
])
|
|
|
|
|
], categories=[str(i) for i in range(10)])
|
|
|
|
|
|
|
|
|
|
def categories(self):
|
|
|
|
|
return { AnnotationType.label: label_categories }
|
|
|
|
|
|
|
|
|
|
class DstTestExtractor(Extractor):
|
|
|
|
|
def __iter__(self):
|
|
|
|
|
return iter([
|
|
|
|
|
target_dataset = Dataset.from_iterable([
|
|
|
|
|
DatasetItem(id=1, image=np.zeros((5, 5, 3)),
|
|
|
|
|
annotations=[
|
|
|
|
|
Mask(np.array([
|
|
|
|
|
@ -289,24 +239,15 @@ class CocoConverterTest(TestCase):
|
|
|
|
|
attributes={ 'is_crowd': False }),
|
|
|
|
|
], attributes={'id': 1}
|
|
|
|
|
),
|
|
|
|
|
])
|
|
|
|
|
|
|
|
|
|
def categories(self):
|
|
|
|
|
return { AnnotationType.label: label_categories }
|
|
|
|
|
], categories=[str(i) for i in range(10)])
|
|
|
|
|
|
|
|
|
|
with TestDir() as test_dir:
|
|
|
|
|
self._test_save_and_load(SrcTestExtractor(),
|
|
|
|
|
self._test_save_and_load(source_dataset,
|
|
|
|
|
partial(CocoInstancesConverter.convert, crop_covered=True),
|
|
|
|
|
test_dir, target_dataset=DstTestExtractor())
|
|
|
|
|
test_dir, target_dataset=target_dataset)
|
|
|
|
|
|
|
|
|
|
def test_can_convert_polygons_to_mask(self):
|
|
|
|
|
label_categories = LabelCategories()
|
|
|
|
|
for i in range(10):
|
|
|
|
|
label_categories.add(str(i))
|
|
|
|
|
|
|
|
|
|
class SrcTestExtractor(Extractor):
|
|
|
|
|
def __iter__(self):
|
|
|
|
|
return iter([
|
|
|
|
|
source_dataset = Dataset.from_iterable([
|
|
|
|
|
DatasetItem(id=1, image=np.zeros((6, 10, 3)),
|
|
|
|
|
annotations=[
|
|
|
|
|
Polygon([0, 0, 4, 0, 4, 4],
|
|
|
|
|
@ -315,14 +256,9 @@ class CocoConverterTest(TestCase):
|
|
|
|
|
label=3, id=4, group=4),
|
|
|
|
|
]
|
|
|
|
|
),
|
|
|
|
|
])
|
|
|
|
|
], categories=[str(i) for i in range(10)])
|
|
|
|
|
|
|
|
|
|
def categories(self):
|
|
|
|
|
return { AnnotationType.label: label_categories }
|
|
|
|
|
|
|
|
|
|
class DstTestExtractor(Extractor):
|
|
|
|
|
def __iter__(self):
|
|
|
|
|
return iter([
|
|
|
|
|
target_dataset = Dataset.from_iterable([
|
|
|
|
|
DatasetItem(id=1, image=np.zeros((6, 10, 3)),
|
|
|
|
|
annotations=[
|
|
|
|
|
Mask(np.array([
|
|
|
|
|
@ -339,24 +275,15 @@ class CocoConverterTest(TestCase):
|
|
|
|
|
label=3, id=4, group=4),
|
|
|
|
|
], attributes={'id': 1}
|
|
|
|
|
),
|
|
|
|
|
])
|
|
|
|
|
|
|
|
|
|
def categories(self):
|
|
|
|
|
return { AnnotationType.label: label_categories }
|
|
|
|
|
], categories=[str(i) for i in range(10)])
|
|
|
|
|
|
|
|
|
|
with TestDir() as test_dir:
|
|
|
|
|
self._test_save_and_load(SrcTestExtractor(),
|
|
|
|
|
self._test_save_and_load(source_dataset,
|
|
|
|
|
partial(CocoInstancesConverter.convert, segmentation_mode='mask'),
|
|
|
|
|
test_dir, target_dataset=DstTestExtractor())
|
|
|
|
|
test_dir, target_dataset=target_dataset)
|
|
|
|
|
|
|
|
|
|
def test_can_convert_masks_to_polygons(self):
|
|
|
|
|
label_categories = LabelCategories()
|
|
|
|
|
for i in range(10):
|
|
|
|
|
label_categories.add(str(i))
|
|
|
|
|
|
|
|
|
|
class SrcExtractor(Extractor):
|
|
|
|
|
def __iter__(self):
|
|
|
|
|
return iter([
|
|
|
|
|
source_dataset = Dataset.from_iterable([
|
|
|
|
|
DatasetItem(id=1, image=np.zeros((5, 10, 3)),
|
|
|
|
|
annotations=[
|
|
|
|
|
Mask(np.array([
|
|
|
|
|
@ -369,14 +296,9 @@ class CocoConverterTest(TestCase):
|
|
|
|
|
label=3, id=4, group=4),
|
|
|
|
|
]
|
|
|
|
|
),
|
|
|
|
|
])
|
|
|
|
|
|
|
|
|
|
def categories(self):
|
|
|
|
|
return { AnnotationType.label: label_categories }
|
|
|
|
|
], categories=[str(i) for i in range(10)])
|
|
|
|
|
|
|
|
|
|
class DstExtractor(Extractor):
|
|
|
|
|
def __iter__(self):
|
|
|
|
|
return iter([
|
|
|
|
|
target_dataset = Dataset.from_iterable([
|
|
|
|
|
DatasetItem(id=1, image=np.zeros((5, 10, 3)),
|
|
|
|
|
annotations=[
|
|
|
|
|
Polygon(
|
|
|
|
|
@ -389,20 +311,16 @@ class CocoConverterTest(TestCase):
|
|
|
|
|
attributes={ 'is_crowd': False }),
|
|
|
|
|
], attributes={'id': 1}
|
|
|
|
|
),
|
|
|
|
|
])
|
|
|
|
|
|
|
|
|
|
def categories(self):
|
|
|
|
|
return { AnnotationType.label: label_categories }
|
|
|
|
|
], categories=[str(i) for i in range(10)])
|
|
|
|
|
|
|
|
|
|
with TestDir() as test_dir:
|
|
|
|
|
self._test_save_and_load(SrcExtractor(),
|
|
|
|
|
self._test_save_and_load(source_dataset,
|
|
|
|
|
partial(CocoInstancesConverter.convert, segmentation_mode='polygons'),
|
|
|
|
|
test_dir, target_dataset=DstExtractor())
|
|
|
|
|
test_dir,
|
|
|
|
|
target_dataset=target_dataset)
|
|
|
|
|
|
|
|
|
|
def test_can_save_and_load_images(self):
|
|
|
|
|
class TestExtractor(Extractor):
|
|
|
|
|
def __iter__(self):
|
|
|
|
|
return iter([
|
|
|
|
|
expected_dataset = Dataset.from_iterable([
|
|
|
|
|
DatasetItem(id=1, subset='train', attributes={'id': 1}),
|
|
|
|
|
DatasetItem(id=2, subset='train', attributes={'id': 2}),
|
|
|
|
|
|
|
|
|
|
@ -414,47 +332,25 @@ class CocoConverterTest(TestCase):
|
|
|
|
|
])
|
|
|
|
|
|
|
|
|
|
with TestDir() as test_dir:
|
|
|
|
|
self._test_save_and_load(TestExtractor(),
|
|
|
|
|
self._test_save_and_load(expected_dataset,
|
|
|
|
|
CocoImageInfoConverter.convert, test_dir)
|
|
|
|
|
|
|
|
|
|
def test_can_save_and_load_labels(self):
|
|
|
|
|
class TestExtractor(Extractor):
|
|
|
|
|
def __iter__(self):
|
|
|
|
|
return iter([
|
|
|
|
|
expected_dataset = Dataset.from_iterable([
|
|
|
|
|
DatasetItem(id=1, subset='train',
|
|
|
|
|
annotations=[
|
|
|
|
|
Label(4, id=1, group=1),
|
|
|
|
|
Label(9, id=2, group=2),
|
|
|
|
|
], attributes={'id': 1}
|
|
|
|
|
),
|
|
|
|
|
])
|
|
|
|
|
|
|
|
|
|
def categories(self):
|
|
|
|
|
label_categories = LabelCategories()
|
|
|
|
|
for i in range(10):
|
|
|
|
|
label_categories.add(str(i))
|
|
|
|
|
return {
|
|
|
|
|
AnnotationType.label: label_categories,
|
|
|
|
|
}
|
|
|
|
|
], attributes={'id': 1}),
|
|
|
|
|
], categories=[str(i) for i in range(10)])
|
|
|
|
|
|
|
|
|
|
with TestDir() as test_dir:
|
|
|
|
|
self._test_save_and_load(TestExtractor(),
|
|
|
|
|
self._test_save_and_load(expected_dataset,
|
|
|
|
|
CocoLabelsConverter.convert, test_dir)
|
|
|
|
|
|
|
|
|
|
def test_can_save_and_load_keypoints(self):
|
|
|
|
|
label_categories = LabelCategories()
|
|
|
|
|
points_categories = PointsCategories()
|
|
|
|
|
for i in range(10):
|
|
|
|
|
label_categories.add(str(i))
|
|
|
|
|
points_categories.add(i, joints=[[0, 1], [1, 2]])
|
|
|
|
|
categories = {
|
|
|
|
|
AnnotationType.label: label_categories,
|
|
|
|
|
AnnotationType.points: points_categories,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
class TestExtractor(Extractor):
|
|
|
|
|
def __iter__(self):
|
|
|
|
|
return iter([
|
|
|
|
|
|
|
|
|
|
source_dataset = Dataset.from_iterable([
|
|
|
|
|
DatasetItem(id=1, subset='train', image=np.zeros((5, 5, 3)),
|
|
|
|
|
annotations=[
|
|
|
|
|
# Full instance annotations: polygon + keypoints
|
|
|
|
|
@ -475,15 +371,16 @@ class CocoConverterTest(TestCase):
|
|
|
|
|
|
|
|
|
|
# Solitary keypoints with no label
|
|
|
|
|
Points([0, 0, 1, 2, 3, 4], [0, 1, 2], id=5),
|
|
|
|
|
])
|
|
|
|
|
])
|
|
|
|
|
|
|
|
|
|
def categories(self):
|
|
|
|
|
return categories
|
|
|
|
|
]),
|
|
|
|
|
], categories={
|
|
|
|
|
AnnotationType.label: LabelCategories.from_iterable(
|
|
|
|
|
str(i) for i in range(10)),
|
|
|
|
|
AnnotationType.points: PointsCategories.from_iterable(
|
|
|
|
|
(i, None, [[0, 1], [1, 2]]) for i in range(10)
|
|
|
|
|
),
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
class DstTestExtractor(TestExtractor):
|
|
|
|
|
def __iter__(self):
|
|
|
|
|
return iter([
|
|
|
|
|
target_dataset = Dataset.from_iterable([
|
|
|
|
|
DatasetItem(id=1, subset='train', image=np.zeros((5, 5, 3)),
|
|
|
|
|
annotations=[
|
|
|
|
|
Points([0, 0, 0, 2, 4, 1], [0, 1, 2],
|
|
|
|
|
@ -514,41 +411,41 @@ class CocoConverterTest(TestCase):
|
|
|
|
|
group=5, id=5,
|
|
|
|
|
attributes={'is_crowd': False}),
|
|
|
|
|
], attributes={'id': 1}),
|
|
|
|
|
])
|
|
|
|
|
], categories={
|
|
|
|
|
AnnotationType.label: LabelCategories.from_iterable(
|
|
|
|
|
str(i) for i in range(10)),
|
|
|
|
|
AnnotationType.points: PointsCategories.from_iterable(
|
|
|
|
|
(i, None, [[0, 1], [1, 2]]) for i in range(10)
|
|
|
|
|
),
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
with TestDir() as test_dir:
|
|
|
|
|
self._test_save_and_load(TestExtractor(),
|
|
|
|
|
self._test_save_and_load(source_dataset,
|
|
|
|
|
CocoPersonKeypointsConverter.convert, test_dir,
|
|
|
|
|
target_dataset=DstTestExtractor())
|
|
|
|
|
target_dataset=target_dataset)
|
|
|
|
|
|
|
|
|
|
def test_can_save_dataset_with_no_subsets(self):
|
|
|
|
|
class TestExtractor(Extractor):
|
|
|
|
|
def __iter__(self):
|
|
|
|
|
return iter([
|
|
|
|
|
test_dataset = Dataset.from_iterable([
|
|
|
|
|
DatasetItem(id=1, attributes={'id': 1}),
|
|
|
|
|
DatasetItem(id=2, attributes={'id': 2}),
|
|
|
|
|
])
|
|
|
|
|
|
|
|
|
|
with TestDir() as test_dir:
|
|
|
|
|
self._test_save_and_load(TestExtractor(),
|
|
|
|
|
self._test_save_and_load(test_dataset,
|
|
|
|
|
CocoConverter.convert, test_dir)
|
|
|
|
|
|
|
|
|
|
def test_can_save_dataset_with_image_info(self):
|
|
|
|
|
class TestExtractor(Extractor):
|
|
|
|
|
def __iter__(self):
|
|
|
|
|
return iter([
|
|
|
|
|
expected_dataset = Dataset.from_iterable([
|
|
|
|
|
DatasetItem(id=1, image=Image(path='1.jpg', size=(10, 15)),
|
|
|
|
|
attributes={'id': 1}),
|
|
|
|
|
])
|
|
|
|
|
|
|
|
|
|
with TestDir() as test_dir:
|
|
|
|
|
self._test_save_and_load(TestExtractor(),
|
|
|
|
|
self._test_save_and_load(expected_dataset,
|
|
|
|
|
CocoImageInfoConverter.convert, test_dir)
|
|
|
|
|
|
|
|
|
|
def test_relative_paths(self):
|
|
|
|
|
class TestExtractor(Extractor):
|
|
|
|
|
def __iter__(self):
|
|
|
|
|
return iter([
|
|
|
|
|
expected_dataset = Dataset.from_iterable([
|
|
|
|
|
DatasetItem(id='1', image=np.ones((4, 2, 3)),
|
|
|
|
|
attributes={'id': 1}),
|
|
|
|
|
DatasetItem(id='subdir1/1', image=np.ones((2, 6, 3)),
|
|
|
|
|
@ -558,39 +455,27 @@ class CocoConverterTest(TestCase):
|
|
|
|
|
])
|
|
|
|
|
|
|
|
|
|
with TestDir() as test_dir:
|
|
|
|
|
self._test_save_and_load(TestExtractor(),
|
|
|
|
|
partial(CocoImageInfoConverter.convert, save_images=True),
|
|
|
|
|
test_dir)
|
|
|
|
|
self._test_save_and_load(expected_dataset,
|
|
|
|
|
partial(CocoImageInfoConverter.convert, save_images=True), test_dir)
|
|
|
|
|
|
|
|
|
|
def test_preserve_coco_ids(self):
|
|
|
|
|
class TestExtractor(Extractor):
|
|
|
|
|
def __iter__(self):
|
|
|
|
|
return iter([
|
|
|
|
|
expected_dataset = Dataset.from_iterable([
|
|
|
|
|
DatasetItem(id='some/name1', image=np.ones((4, 2, 3)),
|
|
|
|
|
attributes={'id': 40}),
|
|
|
|
|
])
|
|
|
|
|
|
|
|
|
|
with TestDir() as test_dir:
|
|
|
|
|
self._test_save_and_load(TestExtractor(),
|
|
|
|
|
partial(CocoImageInfoConverter.convert, save_images=True),
|
|
|
|
|
test_dir)
|
|
|
|
|
self._test_save_and_load(expected_dataset,
|
|
|
|
|
partial(CocoImageInfoConverter.convert, save_images=True), test_dir)
|
|
|
|
|
|
|
|
|
|
def test_annotation_attributes(self):
|
|
|
|
|
class TestExtractor(Extractor):
|
|
|
|
|
def __iter__(self):
|
|
|
|
|
return iter([
|
|
|
|
|
expected_dataset = Dataset.from_iterable([
|
|
|
|
|
DatasetItem(id=1, image=np.ones((4, 2, 3)), annotations=[
|
|
|
|
|
Polygon([0, 0, 4, 0, 4, 4], label=5, group=1, id=1,
|
|
|
|
|
attributes={'is_crowd': False, 'x': 5, 'y': 'abc'}),
|
|
|
|
|
], attributes={'id': 1})
|
|
|
|
|
])
|
|
|
|
|
|
|
|
|
|
def categories(self):
|
|
|
|
|
label_categories = LabelCategories()
|
|
|
|
|
for i in range(10):
|
|
|
|
|
label_categories.add(str(i))
|
|
|
|
|
return { AnnotationType.label: label_categories, }
|
|
|
|
|
], categories=[str(i) for i in range(10)])
|
|
|
|
|
|
|
|
|
|
with TestDir() as test_dir:
|
|
|
|
|
self._test_save_and_load(TestExtractor(),
|
|
|
|
|
self._test_save_and_load(expected_dataset,
|
|
|
|
|
CocoConverter.convert, test_dir)
|
|
|
|
|
|