Spaces:
Sleeping
Sleeping
File size: 1,773 Bytes
70b44e7 | 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 | import os
import io
import numpy as np
from PIL import Image
from fastapi import FastAPI, File, UploadFile
from fastapi.middleware.cors import CORSMiddleware
from fastapi.staticfiles import StaticFiles
from fastapi.responses import HTMLResponse
import tensorflow as tf
app = FastAPI()
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_methods=["*"],
allow_headers=["*"],
)
MODEL_PATH = "model/model.keras"
model = tf.keras.models.load_model(MODEL_PATH)
class_names = ['glioma', 'meningioma', 'notumor', 'pituitary']
from fastapi.concurrency import run_in_threadpool
def preprocess_image(image_bytes):
img = Image.open(io.BytesIO(image_bytes)).convert('RGB')
img = img.resize((224, 224))
img_array = np.array(img).astype('float32') / 255.0
img_array = np.expand_dims(img_array, axis=0)
return img_array
async def get_prediction(processed_img):
return await run_in_threadpool(model.predict, processed_img)
@app.post("/predict")
async def predict(file: UploadFile = File(...)):
contents = await file.read()
processed_img = preprocess_image(contents)
predictions = await get_prediction(processed_img)
pred_idx = np.argmax(predictions[0])
confidence = float(np.max(predictions[0]))
return {
"class": class_names[pred_idx],
"confidence": confidence,
"probabilities": {class_names[i]: float(predictions[0][i]) for i in range(len(class_names))}
}
@app.get("/")
async def read_index():
with open("template/index.html", "r") as f:
return HTMLResponse(content=f.read(), status_code=200)
app.mount("/static", StaticFiles(directory="template"), name="static")
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=7860)
|