vlaadkshl's picture
Create app.py
1ba3fc8 verified
import gradio as gr
import cv2
import numpy as np
from PIL import Image
from ultralytics import SAM
model = SAM('sam_b.pt')
def process_image(input_image):
if input_image is None:
return None, "Can't find photo", 0
input_image = np.array(input_image)
bgr_image = cv2.cvtColor(input_image, cv2.COLOR_RGB2BGR)
r = model(bgr_image)[0]
masks = r.masks.xy
# point = (x, y)
# segment_index = point_in_mask(masks, point)
im_array = r.plot().astype(np.uint8)
im_array = cv2.cvtColor(im_array, cv2.COLOR_BGR2RGB)
im_pil = Image.fromarray(im_array)
# cv2.circle(im_array, point, radius=5, color=(255, 255, 0), thickness=2)
return im_pil
def point_in_mask(masks, point):
x, y = point
for i in range(len(masks) - 1, -1, -1):
mask = np.array(masks[i])
min_x = min(mask[:, 0])
max_x = max(mask[:, 0])
min_y = min(mask[:, 1])
max_y = max(mask[:, 1])
if min_x <= x <= max_x and min_y <= y <= max_y:
return i
return None
iface = gr.Interface(
fn=process_image,
inputs=[gr.Image()],
outputs=[gr.Image(type="numpy")],
title="Image Segmenter",
description="Upload an image to segment."
)
iface.launch()