SAM-with-YOLO / app.py
sumit-ai-ml's picture
Update app.py
d1dea30 verified
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",
value="X-ray" # Corrected from default to value
)
],
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()