blender-chat / app.py
dev-bjoern's picture
Update app.py
e0b3a2c verified
raw
history blame
3.68 kB
import gradio as gr
import subprocess
import os
import spaces
def find_blender_python():
possible_paths = [
"/usr/share/blender/4.2/python/bin/python3.10",
"/usr/share/blender/3.6/python/bin/python3.10",
"/usr/share/blender/3.5/python/bin/python3.10",
"/usr/share/blender/3.1/python/bin/python3.10",
"/usr/lib/blender/3.1/python/bin/python3.10"
]
for path in possible_paths:
if os.path.exists(path):
return path
# Breiterer Fallback-Suchbefehl
result = subprocess.run(["find", "/", "-name", "python3.*", "-path", "*/blender/*", "-type", "f"], capture_output=True, text=True)
paths = result.stdout.strip().split("\n")
if paths and paths[0] and os.path.exists(paths[0]):
return paths[0]
# Debugging: Blender selbst suchen
blender_bin = subprocess.run(["find", "/", "-name", "blender", "-type", "f"], capture_output=True, text=True)
print(f"Blender-Binär gefunden: {blender_bin.stdout}")
raise RuntimeError("Blender Python-Interpreter nicht gefunden!")
# Funktion zum Installieren von Infinigen
def install_infinigen():
infinigen_dir = "infinigen"
if not os.path.exists(infinigen_dir):
print("Klone Infinigen...")
subprocess.run(["git", "clone", "https://github.com/princeton-vl/infinigen.git"], check=True)
blender_python = find_blender_python()
if not blender_python:
raise RuntimeError("Blender Python-Interpreter nicht gefunden!")
print(f"Blender Python gefunden unter: {blender_python}")
subprocess.run([
blender_python, "-m", "pip", "install", "-e", f"{infinigen_dir}[terrain,vis]", "--no-deps"
], check=True)
print("Infinigen installiert.")
# Infinigen beim Start installieren
try:
install_infinigen()
except Exception as e:
print(f"Fehler bei der Installation von Infinigen: {e}")
# Funktion zum Generieren einer Szene mit ZeroGPU
@spaces.GPU
def generate_scene(seed):
output_dir = "outputs"
os.makedirs(output_dir, exist_ok=True)
blender_python = find_blender_python()
if not blender_python:
return "Fehler: Blender Python-Interpreter nicht gefunden!"
command = [
blender_python, "-m", "infinigen.datagen.manage_jobs",
"--output_folder", output_dir,
"--num_scenes", "1",
"--specific_seed", str(int(seed)),
"--configs", "infinigen/infinigen_examples/configs/desert.gin",
"infinigen/infinigen_examples/configs/simple.gin",
"--pipeline_configs", "infinigen/infinigen_examples/configs/local_16GB.gin",
"infinigen/infinigen_examples/configs/monocular.gin",
"infinigen/infinigen_examples/configs/blender_gt.gin"
]
try:
result = subprocess.run(command, capture_output=True, text=True, check=True)
print("STDOUT:", result.stdout)
print("STDERR:", result.stderr)
output_path = os.path.join(output_dir, "0000000000.png")
if os.path.exists(output_path):
return output_path
return f"Fehler: Bild nicht gefunden. STDERR: {result.stderr}"
except subprocess.CalledProcessError as e:
return f"Fehler: {e.stderr}"
# Gradio-Oberfläche
with gr.Blocks(title="Infinigen Demo") as demo:
gr.Markdown("## Infinigen Scene Generator")
seed_input = gr.Number(label="Seed", value=0, precision=0)
output_image = gr.Image(label="Generierte Szene")
generate_button = gr.Button("Szene generieren")
generate_button.click(
fn=generate_scene,
inputs=[seed_input],
outputs=[output_image]
)
demo.launch()