Spaces:
Sleeping
Sleeping
import PIL.Image as Image | |
import PIL.ExifTags | |
import gradio as gr | |
from ultralytics import YOLO | |
# Update the path to the YOLOv8 weights file | |
weights_path = "best (2).pt" | |
model = YOLO(weights_path) | |
def correct_image_orientation(img): | |
"""Correct image orientation based on EXIF metadata.""" | |
try: | |
exif = img._getexif() | |
if exif is not None: | |
orientation_tag = [key for key, value in PIL.ExifTags.TAGS.items() if value == 'Orientation'] | |
if orientation_tag: | |
orientation = exif.get(orientation_tag[0]) | |
if orientation == 3: | |
img = img.rotate(180, expand=True) | |
elif orientation == 6: | |
img = img.rotate(270, expand=True) | |
elif orientation == 8: | |
img = img.rotate(90, expand=True) | |
except (AttributeError, KeyError, IndexError): | |
# If there is no EXIF data or any error occurs, just return the image as is | |
pass | |
return img | |
def predict_image(img, conf_threshold, iou_threshold): | |
"""Predicts and plots labeled objects in an image using YOLOv8 model with adjustable confidence and IOU thresholds. """ | |
# Correct the image orientation first | |
img = correct_image_orientation(img) | |
# Perform prediction using YOLOv8 model | |
results = model.predict( | |
source=img, | |
conf=conf_threshold, | |
iou=iou_threshold, | |
show_labels=True, | |
show_conf=True, | |
imgsz=640, | |
) | |
# Convert the results back to a PIL image | |
if results: | |
im_array = results[0].plot() | |
im = Image.fromarray(im_array) | |
# Ensure the output image is horizontally oriented | |
im = im.rotate(0, expand=True) | |
return im | |
return img | |
iface = gr.Interface( | |
fn=predict_image, | |
inputs=[ | |
gr.inputs.Image(type="pil", label="Upload Image"), | |
gr.inputs.Slider(minimum=0, maximum=1, default=0.25, label="Confidence threshold"), | |
gr.inputs.Slider(minimum=0, maximum=1, default=0.45, label="IoU threshold") | |
], | |
outputs=gr.outputs.Image(type="pil", label="Result"), | |
title="U-SUB DETECTRON", | |
description="""Upload images for inference. The Ultralytics YOLOv8n model is used by default. | |
DO NOT TAKE PICTURE VERTICALLY, current bug prevents model detection due to random rotations. TAKE PICTURE HORIZONTALLY! (input integral image should have bottom of integral facing downwards or leftwards)""", | |
examples=[ | |
["p1.png", 0.25, 0.45], | |
["p2.png", 0.25, 0.45], | |
["test1 (1).png", 0.25, 0.45], | |
["p3.jpeg", 0.25, 0.45], | |
["p4.jpg", 0.25, 0.45], | |
] | |
) | |
if __name__ == '__main__': | |
iface.launch() | |