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