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)}
|