Spaces:
Sleeping
Sleeping
| 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() | |