Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import pandas as pd | |
| import numpy as np | |
| import joblib | |
| # ----------------------------- | |
| # 1️⃣ Load model and data | |
| # ----------------------------- | |
| MODEL_PATH = "linear_model.pkl" | |
| EXCEL_PATH = "excel sheet of plant 2.xlsx" | |
| linear_model = joblib.load(MODEL_PATH) | |
| df = pd.read_excel(EXCEL_PATH) | |
| df.columns = df.columns.str.strip() | |
| strain_names = df['pea plant strain'].unique().tolist() | |
| row_options = ["None, Enter Manually"] + [str(i) for i in range(len(df))] | |
| # ----------------------------- | |
| # 2️⃣ Autofill function | |
| # ----------------------------- | |
| def autofill_fields(row_index): | |
| if row_index == "None, Enter Manually": | |
| return [None]*11 # Dose, Soil N, P, K, pH + 6 optional yield metrics | |
| row = df.iloc[int(row_index)] | |
| return ( | |
| row['Dose (g/pot)'], row['Soil N (ppm)'], row['Soil P (ppm)'], | |
| row['Soil K (ppm)'], row['pH'], row['Chlorophyll (SPAD)'], | |
| row['Shoot Length (cm)'], row['Root Length (cm)'], row['Shoot Wt (g)'], | |
| row['Root Wt (g)'], row['Yield (g/pot)'] | |
| ) | |
| # ----------------------------- | |
| # 3️⃣ Prediction function | |
| # ----------------------------- | |
| def predict_linear(strain, dose, soil_n, soil_p, soil_k, ph, | |
| chlorophyll, shoot_len, root_len, shoot_wt, root_wt, yield_gp, | |
| actual_yield=None): | |
| logs = [] | |
| # Validate required inputs | |
| required = [dose, soil_n, soil_p, soil_k, ph] | |
| if any(v is None for v in required): | |
| logs.append("[DEBUG] Missing numeric inputs!") | |
| return "⚠️ Fill all inputs", "", "", "\n".join(logs) | |
| logs.append("[DEBUG] Inputs received.") | |
| # Prepare DataFrame | |
| X_input = pd.DataFrame([{ | |
| 'pea plant strain': strain, | |
| 'Dose (g/pot)': dose, | |
| 'Soil N (ppm)': soil_n, | |
| 'Soil P (ppm)': soil_p, | |
| 'Soil K (ppm)': soil_k, | |
| 'pH': ph | |
| }]) | |
| logs.append(f"[DEBUG] Input DataFrame:\n{X_input}") | |
| # Predict all 7 target metrics | |
| y_pred = linear_model.predict(X_input)[0] | |
| logs.append(f"[DEBUG] Predicted values:\n{y_pred}") | |
| # Optional actual_yield comparison | |
| if actual_yield is not None: | |
| try: | |
| actual_val = float(actual_yield) | |
| abs_error = np.abs(actual_val - y_pred[5]) # assuming Yield (g/pot) at index 5 | |
| logs.append(f"[DEBUG] Actual Yield: {actual_val}") | |
| logs.append(f"[DEBUG] Absolute Error: {abs_error}") | |
| return (f"**Predicted Metrics:** {y_pred.round(2)}", | |
| f"**Actual Yield:** {actual_val}", | |
| f"**Absolute Error:** {abs_error:.2f}", | |
| "\n".join(logs)) | |
| except: | |
| logs.append("[DEBUG] Actual yield invalid.") | |
| return (f"**Predicted Metrics:** {y_pred.round(2)}", | |
| "Actual Yield: Not provided", | |
| "Absolute Error: N/A", | |
| "\n".join(logs)) | |
| # ----------------------------- | |
| # 4️⃣ Gradio Interface | |
| # ----------------------------- | |
| with gr.Blocks(title="Linear Regression Plant Predictor") as demo: | |
| gr.Markdown("<h1 style='text-align:center'>Linear Regression — Plant Yield Predictor</h1>") | |
| with gr.Row(): | |
| with gr.Column(scale=1): | |
| gr.Markdown("### Plant & Strain") | |
| strain_input = gr.Dropdown(strain_names, label="Select Strain", value=strain_names[0]) | |
| row_selector = gr.Dropdown(row_options, label="Select Row", value="None, Enter Manually") | |
| gr.Markdown("### Input Parameters") | |
| dose = gr.Number(label="Dose (g/pot)") | |
| soil_n = gr.Number(label="Soil N (ppm)") | |
| soil_p = gr.Number(label="Soil P (ppm)") | |
| soil_k = gr.Number(label="Soil K (ppm)") | |
| ph = gr.Number(label="pH") | |
| gr.Markdown("### Optional Yield Metrics") | |
| chlorophyll = gr.Number(label="Chlorophyll (SPAD)") | |
| shoot_len = gr.Number(label="Shoot Length (cm)") | |
| root_len = gr.Number(label="Root Length (cm)") | |
| shoot_wt = gr.Number(label="Shoot Wt (g)") | |
| root_wt = gr.Number(label="Root Wt (g)") | |
| yield_gp = gr.Number(label="Yield (g/pot)") | |
| actual_yield = gr.Number(label="Actual Yield (g/pot)") | |
| predict_btn = gr.Button("Predict", variant="primary") | |
| with gr.Column(scale=1): | |
| gr.Markdown("### Inference Result") | |
| pred_box = gr.Markdown("Awaiting prediction...") | |
| actual_box = gr.Markdown("") | |
| abs_box = gr.Markdown("") | |
| log_box = gr.Textbox(label="Debug Logs", lines=15) | |
| # Autofill callback | |
| row_selector.change(fn=autofill_fields, inputs=[row_selector], | |
| outputs=[dose, soil_n, soil_p, soil_k, ph, | |
| chlorophyll, shoot_len, root_len, | |
| shoot_wt, root_wt, yield_gp]) | |
| # Prediction callback | |
| predict_btn.click(fn=predict_linear, | |
| inputs=[strain_input, dose, soil_n, soil_p, soil_k, ph, | |
| chlorophyll, shoot_len, root_len, shoot_wt, root_wt, yield_gp, | |
| actual_yield], | |
| outputs=[pred_box, actual_box, abs_box, log_box]) | |
| # ----------------------------- | |
| # 5️⃣ Launch | |
| # ----------------------------- | |
| if __name__ == "__main__": | |
| demo.launch(server_name="0.0.0.0", server_port=7860) | |