Spaces:
Running
Running
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) |