File size: 2,408 Bytes
6989a37
13ef1fa
30f242a
13ef1fa
 
6989a37
6f2a51c
 
75e60e4
90d35fd
13ef1fa
 
 
6989a37
13ef1fa
 
6f2a51c
 
 
 
 
 
 
 
 
 
1a4514d
13ef1fa
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e3a012f
29b03e2
90d35fd
13ef1fa
29b03e2
90d35fd
29b03e2
 
90d35fd
29b03e2
13ef1fa
30f242a
e3a012f
90d35fd
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import gradio as gr
from ultralytics import YOLO
from PIL import Image
import numpy as np
import cv2

# Load the YOLOv8 model (ensure this path is correct)
model = YOLO('yolov8n.pt')

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)
    predictions = results[0]
    
    # Check if there are any detections
    if len(predictions.boxes) == 0:
        # No detections, return the image with a message
        annotated_image = np.array(image)
        cv2.putText(annotated_image, "No disease detected", (10, 30), 
                    cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2)
        annotated_image = Image.fromarray(annotated_image)
        return annotated_image, [{"Disease": "None", "Confidence": "N/A"}]
    
    # Extract predictions
    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 with updated syntax
interface = gr.Interface(
    fn=identify_disease,
    inputs=gr.Image(type="pil"),
    outputs=[
        gr.Image(type="pil", label="Annotated Image"),
        gr.Dataframe(headers=["Disease", "Confidence"], label="Predictions")
    ],
    title="Leaf Disease Identifier with YOLOv8",
    description="Upload an image of a leaf, and this tool will identify the disease with confidence scores."
)

# Launch the app
interface.launch()