File size: 1,438 Bytes
54ae236
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from fastapi import APIRouter, UploadFile, File, HTTPException
from models.loader import ModelLoader
from request_queue.queue_manager import RequestQueue
from queue import Full

router = APIRouter(prefix="/predict/pest", tags=["Pest"])

model_loader = ModelLoader(config_dir="models/configs")
request_queue = RequestQueue(maxsize=10)

@router.post("")
async def predict_pest(file: UploadFile = File(...)):
    if not file or not file.filename:
        raise HTTPException(status_code=400, detail="No file uploaded or file is invalid.")
    try:
        image_bytes = await file.read()
        if not image_bytes:
            raise HTTPException(status_code=400, detail="Uploaded file is empty.")
        def process_request():
            try:
                model = model_loader.load_model("pest")
            except Exception:
                raise HTTPException(status_code=503, detail="Pest model not loaded or unavailable.")
            result = model.predict(image_bytes)
            return {"filename": file.filename, **result}
        try:
            request_queue.add_request(process_request)
        except Full:
            raise HTTPException(status_code=429, detail="Request queue is full. Please try again later.")
        response = request_queue.get_request()()
        return response
    except HTTPException as e:
        raise e
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))