|
|
|
|
|
import gradio as gr |
|
from transformers import pipeline |
|
from PIL import Image, ImageDraw |
|
|
|
|
|
detector = pipeline("object-detection", model="facebook/detr-resnet-50", device=-1) |
|
|
|
def detect_objects(image: Image.Image): |
|
outputs = detector(image) |
|
|
|
annotated = image.convert("RGB") |
|
draw = ImageDraw.Draw(annotated) |
|
table = [] |
|
|
|
for obj in outputs: |
|
box = obj["box"] |
|
|
|
if isinstance(box, dict): |
|
xmin = int(box.get("xmin", box.get("x", 0))) |
|
ymin = int(box.get("ymin", box.get("y", 0))) |
|
xmax = int(box.get("xmax", xmin)) |
|
ymax = int(box.get("ymax", ymin)) |
|
else: |
|
|
|
x, y, w, h = box |
|
xmin, ymin = int(x), int(y) |
|
xmax, ymax = int(x + w), int(y + h) |
|
|
|
label = obj["label"] |
|
score = round(obj["score"], 3) |
|
|
|
|
|
draw.rectangle([xmin, ymin, xmax, ymax], outline="red", width=2) |
|
draw.text((xmin, max(ymin - 10, 0)), f"{label} ({score})", fill="red") |
|
|
|
table.append([label, score]) |
|
|
|
return annotated, table |
|
|
|
with gr.Blocks(title="📷✨ Object Detection Demo") as demo: |
|
gr.Markdown( |
|
""" |
|
# 📷✨ Object Detection |
|
Upload an image and let DETR identify objects on CPU. |
|
""" |
|
) |
|
|
|
with gr.Row(): |
|
img_in = gr.Image(type="pil", label="Upload Image") |
|
btn = gr.Button("Detect Objects 🔍", variant="primary") |
|
|
|
img_out = gr.Image(label="Annotated Image") |
|
table_out = gr.Dataframe( |
|
headers=["Label", "Score"], |
|
datatype=["str", "number"], |
|
wrap=True, |
|
interactive=False, |
|
label="Detections" |
|
) |
|
|
|
btn.click(detect_objects, inputs=img_in, outputs=[img_out, table_out]) |
|
|
|
if __name__ == "__main__": |
|
demo.launch(server_name="0.0.0.0") |
|
|