|
import torch |
|
from diffusers import DiffusionPipeline |
|
import trimesh |
|
import numpy as np |
|
from PIL import Image |
|
from io import BytesIO |
|
|
|
def load_pipeline(): |
|
""" |
|
Load the stable-zero123 model pipeline from Hugging Face. |
|
""" |
|
ckpt_id = "stabilityai/stable-zero123" |
|
pipe = DiffusionPipeline.from_pretrained(ckpt_id, torch_dtype=torch.float32).to("cpu") |
|
return pipe |
|
|
|
def generate_3d_model(pipe, prompt, output_path="output.obj", guidance_scale=7.5, num_inference_steps=32): |
|
""" |
|
Generate a 3D model from the prompt and save it in a Blender-compatible format (.obj). |
|
""" |
|
|
|
outputs = pipe(prompt=prompt, guidance_scale=guidance_scale, num_inference_steps=num_inference_steps) |
|
|
|
|
|
vertices = outputs["vertices"][0].detach().cpu().numpy() |
|
faces = outputs["faces"][0].detach().cpu().numpy() |
|
|
|
|
|
mesh = trimesh.Trimesh(vertices=vertices, faces=faces, process=True) |
|
mesh.export(output_path) |
|
return output_path |
|
|
|
def convert_to_gif(images, gif_path="output.gif"): |
|
""" |
|
Convert a list of images into a GIF. |
|
""" |
|
images[0].save( |
|
gif_path, save_all=True, append_images=images[1:], loop=0, duration=100 |
|
) |
|
return gif_path |
|
|