Spaces:
Running
on
Zero
Running
on
Zero
import argparse | |
import sys | |
from pathlib import Path | |
from typing import Optional | |
# --- Start of the "Messy" but Effective Path Setup --- | |
# This block ensures that imports work correctly without modifying the src directory. | |
# It adds both the project root and the src directory to the Python path. | |
try: | |
# Get the project root directory (which is the parent of the 'scripts' directory) | |
project_root = Path(__file__).resolve().parent.parent | |
# Get the source code directory | |
src_dir = project_root / "src" | |
# Add both directories to the system path | |
sys.path.insert(0, str(project_root)) | |
sys.path.insert(0, str(src_dir)) | |
except IndexError: | |
# Fallback for when the script is run in a way that __file__ is not defined | |
print("Could not determine project root. Please run from the 'scripts' directory.") | |
sys.exit(1) | |
# --- End of Path Setup --- | |
import torch | |
from PIL import Image | |
from pipeline import Zero123PlusPipeline # This now works because src/ is on the path | |
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) | |