import gradio as gr import pandas as pd import numpy as np import matplotlib.pyplot as plt from tensorflow.keras.models import load_model import joblib # Load the model model = load_model("Engine_Fault-small.h5") scaler = joblib.load("scaler.pkl") # Fault Type Table fault_table = pd.DataFrame({ "Tipe Kerusakan": [0, 1, 2, 3], "Nama Kerusakan": ["No Fault", "Rich Mixture", "Lean Mixture", "Low Voltage"], "Kondisi": [ "Tidak ada kerusakan", "Performa sensor salah, Tekanan bahan bakar tinggi, Injektor rusak, Regulator tekanan rusak, Filter udara tersumbat, Saluran pengembalian bahan bakar tersumbat", "Performa sensor salah, Tekanan bahan bakar rendah, Injektor rusak, Regulator tekanan rusak", "Busi yang sudah aus, Kabel pengapian rusak, Kumparan rusak, Kabel sensor rusak" ] }) # Define input columns required by the model required_columns = [ "MAP", "TPS", "Force", "Power", "RPM", "Consumption L/H", "Consumption L/100KM", "Speed", "CO", "HC", "CO2", "O2", "Lambda", "AFR" ] def predict_fault(uploaded_csv): if uploaded_csv is None: return "Please upload a CSV file for prediction.", None df = pd.read_csv(uploaded_csv) missing_cols = set(required_columns) - set(df.columns) if missing_cols: return f"Missing required columns: {', '.join(missing_cols)}", None # Scale input X = df[required_columns] X_scaled = scaler.transform(X) # Predict predictions = model.predict(X_scaled) predicted_faults = np.argmax(predictions, axis=1) # Merge fault descriptions df['Predicted Fault Type'] = predicted_faults df = df.merge(fault_table, left_on='Predicted Fault Type', right_on='Tipe Kerusakan', how='left') # Plot bar chart fig, ax = plt.subplots() fault_counts = df['Predicted Fault Type'].value_counts().sort_index() fault_counts.plot(kind='bar', ax=ax) ax.set_title("Jumlah Tipe Fault yang Diprediksi") ax.set_xlabel("Tipe Fault") ax.set_ylabel("Jumlah") ax.set_xticks(range(4)) ax.set_xticklabels(["No Fault", "Rich", "Lean", "Low Volt"], rotation=0) plt.tight_layout() # Return output return df[['Predicted Fault Type', 'Nama Kerusakan', 'Kondisi']].head(10), fig # Gradio Interface demo = gr.Interface( fn=predict_fault, inputs=[ gr.File(label="Upload CSV File", file_types=[".csv"]) ], outputs=[ gr.Dataframe(label="Predicted Faults (Top 10 Rows)"), gr.Plot(label="Bar Chart") ], title="Sistem Prediksi Kerusakan Mesin Otomotif", description=( "Upload file CSV yang berisikan data sensor mesin untuk memprediksi kerusakan.\n\n" "Model mengklasifikasi kerusakan berdasarkan kondisi berikut:\n\n" "**Catatan penting:** File CSV *wajib* memiliki kolom-kolom berikut (harus sesuai urutan):\n" "`MAP`, `TPS`, `Force`, `Power`, `RPM`, `Consumption L/H`, `Consumption L/100KM`, `Speed`, `CO`, `HC`, `CO2`, `O2`, `Lambda`, `AFR`\n\n" "| Tipe Kerusakan | Nama Kerusakan | Kondisi |\n" "|------------|----------------|----------------------------------------------------------------------------|\n" "| 0 | No fault | Tidak ada kerusakan |\n" "| 1 | Rich Mixture | Performa sensor salah, Tekanan bahan bakar tinggi, Injektor rusak, Regulator tekanan rusak, Filter udara tersumbat, Saluran pengembalian bahan bakar tersumbat |\n" "| 2 | Lean Mixture | Performa sensor salah, Tekanan bahan bakar rendah, Injektor rusak, Regulator tekanan rusak |\n" "| 3 | Low Voltage | Busi yang sudah aus, Kabel pengapian rusak, Kumparan rusak, Kabel sensor rusak |\n" ), examples=[["sample.csv"]] ) if __name__ == "__main__": demo.launch()