Spaces:
Runtime error
Runtime error
Upload app.py
Browse files
app.py
CHANGED
@@ -75,7 +75,7 @@ def run_sam(predictor, selected_points):
|
|
75 |
best_mask = cv2.erode(best_mask, kernel, iterations=1)
|
76 |
return best_mask
|
77 |
|
78 |
-
def apply_mask_overlay(image, mask):
|
79 |
"""
|
80 |
在原图上叠加 mask:使用红色绘制 mask 的轮廓,非 mask 区域叠加浅灰色半透明遮罩。
|
81 |
"""
|
@@ -85,7 +85,7 @@ def apply_mask_overlay(image, mask):
|
|
85 |
non_mask = mask == 0
|
86 |
overlay[non_mask] = (0.5 * overlay[non_mask] + 0.5 * gray_color).astype(np.uint8)
|
87 |
contours, _ = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
|
88 |
-
cv2.drawContours(overlay, contours, -1,
|
89 |
return overlay
|
90 |
|
91 |
def segment_and_overlay(image, points, sam_predictor):
|
@@ -401,6 +401,42 @@ def delete_mask(mask_list):
|
|
401 |
return mask_list
|
402 |
|
403 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
404 |
with gr.Blocks(delete_cache=(600, 600)) as demo:
|
405 |
gr.Markdown("""
|
406 |
## 3D Amodal Reconstruction with [Amodal3R](https://sm0kywu.github.io/Amodal3R/)
|
@@ -557,6 +593,11 @@ with gr.Blocks(delete_cache=(600, 600)) as demo:
|
|
557 |
inputs=[original_image, visibility_mask_list],
|
558 |
outputs=[visible_mask]
|
559 |
)
|
|
|
|
|
|
|
|
|
|
|
560 |
gen_occ_mask.click(
|
561 |
segment_and_overlay,
|
562 |
inputs=[original_image, occlusion_points_state, predictor],
|
@@ -572,6 +613,18 @@ with gr.Blocks(delete_cache=(600, 600)) as demo:
|
|
572 |
inputs=[original_image, occlusion_mask_list],
|
573 |
outputs=[occluded_mask]
|
574 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
575 |
|
576 |
|
577 |
# 启动 Gradio App
|
|
|
75 |
best_mask = cv2.erode(best_mask, kernel, iterations=1)
|
76 |
return best_mask
|
77 |
|
78 |
+
def apply_mask_overlay(image, mask, color=(255, 0, 0)):
|
79 |
"""
|
80 |
在原图上叠加 mask:使用红色绘制 mask 的轮廓,非 mask 区域叠加浅灰色半透明遮罩。
|
81 |
"""
|
|
|
85 |
non_mask = mask == 0
|
86 |
overlay[non_mask] = (0.5 * overlay[non_mask] + 0.5 * gray_color).astype(np.uint8)
|
87 |
contours, _ = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
|
88 |
+
cv2.drawContours(overlay, contours, -1, color, 2)
|
89 |
return overlay
|
90 |
|
91 |
def segment_and_overlay(image, points, sam_predictor):
|
|
|
401 |
return mask_list
|
402 |
|
403 |
|
404 |
+
def apply_combined_mask_overlay(image, vis_mask, occ_mask):
|
405 |
+
"""
|
406 |
+
在原图上叠加 mask:使用红色绘制 mask 的轮廓,非 mask 区域叠加浅灰色半透明遮罩。
|
407 |
+
"""
|
408 |
+
img_arr = image
|
409 |
+
overlay = img_arr.copy()
|
410 |
+
gray_color = np.array([200, 200, 200], dtype=np.uint8)
|
411 |
+
non_mask = (vis_mask == 0) & (occ_mask == 0)
|
412 |
+
overlay[non_mask] = (0.5 * overlay[non_mask] + 0.5 * gray_color).astype(np.uint8)
|
413 |
+
contours_occ, _ = cv2.findContours(occ_mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
|
414 |
+
cv2.drawContours(overlay, contours_occ, -1, (255,0,0), 2)
|
415 |
+
contours_vis, _ = cv2.findContours(vis_mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
|
416 |
+
cv2.drawContours(overlay, contours_vis, -1, (255,0,0), 2)
|
417 |
+
return overlay
|
418 |
+
|
419 |
+
|
420 |
+
def combine_mask(image, visible_mask_list, occlusion_mask_list):
|
421 |
+
combined_vis_mask = np.zeros_like(image[:, :, 0])
|
422 |
+
combined_occ_mask = np.zeros_like(image[:, :, 0])
|
423 |
+
combined_mask = np.zeros_like(image[:, :, 0])
|
424 |
+
for mask in visible_mask_list:
|
425 |
+
combined_vis_mask = cv2.bitwise_or(combined_mask, mask)
|
426 |
+
for mask in occlusion_mask_list:
|
427 |
+
combined_occ_mask = cv2.bitwise_or(combined_mask, mask)
|
428 |
+
overlay = apply_combined_mask_overlay(image, combined_vis_mask, combined_occ_mask)
|
429 |
+
# 5*5 kernel dilate for occlusion mask
|
430 |
+
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
|
431 |
+
combined_occ_mask = cv2.dilate(combined_occ_mask, kernel, iterations=1)
|
432 |
+
combined_mask[combined_occ_mask > 0] = 128
|
433 |
+
combined_mask[combined_vis_mask > 0] = 255
|
434 |
+
# concat the mask and overlay to be a single image
|
435 |
+
print(overlay.shape, combined_mask.shape)
|
436 |
+
result = cv2.hconcat([overlay, combined_mask[..., None].repeat(3, axis=-1)])
|
437 |
+
return result
|
438 |
+
|
439 |
+
|
440 |
with gr.Blocks(delete_cache=(600, 600)) as demo:
|
441 |
gr.Markdown("""
|
442 |
## 3D Amodal Reconstruction with [Amodal3R](https://sm0kywu.github.io/Amodal3R/)
|
|
|
593 |
inputs=[original_image, visibility_mask_list],
|
594 |
outputs=[visible_mask]
|
595 |
)
|
596 |
+
undo_vis_mask.click(
|
597 |
+
delete_mask,
|
598 |
+
inputs=[visibility_mask_list],
|
599 |
+
outputs=[visibility_mask_list]
|
600 |
+
)
|
601 |
gen_occ_mask.click(
|
602 |
segment_and_overlay,
|
603 |
inputs=[original_image, occlusion_points_state, predictor],
|
|
|
613 |
inputs=[original_image, occlusion_mask_list],
|
614 |
outputs=[occluded_mask]
|
615 |
)
|
616 |
+
undo_occ_mask.click(
|
617 |
+
delete_mask,
|
618 |
+
inputs=[occlusion_mask_list],
|
619 |
+
outputs=[occlusion_mask_list]
|
620 |
+
)
|
621 |
+
|
622 |
+
# check combined mask
|
623 |
+
check_combine_button.click(
|
624 |
+
combine_mask,
|
625 |
+
inputs=[original_image, visibility_mask_list, occlusion_mask_list],
|
626 |
+
outputs=[combined_mask]
|
627 |
+
)
|
628 |
|
629 |
|
630 |
# 启动 Gradio App
|