File size: 4,857 Bytes
e2e9399
c779da4
ffc3e67
5575a7a
 
ffc3e67
9ac1af2
 
ffc3e67
9ac1af2
 
aadbe2e
7884fb5
ffc3e67
 
 
 
 
 
 
 
 
 
 
 
5575a7a
0d4967c
 
 
c779da4
 
ffc3e67
e2e9399
7715d03
ffc3e67
 
0d4967c
ffc3e67
 
 
 
 
 
 
 
 
 
7715d03
aadbe2e
0d4967c
5575a7a
 
 
 
 
 
0d4967c
5575a7a
ffc3e67
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9ac1af2
ffc3e67
 
 
 
 
 
 
 
 
5575a7a
ffc3e67
 
5575a7a
c779da4
 
 
 
ffc3e67
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c779da4
 
 
 
ffc3e67
c779da4
 
 
 
 
ffc3e67
c779da4
 
 
 
 
 
 
ffc3e67
 
0d4967c
d421148
c779da4
ffc3e67
0d4967c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'

import gradio as gr
import numpy as np
from tensorflow.keras.preprocessing import image
from fastapi import FastAPI, File, UploadFile
from fastapi.responses import JSONResponse
from fastapi.middleware.cors import CORSMiddleware
from io import BytesIO
from PIL import Image
import tensorflow as tf
import logging

from tensorflow.keras.models import load_model, model_from_json
from tensorflow.keras import mixed_precision
from tensorflow.keras.saving import get_custom_objects, register_keras_serializable
from tensorflow.keras.mixed_precision import Policy

# @register_keras_serializable(package="keras")
# class DTypePolicy(Policy):
#     pass

# from tensorflow.keras.saving import get_custom_objects
# get_custom_objects()["DTypePolicy"] = DTypePolicy

# Import deskripsi dan lokasi
from description import description
from location import location

# Nonaktifkan GPU (jika tidak digunakan)
# tf.config.set_visible_devices([], 'GPU')

# Inisialisasi logger
# logging.basicConfig(level=logging.INFO)
# logger = logging.getLogger(__name__)

# ========== Fungsi Load Model dari File JSON + H5 ==========
def load_model_from_file(json_path, h5_path):
    with open(json_path, "r") as f:
        json_config = f.read()
        model = model_from_json(json_config)
    model.load_weights(h5_path)
    return model

# ========== Load Model ==========
model = load_model_from_file("model.json", "my_model.h5")


# Daftar label
labels = [
    "Benteng Vredeburg", "Candi Borobudur", "Candi Prambanan", "Gedung Agung Istana Kepresidenan",
    "Masjid Gedhe Kauman", "Monumen Serangan 1 Maret", "Museum Gunungapi Merapi",
    "Situs Ratu Boko", "Taman Sari", "Tugu Yogyakarta"
]

# Fungsi klasifikasi
def classify_image(img):
    try:
        img = img.resize((224, 224))
        img_array = image.img_to_array(img)
        img_array = np.expand_dims(img_array, axis=0)
        img_array = img_array / 255.0

        pred = model.predict(img_array)[0]
        confidence = np.max(pred)
        predicted_label = labels[np.argmax(pred)]

        akurasi = float(confidence)
        if confidence < 0.8:
            label_output = "Tidak dapat dikenali (Confidence: {:.2f}%)".format(confidence * 100)
            deskripsi = (
                "Tolong arahkan ke objek yang jelas agar bisa diidentifikasikan. "
                "Pastikan anda berada di salah satu tempat seperti:\n"
                "- Benteng Vredeburg\n- Candi Borobudur\n- Candi Prambanan\n"
                "- Gedung Agung Istana Kepresidenan Yogyakarta\n- Masjid Gedhe Kauman\n"
                "- Monumen Serangan 1 Maret\n- Museum Gunungapi Merapi\n- Situs Ratu Boko\n"
                "- Taman Sari\n- Tugu Yogyakarta"
            )
            lokasi = "-"
        else:
            label_output = f"{predicted_label} (Confidence: {confidence * 100:.2f}%)"
            deskripsi = description.get(predicted_label, "Deskripsi belum tersedia.")
            lokasi = location.get(predicted_label, None)
            if lokasi:
                lokasi = f'<a href="{lokasi}" target="_blank">Lihat Lokasi di Google Maps</a>'
            else:
                lokasi = "Lokasi tidak ditemukan"

        return label_output, deskripsi, lokasi, akurasi

    except Exception as e:
        return "Error", str(e), "-"

# Fungsi untuk membuat FastAPI app
def create_app():
    app = FastAPI()
    app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],  # atau daftar domain yang sah
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)



    # @app.post("/api/predict")
    # async def predict(file: UploadFile = File(...)):
    #     contents = await file.read()
    #     img = Image.open(BytesIO(contents)).convert("RGB")
    #     label_output, deskripsi, lokasi, akurasi = classify_image(img)
    #     return JSONResponse(content={
    #         "label_output": label_output,
    #         "deskripsi": deskripsi,
    #         "lokasi": lokasi,
    #         "confidence": akurasi
    #     })

    gradio_app = gr.Interface(
        fn=classify_image,
        inputs=gr.Image(type="pil", label="Upload Gambar"),
        # outputs=["text", "text", "html"],
        outputs=[
            gr.Textbox(label="Output Klasifikasi"),
            gr.Textbox(label="Deskripsi Lengkap", lines=20, max_lines=50),
            gr.HTML(label="Link Lokasi"),
        ],
        # flagging_mode="never",
        title="Klasifikasi Gambar",
        description="Upload gambar, sistem akan mengklasifikasikan dan memberikan deskripsi mengenai gambar tersebut."
    )

    app = gr.mount_gradio_app(app, gradio_app, path="/gradio")
    return app

app = create_app()

# Run server jika dijalankan langsung
if __name__ == "__main__":
    import uvicorn
    # app = create_app()
    uvicorn.run(app, host="127.0.0.1", port=8000)