Spaces:
Sleeping
Sleeping
from mmdet.registry import DATASETS | |
from mmdet.datasets.coco_panoptic import CocoPanopticDataset | |
import os.path as osp | |
class CityscapesPanopticDataset(CocoPanopticDataset): | |
"""Cityscapes dataset for Panoptic segmentation. | |
The class names are changed. | |
""" | |
METAINFO = { | |
'classes': | |
( | |
'person', 'rider', 'car', 'truck', 'bus', | |
'train', 'motorcycle', 'bicycle', | |
'road', 'sidewalk', 'building', 'wall', 'fence', | |
'pole', 'traffic light', 'traffic sign', 'vegetation', | |
'terrain', 'sky' | |
), | |
'thing_classes': | |
( | |
'person', 'rider', 'car', 'truck', 'bus', | |
'train', 'motorcycle', 'bicycle' | |
), | |
'stuff_classes': | |
( | |
'road', 'sidewalk', 'building', 'wall', 'fence', | |
'pole', 'traffic light', 'traffic sign', 'vegetation', | |
'terrain', 'sky' | |
), | |
} | |
def parse_data_info(self, raw_data_info: dict) -> dict: | |
"""Parse raw annotation to target format. | |
Args: | |
raw_data_info (dict): Raw data information load from ``ann_file``. | |
Returns: | |
dict: Parsed annotation. | |
""" | |
img_info = raw_data_info['raw_img_info'] | |
ann_info = raw_data_info['raw_ann_info'] | |
# filter out unmatched annotations which have | |
# same segment_id but belong to other image | |
ann_info = [ | |
ann for ann in ann_info if ann['image_id'] == img_info['img_id'] | |
] | |
data_info = {} | |
img_path = osp.join(self.data_prefix['img'], img_info['file_name']) | |
if self.data_prefix.get('seg', None): | |
seg_map_path = osp.join( | |
self.data_prefix['seg'], | |
img_info['file_name'].replace("_leftImg8bit.png", "_panoptic.png") | |
) | |
else: | |
seg_map_path = None | |
data_info['img_path'] = img_path | |
data_info['img_id'] = img_info['img_id'] | |
data_info['seg_map_path'] = seg_map_path | |
data_info['height'] = img_info['height'] | |
data_info['width'] = img_info['width'] | |
if self.return_classes: | |
data_info['text'] = self.metainfo['thing_classes'] | |
data_info['stuff_text'] = self.metainfo['stuff_classes'] | |
data_info['custom_entities'] = True # no important | |
instances = [] | |
segments_info = [] | |
for ann in ann_info: | |
instance = {} | |
x1, y1, w, h = ann['bbox'] | |
if ann['area'] <= 0 or w < 1 or h < 1: | |
continue | |
bbox = [x1, y1, x1 + w, y1 + h] | |
category_id = ann['category_id'] | |
contiguous_cat_id = self.cat2label[category_id] | |
is_thing = self.coco.load_cats(ids=category_id)[0]['isthing'] | |
if is_thing: | |
is_crowd = ann.get('iscrowd', False) | |
instance['bbox'] = bbox | |
instance['bbox_label'] = contiguous_cat_id | |
if not is_crowd: | |
instance['ignore_flag'] = 0 | |
else: | |
instance['ignore_flag'] = 1 | |
is_thing = False | |
segment_info = { | |
'id': ann['id'], | |
'category': contiguous_cat_id, | |
'is_thing': is_thing | |
} | |
segments_info.append(segment_info) | |
if len(instance) > 0 and is_thing: | |
instances.append(instance) | |
data_info['instances'] = instances | |
data_info['segments_info'] = segments_info | |
return data_info | |