Ayesha-Majeed commited on
Commit
e11c4c9
·
verified ·
1 Parent(s): cb5086d

Upload app.py

Browse files
Files changed (1) hide show
  1. app.py +92 -103
app.py CHANGED
@@ -573,100 +573,33 @@ with gr.Blocks(theme=theme, title="Car Window Segmentation") as demo:
573
  Compare your custom trained YOLOv8 model against state-of-the-art Zero-Shot models!
574
  """)
575
 
576
- # ── TAB 1: Custom Models ──
577
- with gr.Tab("Test Custom Models"):
578
- with gr.Row():
579
- with gr.Column(scale=1):
580
- input_image_custom = gr.Image(type="numpy", label="Upload Window Image")
581
- model_dropdown_custom = gr.Dropdown(
582
- choices=[
583
- "YOLOv8x-seg (Custom Window)",
584
- "YOLOv8x-seg",
585
- "YOLO11x-seg",
586
- "SAM + YOLO (Strategy 1: Bbox + 5 Points)",
587
- "SAM + YOLO (Strategy 2: Mask + 5 Points)",
588
- "SAM + YOLO (Strategy 3: Direct Mask Prompting)",
589
- "Mask R-CNN",
590
- "SegFormer"
591
- ],
592
- value="SegFormer",
593
- label="Select Custom Model",
594
- info="Choose between fine-tuned models and experimental architectures"
595
- )
596
- morph_checkbox = gr.Checkbox(
597
- value=False,
598
- label="Apply Morphological Cleanup",
599
- info="Fills holes inside mask (Closing) and removes tiny noise blobs (Opening). Visual only — does not affect mAP metrics."
600
- )
601
- submit_btn_custom = gr.Button("Run Segmentation", variant="primary", size="lg")
602
- with gr.Column(scale=1):
603
- output_image_custom = gr.Image(label="Segmentation Result", interactive=False)
604
- output_mask_custom = gr.Image(label="Binary Mask (White=Object, Black=Background)", interactive=False)
605
- output_stats_custom = gr.Textbox(label="Detection Statistics", interactive=False)
606
 
607
- if mirror_examples:
608
- gr.Markdown("### Click any window image below to load it")
609
- custom_gallery = gr.Gallery(value=mirror_examples, columns=10, height=120, object_fit="cover", allow_preview=False, show_label=False)
610
-
611
- def load_mirror_img_custom(evt: gr.SelectData):
612
- return mirror_examples[evt.index]
613
-
614
- custom_gallery.select(fn=load_mirror_img_custom, inputs=None, outputs=input_image_custom)
615
 
616
- submit_btn_custom.click(
617
- fn=process_image,
618
- inputs=[input_image_custom, model_dropdown_custom, gr.State(""), morph_checkbox],
619
- outputs=[output_image_custom, output_mask_custom, output_stats_custom]
620
- )
621
 
622
- # ── TAB 2: Pretrained Zero-Shot Models ──
623
- with gr.Tab("Pretrained Zero-Shot Models"):
624
- with gr.Row():
625
- with gr.Column(scale=1):
626
- input_image_pretrained = gr.Image(type="numpy", label="Upload Window Image")
627
- model_dropdown_pretrained = gr.Dropdown(
628
- choices=[
629
- "Grounding DINO (Zero-Shot Detection)",
630
- "Grounded SAM (Zero-Shot Segmentation)",
631
- "Intelliarts Car Parts (Detectron2)"
632
- ],
633
- value="Grounded SAM (Zero-Shot Segmentation)",
634
- label="Select Pretrained Model",
635
- info="Finds windows purely based on the text prompt you provide below!"
636
- )
637
- text_prompt = gr.Textbox(
638
- value="car window. car glass. windshield.",
639
- label="What to search for? (Text Prompt)",
640
- info="Be sure to separate terms with a period."
641
- )
642
- submit_btn_pretrained = gr.Button("Run Zero-Shot Detection", variant="primary", size="lg")
643
- with gr.Column(scale=1):
644
- output_image_pretrained = gr.Image(label="Segmentation Result", interactive=False)
645
- output_mask_pretrained = gr.Image(label="Binary Mask", interactive=False)
646
- output_stats_pretrained = gr.Textbox(label="Detection Statistics", interactive=False)
647
 
648
- if mirror_examples:
649
- gr.Markdown("### Click any window image below to load it")
650
- pretrained_gallery = gr.Gallery(value=mirror_examples, columns=10, height=120, object_fit="cover", allow_preview=False, show_label=False)
651
-
652
- def load_mirror_img_pretrained(evt: gr.SelectData):
653
- return mirror_examples[evt.index]
654
-
655
- pretrained_gallery.select(fn=load_mirror_img_pretrained, inputs=None, outputs=input_image_pretrained)
656
 
657
- submit_btn_pretrained.click(
658
- fn=process_image,
659
- inputs=[input_image_pretrained, model_dropdown_pretrained, text_prompt],
660
- outputs=[output_image_pretrained, output_mask_pretrained, output_stats_pretrained]
661
- )
662
 
663
- # ── TAB 3: Sequential Multi-Model Inference ──
664
- with gr.Tab("Sequential Multi-Model Inference"):
665
- gr.Markdown("### Upload an image to run through all our custom models sequentially!")
 
 
666
  with gr.Row():
667
  input_image_seq = gr.Image(type="numpy", label="Upload Window Image")
668
  with gr.Row():
669
- submit_btn_seq = gr.Button("Run All Models in Sequence", variant="primary", size="lg")
670
 
671
  if mirror_examples:
672
  gr.Markdown("### Or click any example image below to load it:")
@@ -675,6 +608,8 @@ with gr.Blocks(theme=theme, title="Car Window Segmentation") as demo:
675
  compare_gallery.select(fn=load_compare_img, inputs=None, outputs=input_image_seq)
676
 
677
  gr.Markdown("---")
 
 
678
  gr.Markdown("### 1️⃣ YOLOv8x-seg")
679
  with gr.Row():
680
  seq_yolo_img = gr.Image(label="YOLO Overlay", interactive=False)
@@ -688,60 +623,114 @@ with gr.Blocks(theme=theme, title="Car Window Segmentation") as demo:
688
  seq_yolo11_bw = gr.Image(label="YOLO11x Binary Mask", interactive=False, image_mode="L")
689
  seq_yolo11_stats = gr.Textbox(label="YOLO11x Stats", interactive=False)
690
 
691
-
692
  gr.Markdown("---")
693
- gr.Markdown("### 2️⃣ Mask R-CNN (ResNet50-FPN)")
694
  with gr.Row():
695
  seq_mrcnn_img = gr.Image(label="Mask R-CNN Overlay", interactive=False)
696
  seq_mrcnn_bw = gr.Image(label="Mask R-CNN Binary Mask", interactive=False, image_mode="L")
697
  seq_mrcnn_stats = gr.Textbox(label="Mask R-CNN Stats", interactive=False)
698
 
699
  gr.Markdown("---")
700
- gr.Markdown("### 3️⃣ SegFormer (Transformer - Best Model)")
701
  with gr.Row():
702
  seq_segf_img = gr.Image(label="SegFormer Overlay", interactive=False)
703
  seq_segf_bw = gr.Image(label="SegFormer Binary Mask", interactive=False, image_mode="L")
704
  seq_segf_stats = gr.Textbox(label="SegFormer Stats", interactive=False)
705
 
706
  gr.Markdown("---")
707
- gr.Markdown("### 4️⃣ SegFormer + Morphological Cleanup (Holes Filled + Sharp Borders)")
708
  with gr.Row():
709
  seq_segf_morph_img = gr.Image(label="SegFormer + Morph Overlay", interactive=False)
710
  seq_segf_morph_bw = gr.Image(label="SegFormer + Morph Binary Mask", interactive=False, image_mode="L")
711
  seq_segf_morph_stats = gr.Textbox(label="SegFormer + Morph Stats", interactive=False)
712
 
713
- def run_sequential(img):
714
- if img is None: return [None]*15
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
715
 
716
- # Run YOLO
717
  yolo_out, yolo_mask, yolo_stats = process_image(img, "YOLOv8x-seg", "", False)
718
-
719
- # Run YOLO11x
720
  yolo11_out, yolo11_mask, yolo11_stats = process_image(img, "YOLO11x-seg", "", False)
721
-
722
- # Run Mask R-CNN
723
  mrcnn_out, mrcnn_mask, mrcnn_stats = process_image(img, "Mask R-CNN", "", False)
724
-
725
- # Run SegFormer (Plain)
726
  segf_out, segf_mask, segf_stats = run_segformer(img, morph_cleanup=False)
727
-
728
- # Run SegFormer + Morphological Cleanup (Holes filled + Sharp borders)
729
  segf_morph_out, segf_morph_mask, segf_morph_stats = run_segformer(img, morph_cleanup=True)
730
 
 
 
 
 
 
 
 
 
731
  return (yolo_out, yolo_mask, yolo_stats,
732
  yolo11_out, yolo11_mask, yolo11_stats,
733
  mrcnn_out, mrcnn_mask, mrcnn_stats,
734
  segf_out, segf_mask, segf_stats,
735
- segf_morph_out, segf_morph_mask, segf_morph_stats)
 
 
 
 
 
 
736
 
737
  submit_btn_seq.click(
738
- fn=run_sequential,
739
  inputs=[input_image_seq],
740
  outputs=[seq_yolo_img, seq_yolo_bw, seq_yolo_stats,
741
  seq_yolo11_img, seq_yolo11_bw, seq_yolo11_stats,
742
  seq_mrcnn_img, seq_mrcnn_bw, seq_mrcnn_stats,
743
  seq_segf_img, seq_segf_bw, seq_segf_stats,
744
- seq_segf_morph_img, seq_segf_morph_bw, seq_segf_morph_stats]
 
 
 
 
 
 
745
  )
746
 
747
  if __name__ == "__main__":
 
573
  Compare your custom trained YOLOv8 model against state-of-the-art Zero-Shot models!
574
  """)
575
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
576
 
 
 
 
 
 
 
 
 
577
 
578
+ # ── TAB 3: Comprehensive Evaluation ──
579
+ with gr.Tab("Comprehensive Evaluation"):
580
+ gr.Markdown("### 🔍 Comprehensive Evaluation: Results from All Trained and Pretrained Models")
581
+ gr.Markdown("""**The following models will run and display their results below:**
 
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, 2, 3)
 
 
591
 
592
+ **Pretrained Zero-Shot Models:**
 
 
 
 
593
 
594
+ 1. Grounding DINO
595
+ 2. Grounded SAM
596
+ 3. Intelliarts Car Parts
597
+ """)
598
+
599
  with gr.Row():
600
  input_image_seq = gr.Image(type="numpy", label="Upload Window Image")
601
  with gr.Row():
602
+ submit_btn_seq = gr.Button("Run All Models", variant="primary", size="lg")
603
 
604
  if mirror_examples:
605
  gr.Markdown("### Or click any example image below to load it:")
 
608
  compare_gallery.select(fn=load_compare_img, inputs=None, outputs=input_image_seq)
609
 
610
  gr.Markdown("---")
611
+ gr.Markdown("## 🚀 Custom Trained Models")
612
+
613
  gr.Markdown("### 1️⃣ YOLOv8x-seg")
614
  with gr.Row():
615
  seq_yolo_img = gr.Image(label="YOLO Overlay", interactive=False)
 
623
  seq_yolo11_bw = gr.Image(label="YOLO11x Binary Mask", interactive=False, image_mode="L")
624
  seq_yolo11_stats = gr.Textbox(label="YOLO11x Stats", interactive=False)
625
 
 
626
  gr.Markdown("---")
627
+ gr.Markdown("### 3️⃣ Mask R-CNN (ResNet50-FPN)")
628
  with gr.Row():
629
  seq_mrcnn_img = gr.Image(label="Mask R-CNN Overlay", interactive=False)
630
  seq_mrcnn_bw = gr.Image(label="Mask R-CNN Binary Mask", interactive=False, image_mode="L")
631
  seq_mrcnn_stats = gr.Textbox(label="Mask R-CNN Stats", interactive=False)
632
 
633
  gr.Markdown("---")
634
+ gr.Markdown("### 4️⃣ SegFormer (Transformer - Best Model)")
635
  with gr.Row():
636
  seq_segf_img = gr.Image(label="SegFormer Overlay", interactive=False)
637
  seq_segf_bw = gr.Image(label="SegFormer Binary Mask", interactive=False, image_mode="L")
638
  seq_segf_stats = gr.Textbox(label="SegFormer Stats", interactive=False)
639
 
640
  gr.Markdown("---")
641
+ gr.Markdown("### 5️⃣ SegFormer + Morphological Cleanup (Holes Filled + Sharp Borders)")
642
  with gr.Row():
643
  seq_segf_morph_img = gr.Image(label="SegFormer + Morph Overlay", interactive=False)
644
  seq_segf_morph_bw = gr.Image(label="SegFormer + Morph Binary Mask", interactive=False, image_mode="L")
645
  seq_segf_morph_stats = gr.Textbox(label="SegFormer + Morph Stats", interactive=False)
646
 
647
+ gr.Markdown("---")
648
+ gr.Markdown("### 6️⃣ SAM + YOLO (Strategy 1: Bbox + 5 Points)")
649
+ with gr.Row():
650
+ seq_sam1_img = gr.Image(label="SAM+YOLO Strat 1 Overlay", interactive=False)
651
+ seq_sam1_bw = gr.Image(label="SAM+YOLO Strat 1 Binary Mask", interactive=False, image_mode="L")
652
+ seq_sam1_stats = gr.Textbox(label="SAM+YOLO Strat 1 Stats", interactive=False)
653
+
654
+ gr.Markdown("---")
655
+ gr.Markdown("### 7️⃣ SAM + YOLO (Strategy 2: Mask + 5 Points)")
656
+ with gr.Row():
657
+ seq_sam2_img = gr.Image(label="SAM+YOLO Strat 2 Overlay", interactive=False)
658
+ seq_sam2_bw = gr.Image(label="SAM+YOLO Strat 2 Binary Mask", interactive=False, image_mode="L")
659
+ seq_sam2_stats = gr.Textbox(label="SAM+YOLO Strat 2 Stats", interactive=False)
660
+
661
+ gr.Markdown("---")
662
+ gr.Markdown("### 8️⃣ SAM + YOLO (Strategy 3: Direct Mask Prompting)")
663
+ with gr.Row():
664
+ seq_sam3_img = gr.Image(label="SAM+YOLO Strat 3 Overlay", interactive=False)
665
+ seq_sam3_bw = gr.Image(label="SAM+YOLO Strat 3 Binary Mask", interactive=False, image_mode="L")
666
+ seq_sam3_stats = gr.Textbox(label="SAM+YOLO Strat 3 Stats", interactive=False)
667
+
668
+ gr.Markdown("---")
669
+ gr.Markdown("## 🌍 Pretrained Zero-Shot Models")
670
+
671
+ gr.Markdown("### 9️⃣ Grounding DINO (Zero-Shot Detection)")
672
+ with gr.Row():
673
+ seq_dino_img = gr.Image(label="Grounding DINO Overlay", interactive=False)
674
+ seq_dino_bw = gr.Image(label="Grounding DINO Binary Mask", interactive=False, image_mode="L")
675
+ seq_dino_stats = gr.Textbox(label="Grounding DINO Stats", interactive=False)
676
+
677
+ gr.Markdown("---")
678
+ gr.Markdown("### 🔟 Grounded SAM (Zero-Shot Segmentation)")
679
+ with gr.Row():
680
+ seq_gsam_img = gr.Image(label="Grounded SAM Overlay", interactive=False)
681
+ seq_gsam_bw = gr.Image(label="Grounded SAM Binary Mask", interactive=False, image_mode="L")
682
+ seq_gsam_stats = gr.Textbox(label="Grounded SAM Stats", interactive=False)
683
+
684
+ gr.Markdown("---")
685
+ gr.Markdown("### 1️⃣1️⃣ Intelliarts Car Parts (Detectron2)")
686
+ with gr.Row():
687
+ seq_intell_img = gr.Image(label="Intelliarts Car Parts Overlay", interactive=False)
688
+ seq_intell_bw = gr.Image(label="Intelliarts Car Parts Binary Mask", interactive=False, image_mode="L")
689
+ seq_intell_stats = gr.Textbox(label="Intelliarts Car Parts Stats", interactive=False)
690
+
691
+ def run_all_models(img):
692
+ if img is None: return [None]*33
693
 
 
694
  yolo_out, yolo_mask, yolo_stats = process_image(img, "YOLOv8x-seg", "", False)
 
 
695
  yolo11_out, yolo11_mask, yolo11_stats = process_image(img, "YOLO11x-seg", "", False)
 
 
696
  mrcnn_out, mrcnn_mask, mrcnn_stats = process_image(img, "Mask R-CNN", "", False)
 
 
697
  segf_out, segf_mask, segf_stats = run_segformer(img, morph_cleanup=False)
 
 
698
  segf_morph_out, segf_morph_mask, segf_morph_stats = run_segformer(img, morph_cleanup=True)
699
 
700
+ sam1_out, sam1_mask, sam1_stats = process_image(img, "SAM + YOLO (Strategy 1: Bbox + 5 Points)", "", False)
701
+ sam2_out, sam2_mask, sam2_stats = process_image(img, "SAM + YOLO (Strategy 2: Mask + 5 Points)", "", False)
702
+ sam3_out, sam3_mask, sam3_stats = process_image(img, "SAM + YOLO (Strategy 3: Direct Mask Prompting)", "", False)
703
+
704
+ dino_out, dino_mask, dino_stats = process_image(img, "Grounding DINO (Zero-Shot Detection)", "car window. car glass. windshield.", False)
705
+ gsam_out, gsam_mask, gsam_stats = process_image(img, "Grounded SAM (Zero-Shot Segmentation)", "car window. car glass. windshield.", False)
706
+ intell_out, intell_mask, intell_stats = process_image(img, "Intelliarts Car Parts (Detectron2)", "", False)
707
+
708
  return (yolo_out, yolo_mask, yolo_stats,
709
  yolo11_out, yolo11_mask, yolo11_stats,
710
  mrcnn_out, mrcnn_mask, mrcnn_stats,
711
  segf_out, segf_mask, segf_stats,
712
+ segf_morph_out, segf_morph_mask, segf_morph_stats,
713
+ sam1_out, sam1_mask, sam1_stats,
714
+ sam2_out, sam2_mask, sam2_stats,
715
+ sam3_out, sam3_mask, sam3_stats,
716
+ dino_out, dino_mask, dino_stats,
717
+ gsam_out, gsam_mask, gsam_stats,
718
+ intell_out, intell_mask, intell_stats)
719
 
720
  submit_btn_seq.click(
721
+ fn=run_all_models,
722
  inputs=[input_image_seq],
723
  outputs=[seq_yolo_img, seq_yolo_bw, seq_yolo_stats,
724
  seq_yolo11_img, seq_yolo11_bw, seq_yolo11_stats,
725
  seq_mrcnn_img, seq_mrcnn_bw, seq_mrcnn_stats,
726
  seq_segf_img, seq_segf_bw, seq_segf_stats,
727
+ seq_segf_morph_img, seq_segf_morph_bw, seq_segf_morph_stats,
728
+ seq_sam1_img, seq_sam1_bw, seq_sam1_stats,
729
+ seq_sam2_img, seq_sam2_bw, seq_sam2_stats,
730
+ seq_sam3_img, seq_sam3_bw, seq_sam3_stats,
731
+ seq_dino_img, seq_dino_bw, seq_dino_stats,
732
+ seq_gsam_img, seq_gsam_bw, seq_gsam_stats,
733
+ seq_intell_img, seq_intell_bw, seq_intell_stats]
734
  )
735
 
736
  if __name__ == "__main__":