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("""
Sistem Quality Control otomatis berbasis Random Forest untuk mendeteksi varietas kismis (Kecimen vs Besni) berdasarkan pengukuran dimensi fisik.
""") 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()