Spaces:
Sleeping
Sleeping
| 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() |