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!")