import os os.environ['CUDA_VISIBLE_DEVICES'] = '-1' # Disable all GPUs os.environ['TF_ENABLE_ONEDNN_OPTS'] = '0' # Optional: disable oneDNN os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' os.environ["PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION"] = "python" import tensorflow as tf tf.config.set_visible_devices([], 'GPU') 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 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 # Import deskripsi dan lokasi from description import description from location import location # @register_keras_serializable(package="keras") # class DTypePolicy(Policy): # pass # from tensorflow.keras.saving import get_custom_objects # get_custom_objects()["DTypePolicy"] = DTypePolicy # 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'Lihat Lokasi di Google Maps' 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)