File size: 2,706 Bytes
245a3b6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import streamlit as st
import numpy as np
import pandas as pd
from PIL import Image
import tensorflow as tf

# --- PAS DIT AAN ALS JE ANDERE KLASSEN HEBT ---
CLASS_NAMES = [
    "Ajwa",
    "Galaxy",
    "Medjool",
    "Meneifi",
    "Nabtat Ali",
    "Rutab",
    "Shaishe",
    "Sokari",
    "Sugaey"
]

IMG_SIZE = (128, 128)  # dezelfde grootte als in je model


@st.cache_resource
def load_model():
    """Laad het Keras-model één keer en cache het."""
    model = tf.keras.models.load_model("date_fruit_model.h5")
    return model


def preprocess_image(image: Image.Image) -> np.ndarray:
    """

    Maakt een PIL-image klaar voor het model:

    - resize

    - naar np.array

    - normaliseren [0,1]

    - batch-dimensie toevoegen

    """
    image = image.convert("RGB")        # voor de zekerheid
    image = image.resize(IMG_SIZE)
    arr = np.array(image, dtype="float32") / 255.0
    arr = np.expand_dims(arr, axis=0)   # shape: (1, 128, 128, 3)
    return arr


def main():
    st.set_page_config(page_title="Date Fruit Classifier", layout="centered")

    st.title("🍇 Date Fruit Classifier")
    st.write("Upload een foto van een dadel en het model probeert de soort te raden.")

    # Sidebar info
    st.sidebar.header("Info")
    st.sidebar.write("Model: Convolutional Neural Network (Keras/TensorFlow)")
    st.sidebar.write(f"Aantal klassen: **{len(CLASS_NAMES)}**")

    uploaded_file = st.file_uploader(
        "Kies een afbeelding", type=["jpg", "jpeg", "png"]
    )

    if uploaded_file is not None:
        # Toon de geüploade afbeelding
        image = Image.open(uploaded_file)
        st.image(image, caption="Geüploade afbeelding", use_container_width=True)


        if st.button("Classificeer"):
            with st.spinner("Bezig met voorspellen..."):
                model = load_model()
                input_arr = preprocess_image(image)
                preds = model.predict(input_arr)[0]   # shape: (n_classes,)

                pred_idx = int(np.argmax(preds))
                pred_name = CLASS_NAMES[pred_idx]
                pred_conf = float(preds[pred_idx])

            st.subheader("🔎 Voorspelling")
            st.write(f"**Klasse:** {pred_name}")
            st.write(f"**Vertrouwen:** {pred_conf:.2%}")

            # Probabilities per klasse
            st.subheader("📊 Waarschijnlijkheid per klasse")
            probs_df = pd.DataFrame({
                "Klasse": CLASS_NAMES,
                "Score": preds
            })
            probs_df = probs_df.set_index("Klasse")

            st.bar_chart(probs_df)


if __name__ == "__main__":
    main()