File size: 4,310 Bytes
e2e9399
c779da4
 
 
5575a7a
 
 
 
 
9ac1af2
 
 
 
 
c779da4
aadbe2e
7884fb5
c779da4
 
5575a7a
c779da4
 
 
 
 
 
 
 
 
e2e9399
7715d03
 
 
 
e2e9399
5575a7a
aadbe2e
5575a7a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9ac1af2
 
 
 
 
 
 
 
 
 
 
 
5575a7a
 
9ac1af2
 
 
 
 
 
5575a7a
9ac1af2
5575a7a
c779da4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5575a7a
c779da4
 
 
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
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
import keras
print("keras versio:", keras.__version__)
import gradio as gr
import numpy as np
from keras.preprocessing import image
from Model_Load import load_model_from_files
from description import description
from location import location
from fastapi import FastAPI, File, UploadFile
from fastapi.responses import JSONResponse
from io import BytesIO
from PIL import Image
from tensorflow.keras.models import model_from_json
import tensorflow as tf
import logging
from fastapi.middleware.cors import CORSMiddleware
from keras.models import model_from_json

def load_model_from_files(json_path, weights_path):
    with open(json_path, "r") as json_file:
        loaded_model_json = json_file.read()
    model = model_from_json(loaded_model_json) 
    model.load_weights(weights_path)
    return model

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

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

# Load model dan label
model = load_model_from_files("model.json", "my_model.h5")

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 preprocessing dan prediksi
def classify_image(img):
    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

# Fungsi untuk membuat FastAPI app
def create_app():
    app = FastAPI()

    app.add_middleware(
        CORSMiddleware,
        allow_origins=["http://localhost:9000"],  # atau sesuaikan dengan asal frontend
        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=[
            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

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