Spaces:
Running
Running
from ultralytics import YOLO | |
import gradio as gr | |
import numpy as np | |
from PIL import Image | |
# Load YOLO model | |
model = YOLO("best.pt") | |
# Define what class names indicate a human | |
HUMAN_CLASSES = ["person", "human"] | |
# Predict Function | |
def predict(image): | |
image_status = "β Real Image" | |
disease_status = "β No Disease Detected" | |
details = "" | |
audio_html = "alert-1.mp3" # for autoplay sound | |
try: | |
results = model(image) | |
boxes = results[0].boxes | |
class_names = model.names | |
found_human = False | |
found_disease = False | |
if len(boxes) > 0: | |
for box in boxes: | |
class_id = int(box.cls[0]) | |
class_name = class_names[class_id].lower() | |
confidence = float(box.conf[0]) | |
details += f"π {class_name} - {confidence*100:.2f}%\n" | |
if class_name in HUMAN_CLASSES: | |
found_human = True | |
else: | |
found_disease = True | |
if found_human: | |
disease_status = "π¨ Human Detected (Invalid Input)" | |
audio_html = """<audio autoplay><source src="file/disease_alert.mp3" type="audio/mpeg"></audio>""" | |
elif found_disease: | |
disease_status = "π¨ Disease Detected" | |
audio_html = """<audio autoplay><source src="file/disease_alert.mp3" type="audio/mpeg"></audio>""" | |
else: | |
disease_status = "β No Disease Detected" | |
except Exception as e: | |
image_status = "β Error" | |
disease_status = "β οΈ Detection Failed" | |
details = str(e) | |
return image_status, disease_status, details, audio_html | |
# Gradio Interface | |
with gr.Blocks(title="π¨ AgroScan - Human Alert + Disease Detection") as demo: | |
gr.Markdown(""" | |
<h1 style="text-align:center; color:#2e7d32;">πΏ AgroScan</h1> | |
<p style="text-align:center;"> | |
Upload an image of a plant leaf. If a human or disease is detected, an alert will be triggered with sound π¨. | |
</p> | |
""") | |
with gr.Row(): | |
with gr.Column(scale=1): | |
image_input = gr.Image(type="pil", label="π· Upload Image") | |
submit_btn = gr.Button("π Analyze") | |
with gr.Column(scale=1): | |
result1 = gr.Textbox(label="πΌοΈ Image Status") | |
result2 = gr.Textbox(label="π± Disease Status") | |
result3 = gr.Textbox(label="π Detection Details", lines=5) | |
audio_out = gr.HTML(label="π¨ Auto Alert") # autoplay sound (no controls) | |
submit_btn.click(fn=predict, inputs=image_input, | |
outputs=[result1, result2, result3, audio_out]) | |
demo.launch() | |
# from ultralytics import YOLO | |
# import gradio as gr | |
# import numpy as np | |
# from PIL import Image | |
# # Load YOLO model | |
# model = YOLO("best.pt") | |
# # Define human classes | |
# HUMAN_CLASSES = ["person", "human"] | |
# # Prediction function | |
# def predict(image): | |
# image_status = "β Real Image" | |
# disease_status = "β No Disease Detected" | |
# details = "" | |
# alert_sound = "alert-1.mp3" # Will hold sound file path | |
# try: | |
# results = model(image) | |
# boxes = results[0].boxes | |
# class_names = model.names | |
# found_human = False | |
# found_disease = False | |
# if len(boxes) > 0: | |
# for box in boxes: | |
# class_id = int(box.cls[0]) | |
# class_name = class_names[class_id].lower() | |
# confidence = float(box.conf[0]) | |
# details += f"π {class_name} - {confidence*100:.2f}%\n" | |
# if class_name in HUMAN_CLASSES: | |
# found_human = True | |
# else: | |
# found_disease = True | |
# if found_human: | |
# disease_status = "π¨ Human Detected (Invalid Input)" | |
# alert_sound = "disease_alert.mp3" | |
# elif found_disease: | |
# disease_status = "π¨ Disease Detected" | |
# alert_sound = "disease_alert.mp3" | |
# else: | |
# disease_status = "β No Disease Detected" | |
# except Exception as e: | |
# image_status = "β Error" | |
# disease_status = "β οΈ Detection Failed" | |
# details = str(e) | |
# return image_status, disease_status, details, alert_sound | |
# # Gradio Interface | |
# with gr.Blocks(title="π¨ AgroScan - Human Alert + Disease Detection") as demo: | |
# gr.Markdown(""" | |
# <h1 style="text-align:center; color:#2e7d32;">πΏ AgroScan</h1> | |
# <p style="text-align:center;"> | |
# Upload an image of a plant leaf. If a human or disease is detected, an alert will be triggered with sound π¨. | |
# </p> | |
# """) | |
# with gr.Row(): | |
# with gr.Column(scale=1): | |
# image_input = gr.Image(type="pil", label="π· Upload Image") | |
# submit_btn = gr.Button("π Analyze") | |
# with gr.Column(scale=1): | |
# result1 = gr.Textbox(label="πΌοΈ Image Status") | |
# result2 = gr.Textbox(label="π± Disease Status") | |
# result3 = gr.Textbox(label="π Detection Details", lines=5) | |
# audio_out = gr.Audio(label="π¨ Alert Sound", autoplay=True) | |
# submit_btn.click(fn=predict, inputs=image_input, | |
# outputs=[result1, result2, result3, audio_out]) | |
# demo.launch() | |
# from ultralytics import YOLO | |
# import gradio as gr | |
# import numpy as np | |
# from PIL import Image | |
# # Load YOLO model | |
# model = YOLO("best.pt") | |
# # Define what class names indicate a human | |
# HUMAN_CLASSES = ["person", "human"] | |
# # Predict Function | |
# def predict(image): | |
# image_status = "β Real Image" | |
# disease_status = "β No Disease Detected" | |
# details = "" | |
# alert_sound = None # path to MP3 file | |
# try: | |
# results = model(image) | |
# boxes = results[0].boxes | |
# class_names = model.names | |
# found_human = False | |
# found_disease = False | |
# if len(boxes) > 0: | |
# for box in boxes: | |
# class_id = int(box.cls[0]) | |
# class_name = class_names[class_id].lower() | |
# confidence = float(box.conf[0]) | |
# details += f"π {class_name} - {confidence*100:.2f}%\n" | |
# if class_name in HUMAN_CLASSES: | |
# found_human = True | |
# else: | |
# found_disease = True | |
# if found_human: | |
# disease_status = "π¨ Human Detected (Invalid Input)" | |
# alert_sound = "disease_alert.mp3" | |
# elif found_disease: | |
# disease_status = "π¨ Disease Detected" | |
# alert_sound = "disease_alert.mp3" | |
# else: | |
# disease_status = "β No Disease Detected" | |
# except Exception as e: | |
# image_status = "β Error" | |
# disease_status = "β οΈ Detection Failed" | |
# details = str(e) | |
# return image_status, disease_status, details, alert_sound | |
# # Gradio Interface | |
# with gr.Blocks(title="π¨ AgroScan - Human Alert + Disease Detection") as demo: | |
# gr.Markdown(""" | |
# <h1 style="text-align:center; color:#2e7d32;">πΏ AgroScan</h1> | |
# <p style="text-align:center;"> | |
# Upload an image of a plant leaf. If a human or disease is detected, an alert will be triggered with sound π¨. | |
# </p> | |
# """) | |
# with gr.Row(): | |
# with gr.Column(scale=1): | |
# image_input = gr.Image(type="pil", label="π· Upload Image") | |
# submit_btn = gr.Button("π Analyze") | |
# with gr.Column(scale=1): | |
# result1 = gr.Textbox(label="πΌοΈ Image Status") | |
# result2 = gr.Textbox(label="π± Disease Status") | |
# result3 = gr.Textbox(label="π Detection Details", lines=5) | |
# audio_out = gr.Audio(label="π¨ Alert Sound", autoplay=True) | |
# submit_btn.click(fn=predict, inputs=image_input, | |
# outputs=[result1, result2, result3, audio_out]) | |
# demo.launch() | |
# from ultralytics import YOLO | |
# import gradio as gr | |
# import numpy as np | |
# from PIL import Image | |
# # Load the trained YOLOv8 model | |
# model = YOLO("best.pt") | |
# # Class name that represents "human" in your YOLO model | |
# HUMAN_CLASS_NAMES = ["person", "human"] | |
# # Prediction function with sound logic | |
# def predict(image): | |
# image_status = "β Real Image" | |
# disease_status = "β No Disease Detected" | |
# disease_details = "" | |
# play_alert = None # MP3 to be played | |
# try: | |
# results = model(image) | |
# boxes = results[0].boxes | |
# names = model.names | |
# found_human = False | |
# if len(boxes) > 0: | |
# for box in boxes: | |
# class_id = int(box.cls[0]) | |
# class_name = names[class_id] | |
# confidence = float(box.conf[0]) | |
# disease_details += f"π {class_name} - {confidence*100:.2f}%\n" | |
# if class_name.lower() in HUMAN_CLASS_NAMES: | |
# found_human = True | |
# if found_human: | |
# disease_status = "π¨ Disease Detected (Human Image)" | |
# play_alert = "disease_alert.mp3" # make sure this file exists | |
# elif len(boxes) == 0: | |
# disease_status = "β No Disease Detected" | |
# else: | |
# disease_status = "π¨ Disease Detected" | |
# play_alert = "disease_alert.mp3" | |
# except Exception as e: | |
# disease_status = "β Error during detection" | |
# disease_details = str(e) | |
# return image_status, disease_status, disease_details, play_alert | |
# # Gradio UI | |
# with gr.Blocks(title="AgroScan - Human Alert + Disease Detection") as demo: | |
# gr.Markdown(""" | |
# <div style="text-align: center;"> | |
# <h1 style="color: #2e7d32;">πΏ AgroScan: Plant Disease Detector + Human Alert</h1> | |
# <p style="font-size: 16px; color: #555;"> | |
# Upload an image of a leaf or a human. If human is detected, an alert will be triggered. | |
# </p> | |
# </div> | |
# """) | |
# with gr.Row(): | |
# with gr.Column(scale=1): | |
# image_input = gr.Image(type="pil", label="π· Upload Image") | |
# submit_btn = gr.Button("π Analyze") | |
# with gr.Column(scale=1): | |
# image_result = gr.Textbox(label="πΌοΈ Image Authenticity", interactive=False) | |
# disease_result = gr.Textbox(label="π± Disease Status", interactive=False) | |
# detail = gr.Textbox(label="π Details", lines=5, interactive=False) | |
# sound_output = gr.Audio(label="π¨ Alert Sound", autoplay=True, interactive=False) | |
# submit_btn.click(fn=predict, inputs=image_input, | |
# outputs=[image_result, disease_result, detail, sound_output]) | |
# demo.launch() | |
# from ultralytics import YOLO | |
# import gradio as gr | |
# import numpy as np | |
# from PIL import Image | |
# # Load the trained YOLOv8 model | |
# model = YOLO("best.pt") # Make sure 'best.pt' is in the same directory | |
# # Check if image is real (simple check using NumPy array and format) | |
# def is_real_image(image): | |
# try: | |
# if image is None: | |
# return False | |
# arr = np.array(image) | |
# if arr.ndim == 3 and arr.shape[2] in [3, 4]: # RGB or RGBA | |
# return True | |
# return False | |
# except Exception as e: | |
# print(f"Image check error: {e}") | |
# return False | |
# # Prediction function | |
# def predict(image): | |
# image_status = "β Fake Image" | |
# disease_status = "β οΈ Unknown" | |
# disease_details = "" | |
# # Step 1: Image authenticity check | |
# if is_real_image(image): | |
# image_status = "β Real Image" | |
# else: | |
# return image_status, "β οΈ Cannot detect disease in a fake image.", "" | |
# # Step 2: YOLOv8 disease detection | |
# try: | |
# results = model(image) | |
# boxes = results[0].boxes | |
# names = model.names | |
# if len(boxes) == 0: | |
# disease_status = "β No Disease Detected" | |
# else: | |
# disease_status = "π¨ Disease Detected" | |
# for box in boxes: | |
# class_id = int(box.cls[0]) | |
# class_name = names[class_id] | |
# confidence = float(box.conf[0]) | |
# disease_details += f"π¬ {class_name} - Confidence: {confidence*100:.2f}%\n" | |
# except Exception as e: | |
# disease_status = "β Error during detection" | |
# disease_details = str(e) | |
# return image_status, disease_status, disease_details | |
# # Gradio UI | |
# with gr.Blocks(title="AgroScan - Plant Disease & Image Verifier") as demo: | |
# gr.Markdown(""" | |
# <div style="text-align: center;"> | |
# <h1 style="color: #2e7d32;">πΏ AgroScan: Plant Disease Detector + Image Validator</h1> | |
# <p style="font-size: 16px; color: #555;"> | |
# Upload a plant leaf image π to check if it's real or fake and detect any diseases using YOLOv8. | |
# </p> | |
# </div> | |
# """) | |
# with gr.Row(): | |
# with gr.Column(scale=1): | |
# image_input = gr.Image(type="pil", label="π· Upload Leaf Image") | |
# submit_btn = gr.Button("π Analyze") | |
# with gr.Column(scale=1): | |
# image_result = gr.Textbox(label="πΌοΈ Image Authenticity", interactive=False) | |
# disease_result = gr.Textbox(label="π± Disease Status", interactive=False) | |
# detail = gr.Textbox(label="π Detailed Diagnosis", lines=5, interactive=False) | |
# with gr.Accordion("βΉοΈ What is AgroScan?", open=False): | |
# gr.Markdown(""" | |
# AgroScan is an AI-powered detector for identifying plant diseases from leaf images. | |
# It also verifies whether the image is genuine (real leaf image) or fake to avoid misdiagnosis. | |
# Designed to support farmers, agronomists, and researchers for better crop care. | |
# """) | |
# submit_btn.click(fn=predict, inputs=image_input, | |
# outputs=[image_result, disease_result, detail]) | |
# demo.launch() | |
# from ultralytics import YOLO | |
# import gradio as gr | |
# from PIL import Image | |
# # Load YOLO model | |
# model = YOLO("best.pt") # Make sure 'best.pt' is in your directory | |
# # Function to check if image is real | |
# def is_real_image(img): | |
# try: | |
# return isinstance(img, Image.Image) and img.mode in ['RGB', 'RGBA'] and img.size[0] > 50 and img.size[1] > 50 | |
# except: | |
# return False | |
# # Main prediction function with error handling | |
# def predict(image): | |
# try: | |
# if image is None: | |
# return "β No image provided", "β οΈ Cannot check disease", "Upload a valid image first." | |
# # Step 1: Check image authenticity | |
# if is_real_image(image): | |
# image_status = "β Real Image" | |
# else: | |
# return "β Fake Image", "β οΈ Cannot check disease", "Image doesn't appear real. Try another image." | |
# # Step 2: Predict with YOLO model | |
# results = model(image) | |
# names = model.names | |
# boxes = results[0].boxes | |
# if len(boxes) == 0: | |
# return image_status, "β No Disease Detected", "No signs of disease found." | |
# diagnosis = "" | |
# disease_found = False | |
# for box in boxes: | |
# conf = float(box.conf[0]) | |
# if conf > 0.5: | |
# cls_id = int(box.cls[0]) | |
# disease_name = names[cls_id] | |
# diagnosis += f"π¬ {disease_name} - Confidence: {conf*100:.2f}%\n" | |
# disease_found = True | |
# if disease_found: | |
# return image_status, "π¨ Disease Detected", diagnosis | |
# else: | |
# return image_status, "β No Disease Detected", "No confident detections." | |
# except Exception as e: | |
# # Handle unexpected errors gracefully | |
# return "β Error", "β Error", f"An error occurred: {str(e)}" | |
# # Gradio Interface | |
# with gr.Blocks(title="AgroScan - Plant Disease & Image Verifier") as demo: | |
# gr.Markdown("## πΏ AgroScan: Plant Disease Detector + Image Validator") | |
# with gr.Row(): | |
# with gr.Column(): | |
# image_input = gr.Image(type="pil", label="π· Upload Plant Leaf Image") | |
# submit_btn = gr.Button("π Analyze") | |
# with gr.Column(): | |
# image_result = gr.Textbox(label="πΌοΈ Image Authenticity", interactive=False) | |
# disease_result = gr.Textbox(label="π± Disease Status", interactive=False) | |
# detail = gr.Textbox(label="π Detailed Diagnosis", lines=5, interactive=False) | |
# submit_btn.click(fn=predict, inputs=image_input, outputs=[image_result, disease_result, detail]) | |
# demo.launch() | |
# from ultralytics import YOLO | |
# import gradio as gr | |
# from PIL import Image | |
# import imghdr | |
# import os | |
# # Load YOLOv5 model | |
# model = YOLO("best.pt") # Ensure your model file 'best.pt' is in the same directory | |
# # Check if image is real or fake (basic format check) | |
# def is_real_image(image): | |
# try: | |
# if image is None: | |
# return False | |
# format_check = imghdr.what(image.fp.name) | |
# return format_check in ['jpeg', 'png'] | |
# except: | |
# return False | |
# # Prediction function | |
# def predict(image): | |
# image_status = "β Fake Image" | |
# disease_status = "β οΈ Unknown" | |
# disease_details = "" | |
# # Step 1: Check if image is real | |
# if is_real_image(image): | |
# image_status = "β Real Image" | |
# else: | |
# return image_status, "β οΈ Cannot detect disease in a fake image.", "" | |
# # Step 2: Run disease detection | |
# results = model(image) | |
# boxes = results[0].boxes | |
# names = model.names | |
# if len(boxes) == 0: | |
# disease_status = "β No Disease Detected" | |
# else: | |
# disease_status = "π¨ Disease Detected" | |
# for box in boxes: | |
# class_id = int(box.cls[0]) | |
# class_name = names[class_id] | |
# confidence = float(box.conf[0]) | |
# disease_details += f"π¬ {class_name} - Confidence: {confidence*100:.2f}%\n" | |
# return image_status, disease_status, disease_details | |
# # UI using Gradio Blocks | |
# with gr.Blocks(title="AgroScan - Plant Disease & Image Verifier") as demo: | |
# gr.Markdown(""" | |
# <div style="text-align: center;"> | |
# <h1 style="color: #2e7d32;">πΏ AgroScan: Plant Disease Detector + Image Validator</h1> | |
# <p style="font-size: 16px; color: #555;"> | |
# Upload a plant leaf image π to check if it's real or fake and detect any diseases using YOLOv5. | |
# </p> | |
# </div> | |
# """) | |
# with gr.Row(): | |
# with gr.Column(scale=1): | |
# image_input = gr.Image(type="pil", label="π· Upload Leaf Image") | |
# submit_btn = gr.Button("π Analyze") | |
# with gr.Column(scale=1): | |
# image_result = gr.Textbox(label="πΌοΈ Image Authenticity", interactive=False) | |
# disease_result = gr.Textbox(label="π± Disease Status", interactive=False) | |
# detail = gr.Textbox(label="π Detailed Diagnosis", lines=5, interactive=False) | |
# with gr.Accordion("βΉοΈ What is AgroScan?", open=False): | |
# gr.Markdown(""" | |
# AgroScan is an AI-powered detector for identifying plant diseases from leaf images. | |
# It also verifies whether the image is genuine (real leaf image) or fake to avoid misdiagnosis. | |
# Designed to support farmers, agronomists, and researchers for better crop care. | |
# """) | |
# submit_btn.click(fn=predict, inputs=image_input, | |
# outputs=[image_result, disease_result, detail]) | |
# demo.launch() | |
# from ultralytics import YOLO | |
# import gradio as gr | |
# from PIL import Image | |
# # Load YOLOv5 model | |
# model = YOLO("best.pt") # Make sure this file exists in your Hugging Face Space | |
# # Prediction function | |
# def predict(image): | |
# results = model(image) | |
# boxes = results[0].boxes | |
# names = model.names | |
# output = "" | |
# if len(boxes) == 0: | |
# output = "β Healthy: No disease detected!" | |
# else: | |
# for box in boxes: | |
# class_id = int(box.cls[0]) | |
# class_name = names[class_id] | |
# confidence = float(box.conf[0]) | |
# output += f"π¨ Detected: {class_name} ({confidence*100:.2f}%)\n" | |
# return output | |
# # Gradio UI using Blocks | |
# with gr.Blocks(title="AgroScan - Plant Disease Detector") as demo: | |
# gr.Markdown(""" | |
# <div style="text-align: center;"> | |
# <h1 style="color: #2e7d32;">πΏ AgroScan: Plant Disease Detector</h1> | |
# <p style="font-size: 16px; color: #555;"> | |
# Upload a high-quality image of a plant leaf π and detect possible diseases using AI-powered YOLOv5. | |
# </p> | |
# </div> | |
# """) | |
# with gr.Row(): | |
# with gr.Column(scale=1): | |
# image_input = gr.Image(type="pil", label="π· Upload Leaf Image") | |
# predict_button = gr.Button("π Analyze Leaf", variant="primary") | |
# with gr.Column(scale=1): | |
# result_output = gr.Textbox(label="π©Ί Diagnosis Result", lines=6) | |
# with gr.Accordion("βΉοΈ About AgroScan", open=False): | |
# gr.Markdown(""" | |
# **AgroScan** is an intelligent plant disease detector built with **YOLOv5** and trained on custom agricultural datasets. | |
# It helps farmers, researchers, and agriculturists in early detection of plant diseases to ensure timely treatment and improved crop yield. π± | |
# """) | |
# predict_button.click(fn=predict, inputs=image_input, outputs=result_output) | |
# demo.launch() | |
# from ultralytics import YOLO | |
# import gradio as gr | |
# from PIL import Image | |
# import torch | |
# # Load YOLOv5 model | |
# model = YOLO("best.pt") # assumes model is in the same directory | |
# # Prediction function | |
# def predict(image): | |
# results = model(image) | |
# boxes = results[0].boxes | |
# names = model.names | |
# output = "" | |
# if len(boxes) == 0: | |
# output = "β Healthy: No disease detected!" | |
# else: | |
# for box in boxes: | |
# class_id = int(box.cls[0]) | |
# class_name = names[class_id] | |
# confidence = float(box.conf[0]) | |
# output += f"π¨ Detected: {class_name} ({confidence*100:.2f}%)\n" | |
# return output | |
# # Gradio UI | |
# gr.Interface( | |
# fn=predict, | |
# inputs=gr.Image(type="pil"), | |
# outputs="text", | |
# title="πΏ AgroScan: Plant Disease Detector", | |
# description="Upload a plant leaf image to detect disease using a YOLOv5 model.", | |
# ).launch() |