Ferdinann commited on
Commit
96980ce
Β·
verified Β·
1 Parent(s): 2eb956c

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +122 -124
app.py CHANGED
@@ -1,125 +1,123 @@
1
- import gradio as gr
2
- import tensorflow as tf
3
- import pandas as pd
4
- import numpy as np
5
- from datetime import datetime
6
- from PIL import Image
7
-
8
- # --- 1. Konfigurasi & Load Model ---
9
- # Sesuaikan nama file model dengan yang ada di screenshot Anda
10
- MODEL_PATH = "best_model"
11
- class_names = ['layak', 'rusak']
12
- history_data = []
13
-
14
- try:
15
- best_model = tf.keras.models.load_model(MODEL_PATH)
16
- print("βœ… Model berhasil dimuat.")
17
- except Exception as e:
18
- print(f"❌ Gagal memuat model: {e}")
19
- # Dummy model untuk mencegah crash saat build jika file belum ada
20
- best_model = None
21
-
22
- # --- 2. Fungsi Helper ---
23
- def get_detailed_info(label, confidence):
24
- if label == 'layak':
25
- if confidence > 0.85:
26
- return "### βœ… STATUS: SANGAT LAYAK\n**Analisis:** Bangunan dalam kondisi prima. Struktur utama terlihat utuh dan sangat aman untuk dihuni."
27
- return "### ⚠️ STATUS: LAYAK (DENGAN CATATAN)\n**Analisis:** Bangunan aman dihuni, namun ditemukan indikasi kerusakan minor. Disarankan pengecekan rutin pada area retakan."
28
- else:
29
- if confidence > 0.85:
30
- return "### 🚨 STATUS: RUSAK PARAH\n**Analisis:** BAHAYA! Ditemukan kerusakan struktur fatal. Segera kosongkan area dan hubungi pihak berwenang."
31
- return "### 🚧 STATUS: RUSAK RINGAN\n**Analisis:** Terdeteksi kerusakan fisik pada beberapa bagian. Perlu perbaikan teknis sebelum bangunan dinyatakan aman sepenuhnya."
32
-
33
- def predict_image(img):
34
- if best_model is None:
35
- return {}, "Model belum dimuat."
36
-
37
- # Preprocessing
38
- img = img.resize((224, 224))
39
- img_array = tf.keras.preprocessing.image.img_to_array(img)
40
- img_array = tf.expand_dims(img_array, 0) / 255.0
41
-
42
- # Prediksi
43
- predictions = best_model.predict(img_array)[0]
44
- result = {class_names[i]: float(predictions[i]) for i in range(len(class_names))}
45
-
46
- top_label = max(result, key=result.get)
47
- description = get_detailed_info(top_label, result[top_label])
48
- return result, description
49
-
50
- # --- 3. Fungsi Logic Dashboard ---
51
- def handle_upload(img):
52
- if img is None: return {}, "_Menunggu foto bangunan..._"
53
- return predict_image(img)
54
-
55
- def handle_report(img, location):
56
- if img is None:
57
- return {}, pd.DataFrame(history_data, columns=["Waktu", "Status", "Lokasi"]), None, "❌ Gagal: Foto kosong."
58
-
59
- output_dict, desc = predict_image(img)
60
- status = max(output_dict, key=output_dict.get).upper()
61
- now = datetime.now().strftime("%H:%M | %d-%m-%Y")
62
-
63
- history_data.insert(0, [now, status, location if location else "Pusat Kota"])
64
- df = pd.DataFrame(history_data, columns=["Waktu", "Status", "Lokasi"])
65
-
66
- return output_dict, df, None, "βœ… Laporan berhasil disimpan ke riwayat!"
67
-
68
- # --- 4. UI Layout HomeCheck ---
69
- with gr.Blocks(title="HomeCheck AI") as demo:
70
- # Header Area
71
- with gr.Row():
72
- with gr.Column(scale=8):
73
- gr.Markdown("# 🏠 HomeCheck AI")
74
- gr.Markdown("### *Sistem Deteksi Kelayakan Bangunan Cerdas*")
75
- with gr.Column(scale=2):
76
- gr.Markdown("![Logo](https://img.icons8.com/fluency/96/home.png)")
77
-
78
- gr.Markdown("---")
79
-
80
- with gr.Tabs():
81
- with gr.TabItem("πŸ” Analisis Baru"):
82
- with gr.Row():
83
- # Kolom Kiri: Input
84
- with gr.Column(variant="panel"):
85
- gr.Markdown("#### πŸ“₯ Input Data")
86
- input_img = gr.Image(sources=["upload", "webcam"], type="pil", label="Foto Bangunan")
87
- input_loc = gr.Textbox(
88
- label="Titik Lokasi",
89
- placeholder="Contoh: Perumahan Indah Blok A, Medan",
90
- lines=1
91
- )
92
- btn_report = gr.Button("πŸš€ SIMPAN LAPORAN", variant="primary")
93
-
94
- # Kolom Kanan: Hasil
95
- with gr.Column():
96
- gr.Markdown("#### πŸ“Š Hasil Diagnosa")
97
- output_label = gr.Label(num_top_classes=2, label="Probabilitas Akurasi")
98
-
99
- with gr.Group():
100
- output_description = gr.Markdown(
101
- "**Instruksi:**\nSilakan ambil atau upload foto bagian bangunan yang ingin diperiksa.",
102
- )
103
-
104
- with gr.TabItem("πŸ“œ Riwayat Pemeriksaan"):
105
- gr.Markdown("#### πŸ“‘ Log Laporan Tersimpan")
106
- output_history = gr.Dataframe(
107
- headers=["Waktu", "Status", "Lokasi"],
108
- datatype=["str", "str", "str"],
109
- interactive=False
110
- )
111
-
112
- gr.Markdown("---")
113
- gr.Markdown("Β© 2026 HomeCheck AI")
114
-
115
- # --- Interaction Logic ---
116
- input_img.change(fn=handle_upload, inputs=input_img, outputs=[output_label, output_description])
117
-
118
- btn_report.click(
119
- fn=handle_report,
120
- inputs=[input_img, input_loc],
121
- outputs=[output_label, output_history, input_img, output_description]
122
- )
123
-
124
- if __name__ == "__main__":
125
  demo.launch(server_name="0.0.0.0", server_port=7860)
 
1
+ import gradio as gr
2
+ import tensorflow as tf
3
+ import pandas as pd
4
+ import numpy as np
5
+ from datetime import datetime
6
+ from PIL import Image
7
+
8
+ MODEL_PATH = "best_model.h5"
9
+ class_names = ['layak', 'rusak']
10
+ history_data = []
11
+
12
+ try:
13
+ best_model = tf.keras.models.load_model(MODEL_PATH)
14
+ print("βœ… Model berhasil dimuat.")
15
+ except Exception as e:
16
+ print(f"❌ Gagal memuat model: {e}")
17
+ # Dummy model untuk mencegah crash saat build jika file belum ada
18
+ best_model = None
19
+
20
+ # --- 2. Fungsi Helper ---
21
+ def get_detailed_info(label, confidence):
22
+ if label == 'layak':
23
+ if confidence > 0.85:
24
+ return "### βœ… STATUS: SANGAT LAYAK\n**Analisis:** Bangunan dalam kondisi prima. Struktur utama terlihat utuh dan sangat aman untuk dihuni."
25
+ return "### ⚠️ STATUS: LAYAK (DENGAN CATATAN)\n**Analisis:** Bangunan aman dihuni, namun ditemukan indikasi kerusakan minor. Disarankan pengecekan rutin pada area retakan."
26
+ else:
27
+ if confidence > 0.85:
28
+ return "### 🚨 STATUS: RUSAK PARAH\n**Analisis:** BAHAYA! Ditemukan kerusakan struktur fatal. Segera kosongkan area dan hubungi pihak berwenang."
29
+ return "### 🚧 STATUS: RUSAK RINGAN\n**Analisis:** Terdeteksi kerusakan fisik pada beberapa bagian. Perlu perbaikan teknis sebelum bangunan dinyatakan aman sepenuhnya."
30
+
31
+ def predict_image(img):
32
+ if best_model is None:
33
+ return {}, "Model belum dimuat."
34
+
35
+ # Preprocessing
36
+ img = img.resize((224, 224))
37
+ img_array = tf.keras.preprocessing.image.img_to_array(img)
38
+ img_array = tf.expand_dims(img_array, 0) / 255.0
39
+
40
+ # Prediksi
41
+ predictions = best_model.predict(img_array)[0]
42
+ result = {class_names[i]: float(predictions[i]) for i in range(len(class_names))}
43
+
44
+ top_label = max(result, key=result.get)
45
+ description = get_detailed_info(top_label, result[top_label])
46
+ return result, description
47
+
48
+ # --- 3. Fungsi Logic Dashboard ---
49
+ def handle_upload(img):
50
+ if img is None: return {}, "_Menunggu foto bangunan..._"
51
+ return predict_image(img)
52
+
53
+ def handle_report(img, location):
54
+ if img is None:
55
+ return {}, pd.DataFrame(history_data, columns=["Waktu", "Status", "Lokasi"]), None, "❌ Gagal: Foto kosong."
56
+
57
+ output_dict, desc = predict_image(img)
58
+ status = max(output_dict, key=output_dict.get).upper()
59
+ now = datetime.now().strftime("%H:%M | %d-%m-%Y")
60
+
61
+ history_data.insert(0, [now, status, location if location else "Pusat Kota"])
62
+ df = pd.DataFrame(history_data, columns=["Waktu", "Status", "Lokasi"])
63
+
64
+ return output_dict, df, None, "βœ… Laporan berhasil disimpan ke riwayat!"
65
+
66
+ # --- 4. UI Layout HomeCheck ---
67
+ with gr.Blocks(title="HomeCheck AI") as demo:
68
+ # Header Area
69
+ with gr.Row():
70
+ with gr.Column(scale=8):
71
+ gr.Markdown("# 🏠 HomeCheck AI")
72
+ gr.Markdown("### *Sistem Deteksi Kelayakan Bangunan Cerdas*")
73
+ with gr.Column(scale=2):
74
+ gr.Markdown("![Logo](https://img.icons8.com/fluency/96/home.png)")
75
+
76
+ gr.Markdown("---")
77
+
78
+ with gr.Tabs():
79
+ with gr.TabItem("πŸ” Analisis Baru"):
80
+ with gr.Row():
81
+ # Kolom Kiri: Input
82
+ with gr.Column(variant="panel"):
83
+ gr.Markdown("#### πŸ“₯ Input Data")
84
+ input_img = gr.Image(sources=["upload", "webcam"], type="pil", label="Foto Bangunan")
85
+ input_loc = gr.Textbox(
86
+ label="Titik Lokasi",
87
+ placeholder="Contoh: Perumahan Indah Blok A, Medan",
88
+ lines=1
89
+ )
90
+ btn_report = gr.Button("πŸš€ SIMPAN LAPORAN", variant="primary")
91
+
92
+ # Kolom Kanan: Hasil
93
+ with gr.Column():
94
+ gr.Markdown("#### πŸ“Š Hasil Diagnosa")
95
+ output_label = gr.Label(num_top_classes=2, label="Probabilitas Akurasi")
96
+
97
+ with gr.Group():
98
+ output_description = gr.Markdown(
99
+ "**Instruksi:**\nSilakan ambil atau upload foto bagian bangunan yang ingin diperiksa.",
100
+ )
101
+
102
+ with gr.TabItem("πŸ“œ Riwayat Pemeriksaan"):
103
+ gr.Markdown("#### πŸ“‘ Log Laporan Tersimpan")
104
+ output_history = gr.Dataframe(
105
+ headers=["Waktu", "Status", "Lokasi"],
106
+ datatype=["str", "str", "str"],
107
+ interactive=False
108
+ )
109
+
110
+ gr.Markdown("---")
111
+ gr.Markdown("Β© 2026 HomeCheck AI")
112
+
113
+ # --- Interaction Logic ---
114
+ input_img.change(fn=handle_upload, inputs=input_img, outputs=[output_label, output_description])
115
+
116
+ btn_report.click(
117
+ fn=handle_report,
118
+ inputs=[input_img, input_loc],
119
+ outputs=[output_label, output_history, input_img, output_description]
120
+ )
121
+
122
+ if __name__ == "__main__":
 
 
123
  demo.launch(server_name="0.0.0.0", server_port=7860)