rafhiromadoni's picture
Upload 3 files
e201e3d verified
import gradio as gr
import pandas as pd
import joblib
# 1. LOAD MODEL
print("Memuat model Raisin Classification...")
model = joblib.load('raisin_model.pkl')
# 2. FUNGSI PREDIKSI
def predict_raisin(area, perimeter, major_axis, minor_axis, eccentricity, convex_area, extent):
try:
# 1. Susun input user menjadi Dictionary
# PENTING: Sesuaikan ejaan kunci (key) di bawah ini dengan nama kolom dataset di Colab Anda!
input_data = {
'Area': [area],
'Perimeter': [perimeter],
'MajorAxisLength': [major_axis],
'MinorAxisLength': [minor_axis],
'Eccentricity': [eccentricity],
'ConvexArea': [convex_area],
'Extent': [extent]
}
# 2. Jadikan DataFrame
input_df = pd.DataFrame(input_data)
# 3. Trik Jitu: Urutkan kolom otomatis sesuai bawaan model saat di-training
if hasattr(model, 'feature_names_in_'):
input_df = input_df[model.feature_names_in_]
# 4. Lakukan prediksi probabilitas
prediction = model.predict(input_df)[0]
prob = model.predict_proba(input_df)[0]
# Format output probabilitas untuk Progress Bar Gradio
# Asumsi model.classes_ berisi ['Besni', 'Kecimen'] atau [0, 1]
kelas_0 = str(model.classes_[0])
kelas_1 = str(model.classes_[1])
# Ganti label angka dengan teks jika model menggunakan Label Encoder (0 dan 1)
if kelas_0 == '0': kelas_0 = 'Kecimen' # Sesuaikan dengan mapping Anda
if kelas_1 == '1': kelas_1 = 'Besni'
confidences = {kelas_0: prob[0], kelas_1: prob[1]}
# Tentukan hasil akhir
top_kelas = max(confidences, key=confidences.get)
return f"### πŸ‡ Varietas Terdeteksi: **{top_kelas}**", confidences
except Exception as e:
return f"⚠️ Terjadi error: Pastikan nama kolom di app.py sama dengan dataset Anda. Log: {str(e)}", {}
# 3. ANTARMUKA GRADIO
with gr.Blocks(theme=gr.themes.Soft()) as demo:
gr.Markdown("""
<h1 style='text-align: center;'>πŸ‡ AI Raisin Variant Classifier</h1>
<p style='text-align: center;'>Sistem <i>Quality Control</i> otomatis berbasis <b>Random Forest</b> untuk mendeteksi varietas kismis (Kecimen vs Besni) berdasarkan pengukuran dimensi fisik.</p>
""")
with gr.Row():
with gr.Column(scale=1):
gr.Markdown("**πŸ“ Fitur Ukuran & Dimensi**")
area = gr.Number(value=75500, label="Luas Area (Area)")
perimeter = gr.Number(value=1050, label="Keliling (Perimeter)")
convex_area = gr.Number(value=77000, label="Luas Cembung (ConvexArea)")
gr.Markdown("**πŸ“ Fitur Sumbu & Bentuk**")
major_axis = gr.Number(value=430, label="Panjang Sumbu Utama (MajorAxisLength)")
minor_axis = gr.Number(value=220, label="Panjang Sumbu Minor (MinorAxisLength)")
eccentricity = gr.Slider(minimum=0.0, maximum=1.0, value=0.85, step=0.01, label="Tingkat Kelonjongan (Eccentricity)")
extent = gr.Slider(minimum=0.0, maximum=1.0, value=0.70, step=0.01, label="Kepadatan Rasio (Extent)")
btn_predict = gr.Button("πŸ” Identifikasi Varietas", variant="primary")
with gr.Column(scale=1):
gr.Markdown("**πŸ“Š Hasil Deteksi AI**")
out_kesimpulan = gr.Markdown()
out_label = gr.Label(label="Tingkat Keyakinan (Confidence Score)")
gr.Markdown("""
---
**πŸ’‘ Penjelasan Varietas:**
* **Kecimen:** Umumnya ditanam di Turki, ukurannya sedikit lebih kecil dan bentuknya tidak terlalu memanjang.
* **Besni:** Juga dari Turki, namun memiliki ukuran Area dan Panjang Sumbu yang lebih besar dibanding Kecimen.
""")
# Hubungkan tombol
btn_predict.click(
fn=predict_raisin,
inputs=[area, perimeter, major_axis, minor_axis, eccentricity, convex_area, extent],
outputs=[out_kesimpulan, out_label]
)
if __name__ == "__main__":
demo.launch()