Spaces:
Sleeping
Sleeping
File size: 5,361 Bytes
49d1739 af8fde2 cbf824f e053144 890aef1 49d1739 e053144 04532d1 e053144 04532d1 e053144 04532d1 e053144 04532d1 e053144 04532d1 e053144 04532d1 e053144 04532d1 e053144 04532d1 38be658 e053144 04532d1 e053144 af8fde2 e053144 953ea94 e053144 04532d1 e053144 af8fde2 e053144 04532d1 e053144 04532d1 e053144 890aef1 e053144 890aef1 e053144 890aef1 e053144 04532d1 af8fde2 953ea94 e053144 953ea94 331812c |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 |
import gradio as gr
import subprocess
import os
import spaces
import glob
from pathlib import Path
class InfinigenManager:
def __init__(self, base_dir="infinigen", output_dir="outputs"):
self.base_dir = Path(base_dir)
self.output_dir = Path(output_dir)
self.blender_bin = None
self.blender_python = None
self.initialized = False
self._setup_blender()
self._setup_infinigen()
def _setup_blender(self):
"""Stellt sicher, dass Blender installiert ist und findet den Python-Interpreter."""
try:
blender_bins = glob.glob("/usr/bin/blender")
if not blender_bins:
raise FileNotFoundError("Blender-Binär nicht gefunden!")
self.blender_bin = blender_bins[0]
version_result = subprocess.run([self.blender_bin, "-v"], capture_output=True, text=True)
blender_version = next((line.split()[1] for line in version_result.stdout.split("\n") if "Blender" in line and "." in line), None)
print(f"Vorhandene Blender-Version: {blender_version or 'unbekannt'}")
# Breite Suche nach Python-Interpreter
base_paths = ["/usr/share/blender", "/usr/lib/blender"]
python_patterns = [
f"/usr/share/blender/{blender_version}/python/bin/python*",
f"/usr/share/blender/*/python/bin/python*",
f"/usr/lib/blender/*/python/bin/python*",
"/**/blender/*/python/bin/python*"
]
for pattern in python_patterns:
python_bins = glob.glob(pattern, recursive=True)
if python_bins:
self.blender_python = python_bins[0]
print(f"Blender Python gefunden: {self.blender_python}")
self.initialized = True
return
# Debugging: Vollständige Python-Suche
all_python = glob.glob("/**/python", recursive=True)
print(f"Alle Python-Pfade: {all_python}")
raise RuntimeError("Blender Python-Interpreter nicht gefunden!")
except Exception as e:
print(f"Fehler bei Blender-Setup: {e}")
self.blender_python = None
def _setup_infinigen(self):
"""Installiert Infinigen, falls möglich."""
if not self.blender_python:
print("Kann Infinigen nicht installieren: Blender Python fehlt.")
return
if not self.base_dir.exists():
print("Klone Infinigen...")
subprocess.run(["git", "clone", "https://github.com/princeton-vl/infinigen.git"], check=True)
if not self._is_infinigen_installed():
print("Installiere Infinigen...")
subprocess.run([
self.blender_python, "-m", "pip", "install", "-e", str(self.base_dir) + "[terrain,vis]", "--no-deps", "--user"
], check=True)
print("Infinigen installiert.")
def _is_infinigen_installed(self):
"""Prüft, ob Infinigen bereits installiert ist."""
if not self.blender_python:
return False
try:
subprocess.run([self.blender_python, "-c", "import infinigen"], check=True, capture_output=True)
return True
except subprocess.CalledProcessError:
return False
@spaces.GPU
def generate_scene(self, seed, configs=None, pipeline_configs=None):
"""Generiert eine Szene mit Infinigen."""
if not self.initialized or not self.blender_python:
return "Fehler: Infinigen nicht initialisiert (Blender Python fehlt)!"
self.output_dir.mkdir(exist_ok=True)
configs = configs or ["infinigen_examples/configs/desert.gin", "infinigen_examples/configs/simple.gin"]
pipeline_configs = pipeline_configs or [
"infinigen_examples/configs/local_16GB.gin",
"infinigen_examples/configs/monocular.gin",
"infinigen_examples/configs/blender_gt.gin"
]
command = [
self.blender_python, "-m", "infinigen.datagen.manage_jobs",
"--output_folder", str(self.output_dir),
"--num_scenes", "1",
"--specific_seed", str(int(seed))
] + ["--configs"] + configs + ["--pipeline_configs"] + pipeline_configs
try:
result = subprocess.run(command, capture_output=True, text=True, check=True)
print(f"STDOUT: {result.stdout}")
print(f"STDERR: {result.stderr}")
output_path = self.output_dir / "0000000000.png"
return str(output_path) if output_path.exists() else f"Fehler: Bild nicht gefunden. STDERR: {result.stderr}"
except subprocess.CalledProcessError as e:
return f"Fehler: {e.stderr}"
# Manager initialisieren
manager = InfinigenManager() # Immer definieren, auch bei Fehlern
# 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=manager.generate_scene, inputs=[seed_input], outputs=[output_image])
demo.launch() |