paddle12's picture
Update app.py
3579f77 verified
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()