|
import gradio as gr |
|
from PIL import Image, ImageDraw |
|
from transparent_background import Remover |
|
import numpy as np |
|
|
|
|
|
def resize(img: Image, target_size_px: int): |
|
aspect_ratio = img.width / img.height |
|
|
|
if img.width > img.height: |
|
new_width = target_size_px |
|
new_height = int(target_size_px / aspect_ratio) |
|
else: |
|
new_height = target_size_px |
|
new_width = int(target_size_px * aspect_ratio) |
|
|
|
img = img.resize((new_width, new_height), Image.ANTIALIAS) |
|
|
|
return img |
|
|
|
|
|
def infer(img: Image): |
|
|
|
img_resized = resize(img, 512) |
|
|
|
remover = Remover(mode="fast") |
|
masked_image = remover.process(img_resized, type="map") |
|
|
|
gray_image = masked_image.convert("L") |
|
binary_image = gray_image.point(lambda x: 0 if x < 128 else 255, "1") |
|
|
|
image_array = np.array(binary_image) |
|
white_pixels = np.where(image_array == True) |
|
|
|
x_coords = white_pixels[1] |
|
y_coords = white_pixels[0] |
|
|
|
min_x = np.min(x_coords) |
|
max_x = np.max(x_coords) |
|
min_y = np.min(y_coords) |
|
max_y = np.max(y_coords) |
|
|
|
draw = ImageDraw.Draw(img_resized) |
|
draw.rectangle([(min_x, min_y), (max_x, max_y)], outline="red", width=2) |
|
|
|
return img_resized, masked_image |
|
|
|
|
|
gr.Interface( |
|
fn=infer, |
|
description=""" |
|
This space performs salient object detection on an image uploaded by the user. I.e. it will detect the object(s) in the image foreground and draw a red rectangle around it. |
|
|
|
It uses the [transparente-background](https://github.com/plemeri/transparent-background) library, which is build on [InSPyReNet](https://github.com/plemeri/inspyrenet). |
|
""", |
|
inputs=gr.components.Image(type="pil", label="Input Image"), |
|
outputs=[ |
|
gr.components.Image(type="pil", label="Output Image"), |
|
gr.components.Image(type="pil", label="Image Mask"), |
|
], |
|
title="Salient Object Detection", |
|
).launch() |
|
|