Spaces:
Running
Running
from fastapi import FastAPI, UploadFile | |
from ultralytics import YOLO | |
from PIL import Image | |
import os | |
from huggingface_hub import hf_hub_download | |
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: | |
print(MODEL_OPTIONS[model_id]) | |
path = hf_hub_download( | |
repo_id="biglam/medieval-manuscript-yolov11", | |
filename=MODEL_OPTIONS[model_id], | |
) | |
print(path) | |
# Initialize and return model | |
model = YOLO(path) | |
print("Model initialized") | |
return model | |
else: | |
raise ValueError(f"Model {model_id} not found") | |
app = FastAPI() | |
async def root(): | |
return {"status": "ok"} | |
async def predict(image: UploadFile, | |
model_id: str = "YOLOv11-XLarge", | |
conf: float = 0.25, | |
iou: float = 0.7 | |
): | |
print(model_id, conf, iou) | |
# Initialize model for each request | |
model = init_model(model_id) | |
# Open image from uploaded file | |
image = Image.open(image.file) | |
print("Image opened") | |
# Run inference with the PIL Image | |
results = model.predict(source=image, conf=conf, iou=iou) | |
print("Inference done") | |
# Extract detection results | |
result = results[0] | |
detections = [] | |
for box in result.boxes: | |
detection = { | |
"class": result.names[int(box.cls[0])], | |
"confidence": float(box.conf[0]), | |
"bbox": box.xyxy[0].tolist() | |
} | |
detections.append(detection) | |
return {"detections": detections} | |
if __name__ == "__main__": | |
import uvicorn | |
uvicorn.run(app, host="0.0.0.0", port=7860) |