in scripts/data_preparation/prepare_cityscapes.py [0:0]
def __call__(self, img_desc):
img_dir, img_id, lbl_cat = img_desc
coco_ann = []
# Load the annotation
with Image.open(path.join(self.msk_base_dir, img_dir, img_id + "_" + lbl_cat + _INSTANCE_EXT)) as lbl_img:
lbl = np.array(lbl_img)
lbl_size = lbl_img.size
ids = np.unique(lbl)
# Compress the labels and compute cat
lbl_out = np.zeros(lbl.shape, np.int32)
cat = [255]
iscrowd = [0]
for city_id in ids:
if city_id < 1000:
# Stuff or group
cls_i = city_id
iscrowd_i = cs_labels[cls_i].hasInstances
else:
# Instance
cls_i = city_id // 1000
iscrowd_i = False
# If it's a void class just skip it
if cs_labels[cls_i].trainId == 255 or cs_labels[cls_i].trainId == -1:
continue
# Extract all necessary information
iss_class_id = cs_labels[cls_i].trainId
iss_instance_id = len(cat)
mask_i = lbl == city_id
# Save ISS format annotation
cat.append(iss_class_id)
iscrowd.append(1 if iscrowd_i else 0)
lbl_out[mask_i] = iss_instance_id
# Compute COCO detection format annotation
if cs_labels[cls_i].hasInstances:
category_info = {"id": iss_class_id, "is_crowd": iscrowd_i}
coco_ann_i = pct.create_annotation_info(
counter.increment(), img_id, category_info, mask_i, lbl_size, tolerance=2)
if coco_ann_i is not None:
coco_ann.append(coco_ann_i)
# COCO detection format image annotation
coco_img = pct.create_image_info(img_id, path.join(img_dir, img_id + _IMAGE_EXT), lbl_size)
# Write output
Image.fromarray(lbl_out).save(path.join(self.msk_dir, img_id + ".png"))
shutil.copy(path.join(self.img_base_dir, img_dir, img_id + _IMAGE_EXT),
path.join(self.img_dir, img_id + ".png"))
img_meta = {
"id": img_id,
"cat": cat,
"size": (lbl_size[1], lbl_size[0]),
"iscrowd": iscrowd
}
return img_meta, coco_img, coco_ann