FRS / app.py
Nimbus10's picture
Update app.py
e9dd810 verified
import numpy as np
import pandas as pd
import gradio as gr
import joblib
import tensorflow as tf
# Load artifacts
model = tf.keras.models.load_model('model/my_model_low_build.keras')
scaler = joblib.load('model/scaler_minor_low_build.pkl')
soil_encoder = joblib.load('model/soil_encoder_low_build.pkl')
crop_encoder = joblib.load('model/crop_encoder_low_build.pkl')
fertilizer_encoder = joblib.load('model/fertilizer_encoder_low_build.pkl')
# model = tf.keras.models.load_model('model/my_model.keras')
# scaler = joblib.load('model/scaler.pkl')
# soil_encoder = joblib.load('model/soil_encoder.pkl')
# crop_encoder = joblib.load('model/crop_encoder.pkl')
# fertilizer_encoder = joblib.load('model/fertilizer_encoder.pkl')
# Crop requirements (same as before)
crop_requirements = {
'cotton': {'Nitrogen': (80, 120), 'Phosphorus': (40, 60), 'Potassium': (80, 120)},
'orange': {'Nitrogen': (120, 150), 'Phosphorus': (50, 70), 'Potassium': (150, 200)},
'wheat': {'Nitrogen': (100, 150), 'Phosphorus': (40, 60), 'Potassium': (40, 60)},
'maize': {'Nitrogen': (150, 200), 'Phosphorus': (50, 80), 'Potassium': (50, 80)},
'rice': {'Nitrogen': (80, 120), 'Phosphorus': (40, 60), 'Potassium': (60, 80)},
'potato': {'Nitrogen': (150, 200), 'Phosphorus': (60, 80), 'Potassium': (150, 200)},
'tomato': {'Nitrogen': (100, 150), 'Phosphorus': (50, 70), 'Potassium': (150, 200)},
'carrot': {'Nitrogen': (60, 100), 'Phosphorus': (30, 50), 'Potassium': (60, 80)},
'cabbage': {'Nitrogen': (150, 200), 'Phosphorus': (70, 100), 'Potassium': (150, 200)},
'banana': {'Nitrogen': (150, 200), 'Phosphorus': (70, 100), 'Potassium': (200, 250)},
'onion': {'Nitrogen': (80, 120), 'Phosphorus': (40, 60), 'Potassium': (80, 100)},
'pepper': {'Nitrogen': (100, 150), 'Phosphorus': (50, 70), 'Potassium': (150, 200)},
'lettuce': {'Nitrogen': (60, 100), 'Phosphorus': (30, 50), 'Potassium': (40, 60)},
'sunflower': {'Nitrogen': (80, 120), 'Phosphorus': (40, 60), 'Potassium': (60, 80)},
'soybean': {'Nitrogen': (0, 20), 'Phosphorus': (40, 60), 'Potassium': (40, 60)}, # Legume: fixes its own N
'tobacco': {'Nitrogen': (120, 150), 'Phosphorus': (40, 60), 'Potassium': (60, 80)},
'sugarcane': {'Nitrogen': (100, 150), 'Phosphorus': (40, 60), 'Potassium': (150, 200)},
'peanut': {'Nitrogen': (0, 20), 'Phosphorus': (40, 60), 'Potassium': (60, 80)}, # Legume: fixes N
'coffee': {'Nitrogen': (80, 120), 'Phosphorus': (40, 60), 'Potassium': (80, 120)},
'tea': {'Nitrogen': (100, 150), 'Phosphorus': (50, 70), 'Potassium': (100, 150)}
}
def crop_specific_recommendation(raw_input):
recommendations = []
crop = raw_input[5].lower()
if crop in crop_requirements:
ideal = crop_requirements[crop]
n = raw_input[2]
p = raw_input[3]
k = raw_input[4]
# Nitrogen check
if n < ideal['Nitrogen'][0]:
recommendations.append(f"Nitrogen is low for {crop} (current: {n}, ideal: {ideal['Nitrogen'][0]}-{ideal['Nitrogen'][1]})")
elif n > ideal['Nitrogen'][1]:
recommendations.append(f"Nitrogen is high for {crop} (current: {n}, ideal: {ideal['Nitrogen'][0]}-{ideal['Nitrogen'][1]})")
# Phosphorus check
if p < ideal['Phosphorus'][0]:
recommendations.append(f"Phosphorus is low for {crop} (current: {p}, ideal: {ideal['Phosphorus'][0]}-{ideal['Phosphorus'][1]})")
elif p > ideal['Phosphorus'][1]:
recommendations.append(f"Phosphorus is high for {crop} (current: {p}, ideal: {ideal['Phosphorus'][0]}-{ideal['Phosphorus'][1]})")
# Potassium check
if k < ideal['Potassium'][0]:
recommendations.append(f"Potassium is low for {crop} (current: {k}, ideal: {ideal['Potassium'][0]}-{ideal['Potassium'][1]})")
elif k > ideal['Potassium'][1]:
recommendations.append(f"Potassium is high for {crop} (current: {k}, ideal: {ideal['Potassium'][0]}-{ideal['Potassium'][1]})")
else:
recommendations.append(f"No specific recommendations available for {crop}")
return "\n".join(recommendations) if recommendations else f"All nutrient levels are optimal for {crop}"
def predict_fertilizer(temperature, soil, nitrogen, phosphorus, potassium, crop):
try:
# Validate inputs
crop = crop.lower()
if soil not in soil_encoder.classes_:
raise ValueError(f"Invalid soil type. Choose from {list(soil_encoder.classes_)}")
if crop not in crop_encoder.classes_:
raise ValueError(f"Invalid crop type. Choose from {list(crop_encoder.classes_)}")
# Prepare input
num_features = np.array([[temperature, nitrogen, phosphorus, potassium]])
scaled_num = scaler.transform(num_features)
encoded_soil = soil_encoder.transform([soil])[0]
encoded_crop = crop_encoder.transform([crop])[0]
model_input = np.array([[
scaled_num[0][0], # Temperature
encoded_soil, # Soil
scaled_num[0][1], # Nitrogen
scaled_num[0][2], # Phosphorus
scaled_num[0][3], # Potassium
encoded_crop # Crop
]])
# Predict
pred = model.predict(model_input)
fertilizer = fertilizer_encoder.inverse_transform([np.argmax(pred)])[0]
# Generate recommendations
raw_input = [temperature, soil, nitrogen, phosphorus, potassium, crop]
crop_advice = crop_specific_recommendation(raw_input)
return fertilizer, crop_advice
except Exception as e:
return str(e), ""
# Create Gradio interface
inputs = [
gr.Number(label="Temperature (°C)"),
gr.Dropdown(label="Soil Type", choices=list(soil_encoder.classes_)),
gr.Number(label="Nitrogen Level (kg/ha)"),
gr.Number(label="Phosphorus Level (kg/ha)"),
gr.Number(label="Potassium Level (kg/ha)"),
gr.Dropdown(label="Crop Type", choices=list(crop_encoder.classes_))
]
outputs = [
gr.Textbox(label="Recommended Fertilizer"),
gr.Textbox(label="Crop Advice")
]
gr.Interface(
fn=predict_fertilizer,
inputs=inputs,
outputs=outputs,
title="Fertilizer Recommendation System",
description="Predict optimal fertilizer based on soil and crop conditions"
).launch()