|
import gradio as gr |
|
import supervision as sv |
|
from ultralytics import YOLO |
|
import os |
|
from PIL import Image, ImageColor |
|
import numpy as np |
|
|
|
def load_model(img): |
|
|
|
model = YOLO('yolov8s-seg.pt') |
|
result = model(img, verbose=False, imgsz=1280)[0] |
|
detections = sv.Detections.from_ultralytics(result) |
|
labels = [ |
|
f"{model.model.names[class_id]} {confidence:.2f}" |
|
for class_id, confidence in zip(detections.class_id, detections.confidence) |
|
] |
|
|
|
return detections, labels |
|
|
|
def calculate_crop_dim(a,b): |
|
|
|
if a>b: |
|
width= a |
|
height = a |
|
else: |
|
width = b |
|
height = b |
|
|
|
return width, height |
|
|
|
def annotator(img,annotators,colorbb,colormask,colorellipse,colorbc,colorcir,colorlabel): |
|
|
|
""" |
|
Function that changes the color of annotators |
|
Args: |
|
annotators: Icon whose color needs to be changed. |
|
color: Chosen color with which to edit the input icon in Hex. |
|
img: Input image is numpy matrix in BGR. |
|
Returns: |
|
annotators: annotated image |
|
""" |
|
|
|
|
|
|
|
img = img[...,::-1].copy() |
|
|
|
|
|
detections, labels = load_model(img) |
|
|
|
|
|
if "Blur" in annotators: |
|
|
|
blur_annotator = sv.BlurAnnotator() |
|
img = blur_annotator.annotate(img, detections=detections) |
|
|
|
if "BoundingBox" in annotators: |
|
|
|
box_annotator = sv.BoundingBoxAnnotator(sv.Color.from_hex(str(colorbb))) |
|
img = box_annotator.annotate(img, detections=detections) |
|
|
|
if "Mask" in annotators: |
|
|
|
mask_annotator = sv.MaskAnnotator(sv.Color.from_hex(str(colormask))) |
|
img = mask_annotator.annotate(img, detections=detections) |
|
|
|
if "Ellipse" in annotators: |
|
|
|
ellipse_annotator = sv.EllipseAnnotator(sv.Color.from_hex(str(colorellipse))) |
|
img = ellipse_annotator.annotate(img, detections=detections) |
|
|
|
if "BoxCorner" in annotators: |
|
|
|
corner_annotator = sv.BoxCornerAnnotator(sv.Color.from_hex(str(colorbc))) |
|
img = corner_annotator.annotate(img, detections=detections) |
|
|
|
|
|
if "Circle" in annotators: |
|
|
|
circle_annotator = sv.CircleAnnotator(sv.Color.from_hex(str(colorcir))) |
|
img = circle_annotator.annotate(img, detections=detections) |
|
|
|
if "Label" in annotators: |
|
|
|
label_annotator = sv.LabelAnnotator(text_position=sv.Position.CENTER) |
|
label_annotator = sv.LabelAnnotator(sv.Color.from_hex(str(colorlabel))) |
|
img = label_annotator.annotate(img, detections=detections, labels=labels) |
|
|
|
|
|
|
|
|
|
res_img = Image.fromarray(img) |
|
print(type(res_img)) |
|
|
|
x=0 |
|
y=0 |
|
|
|
|
|
print("size of the pil im=", res_img.size) |
|
(v1,v2) = res_img.size |
|
width, height = calculate_crop_dim(v1, v2) |
|
print(width, height) |
|
my_img = np.array(res_img) |
|
|
|
crop_img = my_img[y:y+height, x:x+width] |
|
print(type(crop_img)) |
|
|
|
return crop_img[...,::-1].copy() |
|
|
|
|
|
with gr.Blocks(theme=gr.themes.Soft(primary_hue=gr.themes.colors.purple) |
|
.set( |
|
button_primary_background_fill="*primary_600", |
|
button_primary_background_fill_hover="*primary_700", |
|
checkbox_label_background_fill_selected="*primary_600", |
|
checkbox_background_color_selected="*primary_400", |
|
)) as demo: |
|
gr.Markdown("""# Image Annotator""") |
|
annotators = gr.CheckboxGroup(choices=["BoundingBox", "Mask", "Ellipse", "BoxCorner", "Circle", "Label", "Blur"], value=["BoundingBox", "Mask"], label="Select Annotators:") |
|
|
|
with gr.Accordion("**Color Picker**"): |
|
with gr.Row(): |
|
with gr.Column(): |
|
colorbb = gr.ColorPicker(value="#A351FB",label="BoundingBox") |
|
with gr.Column(): |
|
colormask = gr.ColorPicker(value="#A351FB",label="Mask") |
|
with gr.Column(): |
|
colorellipse = gr.ColorPicker(value="#A351FB",label="Ellipse") |
|
with gr.Column(): |
|
colorbc = gr.ColorPicker(value="#A351FB",label="BoxCorner") |
|
with gr.Column(): |
|
colorcir = gr.ColorPicker(value="#A351FB",label="Circle") |
|
with gr.Column(): |
|
colorlabel = gr.ColorPicker(value="#A351FB",label="Label") |
|
|
|
with gr.Row(): |
|
with gr.Column(): |
|
with gr.Tab("Input image"): |
|
image_input = gr.Image(type="numpy", show_label=False) |
|
with gr.Column(): |
|
with gr.Tab("Result image"): |
|
image_output = gr.Image(type="numpy", show_label=False) |
|
image_button = gr.Button(value="Annotate it!", variant="primary") |
|
|
|
image_button.click(annotator, inputs=[image_input,annotators,colorbb,colormask,colorellipse,colorbc,colorcir,colorlabel], outputs=image_output) |
|
|
|
gr.Markdown("## Image Examples") |
|
gr.Examples( |
|
examples=[os.path.join(os.path.abspath(''), "image/city.jpg"), |
|
os.path.join(os.path.abspath(''), "image/household.jpg"), |
|
os.path.join(os.path.abspath(''), "image/industry.jpg"), |
|
os.path.join(os.path.abspath(''), "image/retail.jpg"), |
|
os.path.join(os.path.abspath(''), "image/aerodefence.jpg")], |
|
inputs=image_input, |
|
outputs=image_output, |
|
fn=annotator, |
|
cache_examples=False, |
|
) |
|
|
|
|
|
demo.launch(debug=False) |