File size: 9,104 Bytes
e9ead59 |
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 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 |
import streamlit as st
from PIL import Image
import torch
from transformers import AutoModelForImageClassification, AutoFeatureExtractor
from groq import Groq
from dotenv import load_dotenv
import os
# Load environment variables from the .env file
load_dotenv()
# Securely get the GROQ API key from environment variables
groq_api_key = os.getenv("GROQ_API_KEY")
if not groq_api_key:
raise ValueError("GROQ_API_KEY environment variable not set.")
# Initialize the client with the API key
client = Groq(api_key=groq_api_key)
# Expanded dictionary with treatments for various diseases
disease_treatments = {
"Grape with Black Rot": "Prune affected areas, avoid water on leaves, use fungicide if severe.",
"Potato with Early Blight": "Apply fungicides, avoid overhead watering, rotate crops yearly.",
"Tomato with Early Blight": "Remove infected leaves, use copper-based fungicide, maintain good airflow.",
"Apple with Scab": "Remove fallen leaves, prune trees, apply fungicide in early spring.",
"Wheat with Leaf Rust": "Apply resistant varieties, use fungicides, remove weeds.",
"Cucumber with Downy Mildew": "Use resistant varieties, ensure good air circulation, apply fungicide.",
"Rose with Powdery Mildew": "Use sulfur or potassium bicarbonate sprays, prune affected areas, avoid overhead watering.",
"Strawberry with Gray Mold": "Remove infected fruits, improve ventilation, avoid wetting the fruit when watering.",
"Peach with Leaf Curl": "Apply a fungicide in late fall or early spring, remove affected leaves.",
"Banana with Panama Disease": "Use disease-resistant varieties, ensure soil drainage, avoid overwatering.",
"Tomato with Septoria Leaf Spot": "Use resistant varieties, remove infected leaves, apply fungicide.",
"Corn with Smut": "Remove infected ears, use disease-free seed, rotate crops.",
"Carrot with Root Rot": "Ensure well-draining soil, avoid excessive watering, use crop rotation.",
"Onion with Downy Mildew": "Use fungicides, ensure adequate spacing, avoid overhead watering.",
"Potato with Late Blight": "Apply copper-based fungicides, remove affected foliage, practice crop rotation.",
"Citrus with Greening Disease": "Remove infected trees, control leafhopper population, plant disease-free trees.",
"Lettuce with Downy Mildew": "Ensure good air circulation, avoid overhead watering, apply fungicides.",
"Pepper with Bacterial Spot": "Use resistant varieties, apply copper-based bactericides, practice crop rotation.",
"Eggplant with Verticillium Wilt": "Use resistant varieties, solarize soil before planting, avoid soil disturbance.",
"Cotton with Boll Rot": "Improve drainage, remove infected bolls, apply fungicides if necessary.",
"Soybean with Soybean Rust": "Use fungicides, rotate crops, use resistant varieties if available.",
"Rice with Sheath Blight": "Reduce nitrogen application, maintain proper water levels, apply fungicides.",
"Sunflower with Downy Mildew": "Use resistant varieties, avoid waterlogging, apply fungicides.",
"Barley with Net Blotch": "Use resistant varieties, remove crop residues, apply fungicides.",
"Oat with Crown Rust": "Use resistant varieties, apply fungicides, avoid high nitrogen levels.",
"Sugarcane with Red Rot": "Use disease-free cuttings, control weeds, apply fungicides if necessary.",
"Pine with Pine Wilt": "Remove and destroy infected trees, control beetle population, avoid planting susceptible species.",
"Avocado with Anthracnose": "Prune infected branches, use copper-based fungicides, avoid wet foliage.",
"Papaya with Papaya Ringspot Virus": "Use virus-resistant varieties, remove infected plants, control aphid population.",
"Mango with Powdery Mildew": "Use sulfur-based fungicides, remove affected parts, avoid overhead watering.",
"Peanut with Leaf Spot": "Use resistant varieties, apply fungicides, rotate crops to reduce infection risk.",
"Chili with Anthracnose": "Apply copper fungicides, remove infected fruits, avoid overhead irrigation.",
"Garlic with White Rot": "Remove infected plants, improve soil drainage, practice crop rotation."
}
# Streamlit title and description
st.title("πΏ Plant Disease Detection πΏ")
st.write("Upload an image of a plant leaf, and the app will detect the disease and suggest a treatment.")
# File upload option
uploaded_file = st.file_uploader("Choose an image...", type=["jpg", "jpeg", "png", "bmp", "gif", "tiff", "webp"])
if uploaded_file is not None:
# Open the image using PIL and display it
image = Image.open(uploaded_file)
image = image.convert("RGB")
st.image(image, caption="Uploaded Image", use_container_width=True)
# Initialize the feature extractor and model
extractor = AutoFeatureExtractor.from_pretrained("linkanjarad/mobilenet_v2_1.0_224-plant-disease-identification")
model = AutoModelForImageClassification.from_pretrained("linkanjarad/mobilenet_v2_1.0_224-plant-disease-identification")
# Preprocess the image
inputs = extractor(images=image, return_tensors="pt")
# Get the model's raw prediction (logits)
outputs = model(**inputs)
logits = outputs.logits
# Temperature scaling for logits (lowering temperature to adjust confidence)
temperature = 0.5
logits = logits / temperature
# Convert logits to probabilities using softmax
softmax = torch.nn.Softmax(dim=1)
probabilities = softmax(logits)
# Get the top prediction
top_k = 1
top_probs, top_indices = torch.topk(probabilities, top_k, dim=1)
top_probs = top_probs[0].tolist()
top_indices = top_indices[0].tolist()
# Define a confidence threshold
confidence_threshold = 0.7
class_labels = model.config.id2label
predicted_disease = "Unknown Disease"
predicted_confidence = top_probs[0]
# Handle low-confidence predictions
if predicted_confidence >= confidence_threshold:
predicted_disease = class_labels.get(top_indices[0], "Unknown Disease")
else:
predicted_disease = "Unknown Disease"
st.warning("The model could not confidently identify a disease. Please try again with a clearer image.")
# Fetch treatment from the dictionary
treatment = disease_treatments.get(predicted_disease, "No treatment information available.")
# Display prediction and treatment
st.write(f"**Predicted Disease:** {predicted_disease}")
st.write(f"**Confidence Level:** {predicted_confidence:.2f}")
# Generate detailed report (using prompts)
symptoms = "leaf discoloration, spots, mold, wilting" # This can be dynamically generated based on the image features
diagnosis_prompt = f"Identify the disease or pest affecting a plant with the following symptoms: {symptoms}."
treatment_prompt = f"Suggest treatments for a plant disease with symptoms like {symptoms}. Include organic and chemical treatment options if available."
preventive_prompt = f"Provide preventive measures for plant diseases with symptoms similar to {symptoms}."
# Combine the prompts into the chat context
chat_context = f"""
### π± Plant Disease Diagnosis Report π±
#### π Predicted Disease
- **Disease**: {predicted_disease}
- **Confidence Level**: {predicted_confidence:.2f}
#### π Disease Diagnosis and Symptoms
- **Diagnosis**: {diagnosis_prompt}
#### π Treatment Recommendations
- **Treatment**: {treatment_prompt}
#### π‘οΈ Preventive Measures
- **Prevention**: {preventive_prompt}
#### π Conclusion
- **Next Steps**: Consult a local expert for further advice.
"""
# Generate report using Groq (or any other service)
try:
chat_completion = client.chat.completions.create(
messages=[
{
"role": "system",
"content": (
"You are a plant disease analysis assistant. Your task is to provide a comprehensive, actionable diagnosis report."
"The report should include the predicted disease, its symptoms, recommended treatments, and prevention tips. "
"Ensure the report is actionable and easy to understand for non-experts in agriculture."
)
},
{
"role": "user",
"content": chat_context
}
],
model="mixtral-8x7b-32768", # Adjust this to the model you're using
temperature=0.7, # Adjust to balance creativity and precision
max_tokens=5000 # Limit to ensure the output is not cut off
)
# Display the generated report in the Streamlit app
st.markdown("---")
# Display the full HTML report generated by Groq
st.markdown(chat_completion.choices[0].message.content, unsafe_allow_html=True)
except Exception as e:
# If there's an error with the Groq API call, display an error message
st.error(f"Error generating report: {str(e)}") |