ariankhalfani's picture
Create app.py
4cd3714 verified
raw
history blame
3.48 kB
import gradio as gr
from ultralytics import YOLO
import cv2
import numpy as np
from PIL import Image, ImageDraw, ImageFont
import sqlite3
import pandas as pd
# Load YOLOv10n model
model = YOLO("best.pt")
# Define label mappings
label_mapping = {0: 'immature', 1: 'mature', 2: 'normal'}
inverse_label_mapping = {'immature': 0, 'mature': 1, 'normal': 2}
# Function to perform prediction
def predict_image(input_image, name, patient_id):
if input_image is None:
return None, "Please Input The Image"
# Convert Gradio input image (PIL Image) to numpy array
image_np = np.array(input_image)
# Ensure the image is in the correct format
if len(image_np.shape) == 2: # grayscale to RGB
image_np = cv2.cvtColor(image_np, cv2.COLOR_GRAY2RGB)
elif image_np.shape[2] == 4: # RGBA to RGB
image_np = cv2.cvtColor(image_np, cv2.COLOR_RGBA2RGB)
# Perform inference with YOLOv10n model
results = model(image_np)
# Draw bounding boxes on the image
image_with_boxes = image_np.copy()
raw_predictions = []
if results[0].boxes:
# Iterate through each detected object
for i in range(len(results[0].boxes)):
box = results[0].boxes[i]
predicted_class = int(box.cls.item())
confidence = box.conf.item()
# Apply confidence threshold
if confidence >= 0.5:
# Map the predicted class to the label
label = label_mapping[predicted_class]
# Get the bounding box coordinates
xmin, ymin, xmax, ymax = map(int, box.xyxy[0])
# Assign color for the label
color = (0, 255, 0) if label == 'normal' else (0, 255, 255) if label == 'immature' else (255, 0, 0)
# Draw the bounding box
cv2.rectangle(image_with_boxes, (xmin, ymin), (xmax, ymax), color, 2)
# Draw the label with confidence
cv2.putText(image_with_boxes, f'{label} {confidence:.2f}', (xmin, ymin - 10), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2)
raw_predictions.append(f"Label: {label}, Confidence: {confidence:.2f}, Box: [{xmin}, {ymin}, {xmax}, {ymax}]")
# Convert to PIL image for Gradio output
pil_image_with_boxes = Image.fromarray(image_with_boxes)
return pil_image_with_boxes, "\n".join(raw_predictions)
# Gradio Interface
def interface(name, patient_id, input_image):
if input_image is None:
return "Please upload an image."
# Run prediction
output_image, raw_result = predict_image(input_image, name, patient_id)
return output_image, raw_result
# Gradio Blocks
with gr.Blocks() as demo:
with gr.Column():
gr.Markdown("# Cataract Detection System")
gr.Markdown("Upload an image to detect cataract and add patient details.")
with gr.Column():
name = gr.Textbox(label="Name")
patient_id = gr.Textbox(label="Patient ID")
input_image = gr.Image(type="pil", label="Upload an Image", image_mode="RGB")
with gr.Column():
submit_btn = gr.Button("Submit")
output_image = gr.Image(type="pil", label="Predicted Image")
with gr.Row():
raw_result = gr.Textbox(label="Raw Result", lines=5)
submit_btn.click(fn=interface, inputs=[name, patient_id, input_image], outputs=[output_image, raw_result])
# Launch the Gradio app
demo.launch()