Sm0kyWu commited on
Commit
2c544af
·
verified ·
1 Parent(s): 05fab42

Upload app.py

Browse files
Files changed (1) hide show
  1. app.py +55 -2
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, (255, 0, 0), 2)
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