sains-data-uas / app.py
suyagi's picture
Update app.py
286a52d verified
from fastapi import FastAPI, UploadFile, File
from fastapi.middleware.cors import CORSMiddleware
import numpy as np
from PIL import Image
import tensorflow as tf
import joblib
import json
app = FastAPI()
# Enable CORS (important for Laravel)
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# Load class names
with open("class_indices.json", "r") as f:
CLASS_NAMES = list(json.load(f).keys())
# ===== LOAD MODELS =====
print("Loading models...")
model_resnet = tf.keras.models.load_model("model_resnet.keras")
model_cnn = tf.keras.models.load_model("model_cnn.keras")
model_efficient = tf.keras.models.load_model("model_efficientnet.keras")
svm_model = joblib.load("svm_model.pkl")
rf_model = joblib.load("random_forest.pkl")
print("All models loaded!")
# ===== IMAGE PREPROCESSING =====
def preprocess_image(img: Image.Image):
img = img.resize((224, 224))
arr = np.array(img).astype("float32") / 255.0
return np.expand_dims(arr, 0)
@app.post("/predict")
async def predict(file: UploadFile = File(...)):
img = Image.open(file.file).convert("RGB")
x = preprocess_image(img)
# Deep Learning Predictions
# pred_resnet = model_resnet.predict(x)
# pred_cnn = model_cnn.predict(x)
# pred_efficient = model_efficient.predict(x)
res_resnet = CLASS_NAMES[int(np.argmax(pred_resnet))]
res_cnn = CLASS_NAMES[int(np.argmax(pred_cnn))]
res_efficient = CLASS_NAMES[int(np.argmax(pred_efficient))]
# Machine Learning
# flat = x.reshape(1, -1) # flatten for ML models
# pred_svm = svm_model.predict(flat)[0]
# pred_rf = rf_model.predict(flat)[0]
return {
"resnet": {
"prediction": res_resnet,
"confidence": float(np.max(pred_resnet))
},
# "cnn": {
# "prediction": res_cnn,
# "confidence": float(np.max(pred_cnn))
# },
# "efficientnet": {
# "prediction": res_efficient,
# "confidence": float(np.max(pred_efficient))
# },
# "svm": str(pred_svm),
# "random_forest": str(pred_rf)
}