crack-api / app.py
thompson1234's picture
Update app.py
767dc7f verified
raw
history blame
1.91 kB
from fastapi import FastAPI, UploadFile, File
from fastapi.middleware.cors import CORSMiddleware
from ultralytics import YOLO
import numpy as np
from PIL import Image
import io
import uvicorn
app = FastAPI()
# CORS ์„ค์ •
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# ๋ชจ๋ธ ๋กœ๋“œ
print("๐Ÿ”ต Loading local crack model...")
model = YOLO("best.pt")
print("โœ… Crack Model Loaded Successfully")
# ===========================================
# 1. (์ถ”๊ฐ€๋จ) ๊ธฐ๋ณธ ๊ฒฝ๋กœ("/") ์ฒ˜๋ฆฌ - ๋ธŒ๋ผ์šฐ์ € ์ ‘์† ํ…Œ์ŠคํŠธ์šฉ
# ===========================================
@app.get("/")
def read_root():
return {"message": "ConcreteAI Crack Detection API is running!", "status": "OK"}
# ===========================================
# 2. ์˜ˆ์ธก API
# ===========================================
@app.post("/predict")
async def predict(img: UploadFile = File(...)):
try:
bytes_data = await img.read()
image = Image.open(io.BytesIO(bytes_data)).convert("RGB")
np_img = np.array(image)
results = model(np_img)
result = results[0]
# ๊ท ์—ด ๊ฐ์ง€ ๋กœ์ง
if result.boxes is None or len(result.boxes) == 0:
return {
"data": [
{"label": "normal", "confidence": 1.0}
]
}
conf = float(result.boxes.conf.max().item())
return {
"data": [
{
"label": "crack",
"confidence": conf
}
]
}
except Exception as e:
print("โŒ Prediction error:", e)
return {
"data": [{"label": "normal", "confidence": 1.0}],
"error": str(e)
}
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=7860)