GodfreyOwino's picture
Create app.py
f75d6da verified
import gradio as gr
from fastapi import FastAPI
from pydantic import BaseModel
from huggingface_hub import hf_hub_download, HfApi
import joblib
import os
from datetime import datetime, timedelta
import pandas as pd
REPO_ID = "GodfreyOwino/NPK_needs_mode2"
FILENAME = "npk_needs_model.joblib"
UPDATE_FREQUENCY = timedelta(days=1)
class InputData(BaseModel):
crop_name: str
target_yield: float
field_size: float
ph: float
organic_carbon: float
nitrogen: float
phosphorus: float
potassium: float
soil_moisture: float
def get_latest_model():
try:
api = HfApi()
remote_info = api.model_info(repo_id=REPO_ID)
remote_mtime = remote_info.lastModified
cached_path = hf_hub_download(repo_id=REPO_ID, filename=FILENAME)
if os.path.exists(cached_path):
local_mtime = datetime.fromtimestamp(os.path.getmtime(cached_path))
if datetime.now() - local_mtime < UPDATE_FREQUENCY:
print("Using cached model (checked recently)")
return joblib.load(cached_path)
if remote_mtime > local_mtime:
print("Downloading updated model")
cached_path = hf_hub_download(repo_id=REPO_ID, filename=FILENAME, force_download=True)
else:
print("Cached model is up-to-date")
else:
print("Downloading model for the first time")
cached_path = hf_hub_download(repo_id=REPO_ID, filename=FILENAME)
except Exception as e:
print(f"Error checking/downloading model: {e}")
print(f"Error type: {type(e)}")
print(f"Error details: {str(e)}")
raise Exception("Unable to download or find the model.")
return joblib.load(cached_path)
def predict(crop_name, target_yield, field_size, ph, organic_carbon, nitrogen, phosphorus, potassium, soil_moisture):
try:
model = get_latest_model()
input_data = {
'crop_name': [crop_name],
'target_yield': [target_yield],
'field_size': [field_size],
'ph': [ph],
'organic_carbon': [organic_carbon],
'nitrogen': [nitrogen],
'phosphorus': [phosphorus],
'potassium': [potassium],
'soil_moisture': [soil_moisture]
}
input_df = pd.DataFrame(input_data)
prediction = model.predict(input_df)
results = {
'nitrogen_need': float(prediction[0][0]),
'phosphorus_need': float(prediction[0][1]),
'potassium_need': float(prediction[0][2]),
'organic_matter_need': float(prediction[0][3]),
'lime_need': float(prediction[0][4])
}
return results
except Exception as e:
return {"error": str(e)}
iface = gr.Interface(
fn=predict,
inputs=[
gr.Textbox(label="Crop Name"),
gr.Number(label="Target Yield"),
gr.Number(label="Field Size"),
gr.Number(label="pH"),
gr.Number(label="Organic Carbon"),
gr.Number(label="Nitrogen"),
gr.Number(label="Phosphorus"),
gr.Number(label="Potassium"),
gr.Number(label="Soil Moisture")
],
outputs=gr.JSON(label="Prediction Results"),
title="NPK Needs Prediction",
description="Enter soil and crop details to predict NPK needs."
)
iface.launch()