File size: 5,286 Bytes
d565bc8
 
 
 
 
80def48
d565bc8
e880c31
d565bc8
 
80def48
d565bc8
 
 
 
 
80def48
 
 
 
 
 
 
 
 
 
 
 
 
 
d565bc8
 
 
 
 
 
 
 
 
 
 
 
 
 
5fcdc39
d565bc8
 
 
 
80def48
 
d565bc8
 
 
 
80def48
d565bc8
 
 
 
 
 
 
 
 
 
 
 
 
80def48
 
 
 
 
 
 
 
 
 
 
 
 
 
d565bc8
80def48
 
 
d565bc8
 
 
 
80def48
d565bc8
 
80def48
d565bc8
 
 
80def48
5fcdc39
d565bc8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
80def48
 
d565bc8
 
 
80def48
d565bc8
 
 
 
 
 
 
 
 
 
 
 
 
11641bb
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
import streamlit as st
import numpy as np
import time

import tensorflow as tf
from utils import load_prepare_image_tf, model_pred_tf, fetch_recipe, load_prepare_image_pt, model_pred_pt
from FoodNoFood import food_not_food
from PIL import Image

import sys
sys.path.insert(1, 'Api Data')
from RecipeData import fetchRecipeData

IMG_SIZE = (224, 224)
model_V1 = 'Seefood_model_v1.tflite'
model_V2 = 'Seefood_model_V2.tflite'
ViT_model = 'ViT-101-1.pt'

@st.cache(show_spinner=False)
def model_prediction(model, img_file, rescale, model_tensor_type):
    if model_tensor_type == 'TF':
        img = load_prepare_image_tf(img_file, IMG_SIZE, rescale=rescale)
        prediction = model_pred_tf(model, img)
        sorceCode, recipe_data = fetchRecipeData(prediction)
    elif model_tensor_type == 'Pt':
        img = load_prepare_image_pt(img_file)
        prediction = model_pred_pt(img, model)
        print(prediction)
        sorceCode, recipe_data = fetchRecipeData(prediction)
        
    return prediction, sorceCode, recipe_data 


def main():
    st.set_page_config(
        page_title="SeeFood",
        page_icon="🍔",
        layout="wide",
        initial_sidebar_state="expanded"
    )

    st.title('SeeFood🍔')
    st.write('Upload a food image and get the recipe for that food and other details of that food')

    col1, col2 = st.columns(2)

    with col1: 
        # image uploading button
        uploaded_file = st.file_uploader("Choose a file")
        selected_model = st.selectbox('Select Model',( 'ViT Model', 'model 1', 'model 2'), index=0)
        
        if uploaded_file is not None:
            uploaded_img = uploaded_file.read()
            pil_img = Image.open(uploaded_file)

            col2.image(uploaded_file, width=700)

        # butoon to make predictions
        predict = st.button('Get Recipe!')

    if predict:
        with st.spinner("Analyzing Image 🕵️‍♂️"):
            food_cat = food_not_food(pil_img)
        
        if food_cat == 'food':
            if uploaded_file is not None:
                with st.spinner('Please Wait 👩‍🍳'):

                    # setting model and rescalling 
                    if selected_model in ['model 1', 'model 2']:
                        
                        if selected_model == 'model 2':
                            pred_model = model_V2 
                            pred_rescale = True
                        elif selected_model == 'model 1':
                            pred_model = model_V1 
                            pred_rescale = False
                        
                        # makeing prediction and fetching food recipe form api
                        food, source_code, recipe_data = model_prediction(pred_model, uploaded_img, pred_rescale, 'TF')
                        
                    elif selected_model == 'ViT Model':
                        pred_model = ViT_model 
                        pred_rescale = True
                        # makeing prediction and fetching food recipe form api
                        food, source_code, recipe_data = model_prediction(pred_model, pil_img, pred_rescale, 'Pt')
                        
                    # asssigning caleoric breakdown data
                    percent_Protein = recipe_data['percentProtein']
                    percent_fat = recipe_data['percentFat']
                    percent_carbs = recipe_data['percentCarbs'] 
                        
                    # food name message
                    col1.success(f"It's an {food}")
                        
                    if source_code == 200:
                        # desplay food recipe
                        st.header(recipe_data['title']+" Recipe")
                        
                        col3, col4 = st.columns(2)

                        with col3:
                            # Ingridents of recipie
                            st.subheader('Ingredients')
                            # st.info(recipe_data['ingridents'])
                            for i in recipe_data['ingridents']:
                                st.info(f"{i}")
                        # Inctuction for recipe
                        with col4:
                            st.subheader('Instructions')
                            st.info(recipe_data['instructions'])
                            # st.subheader('Caloric Breakdown')
                            '''
                            ## Caloric Breakdown
                            '''
                            st.success(f'''
                                        * Protien:  {percent_Protein}%
                                        * Fat: {percent_fat}%
                                        * Carbohydrates: {percent_carbs}%
                                    ''')
                                
                            
                    else:
                        st.error('Something went wrong please try again :(')
                    
                        
        elif food_cat == 'not food':
            with col1:
                st.warning('Invalid Image Please Add Food Image 👨‍🔧')
                    

        else:
            st.warning('Please Upload Image')

                


if __name__=='__main__': 
    main()