Image-Annotator / app.py
Manikandan-Alagu's picture
Update app.py
ddb2631 verified
import gradio as gr
import supervision as sv
from ultralytics import YOLO
import os #added for cache_examples
from PIL import Image, ImageColor
import numpy as np
def load_model(img):
# Load model, get results and return detections/labels
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):
#Calculates the crop dimensions of the image resultant
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() # BGR to RGB using numpy
detections, labels = load_model(img)
if "Blur" in annotators:
# Apply Blur
blur_annotator = sv.BlurAnnotator()
img = blur_annotator.annotate(img, detections=detections)
if "BoundingBox" in annotators:
# Draw Bounding box
box_annotator = sv.BoundingBoxAnnotator(sv.Color.from_hex(str(colorbb)))
img = box_annotator.annotate(img, detections=detections)
if "Mask" in annotators:
# Draw Mask
mask_annotator = sv.MaskAnnotator(sv.Color.from_hex(str(colormask)))
img = mask_annotator.annotate(img, detections=detections)
if "Ellipse" in annotators:
# Draw ellipse
ellipse_annotator = sv.EllipseAnnotator(sv.Color.from_hex(str(colorellipse)))
img = ellipse_annotator.annotate(img, detections=detections)
if "BoxCorner" in annotators:
# Draw Box corner
corner_annotator = sv.BoxCornerAnnotator(sv.Color.from_hex(str(colorbc)))
img = corner_annotator.annotate(img, detections=detections)
if "Circle" in annotators:
# Draw circle
circle_annotator = sv.CircleAnnotator(sv.Color.from_hex(str(colorcir)))
img = circle_annotator.annotate(img, detections=detections)
if "Label" in annotators:
# Draw Label
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)
#crop image for the largest possible square
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() # BGR to RGB using numpy
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)