File size: 3,021 Bytes
1d3f775
 
 
 
 
fefbab6
425f058
1d3f775
 
da2fab4
 
 
1d3f775
 
 
3284380
438b834
 
 
3284380
 
438b834
 
3284380
438b834
 
 
 
 
 
 
 
 
 
 
ea1d682
438b834
 
 
 
 
 
 
 
 
 
235cdb3
057f3bb
235cdb3
 
 
 
438b834
 
 
 
 
 
 
 
 
 
 
 
3284380
438b834
 
 
 
ea1d682
438b834
 
 
 
 
 
1d3f775
 
 
 
3284380
 
1d3f775
 
305e358
1d3f775
 
3284380
5050e07
 
3284380
305e358
3284380
1d3f775
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
import gradio as gr
import numpy as np
import cv2
from PIL import Image
from ultralytics import YOLO
import torch
from segment_anything import sam_model_registry, SamAutomaticMaskGenerator, SamPredictor
# Define available YOLO models
available_models = {
    "X-ray": YOLO("xray.pt"),
    "CT scan": YOLO("CT.pt"),
    "Ultrasound": YOLO("ultrasound.pt"),
    # Add more models as needed
}

def segment_image(input_image, selected_model):
    # Resize the input image to 255x255
    img = np.array(input_image)
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    model = available_models[selected_model]
    
    # Perform object detection and segmentation
    results = model(img)
    mask = results[0].masks.data.numpy()
    target_height = img.shape[0]
    target_width = img.shape[1]

    # Resize the mask using OpenCV
    resized_mask = cv2.resize(mask[0], (target_width, target_height))
    resized_mask = (resized_mask * 255).astype(np.uint8)

    # Create a copy of the original image
    overlay_image = img.copy()

    # Apply the resized mask to the overlay image
    overlay_image[resized_mask > 0] = [0, 255, 255]  # Overlay in green

    # Convert the overlay image to PIL format
    overlay_pil = Image.fromarray(overlay_image)

    # Convert the resized mask to PIL format
    mask_pil = Image.fromarray(resized_mask)
    
    for result in results:
        boxes = result.boxes
        bbox = boxes.xyxy.tolist()[0]
    

    sam_checkpoint = "sam_vit_h_4b8939.pth"
    model_type = "vit_h"
    sam = sam_model_registry[model_type](checkpoint=sam_checkpoint)
    sam.to(device='cpu')
    predictor = SamPredictor(sam)
    predictor.set_image(img)
    
    input_box = np.array(bbox)
    masks_, _, _ = predictor.predict(
        point_coords=None,
        point_labels=None,
        box=input_box,
        multimask_output=False)

    fmask = masks_[0].astype(int)

    resized_mask1 = cv2.resize(fmask, (target_width, target_height))
    resized_mask1 = (resized_mask1 * 255).astype(np.uint8)

    overlay_image1 = img.copy()
    # Apply the resized mask to the overlay image
    overlay_image1[resized_mask1 > 0] = [255, 255, 0]  # Overlay in green

    # Convert the overlay image to PIL format
    overlay_pil1 = Image.fromarray(overlay_image1)

    return overlay_pil, overlay_pil1  # Return both overlay image and mask

# Create the Gradio interface with a dropdown for model selection
iface = gr.Interface(
    fn=segment_image,
    inputs=[
        gr.components.Image(type="pil", label="Upload an image"),
        gr.components.Dropdown(
            choices=list(available_models.keys()),
            label="Select YOLO Model",
            default="X-ray"
        )
    ],
    outputs=[
        gr.components.Image(type="pil", label="YOLO predicted mask and images"),
        gr.components.Image(type="pil", label="YOLO and SAM predicted mask and images ")
    ],
    title="YOLOv8 with SAM πŸ˜ƒ",
    description='This software generates the segmentation mask Medical images'
)

iface.launch()