File size: 3,237 Bytes
34a7c30
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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

import gradio as gr
import os
import subprocess
import shutil
import torch # SHARP relies on PyTorch

# The SHARP repository is expected to be cloned into a folder named 'SHARP'
SHARP_REPO_PATH = "SHARP"
# The model checkpoint is expected to be in the root directory of the Space
MODEL_CHECKPOINT_PATH = "sharp_2572gikvuh.pt"

# Function to run the sharp predict command
def run_sharp_predict(input_files):
    if not input_files:
        return "Please upload at least one image file."

    # Create a temporary directory for input images
    input_dir = "temp_input_images"
    os.makedirs(input_dir, exist_ok=True)

    # Save uploaded images to the temporary input directory
    for i, img_file in enumerate(input_files):
        original_filename = getattr(img_file, 'orig_name', f"image_{i}.png")
        dest_path = os.path.join(input_dir, original_filename)
        shutil.copyfile(img_file.name, dest_path)

    # Create an output directory for gaussians
    output_dir = "temp_output_gaussians"
    if os.path.exists(output_dir):
        shutil.rmtree(output_dir)
    os.makedirs(output_dir, exist_ok=True)

    sharp_script_path = os.path.join(SHARP_REPO_PATH, "sharp", "predict.py")

    if not os.path.exists(sharp_script_path):
        return f"Error: SHARP project not found at '{SHARP_REPO_PATH}' or 'predict.py' is missing. Please ensure the repository is cloned and set up correctly."

    command = [
        "python", sharp_script_path,
        "-i", input_dir,
        "-o", output_dir,
        "-c", MODEL_CHECKPOINT_PATH
    ]

    result_message = ""
    try:
        process = subprocess.run(command, capture_output=True, text=True, check=True)
        result_message += f"Prediction successful! Output in: {output_dir}\n\nSTDOUT:\n{process.stdout}\nSTDERR:\n{process.stderr}"

        generated_files = [f for f in os.listdir(output_dir) if os.path.isfile(os.path.join(output_dir, f))]
        if generated_files:
            result_message += "\n\nGenerated files:\n" + "\n".join(generated_files)
        else:
            result_message += "\n\nNo output files found in the output directory."

    except subprocess.CalledProcessError as e:
        result_message = f"Prediction failed!\n\nSTDOUT:\n{e.stdout}\nSTDERR:\n{e.stderr}\nError: {e}"
    except FileNotFoundError:
        result_message = f"Error: 'python' or '{sharp_script_path}' not found. Ensure Python is in PATH and SHARP is correctly set up."
    except Exception as e:
        result_message = f"An unexpected error occurred: {e}"
    finally:
        if os.path.exists(input_dir):
            shutil.rmtree(input_dir)

    return result_message


# Create a Gradio interface for image upload and sharp predict
gradio_interface = gr.Interface(
    fn=run_sharp_predict,
    inputs=gr.File(file_count="multiple", type="filepath", label="Upload Input Images (e.g., from an MVS dataset)"),
    outputs=gr.Textbox(label="Prediction Output and Results"),
    title="SHARP: Image-to-3D Gaussian Splatting Demo",
    description="Upload a set of images to generate a 3D Gaussian Splatting representation using the apple/Sharp model. This will run the `sharp predict` command."
)

if __name__ == "__main__":
    gradio_interface.launch(share=True)