Ayesha-Majeed commited on
Commit
fbc2557
Β·
verified Β·
1 Parent(s): e0f9722

Upload app.py

Browse files
Files changed (1) hide show
  1. app.py +133 -56
app.py CHANGED
@@ -499,6 +499,70 @@ def run_segformer(img_rgb, morph_cleanup=False):
499
  except Exception as e:
500
  return img_rgb, None, f"SegFormer Error: {e}"
501
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
502
  # ═══════════════════════════════════════════════════════════════════════════════
503
  # Gradio Process Function
504
  # ═══════════════════════════════════════════════════════════════════════════════
@@ -582,22 +646,23 @@ with gr.Blocks(theme=theme, title="Car Window Segmentation") as demo:
582
 
583
  **Custom Trained Models:**
584
 
585
- 1. YOLOv8x-seg
586
  2. YOLO11x-seg
587
- 3. Mask R-CNN
588
- 4. SegFormer
589
- 5. SegFormer + Morphological
590
- 6. SAM + YOLO (Strategy 1: Bbox + 5 Points)
591
- 7. SAM + YOLO (Strategy 2: Mask + 5 Points)
592
- 8. SAM + YOLO (Strategy 3: Direct Mask Prompting)
 
593
 
594
  **Pretrained Zero-Shot Models:**
595
 
596
- 9. Grounding DINO
597
- 10. Grounded SAM
598
- 11. Intelliarts Car Parts
599
 
600
- **Our Findings:** SegFormer and YOLO11x deliver the best performance with significantly sharper edge precision.
601
  """)
602
 
603
  with gr.Row():
@@ -614,12 +679,12 @@ with gr.Blocks(theme=theme, title="Car Window Segmentation") as demo:
614
  gr.Markdown("---")
615
  gr.Markdown("## πŸš€ Custom Trained Models")
616
 
617
- gr.Markdown("### 1️⃣ YOLOv8x-seg")
618
  with gr.Row():
619
- seq_yolo_img = gr.Image(label="YOLO Overlay", interactive=False)
620
- seq_yolo_bw = gr.Image(label="YOLO Binary Mask", interactive=False, image_mode="L")
621
- seq_yolo_stats = gr.Textbox(label="YOLO Stats", interactive=False)
622
-
623
  gr.Markdown("---")
624
  gr.Markdown("### 2️⃣ YOLO11x-seg")
625
  with gr.Row():
@@ -628,42 +693,49 @@ with gr.Blocks(theme=theme, title="Car Window Segmentation") as demo:
628
  seq_yolo11_stats = gr.Textbox(label="YOLO11x Stats", interactive=False)
629
 
630
  gr.Markdown("---")
631
- gr.Markdown("### 3️⃣ Mask R-CNN (ResNet50-FPN)")
632
  with gr.Row():
633
- seq_mrcnn_img = gr.Image(label="Mask R-CNN Overlay", interactive=False)
634
- seq_mrcnn_bw = gr.Image(label="Mask R-CNN Binary Mask", interactive=False, image_mode="L")
635
- seq_mrcnn_stats = gr.Textbox(label="Mask R-CNN Stats", interactive=False)
 
 
 
 
 
 
 
636
 
637
  gr.Markdown("---")
638
- gr.Markdown("### 4️⃣ SegFormer (Transformer - Best Model)")
639
  with gr.Row():
640
- seq_segf_img = gr.Image(label="SegFormer Overlay", interactive=False)
641
- seq_segf_bw = gr.Image(label="SegFormer Binary Mask", interactive=False, image_mode="L")
642
- seq_segf_stats = gr.Textbox(label="SegFormer Stats", interactive=False)
643
 
644
  gr.Markdown("---")
645
- gr.Markdown("### 5️⃣ SegFormer + Morphological Cleanup (Holes Filled + Sharp Borders)")
646
  with gr.Row():
647
  seq_segf_morph_img = gr.Image(label="SegFormer + Morph Overlay", interactive=False)
648
  seq_segf_morph_bw = gr.Image(label="SegFormer + Morph Binary Mask", interactive=False, image_mode="L")
649
  seq_segf_morph_stats = gr.Textbox(label="SegFormer + Morph Stats", interactive=False)
650
 
651
  gr.Markdown("---")
652
- gr.Markdown("### 6️⃣ SAM + YOLO (Strategy 1: Bbox + 5 Points)")
653
  with gr.Row():
654
  seq_sam1_img = gr.Image(label="SAM+YOLO Strat 1 Overlay", interactive=False)
655
  seq_sam1_bw = gr.Image(label="SAM+YOLO Strat 1 Binary Mask", interactive=False, image_mode="L")
656
  seq_sam1_stats = gr.Textbox(label="SAM+YOLO Strat 1 Stats", interactive=False)
657
 
658
  gr.Markdown("---")
659
- gr.Markdown("### 7️⃣ SAM + YOLO (Strategy 2: Mask + 5 Points)")
660
  with gr.Row():
661
  seq_sam2_img = gr.Image(label="SAM+YOLO Strat 2 Overlay", interactive=False)
662
  seq_sam2_bw = gr.Image(label="SAM+YOLO Strat 2 Binary Mask", interactive=False, image_mode="L")
663
  seq_sam2_stats = gr.Textbox(label="SAM+YOLO Strat 2 Stats", interactive=False)
664
 
665
  gr.Markdown("---")
666
- gr.Markdown("### 8️⃣ SAM + YOLO (Strategy 3: Direct Mask Prompting)")
667
  with gr.Row():
668
  seq_sam3_img = gr.Image(label="SAM+YOLO Strat 3 Overlay", interactive=False)
669
  seq_sam3_bw = gr.Image(label="SAM+YOLO Strat 3 Binary Mask", interactive=False, image_mode="L")
@@ -672,21 +744,21 @@ with gr.Blocks(theme=theme, title="Car Window Segmentation") as demo:
672
  gr.Markdown("---")
673
  gr.Markdown("## 🌍 Pretrained Zero-Shot Models")
674
 
675
- gr.Markdown("### 9️⃣ Grounding DINO (Zero-Shot Detection)")
676
  with gr.Row():
677
  seq_dino_img = gr.Image(label="Grounding DINO Overlay", interactive=False)
678
  seq_dino_bw = gr.Image(label="Grounding DINO Binary Mask", interactive=False, image_mode="L")
679
  seq_dino_stats = gr.Textbox(label="Grounding DINO Stats", interactive=False)
680
 
681
  gr.Markdown("---")
682
- gr.Markdown("### πŸ”Ÿ Grounded SAM (Zero-Shot Segmentation)")
683
  with gr.Row():
684
  seq_gsam_img = gr.Image(label="Grounded SAM Overlay", interactive=False)
685
  seq_gsam_bw = gr.Image(label="Grounded SAM Binary Mask", interactive=False, image_mode="L")
686
  seq_gsam_stats = gr.Textbox(label="Grounded SAM Stats", interactive=False)
687
 
688
  gr.Markdown("---")
689
- gr.Markdown("### 1️⃣1️⃣ Intelliarts Car Parts (Detectron2)")
690
  with gr.Row():
691
  seq_intell_img = gr.Image(label="Intelliarts Car Parts Overlay", interactive=False)
692
  seq_intell_bw = gr.Image(label="Intelliarts Car Parts Binary Mask", interactive=False, image_mode="L")
@@ -694,63 +766,68 @@ with gr.Blocks(theme=theme, title="Car Window Segmentation") as demo:
694
 
695
  def run_all_models(img):
696
  if img is None:
697
- yield tuple([None]*33)
698
  return
699
 
700
- # Initialize empty array for all 33 outputs
701
- results = [None] * 33
702
 
703
- # 1. YOLOv8x-seg
704
- results[0], results[1], results[2] = process_image(img, "YOLOv8x-seg", "", False)
705
  yield tuple(results)
706
 
707
  # 2. YOLO11x-seg
708
  results[3], results[4], results[5] = process_image(img, "YOLO11x-seg", "", False)
709
  yield tuple(results)
710
 
711
- # 3. Mask R-CNN
712
- results[6], results[7], results[8] = process_image(img, "Mask R-CNN", "", False)
 
 
 
 
713
  yield tuple(results)
714
 
715
- # 4. SegFormer
716
- results[9], results[10], results[11] = run_segformer(img, morph_cleanup=False)
717
  yield tuple(results)
718
 
719
- # 5. SegFormer + Morphology
720
- results[12], results[13], results[14] = run_segformer(img, morph_cleanup=True)
721
  yield tuple(results)
722
 
723
- # 6. SAM + YOLO Strat 1
724
- results[15], results[16], results[17] = process_image(img, "SAM + YOLO (Strategy 1: Bbox + 5 Points)", "", False)
725
  yield tuple(results)
726
 
727
- # 7. SAM + YOLO Strat 2
728
- results[18], results[19], results[20] = process_image(img, "SAM + YOLO (Strategy 2: Mask + 5 Points)", "", False)
729
  yield tuple(results)
730
 
731
- # 8. SAM + YOLO Strat 3
732
- results[21], results[22], results[23] = process_image(img, "SAM + YOLO (Strategy 3: Direct Mask Prompting)", "", False)
733
  yield tuple(results)
734
 
735
- # 9. Grounding DINO
736
- results[24], results[25], results[26] = process_image(img, "Grounding DINO (Zero-Shot Detection)", "car window. car glass. windshield.", False)
737
  yield tuple(results)
738
 
739
- # 10. Grounded SAM
740
- results[27], results[28], results[29] = process_image(img, "Grounded SAM (Zero-Shot Segmentation)", "car window. car glass. windshield.", False)
741
  yield tuple(results)
742
 
743
- # 11. Intelliarts
744
- results[30], results[31], results[32] = process_image(img, "Intelliarts Car Parts (Detectron2)", "", False)
745
  yield tuple(results)
746
 
747
  submit_btn_seq.click(
748
  fn=run_all_models,
749
  inputs=[input_image_seq],
750
- outputs=[seq_yolo_img, seq_yolo_bw, seq_yolo_stats,
751
  seq_yolo11_img, seq_yolo11_bw, seq_yolo11_stats,
 
 
752
  seq_mrcnn_img, seq_mrcnn_bw, seq_mrcnn_stats,
753
- seq_segf_img, seq_segf_bw, seq_segf_stats,
754
  seq_segf_morph_img, seq_segf_morph_bw, seq_segf_morph_stats,
755
  seq_sam1_img, seq_sam1_bw, seq_sam1_stats,
756
  seq_sam2_img, seq_sam2_bw, seq_sam2_stats,
 
499
  except Exception as e:
500
  return img_rgb, None, f"SegFormer Error: {e}"
501
 
502
+ # ═══════════════════════════════════════════════════════════════════════════════
503
+ # BiRefNet Function
504
+ # ═══════════════════════════════════════════════════════════════════════════════
505
+ def run_birefnet(img_rgb):
506
+ try:
507
+ from transformers import AutoModelForImageSegmentation
508
+ from torchvision import transforms
509
+ import torch.nn.functional as F
510
+
511
+ t0 = time.time()
512
+
513
+ base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
514
+
515
+ # Paths to try (works for local PC and Hugging Face Cloud deployment)
516
+ paths_to_try = [
517
+ os.path.join(base_dir, "BiRefNet_Model", "best_model-20260624T051601Z-3-001", "best_model"), # Local PC
518
+ "birefnet_model", # Hugging Face Root / Root dir
519
+ os.path.join(os.path.dirname(os.path.abspath(__file__)), "birefnet_model"), # Next to app.py
520
+ "best_birefnet_model" # Extra fallback
521
+ ]
522
+
523
+ model_path = None
524
+ for p in paths_to_try:
525
+ if os.path.exists(p) and os.path.exists(os.path.join(p, "config.json")):
526
+ model_path = p
527
+ break
528
+
529
+ # Final fallback: Download directly from Hugging Face Model Repo!
530
+ if model_path is None:
531
+ model_path = "Ayesha-Majeed/birefnet_car_window"
532
+
533
+ model = AutoModelForImageSegmentation.from_pretrained(model_path, trust_remote_code=True).to(DEVICE)
534
+ model.eval()
535
+
536
+ image_transform = transforms.Compose([
537
+ transforms.Resize((1024, 1024)),
538
+ transforms.ToTensor(),
539
+ transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]),
540
+ ])
541
+
542
+ from PIL import Image
543
+ pil_img = Image.fromarray(img_rgb)
544
+ input_tensor = image_transform(pil_img).unsqueeze(0).to(DEVICE)
545
+
546
+ with torch.no_grad():
547
+ if DEVICE == "cuda":
548
+ with torch.amp.autocast("cuda"):
549
+ preds = model(input_tensor)
550
+ final_pred = preds[-1] if isinstance(preds, (list, tuple)) else preds
551
+ else:
552
+ preds = model(input_tensor)
553
+ final_pred = preds[-1] if isinstance(preds, (list, tuple)) else preds
554
+
555
+ h, w = img_rgb.shape[:2]
556
+ final_pred = F.interpolate(final_pred, size=(h, w), mode="bilinear", align_corners=False)
557
+ pred_mask = (torch.sigmoid(final_pred) > 0.5).squeeze().cpu().numpy().astype(np.uint8)
558
+
559
+ elapsed = time.time() - t0
560
+ out = apply_mask_overlay(img_rgb, pred_mask > 0, color=(255, 0, 0)) # Red
561
+ bw_mask = (pred_mask * 255).astype(np.uint8)
562
+ return out, bw_mask, f"Found: 1 (Semantic) | Inference: {elapsed:.2f}s"
563
+ except Exception as e:
564
+ return img_rgb, None, f"BiRefNet Error: {e}"
565
+
566
  # ═══════════════════════════════════════════════════════════════════════════════
567
  # Gradio Process Function
568
  # ═══════════════════════════════════════════════════════════════════════════════
 
646
 
647
  **Custom Trained Models:**
648
 
649
+ 1. SegFormer
650
  2. YOLO11x-seg
651
+ 3. BiRefNet
652
+ 4. YOLOv8x-seg
653
+ 5. Mask R-CNN
654
+ 6. SegFormer + Morphological
655
+ 7. SAM + YOLO (Strategy 1: Bbox + 5 Points)
656
+ 8. SAM + YOLO (Strategy 2: Mask + 5 Points)
657
+ 9. SAM + YOLO (Strategy 3: Direct Mask Prompting)
658
 
659
  **Pretrained Zero-Shot Models:**
660
 
661
+ 10. Grounding DINO
662
+ 11. Grounded SAM
663
+ 12. Intelliarts Car Parts
664
 
665
+ **Our Findings:** BiRefNet, SegFormer, and YOLO11x deliver the best performance with significantly sharper edge precision.
666
  """)
667
 
668
  with gr.Row():
 
679
  gr.Markdown("---")
680
  gr.Markdown("## πŸš€ Custom Trained Models")
681
 
682
+ gr.Markdown("### 1️⃣ SegFormer (Transformer)")
683
  with gr.Row():
684
+ seq_segf_img = gr.Image(label="SegFormer Overlay", interactive=False)
685
+ seq_segf_bw = gr.Image(label="SegFormer Binary Mask", interactive=False, image_mode="L")
686
+ seq_segf_stats = gr.Textbox(label="SegFormer Stats", interactive=False)
687
+
688
  gr.Markdown("---")
689
  gr.Markdown("### 2️⃣ YOLO11x-seg")
690
  with gr.Row():
 
693
  seq_yolo11_stats = gr.Textbox(label="YOLO11x Stats", interactive=False)
694
 
695
  gr.Markdown("---")
696
+ gr.Markdown("### 3️⃣ BiRefNet (Boundary-Aware Model)")
697
  with gr.Row():
698
+ seq_biref_img = gr.Image(label="BiRefNet Overlay", interactive=False)
699
+ seq_biref_bw = gr.Image(label="BiRefNet Binary Mask", interactive=False, image_mode="L")
700
+ seq_biref_stats = gr.Textbox(label="BiRefNet Stats", interactive=False)
701
+
702
+ gr.Markdown("---")
703
+ gr.Markdown("### 4️⃣ YOLOv8x-seg")
704
+ with gr.Row():
705
+ seq_yolo_img = gr.Image(label="YOLO Overlay", interactive=False)
706
+ seq_yolo_bw = gr.Image(label="YOLO Binary Mask", interactive=False, image_mode="L")
707
+ seq_yolo_stats = gr.Textbox(label="YOLO Stats", interactive=False)
708
 
709
  gr.Markdown("---")
710
+ gr.Markdown("### 5️⃣ Mask R-CNN (ResNet50-FPN)")
711
  with gr.Row():
712
+ seq_mrcnn_img = gr.Image(label="Mask R-CNN Overlay", interactive=False)
713
+ seq_mrcnn_bw = gr.Image(label="Mask R-CNN Binary Mask", interactive=False, image_mode="L")
714
+ seq_mrcnn_stats = gr.Textbox(label="Mask R-CNN Stats", interactive=False)
715
 
716
  gr.Markdown("---")
717
+ gr.Markdown("### 6️⃣ SegFormer + Morphological Cleanup (Holes Filled + Sharp Borders)")
718
  with gr.Row():
719
  seq_segf_morph_img = gr.Image(label="SegFormer + Morph Overlay", interactive=False)
720
  seq_segf_morph_bw = gr.Image(label="SegFormer + Morph Binary Mask", interactive=False, image_mode="L")
721
  seq_segf_morph_stats = gr.Textbox(label="SegFormer + Morph Stats", interactive=False)
722
 
723
  gr.Markdown("---")
724
+ gr.Markdown("### 7️⃣ SAM + YOLO (Strategy 1: Bbox + 5 Points)")
725
  with gr.Row():
726
  seq_sam1_img = gr.Image(label="SAM+YOLO Strat 1 Overlay", interactive=False)
727
  seq_sam1_bw = gr.Image(label="SAM+YOLO Strat 1 Binary Mask", interactive=False, image_mode="L")
728
  seq_sam1_stats = gr.Textbox(label="SAM+YOLO Strat 1 Stats", interactive=False)
729
 
730
  gr.Markdown("---")
731
+ gr.Markdown("### 8️⃣ SAM + YOLO (Strategy 2: Mask + 5 Points)")
732
  with gr.Row():
733
  seq_sam2_img = gr.Image(label="SAM+YOLO Strat 2 Overlay", interactive=False)
734
  seq_sam2_bw = gr.Image(label="SAM+YOLO Strat 2 Binary Mask", interactive=False, image_mode="L")
735
  seq_sam2_stats = gr.Textbox(label="SAM+YOLO Strat 2 Stats", interactive=False)
736
 
737
  gr.Markdown("---")
738
+ gr.Markdown("### 9️⃣ SAM + YOLO (Strategy 3: Direct Mask Prompting)")
739
  with gr.Row():
740
  seq_sam3_img = gr.Image(label="SAM+YOLO Strat 3 Overlay", interactive=False)
741
  seq_sam3_bw = gr.Image(label="SAM+YOLO Strat 3 Binary Mask", interactive=False, image_mode="L")
 
744
  gr.Markdown("---")
745
  gr.Markdown("## 🌍 Pretrained Zero-Shot Models")
746
 
747
+ gr.Markdown("### πŸ”Ÿ Grounding DINO (Zero-Shot Detection)")
748
  with gr.Row():
749
  seq_dino_img = gr.Image(label="Grounding DINO Overlay", interactive=False)
750
  seq_dino_bw = gr.Image(label="Grounding DINO Binary Mask", interactive=False, image_mode="L")
751
  seq_dino_stats = gr.Textbox(label="Grounding DINO Stats", interactive=False)
752
 
753
  gr.Markdown("---")
754
+ gr.Markdown("### 1️⃣1️⃣ Grounded SAM (Zero-Shot Segmentation)")
755
  with gr.Row():
756
  seq_gsam_img = gr.Image(label="Grounded SAM Overlay", interactive=False)
757
  seq_gsam_bw = gr.Image(label="Grounded SAM Binary Mask", interactive=False, image_mode="L")
758
  seq_gsam_stats = gr.Textbox(label="Grounded SAM Stats", interactive=False)
759
 
760
  gr.Markdown("---")
761
+ gr.Markdown("### 1️⃣2️⃣ Intelliarts Car Parts (Detectron2)")
762
  with gr.Row():
763
  seq_intell_img = gr.Image(label="Intelliarts Car Parts Overlay", interactive=False)
764
  seq_intell_bw = gr.Image(label="Intelliarts Car Parts Binary Mask", interactive=False, image_mode="L")
 
766
 
767
  def run_all_models(img):
768
  if img is None:
769
+ yield tuple([None]*36)
770
  return
771
 
772
+ # Initialize empty array for all 36 outputs
773
+ results = [None] * 36
774
 
775
+ # 1. SegFormer
776
+ results[0], results[1], results[2] = run_segformer(img, morph_cleanup=False)
777
  yield tuple(results)
778
 
779
  # 2. YOLO11x-seg
780
  results[3], results[4], results[5] = process_image(img, "YOLO11x-seg", "", False)
781
  yield tuple(results)
782
 
783
+ # 3. BiRefNet
784
+ results[6], results[7], results[8] = run_birefnet(img)
785
+ yield tuple(results)
786
+
787
+ # 4. YOLOv8x-seg
788
+ results[9], results[10], results[11] = process_image(img, "YOLOv8x-seg", "", False)
789
  yield tuple(results)
790
 
791
+ # 5. Mask R-CNN
792
+ results[12], results[13], results[14] = process_image(img, "Mask R-CNN", "", False)
793
  yield tuple(results)
794
 
795
+ # 6. SegFormer + Morphology
796
+ results[15], results[16], results[17] = run_segformer(img, morph_cleanup=True)
797
  yield tuple(results)
798
 
799
+ # 7. SAM + YOLO Strat 1
800
+ results[18], results[19], results[20] = process_image(img, "SAM + YOLO (Strategy 1: Bbox + 5 Points)", "", False)
801
  yield tuple(results)
802
 
803
+ # 8. SAM + YOLO Strat 2
804
+ results[21], results[22], results[23] = process_image(img, "SAM + YOLO (Strategy 2: Mask + 5 Points)", "", False)
805
  yield tuple(results)
806
 
807
+ # 9. SAM + YOLO Strat 3
808
+ results[24], results[25], results[26] = process_image(img, "SAM + YOLO (Strategy 3: Direct Mask Prompting)", "", False)
809
  yield tuple(results)
810
 
811
+ # 10. Grounding DINO
812
+ results[27], results[28], results[29] = process_image(img, "Grounding DINO (Zero-Shot Detection)", "car window. car glass. windshield.", False)
813
  yield tuple(results)
814
 
815
+ # 11. Grounded SAM
816
+ results[30], results[31], results[32] = process_image(img, "Grounded SAM (Zero-Shot Segmentation)", "car window. car glass. windshield.", False)
817
  yield tuple(results)
818
 
819
+ # 12. Intelliarts
820
+ results[33], results[34], results[35] = process_image(img, "Intelliarts Car Parts (Detectron2)", "", False)
821
  yield tuple(results)
822
 
823
  submit_btn_seq.click(
824
  fn=run_all_models,
825
  inputs=[input_image_seq],
826
+ outputs=[seq_segf_img, seq_segf_bw, seq_segf_stats,
827
  seq_yolo11_img, seq_yolo11_bw, seq_yolo11_stats,
828
+ seq_biref_img, seq_biref_bw, seq_biref_stats,
829
+ seq_yolo_img, seq_yolo_bw, seq_yolo_stats,
830
  seq_mrcnn_img, seq_mrcnn_bw, seq_mrcnn_stats,
 
831
  seq_segf_morph_img, seq_segf_morph_bw, seq_segf_morph_stats,
832
  seq_sam1_img, seq_sam1_bw, seq_sam1_stats,
833
  seq_sam2_img, seq_sam2_bw, seq_sam2_stats,