Spaces:
Sleeping
Sleeping
Upload app.py
Browse files
app.py
CHANGED
|
@@ -247,26 +247,28 @@ def draw_points_on_image(image, layer_manager):
|
|
| 247 |
return draw_img
|
| 248 |
|
| 249 |
# ============ UI FUNCTIONS ============
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 250 |
def create_new_layer(name, current_manager):
|
| 251 |
"""μ λ μ΄μ΄ μμ±"""
|
| 252 |
if current_manager is None:
|
| 253 |
current_manager = LayerManager()
|
| 254 |
-
|
| 255 |
if not name.strip():
|
| 256 |
-
return current_manager, create_layer_status_html(current_manager),
|
| 257 |
|
| 258 |
# μ€λ³΅ μ΄λ¦ 체ν¬
|
| 259 |
for layer_id, layer in current_manager.layers.items():
|
| 260 |
if layer['name'] == name.strip():
|
| 261 |
-
return current_manager, create_layer_status_html(current_manager),
|
| 262 |
|
| 263 |
layer_id = current_manager.create_layer(name.strip())
|
| 264 |
current_manager.set_current_layer(layer_id)
|
| 265 |
-
|
| 266 |
-
# λλ‘λ€μ΄ μ νμ§ μ
λ°μ΄νΈ
|
| 267 |
-
choices = [(layer['name'], lid) for lid, layer in current_manager.layers.items()]
|
| 268 |
|
| 269 |
-
return current_manager, create_layer_status_html(current_manager),
|
| 270 |
|
| 271 |
def create_layer_status_html(current_manager):
|
| 272 |
"""λ μ΄μ΄ μν νμ HTML μμ± (μκ°μ νμλ§)"""
|
|
@@ -462,16 +464,10 @@ def refresh_visualization(current_manager, image, opacity, border_width):
|
|
| 462 |
|
| 463 |
|
| 464 |
# ============ GRADIO INTERFACE ============
|
| 465 |
-
custom_css="""
|
| 466 |
-
#col-container { margin: 0 auto; max-width: 1200px; }
|
| 467 |
-
#main-title h1 { font-size: 2.1em !important; }
|
| 468 |
-
.layer-button { margin: 2px; }
|
| 469 |
-
"""
|
| 470 |
-
|
| 471 |
# No custom JavaScript needed anymore
|
| 472 |
custom_js = ""
|
| 473 |
|
| 474 |
-
with gr.Blocks(
|
| 475 |
with gr.Column(elem_id="col-container"):
|
| 476 |
gr.Markdown("# **SAM3 Layer Segmentation Tool**", elem_id="main-title")
|
| 477 |
gr.Markdown("**Layer-based object separation and area analysis tool** | 1. Create layers 2. Select point mode and click 3. Run segmentation (processes all layers)")
|
|
@@ -545,17 +541,15 @@ with gr.Blocks(css=custom_css) as demo:
|
|
| 545 |
if mgr is None:
|
| 546 |
mgr = LayerManager()
|
| 547 |
|
| 548 |
-
choices = [(layer['name'], lid) for lid, layer in mgr.layers.items()]
|
| 549 |
-
|
| 550 |
if layer_id:
|
| 551 |
mgr.set_current_layer(layer_id)
|
| 552 |
-
return mgr, create_layer_status_html(mgr),
|
| 553 |
-
return mgr, create_layer_status_html(mgr),
|
| 554 |
|
| 555 |
layer_selector.change(
|
| 556 |
on_layer_select,
|
| 557 |
inputs=[layer_selector, st_layer_manager],
|
| 558 |
-
outputs=[st_layer_manager, layer_buttons_html,
|
| 559 |
)
|
| 560 |
|
| 561 |
# ν¬μΈνΈ λͺ¨λ λ³κ²½
|
|
@@ -619,8 +613,8 @@ with gr.Blocks(css=custom_css) as demo:
|
|
| 619 |
new_manager = LayerManager()
|
| 620 |
empty_html = "<div style='padding: 10px; text-align: center; color: #888;'>No layers created</div>"
|
| 621 |
# μ
λ‘λν μ΄λ―Έμ§λ₯Ό μΆλ ₯μλ νμ
|
| 622 |
-
return new_manager, img, pd.DataFrame(), empty_html,
|
| 623 |
-
|
| 624 |
img_input.change(
|
| 625 |
on_image_upload,
|
| 626 |
inputs=[img_input],
|
|
@@ -629,10 +623,18 @@ with gr.Blocks(css=custom_css) as demo:
|
|
| 629 |
|
| 630 |
@spaces.GPU
|
| 631 |
def run_spaces():
|
| 632 |
-
demo.launch(
|
|
|
|
|
|
|
|
|
|
|
|
|
| 633 |
|
| 634 |
def run_local():
|
| 635 |
-
demo.launch(show_error=True
|
|
|
|
|
|
|
|
|
|
|
|
|
| 636 |
|
| 637 |
if __name__ == "__main__":
|
| 638 |
# Hugging Spaces νκ²½ κ°μ§
|
|
|
|
| 247 |
return draw_img
|
| 248 |
|
| 249 |
# ============ UI FUNCTIONS ============
|
| 250 |
+
def update_layer_selector_choices(manager):
|
| 251 |
+
"""λ μ΄μ΄ μ ν λλ‘λ€μ΄μ choices μ
λ°μ΄νΈ"""
|
| 252 |
+
choices = [(layer['name'], lid) for lid, layer in manager.layers.items()]
|
| 253 |
+
return gr.Dropdown(choices=choices, interactive=True, value=manager.current_layer_id)
|
| 254 |
+
|
| 255 |
def create_new_layer(name, current_manager):
|
| 256 |
"""μ λ μ΄μ΄ μμ±"""
|
| 257 |
if current_manager is None:
|
| 258 |
current_manager = LayerManager()
|
| 259 |
+
|
| 260 |
if not name.strip():
|
| 261 |
+
return current_manager, create_layer_status_html(current_manager), update_layer_selector_choices(current_manager), "Please enter a layer name"
|
| 262 |
|
| 263 |
# μ€λ³΅ μ΄λ¦ 체ν¬
|
| 264 |
for layer_id, layer in current_manager.layers.items():
|
| 265 |
if layer['name'] == name.strip():
|
| 266 |
+
return current_manager, create_layer_status_html(current_manager), update_layer_selector_choices(current_manager), f"Layer name '{name}' already exists"
|
| 267 |
|
| 268 |
layer_id = current_manager.create_layer(name.strip())
|
| 269 |
current_manager.set_current_layer(layer_id)
|
|
|
|
|
|
|
|
|
|
| 270 |
|
| 271 |
+
return current_manager, create_layer_status_html(current_manager), update_layer_selector_choices(current_manager), f"Layer '{name}' created"
|
| 272 |
|
| 273 |
def create_layer_status_html(current_manager):
|
| 274 |
"""λ μ΄μ΄ μν νμ HTML μμ± (μκ°μ νμλ§)"""
|
|
|
|
| 464 |
|
| 465 |
|
| 466 |
# ============ GRADIO INTERFACE ============
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 467 |
# No custom JavaScript needed anymore
|
| 468 |
custom_js = ""
|
| 469 |
|
| 470 |
+
with gr.Blocks() as demo:
|
| 471 |
with gr.Column(elem_id="col-container"):
|
| 472 |
gr.Markdown("# **SAM3 Layer Segmentation Tool**", elem_id="main-title")
|
| 473 |
gr.Markdown("**Layer-based object separation and area analysis tool** | 1. Create layers 2. Select point mode and click 3. Run segmentation (processes all layers)")
|
|
|
|
| 541 |
if mgr is None:
|
| 542 |
mgr = LayerManager()
|
| 543 |
|
|
|
|
|
|
|
| 544 |
if layer_id:
|
| 545 |
mgr.set_current_layer(layer_id)
|
| 546 |
+
return mgr, create_layer_status_html(mgr), f"Layer '{mgr.layers[layer_id]['name']}' selected"
|
| 547 |
+
return mgr, create_layer_status_html(mgr), "Please select a layer"
|
| 548 |
|
| 549 |
layer_selector.change(
|
| 550 |
on_layer_select,
|
| 551 |
inputs=[layer_selector, st_layer_manager],
|
| 552 |
+
outputs=[st_layer_manager, layer_buttons_html, status_text]
|
| 553 |
)
|
| 554 |
|
| 555 |
# ν¬μΈνΈ λͺ¨λ λ³κ²½
|
|
|
|
| 613 |
new_manager = LayerManager()
|
| 614 |
empty_html = "<div style='padding: 10px; text-align: center; color: #888;'>No layers created</div>"
|
| 615 |
# μ
λ‘λν μ΄λ―Έμ§λ₯Ό μΆλ ₯μλ νμ
|
| 616 |
+
return new_manager, img, pd.DataFrame(), empty_html, update_layer_selector_choices(new_manager), "positive", "Include Point (Red)", "New image uploaded"
|
| 617 |
+
|
| 618 |
img_input.change(
|
| 619 |
on_image_upload,
|
| 620 |
inputs=[img_input],
|
|
|
|
| 623 |
|
| 624 |
@spaces.GPU
|
| 625 |
def run_spaces():
|
| 626 |
+
demo.launch(ssr=False, css="""
|
| 627 |
+
#col-container { margin: 0 auto; max-width: 1200px; }
|
| 628 |
+
#main-title h1 { font-size: 2.1em !important; }
|
| 629 |
+
.layer-button { margin: 2px; }
|
| 630 |
+
""")
|
| 631 |
|
| 632 |
def run_local():
|
| 633 |
+
demo.launch(show_error=True, ssr=False, css="""
|
| 634 |
+
#col-container { margin: 0 auto; max-width: 1200px; }
|
| 635 |
+
#main-title h1 { font-size: 2.1em !important; }
|
| 636 |
+
.layer-button { margin: 2px; }
|
| 637 |
+
""")
|
| 638 |
|
| 639 |
if __name__ == "__main__":
|
| 640 |
# Hugging Spaces νκ²½ κ°μ§
|