|
|
import numpy as np |
|
|
import pandas as pd |
|
|
import gradio as gr |
|
|
import joblib |
|
|
import tensorflow as tf |
|
|
|
|
|
|
|
|
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') |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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)}, |
|
|
'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)}, |
|
|
'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] |
|
|
|
|
|
|
|
|
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]})") |
|
|
|
|
|
|
|
|
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]})") |
|
|
|
|
|
|
|
|
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: |
|
|
|
|
|
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_)}") |
|
|
|
|
|
|
|
|
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], |
|
|
encoded_soil, |
|
|
scaled_num[0][1], |
|
|
scaled_num[0][2], |
|
|
scaled_num[0][3], |
|
|
encoded_crop |
|
|
]]) |
|
|
|
|
|
|
|
|
pred = model.predict(model_input) |
|
|
fertilizer = fertilizer_encoder.inverse_transform([np.argmax(pred)])[0] |
|
|
|
|
|
|
|
|
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), "" |
|
|
|
|
|
|
|
|
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() |