|
import argparse |
|
import sys |
|
from pathlib import Path |
|
from typing import Optional |
|
|
|
|
|
|
|
|
|
try: |
|
|
|
project_root = Path(__file__).resolve().parent.parent |
|
|
|
src_dir = project_root / "src" |
|
|
|
|
|
sys.path.insert(0, str(project_root)) |
|
sys.path.insert(0, str(src_dir)) |
|
except IndexError: |
|
|
|
print("Could not determine project root. Please run from the 'scripts' directory.") |
|
sys.exit(1) |
|
|
|
|
|
import torch |
|
from PIL import Image |
|
|
|
from pipeline import Zero123PlusPipeline |
|
from utils import add_white_bg, load_z123_pipe |
|
|
|
|
|
def generate_from_single_view( |
|
input_path: Path, |
|
output_path: Path, |
|
device_number: int = 0, |
|
pipeline: Optional[Zero123PlusPipeline] = None, |
|
) -> None: |
|
""" |
|
Generates a multi-view image grid from a single input image. |
|
|
|
Args: |
|
input_path: Path to the single input image. |
|
output_path: Path to save the generated multi-view .png file. |
|
device_number: The GPU device number to use. |
|
pipeline: An optional pre-loaded pipeline instance. |
|
""" |
|
if not input_path.is_file(): |
|
raise FileNotFoundError(f"Input image not found at: {input_path}") |
|
|
|
print(f"Loading pipeline on device {device_number}...") |
|
if pipeline is None: |
|
pipeline = load_z123_pipe(device_number) |
|
|
|
print(f"Processing input image: {input_path}") |
|
cond_image = Image.open(input_path) |
|
cond_image = add_white_bg(cond_image) |
|
|
|
print("Generating multi-view grid...") |
|
result = pipeline(cond_image, num_inference_steps=75).images[0] |
|
|
|
output_path.parent.mkdir(parents=True, exist_ok=True) |
|
result.save(output_path) |
|
print(f"Successfully saved multi-view grid to: {output_path}") |
|
|
|
|
|
if __name__ == '__main__': |
|
parser = argparse.ArgumentParser( |
|
description="Generate a multi-view image grid from a single input view using Zero123++." |
|
) |
|
parser.add_argument( |
|
"--input_image", |
|
type=Path, |
|
required=True, |
|
help="Path to the single input image file (e.g., examples/robot_sunglasses/src.png)." |
|
) |
|
parser.add_argument( |
|
"--output_path", |
|
type=Path, |
|
required=True, |
|
help="Path to save the output multi-view grid (e.g., examples/robot_sunglasses/src_mv.png)." |
|
) |
|
parser.add_argument( |
|
"--device_number", |
|
type=int, |
|
default=0, |
|
help="GPU device number to use for generation." |
|
) |
|
args = parser.parse_args() |
|
|
|
try: |
|
generate_from_single_view( |
|
input_path=args.input_image, |
|
output_path=args.output_path, |
|
device_number=args.device_number |
|
) |
|
except Exception as e: |
|
print(f"An error occurred: {e}") |
|
sys.exit(1) |
|
|