123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 |
- #!/usr/bin/env python
- import os.path as osp
- from glob import glob
- from PIL import Image
- from tqdm import tqdm
- from common import (get_default_parser, add_crop_options, crop_patches,
- create_file_list, copy_dataset, create_label_list,
- get_path_tuples)
- # According to the official doc(https://github.com/CAPTAIN-WHU/iSAID_Devkit),
- # the files should be organized as follows:
- #
- # iSAID
- # ├── test
- # │ └── images
- # │ ├── P0006.png
- # │ └── ...
- # │ └── P0009.png
- # ├── train
- # │ └── images
- # │ ├── P0002_instance_color_RGB.png
- # │ ├── P0002_instance_id_RGB.png
- # │ ├── P0002.png
- # │ ├── ...
- # │ ├── P0010_instance_color_RGB.png
- # │ ├── P0010_instance_id_RGB.png
- # │ └── P0010.png
- # └── val
- # └── images
- # ├── P0003_instance_color_RGB.png
- # ├── P0003_instance_id_RGB.png
- # ├── P0003.png
- # ├── ...
- # ├── P0004_instance_color_RGB.png
- # ├── P0004_instance_id_RGB.png
- # └── P0004.png
- CLASSES = ('background', 'ship', 'storage_tank', 'baseball_diamond',
- 'tennis_court', 'basketball_court', 'ground_track_field', 'bridge',
- 'large_vehicle', 'small_vehicle', 'helicopter', 'swimming_pool',
- 'roundabout', 'soccer_ball_field', 'plane', 'harbor')
- # Refer to https://github.com/Z-Zheng/FarSeg/blob/master/data/isaid.py
- COLOR_MAP = [[0, 0, 0], [0, 0, 63], [0, 191, 127], [0, 63, 0], [0, 63, 127],
- [0, 63, 191], [0, 63, 255], [0, 127, 63], [0, 127, 127],
- [0, 0, 127], [0, 0, 191], [0, 0, 255], [0, 63, 63], [0, 127, 191],
- [0, 127, 255], [0, 100, 155]]
- SUBSETS = ('train', 'val')
- SUBDIR = 'images'
- FILE_LIST_PATTERN = "{subset}.txt"
- LABEL_LIST_NAME = "labels.txt"
- URL = ""
- def flatten(nested_list):
- flattened_list = []
- for ele in nested_list:
- if isinstance(ele, list):
- flattened_list.extend(flatten(ele))
- else:
- flattened_list.append(ele)
- return flattened_list
- def rgb2mask(rgb):
- palette = flatten(COLOR_MAP)
- # Pad with zero
- palette = palette + [0] * (256 * 3 - len(palette))
- ref = Image.new(mode='P', size=(1, 1))
- ref.putpalette(palette)
- mask = rgb.quantize(palette=ref, dither=0)
- return mask
- if __name__ == '__main__':
- parser = get_default_parser()
- parser.add_argument(
- '--crop_size', type=int, help="Size of cropped patches.", default=800)
- parser.add_argument(
- '--crop_stride',
- type=int,
- help="Stride of sliding windows when cropping patches. `crop_size` will be used only if `crop_size` is not None.",
- default=600)
- args = parser.parse_args()
- out_dir = osp.join(args.out_dataset_dir,
- osp.basename(osp.normpath(args.in_dataset_dir)))
- assert args.crop_size is not None
- # According to https://github.com/CAPTAIN-WHU/iSAID_Devkit/blob/master/preprocess/split.py
- # Set keep_last=True
- crop_patches(
- args.crop_size,
- args.crop_stride,
- data_dir=args.in_dataset_dir,
- out_dir=out_dir,
- subsets=SUBSETS,
- subdirs=(SUBDIR, ),
- glob_pattern='*.png',
- max_workers=8,
- keep_last=True)
- for subset in SUBSETS:
- path_tuples = []
- print(f"Processing {subset} labels...")
- for im_subdir in tqdm(glob(osp.join(out_dir, subset, SUBDIR, "*/"))):
- im_name = osp.basename(im_subdir[:-1]) # Strip trailing '/'
- if '_' in im_name:
- # Do not process labels
- continue
- mask_subdir = osp.join(out_dir, subset, SUBDIR,
- im_name + '_instance_color_RGB')
- for mask_path in glob(osp.join(mask_subdir, '*.png')):
- # Convert RGB files to mask files (pseudo color)
- rgb = Image.open(mask_path).convert('RGB')
- mask = rgb2mask(rgb)
- # Write to the original location
- mask.save(mask_path)
- path_tuples.extend(
- get_path_tuples(
- im_subdir,
- mask_subdir,
- glob_pattern='*.png',
- data_dir=args.out_dataset_dir))
- path_tuples.sort()
- file_list = osp.join(
- args.out_dataset_dir, FILE_LIST_PATTERN.format(subset=subset))
- create_file_list(file_list, path_tuples)
- print(f"Write file list to {file_list}.")
- label_list = osp.join(args.out_dataset_dir, LABEL_LIST_NAME)
- create_label_list(label_list, CLASSES)
- print(f"Write label list to {label_list}.")
|