File size: 1,695 Bytes
300b4bf
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import streamlit as st
from PIL import Image
import pandas as pd
from transformers import pipeline

st.set_page_config(page_title="WebKalorier")

st.title("🍽️ WebKalorier – Kalorieestimering via Billede")

@st.cache_resource(show_spinner=False)
def get_classifier():
    return pipeline("image-classification", model="eslamxm/vit-base-food101")

classifier = get_classifier()

# Load calorie data
df = pd.read_csv("kaloriedata.csv")
food_list = df["navn"].tolist()

uploaded_file = st.file_uploader("Upload et billede af din mad", type=["jpg","jpeg","png"])
if uploaded_file:
    image = Image.open(uploaded_file).convert("RGB")
    st.image(image, caption="Analyserer...", use_column_width=True)
    with st.spinner("Klassificerer billede..."):
        results = classifier(image, top_k=3)
    # Display top result
    top = results[0]
    label = top["label"]
    score = top["score"]
    st.markdown(f"**Modelgæt:** {label} ({score*100:.1f}% sikkerhed)")
    if score < 0.7:
        chosen = st.selectbox("Modellen er usikker – vælg fødevare manuelt:", food_list)
    else:
        # Fuzzy matching could be added via utils/matcher.py
        chosen = label.replace('_', ' ').lower()
    gram = st.number_input(f"Hvor mange gram {chosen}?", min_value=1, max_value=2000, value=100)
    kcal_per_100g = float(df.loc[df['navn']==chosen, 'kcal_pr_100g'].squeeze()) if chosen in df['navn'].values else 0
    kcal = gram * kcal_per_100g / 100
    st.markdown("### Analyse af måltid")
    st.write(f"- {gram} g **{chosen}** = {kcal:.1f} kcal")
    feedback = st.text_input("Har du feedback eller rettelse?")
    if st.button("Send feedback"):
        st.success("Tak for din feedback!")