import os os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' import keras import gradio as gr import numpy as np from keras.preprocessing import image from fastapi import FastAPI, File, UploadFile from fastapi.responses import JSONResponse from io import BytesIO from PIL import Image import tensorflow as tf import logging from fastapi.middleware.cors import CORSMiddleware from tensorflow.keras.models import load_model # 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 memuat model dari file .h5 langsung def load_model_from_file(h5_path): return load_model(h5_path) # Load model model = load_model_from_file("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): 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'Lihat Lokasi di Google Maps' 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 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 # Run server jika dijalankan langsung if _name_ == "_main_": import uvicorn app = create_app() uvicorn.run(app, host="127.0.0.1", port=8000)