Spaces:
Build error
Build error
| import alt as alt | |
| import streamlit as st | |
| import pandas as pd | |
| import tensorflow as tf | |
| import altair as alt | |
| from utils import load_and_prep, get_classes, preprocess_data # Import the preprocess_data function | |
| import time | |
| # @st.cache_data(suppress_st_warning=True) | |
| def predicting(image, model): | |
| image = load_and_prep(image) | |
| image = tf.cast(tf.expand_dims(image, axis=0), tf.int16) | |
| preds = model.predict(image) | |
| pred_class = class_names[tf.argmax(preds[0])] | |
| pred_conf = tf.reduce_max(preds[0]) | |
| top_5_i = sorted((preds.argsort())[0][-5:][::-1]) | |
| values = preds[0][top_5_i] * 100 | |
| labels = [] | |
| for x in range(5): | |
| labels.append(class_names[top_5_i[x]]) | |
| df = pd.DataFrame({"Top 5 Predictions": labels, | |
| "F1 Scores": values, | |
| 'color': ['#EC5953', '#EC5953', '#EC5953', '#EC5953', '#EC5953']}) | |
| df = df.sort_values('F1 Scores') | |
| return pred_class, pred_conf, df | |
| class_names = get_classes() | |
| st.set_page_config(page_title="Dish Decoder", | |
| page_icon="π") | |
| #### SideBar #### | |
| st.sidebar.title("What's Dish Decoder ?") | |
| st.sidebar.write(""" | |
| Dish Decoder is an end-to-end **CNN Image Classification Model** which identifies the food in your image. | |
| - It can identify over 100 different food classes | |
| - It is based upon a pre-trained Image Classification Model that comes with Keras and then retrained on the infamous **Food101 Dataset**. | |
| - The Model actually beats the DeepFood Paper's model which also trained on the same dataset. | |
| - The Accuracy acquired by DeepFood was 77.4% and our model's 85%. | |
| - Difference of 8% ain't much, but the interesting thing is, DeepFood's model took 2-3 days to train while our's barely took 90min. | |
| **Accuracy :** **`85%`** | |
| **Model :** **`EfficientNetB1`** | |
| **Dataset :** **`Food101`** | |
| """) | |
| #### Main Body #### | |
| st.title("Dish Decoder πποΈ") | |
| st.header("Discover, Decode, Delight !") | |
| file = st.file_uploader(label="Upload an image of food.", | |
| type=["jpg", "jpeg", "png"]) | |
| model = tf.keras.models.load_model("FoodVision.hdf5") | |
| st.sidebar.markdown("Created by **Sparsh Goyal**") | |
| st.markdown( | |
| """ | |
| <div style="position: fixed; bottom: 0; right: 10px; padding: 10px; color: white;"> | |
| <a href="https://github.com/sg-sparsh-goyal" target="_blank" style="color: white; text-decoration: none;"> | |
| β¨ Github | |
| </a><br> | |
| </div> | |
| """, | |
| unsafe_allow_html=True | |
| ) | |
| if not file: | |
| st.warning("Please upload an image") | |
| st.stop() | |
| else: | |
| st.info("Uploading your image...") | |
| # Add a loading bar | |
| progress_bar = st.progress(0) | |
| image = file.read() | |
| # Simulate image processing with a 2-second delay | |
| for percent_complete in range(100): | |
| time.sleep(0.02) | |
| progress_bar.progress(percent_complete + 1) | |
| st.success("Image upload complete!") | |
| st.image(image, use_column_width=True) | |
| pred_button = st.button("Predict") | |
| if pred_button: | |
| pred_class, pred_conf, df = predicting(image, model) | |
| st.success(f'Prediction : {pred_class} \nConfidence : {pred_conf * 100:.2f}%') | |
| chart = alt.Chart(df).mark_bar(color='#00FF00').encode( | |
| x=alt.X('F1 Scores', axis=alt.Axis(title=None)), | |
| y=alt.Y('Top 5 Predictions', sort=None, axis=alt.Axis(title=None)), | |
| text='F1 Scores' | |
| ).properties(width=600, height=400) | |
| st.altair_chart(chart, use_container_width=True) | |