def convert_single_core(proc_id, image_set, categories, source_folder, segmentations_folder, VOID=0): annotations = [] for working_idx, image_info in enumerate(image_set): if working_idx % 100 == 0: print('Core: {}, {} from {} images converted'.format( proc_id, working_idx, len(image_set))) file_name = '{}.png'.format(image_info['file_name'].rsplit('.')[0]) try: original_format = np.array(Image.open( os.path.join(source_folder, file_name)), dtype=np.uint32) except IOError: raise KeyError('no prediction png file for id: {}'.format( image_info['id'])) pan = OFFSET * original_format[:, :, 0] + original_format[:, :, 1] pan_format = np.zeros( (original_format.shape[0], original_format.shape[1], 3), dtype=np.uint8) id_generator = IdGenerator(categories) l = np.unique(pan) segm_info = [] for el in l: sem = el // OFFSET if sem == VOID: continue if sem not in categories: raise KeyError('Unknown semantic label {}'.format(sem)) mask = pan == el segment_id, color = id_generator.get_id_and_color(sem) pan_format[mask] = color segm_info.append({"id": int(segment_id), "category_id": int(sem)}) annotations.append({ 'image_id': image_info['id'], 'file_name': file_name, "segments_info": segm_info }) Image.fromarray(pan_format).save( os.path.join(segmentations_folder, file_name)) print('Core: {}, all {} images processed'.format(proc_id, len(image_set))) return annotations
def convert_detection_to_panoptic_coco_format_single_core( proc_id, coco_detection, img_ids, categories, segmentations_folder): id_generator = IdGenerator(categories) annotations_panoptic = [] for working_idx, img_id in enumerate(img_ids): if working_idx % 100 == 0: print('Core: {}, {} from {} images processed'.format( proc_id, working_idx, len(img_ids))) img = coco_detection.loadImgs(int(img_id))[0] pan_format = np.zeros((img['height'], img['width'], 3), dtype=np.uint8) overlaps_map = np.zeros((img['height'], img['width']), dtype=np.uint32) anns_ids = coco_detection.getAnnIds(img_id) anns = coco_detection.loadAnns(anns_ids) panoptic_record = {} panoptic_record['image_id'] = img_id file_name = '{}.png'.format(img['file_name'].rsplit('.')[0]) panoptic_record['file_name'] = file_name segments_info = [] for ann in anns: if ann['category_id'] not in categories: raise Exception( 'Panoptic coco categories file does not contain \ category with id: {}'.format(ann['category_id'])) segment_id, color = id_generator.get_id_and_color( ann['category_id']) mask = coco_detection.annToMask(ann) overlaps_map += mask pan_format[mask == 1] = color ann.pop('segmentation') ann.pop('image_id') ann['id'] = segment_id segments_info.append(ann) if np.sum(overlaps_map > 1) != 0: raise Exception( "Segments for image {} overlap each other.".format(img_id)) panoptic_record['segments_info'] = segments_info annotations_panoptic.append(panoptic_record) Image.fromarray(pan_format).save( os.path.join(segmentations_folder, file_name)) print('Core: {}, all {} images processed'.format(proc_id, len(img_ids))) return annotations_panoptic
def panoptic_converter(original_format_folder, out_folder, out_file): if not os.path.isdir(out_folder): print("Creating folder {} for panoptic segmentation PNGs".format( out_folder)) os.mkdir(out_folder) categories = [] for idx, el in enumerate(labels): if el.ignoreInEval: continue categories.append({ 'id': el.id, 'name': el.name, 'color': el.color, 'supercategory': el.category, 'isthing': 1 if el.hasInstances else 0 }) categories_dict = {cat['id']: cat for cat in categories} file_list = sorted( glob.glob( os.path.join(original_format_folder, '*/*_gtFine_instanceIds.png'))) images = [] annotations = [] for working_idx, f in enumerate(file_list): if working_idx % 10 == 0: print(working_idx, len(file_list)) original_format = np.array(Image.open(f)) file_name = f.split('/')[-1] image_id = file_name.rsplit('_', 2)[0] image_filename = '{}_leftImg8bit.png'.format(image_id) # image entry, id for image is its filename without extension images.append({ "id": image_id, "width": original_format.shape[1], "height": original_format.shape[0], "file_name": image_filename }) pan_format = np.zeros( (original_format.shape[0], original_format.shape[1], 3), dtype=np.uint8) id_generator = IdGenerator(categories_dict) idx = 0 l = np.unique(original_format) segm_info = [] for el in l: if el < 1000: semantic_id = el is_crowd = 1 else: semantic_id = el // 1000 is_crowd = 0 if semantic_id not in categories_dict: continue if categories_dict[semantic_id]['isthing'] == 0: is_crowd = 0 mask = original_format == el segment_id, color = id_generator.get_id_and_color(semantic_id) pan_format[mask] = color area = np.sum(mask) # segment area computation # bbox computation for a segment hor = np.sum(mask, axis=0) hor_idx = np.nonzero(hor)[0] x = hor_idx[0] width = hor_idx[-1] - x + 1 vert = np.sum(mask, axis=1) vert_idx = np.nonzero(vert)[0] y = vert_idx[0] height = vert_idx[-1] - y + 1 bbox = [x, y, width, height] segm_info.append({ "id": int(segment_id), "category_id": int(semantic_id), "area": area, "bbox": bbox, "iscrowd": is_crowd }) annotations.append({ 'image_id': image_id, 'file_name': file_name, "segments_info": segm_info }) Image.fromarray(pan_format).save(os.path.join(out_folder, file_name)) d = { 'images': images, 'annotations': annotations, 'categories': categories, } with open(out_file, 'w') as f: json.dump(d, f)