File size: 4,456 Bytes
1d64201
a52f9ab
 
1d64201
873ac58
d1af37b
1d64201
873ac58
1d64201
0872418
1d64201
 
 
873ac58
d1af37b
 
 
873ac58
aca5861
bce365b
1d64201
aca5861
bce365b
1d64201
 
873ac58
1d64201
 
 
 
873ac58
1d64201
0872418
1d64201
63642bb
bce365b
1d64201
0872418
d1af37b
873ac58
1d64201
63642bb
873ac58
 
4bb5406
 
 
 
1d64201
5071c90
 
 
 
 
 
 
 
2f7fddd
 
aca5861
74cd29b
0872418
b09ff42
ce26e7b
 
b09ff42
74cd29b
aca5861
 
d1af37b
873ac58
 
d1af37b
aca5861
 
1d64201
aca5861
873ac58
 
 
 
 
 
aca5861
f8b59fe
aca5861
 
 
 
1d64201
873ac58
ce26e7b
aca5861
f419f09
 
 
 
 
aca5861
1d64201
873ac58
 
b09ff42
aca5861
84736b7
873ac58
 
0872418
 
 
873ac58
 
 
4bb5406
5071c90
 
 
 
 
 
 
 
873ac58
c9e469a
 
 
 
873ac58
 
aca5861
c9e469a
 
 
 
873ac58
bce365b
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
124
125
126
127
128
129
130
131
132
133
134
135
136
import os
os.environ["GRADIO_API_FORCE_3"] = "1"
import gradio as gr
import sys
import json
import shutil
import gdown
from PIL import Image

print("Gradio App Starting...")

BASE_DIR = os.path.dirname(os.path.abspath(__file__))

# Paths
UPLOAD_DIR = "/tmp/uploads/"
JSON_DIR = "/tmp/results/"
OUTPUT_DIR = "/tmp/output/"
MODEL_DIR = os.path.join(BASE_DIR, "rcnn_model", "scripts")
logo_path = os.path.join(BASE_DIR, "public", "logo.png")
model_path = os.path.join(OUTPUT_DIR, "model_final.pth")

# Google Drive model
GOOGLE_DRIVE_FILE_ID = "1yr64AOgaYZPTcQzG6cxG6lWBENHR9qjW"
GDRIVE_URL = f"https://drive.google.com/uc?id={GOOGLE_DRIVE_FILE_ID}"

# Create folders
os.makedirs(UPLOAD_DIR, exist_ok=True)
os.makedirs(JSON_DIR, exist_ok=True)
os.makedirs(OUTPUT_DIR, exist_ok=True)

# Download model if missing
if not os.path.exists(model_path):
    print("Model file not found! Downloading...")
    try:
        gdown.download(GDRIVE_URL, model_path, quiet=False, use_cookies=False)
        print("Model downloaded successfully.")
    except Exception as e:
        print(f"Failed to download model: {e}")

# Import model
sys.path.append(MODEL_DIR)
from rcnn_model.scripts.rcnn_run import main, write_config

cfg = write_config()
def clear_outputs_on_upload(uploaded_file_path):
    if uploaded_file_path is None:
        return None, None, None, None, None
    return gr.update(value=uploaded_file_path), None, None, None, None

def show_uploaded_image(path):
    if path is None:
        return None
    try:
        return Image.open(path)
    except:
        return None
    
def predict(uploaded_file_path):
    if uploaded_file_path is None:
        return None, None, "No file uploaded.", None

    # Save uploaded file to tmp folder
    uploaded_path = os.path.join(UPLOAD_DIR, "input_image.png")
    shutil.copy(uploaded_file_path, uploaded_path)

    input_filename = "input_image.png"

    output_json_name = input_filename.replace(".png", "_result.json").replace(".jpg", "_result.json").replace(".jpeg", "_result.json")
    output_image_name = input_filename.replace(".png", "_result.png").replace(".jpg", "_result.png").replace(".jpeg", "_result.png")

    output_json_path = os.path.join(JSON_DIR, output_json_name)
    output_image_path = os.path.join(JSON_DIR, output_image_name)

    # Run model
    main(cfg, uploaded_path, output_json_name, output_image_name)

    # Read outputs
    result_img = Image.open(output_image_path) if os.path.exists(output_image_path) else None
    result_json = {}
    if os.path.exists(output_json_path):
        with open(output_json_path, "r") as jf:
            result_json = json.load(jf)

    # Save JSON to file for download
    download_json_path = os.path.join(JSON_DIR, "output.json")
    with open(download_json_path, "w") as f:
        json.dump(result_json, f, indent=2)

    return result_img, json.dumps(result_json, indent=2), None, download_json_path, uploaded_path

with gr.Blocks() as demo:
    with gr.Row():
        gr.Markdown(
            f"""
    <div style='display: flex; align-items: center; justify-content: center;'>
        <h1>Inovonics 2D Floorplan Vectorizer</h1>
    </div>
    """
        )

    with gr.Row():
        with gr.Column():
            uploaded_file = gr.File(label="Upload your Floorplan Image", type="filepath")
            uploaded_image_display = gr.Image(label="Uploaded Image", visible=True)
            run_button = gr.Button("Run Vectorizer")

        with gr.Column():
            output_image = gr.Image(label="Output Vectorized Image")
            download_button = gr.File(label="Download JSON", visible=True)
            output_json = gr.JSON(label="Output JSON")

    error_output = gr.Textbox(label="Error Message", visible=False)

    uploaded_file.change(
    lambda path: (
        gr.update(value=path),
        None, None, None, show_uploaded_image(path)
    ),
    inputs=[uploaded_file],
    outputs=[uploaded_file, output_image, output_json, download_button, uploaded_image_display]
)

    run_button.click(
    lambda x: (x, gr.update(interactive=False)),
    inputs=[uploaded_file],
    outputs=[uploaded_file, run_button],
    ).then(
        predict,
        inputs=[uploaded_file],
        outputs=[output_image, output_json, error_output, download_button, uploaded_image_display]
    ).then(
    lambda: gr.update(interactive=True),
    None,
    [run_button],
    )
demo.launch(server_name="0.0.0.0", server_port=7860, share=True)