|
|
|
|
|
import os |
|
|
|
import numpy as np |
|
import tqdm |
|
from skimage import io |
|
from skimage.segmentation import mark_boundaries |
|
|
|
from saicinpainting.evaluation.data import InpaintingDataset |
|
from saicinpainting.evaluation.vis import save_item_for_vis |
|
|
|
def save_mask_for_sidebyside(item, out_file): |
|
mask = item['mask'] |
|
if mask.ndim == 3: |
|
mask = mask[0] |
|
mask = np.clip(mask * 255, 0, 255).astype('uint8') |
|
io.imsave(out_file, mask) |
|
|
|
def save_img_for_sidebyside(item, out_file): |
|
img = np.transpose(item['image'], (1, 2, 0)) |
|
img = np.clip(img * 255, 0, 255).astype('uint8') |
|
io.imsave(out_file, img) |
|
|
|
def save_masked_img_for_sidebyside(item, out_file): |
|
mask = item['mask'] |
|
img = item['image'] |
|
|
|
img = (1-mask) * img + mask |
|
img = np.transpose(img, (1, 2, 0)) |
|
|
|
img = np.clip(img * 255, 0, 255).astype('uint8') |
|
io.imsave(out_file, img) |
|
|
|
def main(args): |
|
dataset = InpaintingDataset(args.datadir, img_suffix='.png') |
|
|
|
area_bins = np.linspace(0, 1, args.area_bins + 1) |
|
|
|
heights = [] |
|
widths = [] |
|
image_areas = [] |
|
hole_areas = [] |
|
hole_area_percents = [] |
|
area_bins_count = np.zeros(args.area_bins) |
|
area_bin_titles = [f'{area_bins[i] * 100:.0f}-{area_bins[i + 1] * 100:.0f}' for i in range(args.area_bins)] |
|
|
|
bin2i = [[] for _ in range(args.area_bins)] |
|
|
|
for i, item in enumerate(tqdm.tqdm(dataset)): |
|
h, w = item['image'].shape[1:] |
|
heights.append(h) |
|
widths.append(w) |
|
full_area = h * w |
|
image_areas.append(full_area) |
|
hole_area = (item['mask'] == 1).sum() |
|
hole_areas.append(hole_area) |
|
hole_percent = hole_area / full_area |
|
hole_area_percents.append(hole_percent) |
|
bin_i = np.clip(np.searchsorted(area_bins, hole_percent) - 1, 0, len(area_bins_count) - 1) |
|
area_bins_count[bin_i] += 1 |
|
bin2i[bin_i].append(i) |
|
|
|
os.makedirs(args.outdir, exist_ok=True) |
|
|
|
for bin_i in range(args.area_bins): |
|
bindir = os.path.join(args.outdir, area_bin_titles[bin_i]) |
|
os.makedirs(bindir, exist_ok=True) |
|
bin_idx = bin2i[bin_i] |
|
for sample_i in np.random.choice(bin_idx, size=min(len(bin_idx), args.samples_n), replace=False): |
|
item = dataset[sample_i] |
|
path = os.path.join(bindir, dataset.img_filenames[sample_i].split('/')[-1]) |
|
save_masked_img_for_sidebyside(item, path) |
|
|
|
|
|
if __name__ == '__main__': |
|
import argparse |
|
|
|
aparser = argparse.ArgumentParser() |
|
aparser.add_argument('--datadir', type=str, |
|
help='Path to folder with images and masks (output of gen_mask_dataset.py)') |
|
aparser.add_argument('--outdir', type=str, help='Where to put results') |
|
aparser.add_argument('--samples-n', type=int, default=10, |
|
help='Number of sample images with masks to copy for visualization for each area bin') |
|
aparser.add_argument('--area-bins', type=int, default=10, help='How many area bins to have') |
|
|
|
main(aparser.parse_args()) |
|
|