File size: 1,679 Bytes
8986a25
aed3657
8986a25
aed3657
 
 
 
8986a25
 
aed3657
 
 
 
 
8986a25
 
 
aed3657
8986a25
aed3657
 
 
 
 
 
 
 
8986a25
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import gradio as gr
from huggingface_hub import hf_hub_download
from ultralytics import YOLO
from PIL import Image
import numpy as np
import os

# Optional: Set YOLO config dir for write access (for HF Spaces)
os.environ["YOLO_CONFIG_DIR"] = "/tmp"

# Load YOLO model from Hugging Face
yolo_path = hf_hub_download(repo_id="RippedKek/leafmed-models", filename="yolo11x_leaf.pt")
yolo_model = YOLO(yolo_path)

def detect_and_crop_leaf(image: Image.Image):
    image_rgb = image.convert("RGB")
    image_rgb.save("temp_input.jpg")

    results = yolo_model.predict("temp_input.jpg", task="detect", conf=0.55)
    boxes = results[0].boxes
    class_ids = boxes.cls.cpu().numpy()
    xyxy = boxes.xyxy.cpu().numpy()
    class_names = [yolo_model.names[int(i)] for i in class_ids]

    for i, name in enumerate(class_names):
        if name.lower() == "leaf":
            x1, y1, x2, y2 = map(int, xyxy[i])
            x1_adj = max(int(x1 - x1 * 0.1), 0)
            y1_adj = max(int(y1 - y1 * 0.1), 0)
            x2_adj = int(x2 + x2 * 0.1)
            y2_adj = int(y2 + y2 * 0.1)

            cropped = image_rgb.crop((x1_adj, y1_adj, x2_adj, y2_adj))
            return cropped, f"Leaf detected with bounding box: ({x1_adj}, {y1_adj}, {x2_adj}, {y2_adj})"
    
    return None, "No leaf detected in the image."

demo = gr.Interface(
    fn=detect_and_crop_leaf,
    inputs=gr.Image(type="pil", label="Upload Leaf Image"),
    outputs=[
        gr.Image(type="pil", label="Cropped Leaf"),
        gr.Textbox(label="Detection Info")
    ],
    title="Leaf Detector",
    description="Upload an image containing a leaf. The model will detect and crop the leaf area."
)

demo.launch()