Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import tensorflow as tf | |
| import json | |
| import tensorflow_hub as hub | |
| from PIL import Image | |
| # Ensure KerasLayer is recognized when loading the model | |
| tf.keras.utils.get_custom_objects().update({'KerasLayer': hub.KerasLayer}) | |
| # Paths to your model and label files | |
| class_file_path = './labels.json' | |
| model_file_path = './model.h5' | |
| # Load the model | |
| model = tf.keras.models.load_model(model_file_path) | |
| def load_breeds(file_path=class_file_path): | |
| with open(file_path, 'r') as file: | |
| return json.load(file) | |
| labels = load_breeds() | |
| # Format disease list as comma-separated string, nicely readable for UI | |
| def format_label(label): | |
| label = label.replace('__', ' ') | |
| label = label.replace('_', ' ') | |
| return label.title() | |
| disease_list_str = ", ".join([format_label(label) for label in labels]) | |
| # Organic treatments dictionary with keys matching the raw label strings exactly | |
| organic_treatments = { | |
| "Maize Rust": "Spray neem oil or copper fungicide. Use resistant maize varieties and remove infected plant debris.", | |
| "Maize fall armyworm": "Handpick larvae, use Bacillus thuringiensis (Bt) sprays, and encourage natural predators like birds and parasitic wasps.", | |
| "Maize grasshoper": "Introduce natural predators such as birds, use neem-based insecticides, and practice crop rotation.", | |
| "Maize healthy": "No treatment needed. Maintain good agricultural practices and crop hygiene.", | |
| "Maize leaf beetle": "Use neem oil sprays, release beneficial insects like ladybugs, and remove affected leaves.", | |
| "Maize leaf blight": "Apply copper-based fungicides, use resistant varieties, and avoid overhead irrigation to reduce leaf wetness.", | |
| "Maize leaf spot": "Remove and destroy infected leaves, use copper fungicides, and ensure proper spacing for air circulation.", | |
| "Maize streak virus": "Control insect vectors like leafhoppers with neem insecticide, plant resistant varieties, and remove infected plants.", | |
| "Tomato_Bacterial_spot": "Spray copper-based bactericides, remove infected plant material, and avoid overhead watering.", | |
| "Tomato_Early_blight": "Use copper fungicides, remove and destroy infected leaves, and rotate crops.", | |
| "Tomato_Late_blight": "Apply organic fungicides like copper or bicarbonate sprays, remove infected plants, and avoid wetting foliage.", | |
| "Tomato_Leaf_Mold": "Ensure good air circulation, avoid overhead watering, and apply neem or copper fungicides.", | |
| "Tomato_Septoria_leaf_spot": "Remove infected leaves, use copper fungicides, and maintain proper plant spacing.", | |
| "Tomato_Spider_mites_Two_spotted_spider_mite": "Spray insecticidal soap or neem oil, introduce predatory mites, and regularly hose plants to remove mites.", | |
| "Tomato__Target_Spot": "Remove affected leaves, use copper fungicides, and practice crop rotation.", | |
| "Tomato__Tomato_YellowLeaf__Curl_Virus": "Control whitefly vectors with neem insecticide, remove infected plants, and use resistant varieties.", | |
| "Tomato__Tomato_mosaic_virus": "Use virus-free seeds, disinfect tools, remove infected plants, and practice crop rotation.", | |
| "Tomato_healthy": "No treatment needed. Maintain proper watering, good air circulation, and balanced fertilization." | |
| } | |
| def process_image(image, img_size=224): | |
| img_array = tf.keras.preprocessing.image.img_to_array(image) | |
| img_array = tf.image.resize(img_array, [img_size, img_size]) / 255.0 | |
| return img_array | |
| def predict_breed(image): | |
| try: | |
| if image is None: | |
| return "β No image uploaded. Please upload a Maize or Tomato leaf image.", {}, "" | |
| img_array = process_image(image) | |
| img_array = tf.expand_dims(img_array, axis=0) | |
| predictions = model.predict(img_array)[0] | |
| top3_indices = predictions.argsort()[-3:][::-1] | |
| top_pred_class_raw = labels[top3_indices[0]] # raw key | |
| top_pred_class = format_label(top_pred_class_raw) | |
| # Check for valid crops in the display label | |
| if "Maize" not in top_pred_class and "Tomato" not in top_pred_class: | |
| return "β This model only supports Maize and Tomato leaf images.", {}, "" | |
| output_lines = ["πΏ **Top 3 Predictions:**"] | |
| confidence_scores = {} | |
| for i in top3_indices: | |
| class_name = format_label(labels[i]) | |
| confidence = predictions[i] * 100 | |
| output_lines.append(f"- **{class_name}**: {confidence:.2f}%") | |
| confidence_scores[class_name] = float(f"{confidence:.2f}") | |
| treatment = organic_treatments.get(top_pred_class_raw, "No organic treatment available.") | |
| treatment_text = f"π± **Organic Treatment for {top_pred_class}:**\n\n{treatment}" | |
| return "\n".join(output_lines), confidence_scores, treatment_text | |
| except Exception as e: | |
| print("Prediction Error:", e) | |
| return "β File not supported. Please upload a valid image file (JPEG/PNG).", {}, "" | |
| with gr.Blocks() as demo: | |
| gr.Markdown("# πΏ Hares: Maize & Tomato Disease Classifier") | |
| gr.Markdown(f"### Supported Diseases:\n\n{disease_list_str}") | |
| image_input = gr.Image(type="pil", label="Upload Maize or Tomato Leaf Image") | |
| prediction_text = gr.Markdown(label="Prediction") | |
| confidence_bar = gr.JSON(label="Confidence Scores") | |
| treatment_text = gr.Markdown(label="Organic Treatment") | |
| image_input.change(fn=predict_breed, inputs=image_input, outputs=[prediction_text, confidence_bar, treatment_text]) | |
| demo.launch(share=True) | |