Spaces:
Sleeping
Sleeping
| import uvicorn | |
| from fastapi.staticfiles import StaticFiles | |
| from enum import Enum | |
| from fastapi import FastAPI, UploadFile, File | |
| from PIL import Image | |
| import io | |
| from ultralytics import YOLO | |
| import os | |
| import uuid | |
| from fastapi.responses import Response | |
| app = FastAPI(docs_url='/') | |
| use_gpu = False | |
| output_dir = 'output' | |
| model = YOLO("model.pt", task="detect") | |
| class OutputEnum(str, Enum): | |
| json = "json" | |
| image = "image" | |
| async def detect( | |
| file: UploadFile = File(...), | |
| output: OutputEnum = OutputEnum.json | |
| ): | |
| contents = await file.read() | |
| image = Image.open(io.BytesIO(contents)) | |
| results = model.predict(source=image) | |
| if output == OutputEnum.image: | |
| filename = f"{uuid.uuid4().hex}.jpg" | |
| filepath = os.path.join(output_dir, filename) | |
| results[0].save(filename=filepath) | |
| with open(filepath, "rb") as f: | |
| image_bytes = f.read() | |
| os.remove(filepath) | |
| return Response(content=image_bytes, media_type="image/jpeg") | |
| else: | |
| detections = [{ | |
| 'class': int(box.cls), | |
| 'confidence': float(box.conf), | |
| 'box': [float(x) for x in box.xyxy[0]] | |
| } for box in results[0].boxes] | |
| return {'detections': detections} | |
| app.mount("/output", StaticFiles(directory="output", follow_symlink=True, html=True), name="output") | |
| if __name__ == '__main__': | |
| uvicorn.run(app=app) |