rafhiromadoni commited on
Commit
e201e3d
Β·
verified Β·
1 Parent(s): 66fca6c

Upload 3 files

Browse files
Files changed (3) hide show
  1. app.py +96 -0
  2. raisin_model.pkl +3 -0
  3. requirements.txt +3 -0
app.py ADDED
@@ -0,0 +1,96 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import pandas as pd
3
+ import joblib
4
+
5
+ # 1. LOAD MODEL
6
+ print("Memuat model Raisin Classification...")
7
+ model = joblib.load('raisin_model.pkl')
8
+
9
+ # 2. FUNGSI PREDIKSI
10
+ def predict_raisin(area, perimeter, major_axis, minor_axis, eccentricity, convex_area, extent):
11
+ try:
12
+ # 1. Susun input user menjadi Dictionary
13
+ # PENTING: Sesuaikan ejaan kunci (key) di bawah ini dengan nama kolom dataset di Colab Anda!
14
+ input_data = {
15
+ 'Area': [area],
16
+ 'Perimeter': [perimeter],
17
+ 'MajorAxisLength': [major_axis],
18
+ 'MinorAxisLength': [minor_axis],
19
+ 'Eccentricity': [eccentricity],
20
+ 'ConvexArea': [convex_area],
21
+ 'Extent': [extent]
22
+ }
23
+
24
+ # 2. Jadikan DataFrame
25
+ input_df = pd.DataFrame(input_data)
26
+
27
+ # 3. Trik Jitu: Urutkan kolom otomatis sesuai bawaan model saat di-training
28
+ if hasattr(model, 'feature_names_in_'):
29
+ input_df = input_df[model.feature_names_in_]
30
+
31
+ # 4. Lakukan prediksi probabilitas
32
+ prediction = model.predict(input_df)[0]
33
+ prob = model.predict_proba(input_df)[0]
34
+
35
+ # Format output probabilitas untuk Progress Bar Gradio
36
+ # Asumsi model.classes_ berisi ['Besni', 'Kecimen'] atau [0, 1]
37
+ kelas_0 = str(model.classes_[0])
38
+ kelas_1 = str(model.classes_[1])
39
+
40
+ # Ganti label angka dengan teks jika model menggunakan Label Encoder (0 dan 1)
41
+ if kelas_0 == '0': kelas_0 = 'Kecimen' # Sesuaikan dengan mapping Anda
42
+ if kelas_1 == '1': kelas_1 = 'Besni'
43
+
44
+ confidences = {kelas_0: prob[0], kelas_1: prob[1]}
45
+
46
+ # Tentukan hasil akhir
47
+ top_kelas = max(confidences, key=confidences.get)
48
+
49
+ return f"### πŸ‡ Varietas Terdeteksi: **{top_kelas}**", confidences
50
+
51
+ except Exception as e:
52
+ return f"⚠️ Terjadi error: Pastikan nama kolom di app.py sama dengan dataset Anda. Log: {str(e)}", {}
53
+
54
+ # 3. ANTARMUKA GRADIO
55
+ with gr.Blocks(theme=gr.themes.Soft()) as demo:
56
+ gr.Markdown("""
57
+ <h1 style='text-align: center;'>πŸ‡ AI Raisin Variant Classifier</h1>
58
+ <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>
59
+ """)
60
+
61
+ with gr.Row():
62
+ with gr.Column(scale=1):
63
+ gr.Markdown("**πŸ“ Fitur Ukuran & Dimensi**")
64
+ area = gr.Number(value=75500, label="Luas Area (Area)")
65
+ perimeter = gr.Number(value=1050, label="Keliling (Perimeter)")
66
+ convex_area = gr.Number(value=77000, label="Luas Cembung (ConvexArea)")
67
+
68
+ gr.Markdown("**πŸ“ Fitur Sumbu & Bentuk**")
69
+ major_axis = gr.Number(value=430, label="Panjang Sumbu Utama (MajorAxisLength)")
70
+ minor_axis = gr.Number(value=220, label="Panjang Sumbu Minor (MinorAxisLength)")
71
+ eccentricity = gr.Slider(minimum=0.0, maximum=1.0, value=0.85, step=0.01, label="Tingkat Kelonjongan (Eccentricity)")
72
+ extent = gr.Slider(minimum=0.0, maximum=1.0, value=0.70, step=0.01, label="Kepadatan Rasio (Extent)")
73
+
74
+ btn_predict = gr.Button("πŸ” Identifikasi Varietas", variant="primary")
75
+
76
+ with gr.Column(scale=1):
77
+ gr.Markdown("**πŸ“Š Hasil Deteksi AI**")
78
+ out_kesimpulan = gr.Markdown()
79
+ out_label = gr.Label(label="Tingkat Keyakinan (Confidence Score)")
80
+
81
+ gr.Markdown("""
82
+ ---
83
+ **πŸ’‘ Penjelasan Varietas:**
84
+ * **Kecimen:** Umumnya ditanam di Turki, ukurannya sedikit lebih kecil dan bentuknya tidak terlalu memanjang.
85
+ * **Besni:** Juga dari Turki, namun memiliki ukuran Area dan Panjang Sumbu yang lebih besar dibanding Kecimen.
86
+ """)
87
+
88
+ # Hubungkan tombol
89
+ btn_predict.click(
90
+ fn=predict_raisin,
91
+ inputs=[area, perimeter, major_axis, minor_axis, eccentricity, convex_area, extent],
92
+ outputs=[out_kesimpulan, out_label]
93
+ )
94
+
95
+ if __name__ == "__main__":
96
+ demo.launch()
raisin_model.pkl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:ae54f207c06856f1a15c66abad23623c7403b207dcff62517101c53cf25c8755
3
+ size 3276345
requirements.txt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ pandas
2
+ scikit-learn
3
+ joblib