Dataclasses defining the COCO dataset and how to convert it to/from a dict.
%load_ext autoreload
%autoreload 2
coco_info_dict = {
'year': 2020,
'version': 'v1',
'description': 'desc',
'contributor': 'me',
'url': 'http://url',
}
coco_info = CocoInfo.from_dict(coco_info_dict)
coco_info_dict2 = coco_info.to_dict_skip_nulls()
display(coco_info)
display(coco_info_dict2)
assert coco_info_dict2 == coco_info_dict, coco_info_dict2
assert coco_info.collection_name == 'info'
assert coco_info.is_valid()
coco_license_dict = {
'id': '1',
'name': 'Attribution-NonCommercial-NoDerivatives 4.0 International',
'url': 'https://creativecommons.org/licenses/by-nc-nd/4.0/',
}
coco_license = CocoLicense.from_dict(coco_license_dict)
coco_license_dict2 = coco_license.to_dict_skip_nulls()
display(coco_license)
display(coco_license_dict2)
assert coco_license.is_valid()
assert coco_license_dict2 == coco_license_dict, coco_license_dict2
assert coco_license.collection_name == 'licenses'
# --
# test minimal required fields
assert CocoLicense.from_dict({'id': 2, 'name': 'Apache 2.0'}) == CocoLicense(id=2, name='Apache 2.0')
coco_image_dict = {
'id': '204800',
'license': 1,
'coco_url': 'https://outforz.s3.amazonaws.com/media/public/content/2021/01/10/e2e76667-f7e.jpg',
'width': 1920,
'height': 2560,
'file_name': 'e2e76667-f7e.jpg',
'date_captured': '2021-01-05 13:18:13',
}
coco_image = CocoImage.from_dict(coco_image_dict)
display(coco_image)
assert coco_image.is_valid()
assert coco_image.to_dict_skip_nulls() == coco_image_dict, coco_image.to_dict_skip_nulls()
assert coco_image.collection_name == 'images'
# --
# test minimal required fields
assert CocoImage.from_dict({'id': 2, 'coco_url': 'http://image'}) == CocoImage(id=2, coco_url='http://image')
assert CocoImage(id=1, coco_url='http://abc.com/keks.jpg').get_file_name() == 'keks.jpg'
c = CocoObjectDetectionAnnotation(id=1, image_id=2, category_id=3, bbox=[])
assert not c.is_valid()
c = replace(c, bbox=[1, -2, 3, 4])
assert not c.is_valid()
c = replace(c, bbox=[1, 2, 3, 4])
assert c.is_valid()
c = CocoObjectDetectionCategory(id='12345678', name='Бреф Кольорова вода Евкаліпт НОВИНКА!!! 50 г')
assert c.is_valid()
a = c.get_dir_name()
assert a == 'Бреф_Кольорова_вода_Евкаліпт_НОВИНКА_50_г--12345678', a
non_col = CocoDataset.get_non_collective_elements()
col = CocoDataset.get_collective_elements()
assert non_col == ['info'], non_col
assert col == ['annotations', 'images', 'licenses'], col
non_col = CocoObjectDetectionDataset.get_non_collective_elements()
col = CocoObjectDetectionDataset.get_collective_elements()
assert non_col == ['info'], non_col
assert col == ['annotations', 'categories', 'images', 'licenses'], col
dataset = CocoObjectDetectionDataset(
info=CocoInfo(year=2017, version='1.0', description='COCO 2017 Dataset', contributor='COCO Consortium', url='http://cocodataset.org', date_created='2017/09/01'),
images=[CocoImage(id='362343', coco_url='http://image')],
annotations=[
CocoObjectDetectionAnnotation(id='402717', image_id='362343', category_id='10', bbox=(196.7, 254.52, 9.89, 23.19), iscrowd=0),
],
categories=[CocoObjectDetectionCategory(id='10', name="person")],
)
assert dataset.is_valid()
dataset.to_dict_skip_nulls()
dataset2 = CocoObjectDetectionDataset.from_dict(dataset.to_dict())
assert dataset2 == dataset, display(dataset2, dataset)
dataset.to_full_str()
d = {'info': {'year': 2017,
'version': '1.0',
'description': 'COCO 2017 Dataset',
'contributor': 'COCO Consortium',
'url': 'http://cocodataset.org',
'date_created': '2017/09/01'},
'images': [
{'id': '204800',
'width': 1920,
'height': 2560,
'file_name': 'e2e76667-f7e.jpg',
'license': 1,
'coco_url': 'https://e2e76667-f7e.jpg',
'date_captured': '2021-01-05 13:18:13'},
],
'annotations': [{'id': '402717',
'image_id': '362343',
'category_id': '10',
'bbox': (196.7, 254.52, 9.89, 23.19),
'iscrowd': 0}],
'categories':[]}
CocoObjectDetectionDataset.from_dict(d)
raw = {
"id": '204800',
"license": 1,
"coco_url": "https://e2e76667-f7e.jpg",
"width": 1920,
"height": 2560,
"file_name": "e2e76667-f7e.jpg",
"date_captured": "2021-01-05 13:18:13"
}
display(CocoImage.from_dict(raw))
del raw["date_captured"]
display(CocoImage.from_dict(raw))
del raw["id"]
try:
display(CocoImage.from_dict(raw))
except KeyError:
pass
else:
assert False, "no exception"
get_dataset_class("object_detection")
d1 = {
'info': {},
'licenses': [],
'images': [
{'id': '1', 'coco_url': 'https://image1.jpg'}
],
'annotations': [
{'id': '10', 'image_id': '1', 'category_id': '1', 'bbox': (4,3,2,1)}
],
'categories': [
{'id': '1', 'name': 'human'}
]
}
d2 = {
'info': {},
'licenses': [],
'images': [
{'id': '1', 'coco_url': 'https://image1.jpg'},
{'id': '2', 'coco_url': 'https://image2.jpg'}
],
'annotations': [
{'id': '10', 'image_id': '1', 'category_id': '1', 'bbox': (4,3,2,1)},
{'id': '11', 'image_id': '2', 'category_id': '2', 'bbox': (1,2,3,4)}
],
'categories': [
{'id': '2', 'name': 'animal'}
]
}
d_res = merge_datasets(CocoObjectDetectionDataset.from_dict(d1),
CocoObjectDetectionDataset.from_dict(d2))
res = d_res.to_dict_skip_nulls()
display(res)
assert res == {'images': [{'id': '1', 'coco_url': 'https://image1.jpg'},
{'id': '2', 'coco_url': 'https://image2.jpg'}],
'info': {},
'licenses': [],
'annotations': [{'id': '10',
'image_id': '1',
'category_id': '1',
'bbox': (4, 3, 2, 1)},
{'id': '11', 'image_id': '2', 'category_id': '2', 'bbox': (1, 2, 3, 4)}],
'categories': [{'id': '1', 'name': 'human'}, {'id': '2', 'name': 'animal'}]}, res
d2['annotations'][0]['bbox'] = (100, 101, 102, 103)
assert d1['annotations'][0]['id'] == d2['annotations'][0]['id'] \
and d2['annotations'][0]['bbox'] != d1['annotations'][0]['bbox']
try:
d_res = merge_datasets(CocoObjectDetectionDataset.from_dict(d1),
CocoObjectDetectionDataset.from_dict(d2))
except ValueError:
pass
else:
assert False, 'test failed'
expected_merge_update_result = {
'info': {},
'licenses': [],
'images': [
{'id': '1', 'coco_url': 'https://image1.jpg'},
{'id': '2', 'coco_url': 'https://image2.jpg'}
],
'annotations': [
{'id': '10', 'image_id': '1', 'category_id': '1', 'bbox': (100, 101, 102, 103)},
{'id': '11', 'image_id': '2', 'category_id': '2', 'bbox': (1, 2, 3, 4)}
],
'categories': [
{'id': '1', 'name': 'human'},
{'id': '2', 'name': 'animal'}
]
}
actual_merge_update_result = merge_datasets(
CocoObjectDetectionDataset.from_dict(d1),
CocoObjectDetectionDataset.from_dict(d2),
update=True
).to_dict_skip_nulls()
assert actual_merge_update_result == expected_merge_update_result, actual_merge_update_result
assert merge_datasets(None, CocoObjectDetectionDataset.from_dict(d2)) == CocoObjectDetectionDataset.from_dict(d2)
a = [1,2,3,4,5]
b = shuffle(a)
a, b
res = cut_annotations_per_category(
CocoObjectDetectionDataset.from_dict(
{'info': {},
'images': [{'id': '1', 'coco_url': 'https://image1.jpg'}],
'annotations': [
{'id': '10', 'image_id': '1', 'category_id': '1', 'bbox': (4,3,2,1)},
{'id': '11', 'image_id': '1', 'category_id': '1', 'bbox': (4,3,2,1)},
{'id': '12', 'image_id': '1', 'category_id': '2', 'bbox': (4,3,2,1)},
{'id': '13', 'image_id': '1', 'category_id': '2', 'bbox': (4,3,2,1)},
],
'categories': [
{'id': '1', 'name': 'animal'},
{'id': '2', 'name': 'animal'},
]}
),
max_annotations_per_category=1
)
assert len(res.annotations) == 2, res.to_dict_skip_nulls()
d = {'info': {},
'images': [{'id': '1', 'coco_url': 'https://image1.jpg'},
{'id': '', 'coco_url': 'https://image2.jpg'},
{'id': '2', 'coco_url': ''},
{'id': '3','coco_url': 'https://valid-but-unused'},
],
'annotations': [
{'id': '10',
'image_id': '1',
'category_id': '1',
'bbox': (4,3,2,1)},
{'id': '',
'image_id': '2',
'category_id': '1',
'bbox': (1,2,3,4)},
{'id': 'ANN-01',
'image_id': '1',
'category_id': '1',
'bbox': (1,2,3,4)},
{'id': '3',
'image_id': '2',
'category_id': '',
'bbox': (1,2,3,4)},
{'id': '4',
'image_id': '2',
'category_id': '2',
'bbox': (1,2,3,0)},
{'id': '5',
'image_id': '2',
'category_id': '2',
'bbox': (1,2,-2,4)},
],
'categories': [
{'id': '1', 'name': 'animal'},
{'id': '', 'name': 'nobody'},
]}
c = CocoObjectDetectionDataset.from_dict(d)
c2 = remove_invalid_elements(c)
d2 = c2.to_dict_skip_nulls()
assert d2 == {
'annotations': [
{
'id': '10',
'image_id': '1',
'category_id': '1',
'bbox': (4, 3, 2, 1)
},
{
'id': 'ANN-01',
'image_id': '1',
'category_id': '1',
'bbox': (1,2,3,4)
},
],
'images': [
{'id': '1', 'coco_url': 'https://image1.jpg'}],
'info': {},
'licenses': [],
'categories': [{'id': '1', 'name': 'animal'}],
}, d2