import gradio as gr from ultralytics import YOLO from PIL import Image import numpy as np import cv2 # Load the pre-trained YOLOv5 model # Use 'yolov5s' or any available YOLO model from ultralytics model = YOLO('yolov5s') # Change to a leaf disease detection model if available def identify_disease(image): # Convert the image to RGB if it's not if image.mode != 'RGB': image = image.convert('RGB') # Perform inference results = model(image) # Extract predictions predictions = results[0] boxes = predictions.boxes labels = boxes.cls.cpu().numpy() scores = boxes.conf.cpu().numpy() class_names = model.names # Annotate image with bounding boxes and labels annotated_image = np.array(image) for box, label, score in zip(boxes.xyxy.cpu().numpy(), labels, scores): x1, y1, x2, y2 = map(int, box) class_name = class_names[int(label)] confidence = f"{score * 100:.2f}%" annotated_image = cv2.rectangle(annotated_image, (x1, y1), (x2, y2), (0, 255, 0), 2) annotated_image = cv2.putText(annotated_image, f"{class_name} {confidence}", (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2) # Convert annotated image back to PIL format annotated_image = Image.fromarray(annotated_image) # Prepare results for display results_list = [{"Disease": class_names[int(label)], "Confidence": f"{score * 100:.2f}%"} for label, score in zip(labels, scores)] return annotated_image, results_list # Define Gradio interface interface = gr.Interface( fn=identify_disease, inputs=gr.inputs.Image(type="pil"), outputs=[ gr.outputs.Image(type="pil", label="Annotated Image"), gr.outputs.Dataframe(headers=["Disease", "Confidence"], label="Predictions") ], title="Leaf Disease Identifier with YOLOv5", description="Upload an image of a leaf, and this tool will identify the disease with confidence scores." ) # Launch the app interface.launch()