Spaces:
Running
Running
| import argparse | |
| from pathlib import Path | |
| import cv2 | |
| import numpy as np | |
| from synth.forge import apply_random_forgery | |
| def generate(genuine_dir: str, out_dir: str, count: int = 200) -> None: | |
| genuine_path = Path(genuine_dir) | |
| tampered_path = Path(out_dir) / 'tampered' | |
| masks_path = Path(out_dir) / 'masks' | |
| tampered_path.mkdir(parents=True, exist_ok=True) | |
| masks_path.mkdir(parents=True, exist_ok=True) | |
| sources = list(genuine_path.glob('*.jpg')) + list(genuine_path.glob('*.png')) | |
| if not sources: | |
| raise FileNotFoundError(f'No images in {genuine_dir}') | |
| for i in range(count): | |
| src = sources[i % len(sources)] | |
| img = cv2.imread(str(src)) | |
| if img is None: | |
| print(f' skipping unreadable: {src}') | |
| continue | |
| donor = cv2.imread(str(sources[(i + 1) % len(sources)])) | |
| try: | |
| forged, mask, op = apply_random_forgery(img, donor=donor) | |
| except Exception as e: | |
| print(f' forge failed on {src.name}: {e}') | |
| continue | |
| name = f'{src.stem}_forge_{i:05d}' | |
| cv2.imwrite(str(tampered_path / f'{name}.jpg'), forged) | |
| cv2.imwrite(str(masks_path / f'{name}.png'), mask) | |
| if (i + 1) % 50 == 0: | |
| print(f' {i+1}/{count} done') | |
| print(f'Generated {count} tampered images') | |
| if __name__ == '__main__': | |
| parser = argparse.ArgumentParser() | |
| parser.add_argument('--genuine', default='data/genuine') | |
| parser.add_argument('--out', default='data') | |
| parser.add_argument('--count', type=int, default=200) | |
| args = parser.parse_args() | |
| generate(args.genuine, args.out, args.count) |