Shailajagorile/MultiViewImageGeneration
0
1import os2import torch3from diffusers import DiffusionPipeline4from PIL import Image5import gradio as gr6 7# Load Zero123-XL (3D-aware multi-view model)8model_id = "ashawkey/zero123-xl"9pipe = DiffusionPipeline.from_pretrained(model_id, torch_dtype=torch.float16)10pipe.to("cuda")11 12# Create output folder13os.makedirs("outputs", exist_ok=True)14 15# Generate novel views for a batch of images16def generate_views(image_list):17 results = {}18 for idx, image in enumerate(image_list):19 base_name = f"image_{idx+1}"20 21 # Generate multiple novel views22 # Zero123-XL automatically rotates input in different directions23 outputs = pipe(image, num_images_per_prompt=4) # 4 new views per image24 25 img_paths = []26 for j, img in enumerate(outputs.images):27 path = f"outputs/{base_name}_view{j+1}.png"28 img.save(path)29 img_paths.append(path)30 31 results[base_name] = img_paths32 33 return results34 35# Gradio interface36with gr.Blocks() as demo:37 gr.Markdown("## 🖼 Novel View Synthesis with Zero123-XL")38 39 with gr.Row():40 input_images = gr.File(file_types=[".png", ".jpg", ".jpeg"], file_types_display="image", type="file", label="Upload Images", file_types_multiple=True)41 run_btn = gr.Button("Generate Views")42 43 gallery = gr.Gallery(label="Generated Views", show_label=True).style(grid=[4], height="auto")44 45 def inference(files):46 images = [Image.open(f.name).convert("RGB") for f in files]47 results = generate_views(images)48 all_outputs = []49 for k, v in results.items():50 for img_path in v:51 all_outputs.append(Image.open(img_path))52 return all_outputs53 54 run_btn.click(inference, inputs=[input_images], outputs=[gallery])55 56# Launch57if _name_ == "_main_":58 demo.launch()