init
This commit is contained in:
87
finetune/tools/dataset_converters/pascal_context.py
Normal file
87
finetune/tools/dataset_converters/pascal_context.py
Normal file
@@ -0,0 +1,87 @@
|
||||
# Copyright (c) OpenMMLab. All rights reserved.
|
||||
import argparse
|
||||
import os.path as osp
|
||||
from functools import partial
|
||||
|
||||
import numpy as np
|
||||
from detail import Detail
|
||||
from mmengine.utils import mkdir_or_exist, track_progress
|
||||
from PIL import Image
|
||||
|
||||
_mapping = np.sort(
|
||||
np.array([
|
||||
0, 2, 259, 260, 415, 324, 9, 258, 144, 18, 19, 22, 23, 397, 25, 284,
|
||||
158, 159, 416, 33, 162, 420, 454, 295, 296, 427, 44, 45, 46, 308, 59,
|
||||
440, 445, 31, 232, 65, 354, 424, 68, 326, 72, 458, 34, 207, 80, 355,
|
||||
85, 347, 220, 349, 360, 98, 187, 104, 105, 366, 189, 368, 113, 115
|
||||
]))
|
||||
_key = np.array(range(len(_mapping))).astype('uint8')
|
||||
|
||||
|
||||
def generate_labels(img_id, detail, out_dir):
|
||||
|
||||
def _class_to_index(mask, _mapping, _key):
|
||||
# assert the values
|
||||
values = np.unique(mask)
|
||||
for i in range(len(values)):
|
||||
assert (values[i] in _mapping)
|
||||
index = np.digitize(mask.ravel(), _mapping, right=True)
|
||||
return _key[index].reshape(mask.shape)
|
||||
|
||||
mask = Image.fromarray(
|
||||
_class_to_index(detail.getMask(img_id), _mapping=_mapping, _key=_key))
|
||||
filename = img_id['file_name']
|
||||
mask.save(osp.join(out_dir, filename.replace('jpg', 'png')))
|
||||
return osp.splitext(osp.basename(filename))[0]
|
||||
|
||||
|
||||
def parse_args():
|
||||
parser = argparse.ArgumentParser(
|
||||
description='Convert PASCAL VOC annotations to mmsegmentation format')
|
||||
parser.add_argument('devkit_path', help='pascal voc devkit path')
|
||||
parser.add_argument('json_path', help='annoation json filepath')
|
||||
parser.add_argument('-o', '--out_dir', help='output path')
|
||||
args = parser.parse_args()
|
||||
return args
|
||||
|
||||
|
||||
def main():
|
||||
args = parse_args()
|
||||
devkit_path = args.devkit_path
|
||||
if args.out_dir is None:
|
||||
out_dir = osp.join(devkit_path, 'VOC2010', 'SegmentationClassContext')
|
||||
else:
|
||||
out_dir = args.out_dir
|
||||
json_path = args.json_path
|
||||
mkdir_or_exist(out_dir)
|
||||
img_dir = osp.join(devkit_path, 'VOC2010', 'JPEGImages')
|
||||
|
||||
train_detail = Detail(json_path, img_dir, 'train')
|
||||
train_ids = train_detail.getImgs()
|
||||
|
||||
val_detail = Detail(json_path, img_dir, 'val')
|
||||
val_ids = val_detail.getImgs()
|
||||
|
||||
mkdir_or_exist(
|
||||
osp.join(devkit_path, 'VOC2010/ImageSets/SegmentationContext'))
|
||||
|
||||
train_list = track_progress(
|
||||
partial(generate_labels, detail=train_detail, out_dir=out_dir),
|
||||
train_ids)
|
||||
with open(
|
||||
osp.join(devkit_path, 'VOC2010/ImageSets/SegmentationContext',
|
||||
'train.txt'), 'w') as f:
|
||||
f.writelines(line + '\n' for line in sorted(train_list))
|
||||
|
||||
val_list = track_progress(
|
||||
partial(generate_labels, detail=val_detail, out_dir=out_dir), val_ids)
|
||||
with open(
|
||||
osp.join(devkit_path, 'VOC2010/ImageSets/SegmentationContext',
|
||||
'val.txt'), 'w') as f:
|
||||
f.writelines(line + '\n' for line in sorted(val_list))
|
||||
|
||||
print('Done!')
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
Reference in New Issue
Block a user