dev-bjoern commited on
Commit
c02bf22
·
verified ·
1 Parent(s): 4db678f

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +128 -107
app.py CHANGED
@@ -1,135 +1,159 @@
 
 
1
  import gradio as gr
2
  import subprocess
3
- import os
4
- import spaces
5
- import glob
6
  from pathlib import Path
7
  import torch
 
 
 
 
 
 
 
 
8
 
9
  class InfinigenManager:
10
  def __init__(self, base_dir="infinigen", output_dir="outputs", blender_version="4.3.2"):
 
11
  self.base_dir = Path(base_dir)
12
  self.output_dir = Path(output_dir)
13
  self.blender_version = blender_version
14
  self.blender_bin = None
15
  self.blender_python = None
16
  self.initialized = False
17
- print("Initialisiere InfinigenManager...")
18
- self._setup_blender()
19
- self._setup_infinigen()
20
- self._check_cuda()
21
 
22
- def _setup_blender(self):
23
- """Installiert Blender 4.3.2, falls nötig, und findet den Python-Interpreter."""
24
- print("Starte Blender-Setup...")
25
  try:
26
- # Prüfe vorhandene Blender-Version
27
- blender_bins = glob.glob("/usr/bin/blender")
28
- if blender_bins:
29
- self.blender_bin = blender_bins[0]
30
- version_result = subprocess.run([self.blender_bin, "-v"], capture_output=True, text=True, timeout=10)
31
- current_version = next((line.split()[1] for line in version_result.stdout.split("\n") if "Blender" in line and "." in line), None)
32
- print(f"Vorhandene Blender-Version: {current_version or 'unbekannt'}")
33
- if current_version and current_version >= self.blender_version:
34
- print("Vorhandene Version ist aktuell genug.")
35
- else:
36
- print("Installiere neueste Blender-Version...")
37
- self._install_latest_blender()
38
- else:
39
- print("Kein Blender vorhanden, installiere neueste Version...")
40
- self._install_latest_blender()
41
-
42
- # Finde Blender-Python mit angepasster Suche
43
- base_path = f"/home/user/blender-{self.blender_version}-linux-x64" if self.blender_bin == f"/home/user/blender-{self.blender_version}-linux-x64/blender" else "/usr/share/blender"
44
- python_patterns = [
45
- f"{base_path}/{self.blender_version}/python/bin/python*",
46
- f"{base_path}/python/bin/python*",
47
- "/usr/share/blender/*/python/bin/python*",
48
- "/usr/lib/blender/*/python/bin/python*"
49
- ]
50
- for pattern in python_patterns:
51
- print(f"Suche nach Python mit Muster: {pattern}")
52
- python_bins = glob.glob(pattern, recursive=True)
53
- if python_bins:
54
- self.blender_python = python_bins[0]
55
- print(f"Blender Python gefunden: {self.blender_python}")
56
- self.initialized = True
57
- return
58
-
59
- print("Keine Python-Bins gefunden, detaillierte Suche läuft...")
60
- all_python = glob.glob(f"{base_path}/**/python3.*", recursive=True)
61
- print(f"Detaillierte Python-Suche: {all_python}")
62
- if all_python:
63
- self.blender_python = all_python[0]
64
- print(f"Blender Python gefunden (Fallback): {self.blender_python}")
65
- self.initialized = True
66
- return
67
-
68
- raise RuntimeError("Blender Python-Interpreter nicht gefunden!")
69
  except Exception as e:
70
- print(f"Fehler bei Blender-Setup: {e}")
71
- self.blender_python = None
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
72
 
73
  def _install_latest_blender(self):
74
- """Installiert Blender 4.3.2 dynamisch zur Laufzeit."""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
75
  try:
76
- print("Lade Blender 4.3.2 herunter...")
77
- subprocess.run([
78
- "wget", "https://download.blender.org/release/Blender4.3/blender-4.3.2-linux-x64.tar.xz"
79
- ], check=True, timeout=60)
80
- print("Entpacke Blender 4.3.2...")
81
- subprocess.run([
82
- "tar", "-xvf", "blender-4.3.2-linux-x64.tar.xz", "-C", "/home/user"
83
- ], check=True, timeout=60)
84
- self.blender_bin = "/home/user/blender-4.3.2-linux-x64/blender"
85
- print(f"Blender 4.3.2 installiert unter: {self.blender_bin}")
86
- os.remove("blender-4.3.2-linux-x64.tar.xz")
87
  except Exception as e:
88
- print(f"Fehler bei der Installation von Blender 4.3.2: {e}")
89
- raise
90
 
91
  def _check_cuda(self):
92
- """Prüft CUDA-Verfügbarkeit."""
93
- if torch.cuda.is_available():
94
- print(f"CUDA verfügbar: {torch.cuda.get_device_name(0)}")
95
- else:
96
- print("CUDA nicht verfügbar!")
97
 
98
  def _setup_infinigen(self):
99
- """Installiert Infinigen, falls möglich."""
100
- print("Starte Infinigen-Setup...")
101
  if not self.blender_python:
102
- print("Kann Infinigen nicht installieren: Blender Python fehlt.")
103
  return
104
-
 
105
  if not self.base_dir.exists():
106
- print("Klone Infinigen...")
107
- subprocess.run(["git", "clone", "https://github.com/princeton-vl/infinigen.git"], check=True, timeout=30)
108
-
109
  if not self._is_infinigen_installed():
110
- print("Installiere Infinigen...")
111
- subprocess.run([
112
- self.blender_python, "-m", "pip", "install", "-e", str(self.base_dir) + "[terrain,vis]", "--no-deps", "--user"
113
- ], check=True, timeout=60)
114
- print("Infinigen installiert.")
115
 
116
  def _is_infinigen_installed(self):
117
  """Prüft, ob Infinigen bereits installiert ist."""
118
  if not self.blender_python:
119
  return False
120
  try:
121
- subprocess.run([self.blender_python, "-c", "import infinigen"], check=True, capture_output=True, timeout=10)
122
  return True
123
- except subprocess.CalledProcessError:
124
  return False
125
 
126
  @spaces.GPU
127
  def generate_scene(self, seed, configs=None, pipeline_configs=None):
128
- """Generiert eine Szene mit Infinigen."""
129
  if not self.initialized or not self.blender_python:
130
- return "Fehler: Infinigen nicht initialisiert (Blender Python fehlt)!"
131
-
132
- print(f"Generiere Szene mit Seed: {seed}")
133
  self.output_dir.mkdir(exist_ok=True)
134
  configs = configs or ["infinigen_examples/configs/desert.gin", "infinigen_examples/configs/simple.gin"]
135
  pipeline_configs = pipeline_configs or [
@@ -137,30 +161,27 @@ class InfinigenManager:
137
  "infinigen_examples/configs/monocular.gin",
138
  "infinigen_examples/configs/blender_gt.gin"
139
  ]
140
-
141
  command = [
142
  self.blender_python, "-m", "infinigen.datagen.manage_jobs",
143
  "--output_folder", str(self.output_dir),
144
  "--num_scenes", "1",
145
- "--specific_seed", str(int(seed))
146
- ] + ["--configs"] + configs + ["--pipeline_configs"] + pipeline_configs
147
-
 
148
  try:
149
- result = subprocess.run(command, capture_output=True, text=True, check=True, timeout=300)
150
- print(f"STDOUT: {result.stdout}")
151
- print(f"STDERR: {result.stderr}")
152
  output_path = self.output_dir / "0000000000.png"
153
- return str(output_path) if output_path.exists() else f"Fehler: Bild nicht gefunden. STDERR: {result.stderr}"
154
- except subprocess.TimeoutExpired as e:
155
- return f"Fehler: Timeout bei Szenengenerierung: {e.stderr}"
156
- except subprocess.CalledProcessError as e:
157
- return f"Fehler: {e.stderr}"
158
 
159
  # Manager initialisieren
160
- print("Starte Manager-Initialisierung...")
161
  manager = InfinigenManager()
162
 
163
- # Gradio-Oberfläche
164
  with gr.Blocks(title="Infinigen Demo") as demo:
165
  gr.Markdown("## Infinigen Scene Generator")
166
  seed_input = gr.Number(label="Seed", value=0, precision=0)
@@ -169,5 +190,5 @@ with gr.Blocks(title="Infinigen Demo") as demo:
169
 
170
  generate_button.click(fn=manager.generate_scene, inputs=[seed_input], outputs=[output_image])
171
 
172
- print("Starte Gradio-Oberfläche...")
173
  demo.launch()
 
1
+ #!/usr/bin/env python3
2
+
3
  import gradio as gr
4
  import subprocess
 
 
 
5
  from pathlib import Path
6
  import torch
7
+ import os
8
+ import logging
9
+ import sys
10
+ import spaces
11
+
12
+ # Logging konfigurieren
13
+ logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s")
14
+ logger = logging.getLogger(__name__)
15
 
16
  class InfinigenManager:
17
  def __init__(self, base_dir="infinigen", output_dir="outputs", blender_version="4.3.2"):
18
+ """Initialisiert den InfinigenManager mit Basisverzeichnis, Ausgabeverzeichnis und Blender-Version."""
19
  self.base_dir = Path(base_dir)
20
  self.output_dir = Path(output_dir)
21
  self.blender_version = blender_version
22
  self.blender_bin = None
23
  self.blender_python = None
24
  self.initialized = False
25
+ logger.info("Initialisiere InfinigenManager...")
26
+ self._initialize()
 
 
27
 
28
+ def _run_command(self, command, error_msg="Fehler bei Befehlsausführung", timeout=None):
29
+ """Führt Befehle einheitlich aus und behandelt Fehler."""
 
30
  try:
31
+ result = subprocess.run(
32
+ command,
33
+ shell=isinstance(command, str),
34
+ capture_output=True,
35
+ text=True,
36
+ check=True,
37
+ timeout=timeout
38
+ )
39
+ logger.debug(f"STDOUT: {result.stdout}")
40
+ return result
41
+ except subprocess.CalledProcessError as e:
42
+ logger.error(f"{error_msg}: {e.stderr}")
43
+ raise
44
+ except subprocess.TimeoutExpired as e:
45
+ logger.error(f"{error_msg} (Timeout): {e.stderr}")
46
+ raise
47
+
48
+ def _initialize(self):
49
+ """Führt die zentrale Initialisierung durch."""
50
+ try:
51
+ self._setup_blender()
52
+ self._setup_infinigen()
53
+ self._check_cuda()
54
+ self.initialized = True
55
+ logger.info("Initialisierung erfolgreich abgeschlossen.")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
56
  except Exception as e:
57
+ logger.error(f"Initialisierung fehlgeschlagen: {e}")
58
+ self.initialized = False
59
+
60
+ def _setup_blender(self):
61
+ """Richtet Blender und dessen Python-Interpreter ein."""
62
+ logger.info("Starte Blender-Setup...")
63
+ self.blender_bin = self._find_blender() or self._install_latest_blender()
64
+ self.blender_python = self._find_blender_python_with_grep()
65
+ if not self.blender_python:
66
+ raise RuntimeError("Blender Python-Interpreter nicht gefunden!")
67
+ logger.info(f"Blender Python gefunden: {self.blender_python}")
68
+
69
+ def _find_blender(self):
70
+ """Sucht nach einer vorhandenen Blender-Installation."""
71
+ blender_paths = [
72
+ f"/home/user/blender-{self.blender_version}-linux-x64/blender",
73
+ "/usr/bin/blender"
74
+ ]
75
+ for bin_path in blender_paths:
76
+ if os.path.exists(bin_path):
77
+ try:
78
+ version_result = self._run_command([bin_path, "-v"], "Kann Blender-Version nicht prüfen", timeout=10)
79
+ version = next((line.split()[1] for line in version_result.stdout.split("\n")
80
+ if "Blender" in line and "." in line), None)
81
+ logger.info(f"Vorhandene Blender-Version: {version or 'unbekannt'}")
82
+ if version and version >= self.blender_version:
83
+ return bin_path
84
+ except Exception as e:
85
+ logger.warning(f"Fehler bei Blender-Prüfung ({bin_path}): {e}")
86
+ return None
87
 
88
  def _install_latest_blender(self):
89
+ """Installiert Blender 4.3.2, falls nicht vorhanden."""
90
+ logger.info("Installiere Blender 4.3.2...")
91
+ url = "https://download.blender.org/release/Blender4.3/blender-4.3.2-linux-x64.tar.xz"
92
+ tar_path = "blender-4.3.2-linux-x64.tar.xz"
93
+ blender_dir = Path(f"/home/user/blender-{self.blender_version}-linux-x64")
94
+
95
+ self._run_command(f"wget -q {url}", "Fehler beim Herunterladen von Blender", timeout=60)
96
+ self._run_command(f"tar -xvf {tar_path} -C /home/user", "Fehler beim Entpacken von Blender", timeout=60)
97
+ os.remove(tar_path)
98
+ return blender_dir / "blender"
99
+
100
+ def _find_blender_python_with_grep(self):
101
+ """Sucht den Blender-Python-Pfad mit find."""
102
+ base_path = Path(self.blender_bin).parent.parent
103
+ grep_cmd = f"find {base_path} -type f -path '*/python/bin/python3*' -executable"
104
  try:
105
+ result = self._run_command(grep_cmd, "Fehler bei der Python-Suche mit find")
106
+ python_paths = result.stdout.strip().split("\n")
107
+ for path in python_paths:
108
+ if path:
109
+ version_result = self._run_command([path, "--version"], "Fehler bei Python-Version", timeout=5)
110
+ logger.info(f"Python-Version: {version_result.stdout.strip()}")
111
+ return path
112
+ logger.warning("Kein passender Python-Pfad in find-Ausgabe gefunden.")
113
+ return None
 
 
114
  except Exception as e:
115
+ logger.error(f"Fehler bei der Suche nach Blender-Python: {e}")
116
+ return None
117
 
118
  def _check_cuda(self):
119
+ """Prüft die CUDA-Verfügbarkeit für GPU-Nutzung."""
120
+ cuda_available = torch.cuda.is_available()
121
+ logger.info(f"CUDA {'verfügbar' if cuda_available else 'nicht verfügbar'}: {torch.cuda.get_device_name(0) if cuda_available else 'N/A'}")
 
 
122
 
123
  def _setup_infinigen(self):
124
+ """Richtet Infinigen ein, falls nicht installiert."""
 
125
  if not self.blender_python:
126
+ logger.error("Kann Infinigen nicht installieren: Blender Python fehlt.")
127
  return
128
+
129
+ logger.info("Starte Infinigen-Setup...")
130
  if not self.base_dir.exists():
131
+ self._run_command(f"git clone https://github.com/princeton-vl/infinigen.git {self.base_dir}",
132
+ "Fehler beim Klonen von Infinigen", timeout=30)
133
+
134
  if not self._is_infinigen_installed():
135
+ logger.info("Installiere Infinigen...")
136
+ self._run_command([
137
+ self.blender_python, "-m", "pip", "install", "-e", f"{self.base_dir}[terrain,vis]", "--no-deps", "--user"
138
+ ], "Fehler bei der Installation von Infinigen", timeout=60)
 
139
 
140
  def _is_infinigen_installed(self):
141
  """Prüft, ob Infinigen bereits installiert ist."""
142
  if not self.blender_python:
143
  return False
144
  try:
145
+ self._run_command([self.blender_python, "-c", "import infinigen"], timeout=10)
146
  return True
147
+ except Exception:
148
  return False
149
 
150
  @spaces.GPU
151
  def generate_scene(self, seed, configs=None, pipeline_configs=None):
152
+ """Generiert eine Szene mit Infinigen auf der GPU."""
153
  if not self.initialized or not self.blender_python:
154
+ return "Fehler: Infinigen nicht initialisiert!"
155
+
156
+ logger.info(f"Generiere Szene mit Seed: {seed}")
157
  self.output_dir.mkdir(exist_ok=True)
158
  configs = configs or ["infinigen_examples/configs/desert.gin", "infinigen_examples/configs/simple.gin"]
159
  pipeline_configs = pipeline_configs or [
 
161
  "infinigen_examples/configs/monocular.gin",
162
  "infinigen_examples/configs/blender_gt.gin"
163
  ]
164
+
165
  command = [
166
  self.blender_python, "-m", "infinigen.datagen.manage_jobs",
167
  "--output_folder", str(self.output_dir),
168
  "--num_scenes", "1",
169
+ "--specific_seed", str(int(seed)),
170
+ "--configs"
171
+ ] + configs + ["--pipeline_configs"] + pipeline_configs
172
+
173
  try:
174
+ self._run_command(command, "Fehler bei Szenengenerierung", timeout=300)
 
 
175
  output_path = self.output_dir / "0000000000.png"
176
+ return str(output_path) if output_path.exists() else "Fehler: Bild nicht gefunden!"
177
+ except Exception as e:
178
+ return f"Fehler bei Szenengenerierung: {str(e)}"
 
 
179
 
180
  # Manager initialisieren
181
+ logger.info("Starte Manager-Initialisierung...")
182
  manager = InfinigenManager()
183
 
184
+ # Gradio-Oberfläche definieren
185
  with gr.Blocks(title="Infinigen Demo") as demo:
186
  gr.Markdown("## Infinigen Scene Generator")
187
  seed_input = gr.Number(label="Seed", value=0, precision=0)
 
190
 
191
  generate_button.click(fn=manager.generate_scene, inputs=[seed_input], outputs=[output_image])
192
 
193
+ logger.info("Starte Gradio-Oberfläche...")
194
  demo.launch()