File size: 1,970 Bytes
e6fd081
dd08b4c
c2235b0
dd08b4c
c2235b0
 
 
 
 
 
 
 
 
e6fd081
b42ff5c
fc8a3db
e6fd081
c2235b0
dd08b4c
 
fc8a3db
e6fd081
dd08b4c
c2235b0
 
dd08b4c
c2235b0
 
 
 
 
 
 
 
 
 
 
644210d
 
dd08b4c
 
 
 
644210d
dd08b4c
644210d
 
 
 
dd08b4c
 
644210d
dd08b4c
e6fd081
dd08b4c
 
 
 
c2235b0
644210d
c2235b0
 
 
644210d
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
from fastapi import FastAPI, UploadFile, File
from transformers import AutoImageProcessor, AutoModelForImageClassification
from PIL import Image
import torch
import io
import logging

# Set up logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

app = FastAPI()

# ✅ working model on HuggingFace
MODEL_NAME = "Zodex/my-final-food-model-v29-full"

# Load the processor and model
try:
    logger.info(f"Loading model '{MODEL_NAME}'...")
    processor = AutoImageProcessor.from_pretrained(MODEL_NAME)
    model = AutoModelForImageClassification.from_pretrained(MODEL_NAME)
    model.eval()  # ✅ just to be safe
    logger.info("Model and processor loaded successfully!")
except Exception as e:
    logger.error(f"Failed to load model: {str(e)}")
    raise

@app.get("/")
async def read_root():
    return {"message": "Food Recognition API is running."}

@app.post("/predict")
async def predict_image(file: UploadFile = File(...)):
    try:
        contents = await file.read()
        image = Image.open(io.BytesIO(contents)).convert("RGB")

        # Preprocess
        inputs = processor(images=image, return_tensors="pt")

        # Get model predictions
        with torch.no_grad():
            logits = model(**inputs).logits

        probabilities = torch.nn.functional.softmax(logits, dim=-1)

        top_k = 3
        values, indices = torch.topk(logits, top_k)

        results = []
        for i in range(top_k):
            pred_index = indices[0][i].item()
            label = model.config.id2label[pred_index]
            score = float(probabilities[0][pred_index].item())
            results.append({
                "food_name": label.replace("_", " ").title(),
                "confidence": round(score, 4),
            })

        return {"success": True, "predictions": results}

    except Exception as e:
        logger.error(f"Error processing image: {str(e)}")
        return {"success": False, "error": str(e)}