|
|
import streamlit as st |
|
|
from PIL import Image |
|
|
from transformers import pipeline |
|
|
import pandas as pd |
|
|
|
|
|
|
|
|
df = pd.read_csv("kaloriedata.csv") |
|
|
food_list = df["navn"].tolist() |
|
|
|
|
|
|
|
|
@st.cache_resource |
|
|
def get_classifier(): |
|
|
return pipeline("zero-shot-image-classification", model="openai/clip-vit-base-patch32") |
|
|
|
|
|
classifier = get_classifier() |
|
|
|
|
|
st.title("🍽️ WebKalorier – Kalorieestimering via CLIP") |
|
|
|
|
|
uploaded = st.file_uploader("Upload billede af mad", type=["jpg", "jpeg", "png"]) |
|
|
if uploaded: |
|
|
image = Image.open(uploaded).convert("RGB") |
|
|
st.image(image, caption="Uploadet billede", use_column_width=True) |
|
|
with st.spinner("Analyserer..."): |
|
|
outputs = classifier(image, candidate_labels=food_list) |
|
|
|
|
|
best = outputs[0] |
|
|
label = best['labels'][0] |
|
|
score = best['scores'][0] |
|
|
st.markdown(f"**Modelgæt:** {label} ({score:.1%} sikkerhed)") |
|
|
|
|
|
if score < 0.7: |
|
|
label = st.selectbox("Modellen er usikker – vælg manuelt:", food_list, index=food_list.index(label)) |
|
|
|
|
|
gram = st.number_input(f"Angiv mængde af {label} i gram:", 1, 2000, 100) |
|
|
|
|
|
kcal_per_100g = df.loc[df["navn"] == label, "kcal_pr_100g"].iloc[0] |
|
|
kcal = gram * kcal_per_100g / 100 |
|
|
st.subheader("🔍 Analyse af måltid") |
|
|
st.write(f"- **{gram} g {label}** → **{kcal:.1f} kcal**") |
|
|
|
|
|
feedback = st.text_input("Feedback eller korrektion (valgfrit)") |
|
|
if st.button("Send feedback"): |
|
|
with open("feedback_log.csv", "a") as f: |
|
|
f.write(f"{label},{score:.2f},{feedback}\n") |
|
|
st.success("Tak for din feedback!") |