mayrajeo's picture
Update app.py
6b5781d verified
import sys, os
import gradio as gr
import plotly.express as px
import numpy as np
import random
from ultralytics import YOLO
#from sahi.models.yolov8 import *
from src.sahi_onnx import *
from sahi.predict import get_sliced_prediction
from sahi.utils.cv import visualize_object_predictions
import PIL
#model_base = "https://huggingface.co/mayrajeo/marine-vessel-detection/resolve/main/"
model_base = 'onnx_models'
def inference(
im:gr.Image=None,
model_path:gr.Dropdown='YOLOv8n',
conf_thr:gr.Slider=0.25
):
#model = Yolov8DetectionModel(model_path=f'{model_base}/{model_path}/{model_path}.pt',
model = Yolov8onnxDetectionModel(model_path=f'{model_base}/{model_path}/{model_path.lower()}.onnx',
config_path=f'{model_base}/{model_path}/args.yaml',
device='cpu',
confidence_threshold=conf_thr,
category_mapping={'0': 'Boat'},
image_size=640)
res = get_sliced_prediction(im, model, slice_width=320,
slice_height=320, overlap_height_ratio=0.2,
overlap_width_ratio=0.2, verbose=0)
img = PIL.Image.open(im)
visual_result = visualize_object_predictions(image=np.array(img),
object_prediction_list=res.object_prediction_list,
text_size=0.4,
rect_th=1)
fig = px.imshow(visual_result['image'])
fig.update_layout(showlegend=False, hovermode=False)
fig.update_xaxes(visible=False)
fig.update_yaxes(visible=False)
return fig
inputs = [
gr.Image(type='filepath', label='Input'),
gr.Dropdown([
'YOLOv8n',
'YOLOv8s',
'YOLOv8m',
'YOLOv8l',
'YOLOv8x'
],
value='YOLOv8n', label='Model'),
gr.Slider(minimum=0.0, maximum=1.0, value=0.25, step=0.05, label='Confidence Threshold'),
]
outputs = [
gr.Plot(label='Predictions')
]
example_images = [[f'examples/{f}'] for f in os.listdir('examples')]
gr.Interface(
fn=inference,
inputs=inputs,
outputs=outputs,
allow_flagging='never',
examples=example_images,
cache_examples=False,
examples_per_page=10,
title='Marine vessel detection from Sentinel 2 images',
description="""Models detect potential marine vessels from Sentinel 2 imagery.
Each example image covers 7.68x7.68 km (768x768 pixels).
As we don't clean the prediction with stationary targets that look like vessels in this resolution,
there will most likely be false positives from lighthouses, above-water rocks and on land.\n
Be patient with responses, as free tier only has 2vCPUs so app might be slow sometimes."""
).launch()