import streamlit as st from PIL import Image from transformers import AutoImageProcessor, AutoModelForImageClassification import torch import requests from utils.matcher import oversaet_fuzzy @st.cache_resource def load_model(): processor = AutoImageProcessor.from_pretrained("timm/food101-vit-base-patch16-224") model = AutoModelForImageClassification.from_pretrained("timm/food101-vit-base-patch16-224") return processor, model processor, model = load_model() st.title("Kalorieestimat og Fødevareklassificering") uploaded_file = st.file_uploader("Upload et billede", type=["jpg", "jpeg", "png"]) confidence_threshold = 0.7 if uploaded_file is not None: image = Image.open(uploaded_file).convert("RGB") st.image(image, caption="Uploadet billede", use_column_width=True) inputs = processor(images=image, return_tensors="pt") with torch.no_grad(): outputs = model(**inputs) logits = outputs.logits predicted_class_idx = logits.argmax(-1).item() confidence = torch.softmax(logits, dim=-1)[0][predicted_class_idx].item() label = model.config.id2label[predicted_class_idx] label_dk = oversaet_fuzzy(label) st.markdown(f"**Modelgæt:** {label} ({confidence*100:.1f}%)") st.markdown(f"**Oversat (fuzzy):** {label_dk}") if confidence < confidence_threshold: manual = st.selectbox("Modellen er usikker – vælg manuelt fødevaretype:", options=["æg", "kartofler", "smør", "broccoli"]) st.markdown(f"**Manuelt valg:** {manual}") feedback = st.text_input("Har du feedback eller en mere præcis betegnelse?") if feedback: st.success("Tak for din feedback!") st.subheader("Eksempel på fødevareanalyse:") st.markdown("- 100 g æg - 200 g kartofler - 50 g smør - 25 g broccoli")