Spaces:
Running
Running
File size: 3,442 Bytes
3aab45d 05a7235 dcb7f7a 3aab45d 05a7235 3aab45d 454af1d 2da45ca 3aab45d 454af1d b047264 dcb7f7a b047264 dcb7f7a 3aab45d dcb7f7a 3aab45d | 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 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 | from fastapi import FastAPI, File, UploadFile, Form
from pydantic import BaseModel
import numpy as np
from tensorflow.keras.models import load_model
import PIL.Image
import io
import pandas as pd
import os
app = FastAPI()
model = load_model("foodnutrition.keras", compile=False)
CLASS_NAMES = [
'Ayam Bakar', 'Ayam Geprek', 'Ayam Goreng', 'Ayam Tepung', 'Bakso', 'Bakwan',
'Batagor', 'Bolu Kukus', 'Burger', 'Cap Cay', 'Chicken Katsu', 'Cilok',
'Dimsum', 'Donat', 'Es Teh', 'Gado-Gado', 'Ikan Goreng', 'Jasuke',
'Jus Jeruk', 'Kikil', 'Kopi', 'Krepes', 'Lemper', 'Mie Ayam',
'Mie Instan', 'Nasi Goreng', 'Nasi Padang', 'Pecel Lele', 'Pizza',
'Random Image', 'Rendang', 'Risoles', 'Sate Ayam', 'Seblak',
'Siomay', 'Sop', 'Soto', 'Tahu', 'Tangkil', 'Telur Balado',
'Telur Dadar', 'Tempe', 'Thai Tea'
]
# Muat file CSV
nutrisi_csv = pd.read_csv('nutrisi_origin.csv')
KOLOM_NAMA = nutrisi_csv.columns[1]
class FoodRequest(BaseModel):
nama_makanan: str
def get_nutrition_data(food_name: str):
pencarian = nutrisi_csv[nutrisi_csv[KOLOM_NAMA].str.lower() == food_name.lower()]
kalori, protein, lemak, karbo = 0.0, 0.0, 0.0, 0.0
kategori = "Tidak Diketahui"
if not pencarian.empty:
detail_nutrisi = pencarian.iloc[0]
kal_teks = str(detail_nutrisi.get('Kalori', '0')).lower().replace(',', '.').replace('g', '').strip()
pro_teks = str(detail_nutrisi.get('Protein', '0')).lower().replace(',', '.').replace('g', '').strip()
lem_teks = str(detail_nutrisi.get('Lemak', '0')).lower().replace(',', '.').replace('g', '').strip()
karbo_teks = str(detail_nutrisi.get('Karbohidrat', '0')).lower().replace(',', '.').replace('g', '').strip()
if 'Kategori' in detail_nutrisi:
kategori = str(detail_nutrisi['Kategori'])
try: kalori = float(kal_teks)
except: kalori = 0.0
try: protein = float(pro_teks)
except: protein = 0.0
try: lemak = float(lem_teks)
except: lemak = 0.0
try: karbo = float(karbo_teks)
except: karbo = 0.0
return {
"kalori": kalori,
"protein": protein,
"lemak": lemak,
"karbohidrat": karbo,
"kategori": kategori
}
@app.get('/')
async def hello():
return {"message": "Food Nutrition API Ready"}
@app.post('/predict')
async def predict(file: UploadFile = File(...)):
img_bytes = await file.read()
img = PIL.Image.open(io.BytesIO(img_bytes)).convert('RGB')
img = img.resize((244, 244))
img_array = np.array(img).astype("float32") / 255.0
img_array = np.expand_dims(img_array, axis=0)
preds = model.predict(img_array, verbose=0)
index = np.argmax(preds[0])
confidence = round(float(np.max(preds[0])) * 100, 2)
if confidence >= 90.0:
predicted_label = CLASS_NAMES[index]
else:
predicted_label = "Tidak diketahui"
probability = []
for i, prob in enumerate(preds[0]):
probability.append({
"label": CLASS_NAMES[i],
"score": round(float(prob) * 100, 2)
})
probability = sorted(probability, key=lambda x: x["score"], reverse=True)
data_nutrisi = get_nutrition_data(predicted_label)
return {
"prediction": predicted_label,
"confidence": confidence,
"probability": probability,
"nutrisi": data_nutrisi
} |