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)