omanaaja commited on
Commit
ffc3e67
·
1 Parent(s): d421148

melakukan perubahan pada app.py menyesuaikan library dan menginstal ulang requirements.txt

Browse files
Files changed (2) hide show
  1. app.py +86 -62
  2. requirements.txt +7 -9
app.py CHANGED
@@ -1,35 +1,51 @@
1
  import os
2
  os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
3
- import keras
4
  import gradio as gr
5
  import numpy as np
6
- from keras.preprocessing import image
7
  from fastapi import FastAPI, File, UploadFile
8
  from fastapi.responses import JSONResponse
 
9
  from io import BytesIO
10
  from PIL import Image
11
  import tensorflow as tf
12
  import logging
13
- from fastapi.middleware.cors import CORSMiddleware
14
- from tensorflow.keras.models import load_model
 
 
 
 
 
 
 
 
 
 
15
 
16
  # Import deskripsi dan lokasi
17
  from description import description
18
  from location import location
19
 
20
  # Nonaktifkan GPU (jika tidak digunakan)
21
- tf.config.set_visible_devices([], 'GPU')
22
 
23
  # Inisialisasi logger
24
- logging.basicConfig(level=logging.INFO)
25
- logger = logging.getLogger(__name__)
26
 
27
- # Fungsi memuat model dari file .h5 langsung
28
- def load_model_from_file(h5_path):
29
- return load_model(h5_path)
 
 
 
 
 
 
 
30
 
31
- # Load model
32
- model = load_model_from_file("my_model.h5")
33
 
34
  # Daftar label
35
  labels = [
@@ -40,71 +56,77 @@ labels = [
40
 
41
  # Fungsi klasifikasi
42
  def classify_image(img):
43
- img = img.resize((224, 224))
44
- img_array = image.img_to_array(img)
45
- img_array = np.expand_dims(img_array, axis=0)
46
- img_array = img_array / 255.0
47
-
48
- pred = model.predict(img_array)[0]
49
- confidence = np.max(pred)
50
- predicted_label = labels[np.argmax(pred)]
51
-
52
- akurasi = float(confidence)
53
- if confidence < 0.8:
54
- label_output = "Tidak dapat dikenali (Confidence: {:.2f}%)".format(confidence * 100)
55
- deskripsi = (
56
- "Tolong arahkan ke objek yang jelas agar bisa diidentifikasikan. "
57
- "Pastikan anda berada di salah satu tempat seperti:\n"
58
- "- Benteng Vredeburg\n- Candi Borobudur\n- Candi Prambanan\n"
59
- "- Gedung Agung Istana Kepresidenan Yogyakarta\n- Masjid Gedhe Kauman\n"
60
- "- Monumen Serangan 1 Maret\n- Museum Gunungapi Merapi\n- Situs Ratu Boko\n"
61
- "- Taman Sari\n- Tugu Yogyakarta"
62
- )
63
- lokasi = "-"
64
- else:
65
- label_output = f"{predicted_label} (Confidence: {confidence * 100:.2f}%)"
66
- deskripsi = description.get(predicted_label, "Deskripsi belum tersedia.")
67
- lokasi = location.get(predicted_label, None)
68
- if lokasi:
69
- lokasi = f'<a href="{lokasi}" target="_blank">Lihat Lokasi di Google Maps</a>'
70
  else:
71
- lokasi = "Lokasi tidak ditemukan"
 
 
 
 
 
 
 
 
72
 
73
- return label_output, deskripsi, lokasi, akurasi
 
74
 
75
  # Fungsi untuk membuat FastAPI app
76
  def create_app():
77
  app = FastAPI()
78
-
79
  app.add_middleware(
80
- CORSMiddleware,
81
- allow_origins=["http://localhost:9000"], # atau sesuaikan
82
- allow_credentials=True,
83
- allow_methods=["*"],
84
- allow_headers=["*"],
85
- )
86
-
87
- @app.post("/api/predict")
88
- async def predict(file: UploadFile = File(...)):
89
- contents = await file.read()
90
- img = Image.open(BytesIO(contents)).convert("RGB")
91
- label_output, deskripsi, lokasi, akurasi = classify_image(img)
92
- return JSONResponse(content={
93
- "label_output": label_output,
94
- "deskripsi": deskripsi,
95
- "lokasi": lokasi,
96
- "confidence": akurasi
97
- })
 
 
98
 
99
  gradio_app = gr.Interface(
100
  fn=classify_image,
101
  inputs=gr.Image(type="pil", label="Upload Gambar"),
 
102
  outputs=[
103
  gr.Textbox(label="Output Klasifikasi"),
104
  gr.Textbox(label="Deskripsi Lengkap", lines=20, max_lines=50),
105
  gr.HTML(label="Link Lokasi"),
106
  ],
107
- flagging_mode="never",
108
  title="Klasifikasi Gambar",
109
  description="Upload gambar, sistem akan mengklasifikasikan dan memberikan deskripsi mengenai gambar tersebut."
110
  )
@@ -112,8 +134,10 @@ def create_app():
112
  app = gr.mount_gradio_app(app, gradio_app, path="/gradio")
113
  return app
114
 
 
 
115
  # Run server jika dijalankan langsung
116
  if __name__ == "__main__":
117
  import uvicorn
118
- app = create_app()
119
  uvicorn.run(app, host="127.0.0.1", port=8000)
 
1
  import os
2
  os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
3
+
4
  import gradio as gr
5
  import numpy as np
6
+ from tensorflow.keras.preprocessing import image
7
  from fastapi import FastAPI, File, UploadFile
8
  from fastapi.responses import JSONResponse
9
+ from fastapi.middleware.cors import CORSMiddleware
10
  from io import BytesIO
11
  from PIL import Image
12
  import tensorflow as tf
13
  import logging
14
+
15
+ from tensorflow.keras.models import load_model, model_from_json
16
+ from tensorflow.keras import mixed_precision
17
+ from tensorflow.keras.saving import get_custom_objects, register_keras_serializable
18
+ from tensorflow.keras.mixed_precision import Policy
19
+
20
+ # @register_keras_serializable(package="keras")
21
+ # class DTypePolicy(Policy):
22
+ # pass
23
+
24
+ # from tensorflow.keras.saving import get_custom_objects
25
+ # get_custom_objects()["DTypePolicy"] = DTypePolicy
26
 
27
  # Import deskripsi dan lokasi
28
  from description import description
29
  from location import location
30
 
31
  # Nonaktifkan GPU (jika tidak digunakan)
32
+ # tf.config.set_visible_devices([], 'GPU')
33
 
34
  # Inisialisasi logger
35
+ # logging.basicConfig(level=logging.INFO)
36
+ # logger = logging.getLogger(__name__)
37
 
38
+ # ========== Fungsi Load Model dari File JSON + H5 ==========
39
+ def load_model_from_file(json_path, h5_path):
40
+ with open(json_path, "r") as f:
41
+ json_config = f.read()
42
+ model = model_from_json(json_config)
43
+ model.load_weights(h5_path)
44
+ return model
45
+
46
+ # ========== Load Model ==========
47
+ model = load_model_from_file("model.json", "my_model.h5")
48
 
 
 
49
 
50
  # Daftar label
51
  labels = [
 
56
 
57
  # Fungsi klasifikasi
58
  def classify_image(img):
59
+ try:
60
+ img = img.resize((224, 224))
61
+ img_array = image.img_to_array(img)
62
+ img_array = np.expand_dims(img_array, axis=0)
63
+ img_array = img_array / 255.0
64
+
65
+ pred = model.predict(img_array)[0]
66
+ confidence = np.max(pred)
67
+ predicted_label = labels[np.argmax(pred)]
68
+
69
+ akurasi = float(confidence)
70
+ if confidence < 0.8:
71
+ label_output = "Tidak dapat dikenali (Confidence: {:.2f}%)".format(confidence * 100)
72
+ deskripsi = (
73
+ "Tolong arahkan ke objek yang jelas agar bisa diidentifikasikan. "
74
+ "Pastikan anda berada di salah satu tempat seperti:\n"
75
+ "- Benteng Vredeburg\n- Candi Borobudur\n- Candi Prambanan\n"
76
+ "- Gedung Agung Istana Kepresidenan Yogyakarta\n- Masjid Gedhe Kauman\n"
77
+ "- Monumen Serangan 1 Maret\n- Museum Gunungapi Merapi\n- Situs Ratu Boko\n"
78
+ "- Taman Sari\n- Tugu Yogyakarta"
79
+ )
80
+ lokasi = "-"
 
 
 
 
 
81
  else:
82
+ label_output = f"{predicted_label} (Confidence: {confidence * 100:.2f}%)"
83
+ deskripsi = description.get(predicted_label, "Deskripsi belum tersedia.")
84
+ lokasi = location.get(predicted_label, None)
85
+ if lokasi:
86
+ lokasi = f'<a href="{lokasi}" target="_blank">Lihat Lokasi di Google Maps</a>'
87
+ else:
88
+ lokasi = "Lokasi tidak ditemukan"
89
+
90
+ return label_output, deskripsi, lokasi, akurasi
91
 
92
+ except Exception as e:
93
+ return "Error", str(e), "-"
94
 
95
  # Fungsi untuk membuat FastAPI app
96
  def create_app():
97
  app = FastAPI()
 
98
  app.add_middleware(
99
+ CORSMiddleware,
100
+ allow_origins=["*"], # atau daftar domain yang sah
101
+ allow_credentials=True,
102
+ allow_methods=["*"],
103
+ allow_headers=["*"],
104
+ )
105
+
106
+
107
+
108
+ # @app.post("/api/predict")
109
+ # async def predict(file: UploadFile = File(...)):
110
+ # contents = await file.read()
111
+ # img = Image.open(BytesIO(contents)).convert("RGB")
112
+ # label_output, deskripsi, lokasi, akurasi = classify_image(img)
113
+ # return JSONResponse(content={
114
+ # "label_output": label_output,
115
+ # "deskripsi": deskripsi,
116
+ # "lokasi": lokasi,
117
+ # "confidence": akurasi
118
+ # })
119
 
120
  gradio_app = gr.Interface(
121
  fn=classify_image,
122
  inputs=gr.Image(type="pil", label="Upload Gambar"),
123
+ # outputs=["text", "text", "html"],
124
  outputs=[
125
  gr.Textbox(label="Output Klasifikasi"),
126
  gr.Textbox(label="Deskripsi Lengkap", lines=20, max_lines=50),
127
  gr.HTML(label="Link Lokasi"),
128
  ],
129
+ # flagging_mode="never",
130
  title="Klasifikasi Gambar",
131
  description="Upload gambar, sistem akan mengklasifikasikan dan memberikan deskripsi mengenai gambar tersebut."
132
  )
 
134
  app = gr.mount_gradio_app(app, gradio_app, path="/gradio")
135
  return app
136
 
137
+ app = create_app()
138
+
139
  # Run server jika dijalankan langsung
140
  if __name__ == "__main__":
141
  import uvicorn
142
+ # app = create_app()
143
  uvicorn.run(app, host="127.0.0.1", port=8000)
requirements.txt CHANGED
@@ -1,10 +1,8 @@
1
- tensorflow==2.10.0
2
- gradio==4.25.0
3
- fastapi==0.110.0
 
 
 
 
4
  uvicorn==0.29.0
5
- python-multipart==0.0.9
6
- pillow==10.3.0
7
- numpy==1.24.3 # Gantilah versi ini
8
- python-dotenv==1.0.1
9
- torch
10
- keras==2.10.0
 
1
+ tensorflow==2.19.0
2
+ numpy==1.26.4
3
+ pillow==9.5.0
4
+ protobuf==3.20.3
5
+ grpcio==1.54.0
6
+ gradio==5.33.2
7
+ fastapi==0.115.12
8
  uvicorn==0.29.0