U-substitution / app.py
CatFatOw's picture
Update app.py
0869030 verified
raw
history blame contribute delete
No virus
2.71 kB
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()