wjm55
Refactor model loading in app.py to create a models directory and update local model path. Modify test.py to change default model ID and use a variable for the local app URL.
fae55a0
raw
history blame
1.96 kB
from fastapi import FastAPI, UploadFile
from ultralytics import YOLO
import io
from PIL import Image
import numpy as np
import os
from huggingface_hub import hf_hub_download
from ultralytics import YOLO
import requests
import supervision as sv
def init_model(model_id: str):
# Define models
MODEL_OPTIONS = {
"YOLOv11-Nano": "medieval-yolov11n.pt",
"YOLOv11-Small": "medieval-yolov11s.pt",
"YOLOv11-Medium": "medieval-yolov11m.pt",
"YOLOv11-Large": "medieval-yolov11l.pt",
"YOLOv11-XLarge": "medieval-yolov11x.pt"
}
if model_id in MODEL_OPTIONS:
os.makedirs("models", exist_ok=True)
model_path = hf_hub_download(
repo_id="biglam/medieval-manuscript-yolov11",
filename=MODEL_OPTIONS[model_id]
)
local_path = os.path.join("models", model_path)
return YOLO(local_path)
else:
raise ValueError(f"Model {model_id} not found")
app = FastAPI()
@app.post("/predict")
async def predict(image: UploadFile,
model_id: str = "YOLOv11-XLarge",
conf: float = 0.25,
iou: float = 0.7
):
# Initialize model at startup
model = init_model(model_id)
# Download and open image from URL
image = Image.open(image.file)
# Run inference with the PIL Image
results = model.predict(source=image, conf=conf, iou=iou)
# Extract detection results
result = results[0]
# print(result)
detections = []
for box in result.boxes:
detection = {
"class": result.names[int(box.cls[0])],
"confidence": float(box.conf[0]),
"bbox": box.xyxy[0].tolist() # Convert bbox tensor to list
}
detections.append(detection)
print(detections)
return {"detections": detections}
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=7860)