File size: 3,678 Bytes
49d1739
af8fde2
 
cbf824f
49d1739
38be658
 
 
e0b3a2c
 
 
 
38be658
 
 
 
 
 
 
e0b3a2c
38be658
 
 
 
 
 
 
e0b3a2c
38be658
331812c
af8fde2
 
 
 
 
 
38be658
331812c
38be658
af8fde2
38be658
af8fde2
 
 
 
953ea94
af8fde2
331812c
 
 
 
af8fde2
 
 
 
 
 
 
38be658
 
 
331812c
af8fde2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
953ea94
af8fde2
 
 
 
2ccb445
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
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()