""" python generate_imagematte_with_background_image.py \ --imagematte-dir ../matting-data/Distinctions/test \ --background-dir ../matting-data/Backgrounds/valid \ --resolution 512 \ --out-dir ../matting-data/evaluation/distinction_static_sd/ \ --random-seed 10 Seed: 10 - distinction-static 11 - distinction-motion 12 - adobe-static 13 - adobe-motion """ import argparse import os import pims import numpy as np import random from PIL import Image from tqdm import tqdm from tqdm.contrib.concurrent import process_map from torchvision import transforms from torchvision.transforms import functional as F parser = argparse.ArgumentParser() parser.add_argument('--imagematte-dir', type=str, required=True) parser.add_argument('--background-dir', type=str, required=True) parser.add_argument('--num-samples', type=int, default=20) parser.add_argument('--num-frames', type=int, default=100) parser.add_argument('--resolution', type=int, required=True) parser.add_argument('--out-dir', type=str, required=True) parser.add_argument('--random-seed', type=int) parser.add_argument('--extension', type=str, default='.png') args = parser.parse_args() random.seed(args.random_seed) imagematte_filenames = os.listdir(os.path.join(args.imagematte_dir, 'fgr')) background_filenames = os.listdir(args.background_dir) random.shuffle(imagematte_filenames) random.shuffle(background_filenames) def lerp(a, b, percentage): return a * (1 - percentage) + b * percentage def motion_affine(*imgs): config = dict(degrees=(-10, 10), translate=(0.1, 0.1), scale_ranges=(0.9, 1.1), shears=(-5, 5), img_size=imgs[0][0].size) angleA, (transXA, transYA), scaleA, (shearXA, shearYA) = transforms.RandomAffine.get_params(**config) angleB, (transXB, transYB), scaleB, (shearXB, shearYB) = transforms.RandomAffine.get_params(**config) T = len(imgs[0]) variation_over_time = random.random() for t in range(T): percentage = (t / (T - 1)) * variation_over_time angle = lerp(angleA, angleB, percentage) transX = lerp(transXA, transXB, percentage) transY = lerp(transYA, transYB, percentage) scale = lerp(scaleA, scaleB, percentage) shearX = lerp(shearXA, shearXB, percentage) shearY = lerp(shearYA, shearYB, percentage) for img in imgs: img[t] = F.affine(img[t], angle, (transX, transY), scale, (shearX, shearY), F.InterpolationMode.BILINEAR) return imgs def process(i): imagematte_filename = imagematte_filenames[i % len(imagematte_filenames)] background_filename = background_filenames[i % len(background_filenames)] out_path = os.path.join(args.out_dir, str(i).zfill(4)) os.makedirs(os.path.join(out_path, 'fgr'), exist_ok=True) os.makedirs(os.path.join(out_path, 'pha'), exist_ok=True) os.makedirs(os.path.join(out_path, 'com'), exist_ok=True) os.makedirs(os.path.join(out_path, 'bgr'), exist_ok=True) with Image.open(os.path.join(args.background_dir, background_filename)) as bgr: bgr = bgr.convert('RGB') w, h = bgr.size scale = args.resolution / min(h, w) w, h = int(w * scale), int(h * scale) bgr = bgr.resize((w, h)) bgr = F.center_crop(bgr, (args.resolution, args.resolution)) with Image.open(os.path.join(args.imagematte_dir, 'fgr', imagematte_filename)) as fgr, \ Image.open(os.path.join(args.imagematte_dir, 'pha', imagematte_filename)) as pha: fgr = fgr.convert('RGB') pha = pha.convert('L') fgrs = [fgr] * args.num_frames phas = [pha] * args.num_frames fgrs, phas = motion_affine(fgrs, phas) for t in tqdm(range(args.num_frames), desc=str(i).zfill(4)): fgr = fgrs[t] pha = phas[t] w, h = fgr.size scale = args.resolution / max(h, w) w, h = int(w * scale), int(h * scale) fgr = fgr.resize((w, h)) pha = pha.resize((w, h)) if h < args.resolution: pt = (args.resolution - h) // 2 pb = args.resolution - h - pt else: pt = 0 pb = 0 if w < args.resolution: pl = (args.resolution - w) // 2 pr = args.resolution - w - pl else: pl = 0 pr = 0 fgr = F.pad(fgr, [pl, pt, pr, pb]) pha = F.pad(pha, [pl, pt, pr, pb]) if i // len(imagematte_filenames) % 2 == 1: fgr = fgr.transpose(Image.FLIP_LEFT_RIGHT) pha = pha.transpose(Image.FLIP_LEFT_RIGHT) fgr.save(os.path.join(out_path, 'fgr', str(t).zfill(4) + args.extension)) pha.save(os.path.join(out_path, 'pha', str(t).zfill(4) + args.extension)) if t == 0: bgr.save(os.path.join(out_path, 'bgr', str(t).zfill(4) + args.extension)) else: os.symlink(str(0).zfill(4) + args.extension, os.path.join(out_path, 'bgr', str(t).zfill(4) + args.extension)) pha = np.asarray(pha).astype(float)[:, :, None] / 255 com = Image.fromarray(np.uint8(np.asarray(fgr) * pha + np.asarray(bgr) * (1 - pha))) com.save(os.path.join(out_path, 'com', str(t).zfill(4) + args.extension)) if __name__ == '__main__': r = process_map(process, range(args.num_samples), max_workers=32)