File size: 1,420 Bytes
eb9f7e6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
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"

@app.post("/detect")
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)