File size: 4,356 Bytes
2a3a041
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from PIL import Image
import requests
import pickle
from io import BytesIO
import gradio as gr
from src.args import get_parser
from src.model import get_model
import torch
import os
from src.model1_inf import im2ingr
import numpy as np

response = requests.get("https://i.imgur.com/DwR24EM.jpeg")
dog_img = Image.open(BytesIO(response.content))

def img2ingr(image):
    # img_file = '../data/demo_imgs/1.jpg'
    # image = Image.open(img_file).convert('RGB')
    img = Image.fromarray(np.uint8(image)).convert('RGB')
    ingr = im2ingr(img, ingrs_vocab, model)
    return ' '.join(ingr)

def img_ingr2recipe(image, ingr):
    print(image.shape, ingr)
    return dog_img, "A delicious meme dog \n--------\n1. Cook it!\n2. GL&HF"

def change_checkbox(predicted_ingr):
    return gr.update(label="Ingredient required", interactive=True, choices=predicted_ingr.split(), value=predicted_ingr.split())

def add_ingr(new_ingr):
    print(new_ingr)
    return "hello"

def add_to_checkbox(old_ingr, new_ingr):
    # chack if in dict or not
    return gr.update(label="Ingredient required", interactive=True, choices=[*old_ingr, new_ingr], value=[*old_ingr, new_ingr])


""" load model1 """
args = get_parser()

# basic parameters
model_dir = './data'
data_dir = './data'
example_dir = './data/demo_imgs/'
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
map_loc = None if torch.cuda.is_available() else 'cpu'

# load ingredients vocab
ingrs_vocab = pickle.load(open(os.path.join(model_dir, 'ingr_vocab.pkl'), 'rb'))
vocab = pickle.load(open(os.path.join(data_dir, 'instr_vocab.pkl'), 'rb'))

ingr_vocab_size = len(ingrs_vocab)
instrs_vocab_size = len(vocab)

# model setting and loading
args.maxseqlen = 15
args.ingrs_only=True
model = get_model(args, ingr_vocab_size, instrs_vocab_size)
model_path = os.path.join(model_dir, 'modelbest.ckpt')
model.load_state_dict(torch.load(model_path, map_location=map_loc))
model.to(device)
model.eval()
model.ingrs_only = True
model.recipe_only = False

""" load model2 """




""" gradio """
# input image -> list all required ingrs -> checkbox for selecting ingrs / input_box for input more ingrs user want -> output: recipe and its image
with gr.Blocks() as demo:
    gr.Markdown(
    """
    # Recipedia
    Start finding the yummy recipe ...
    """)
    with gr.Tabs():
        with gr.TabItem("User"):
            # input image
            image_input = gr.Image(label="Upload the image of your yummy food", type='filepath')
            gr.Examples(examples=[example_dir+"1.jpg", example_dir+"2.jpg", example_dir+"3.jpg", example_dir+"4.jpg", example_dir+"5.jpg", example_dir+"6.jpg"], inputs=image_input)
            with gr.Row():
                # clear_img_btn = gr.Button("Clear")
                image_btn = gr.Button("Upload", variant="primary")
            # list all required ingrs -> checkbox for selecting ingrs / input_box for input more ingrs user want
            predicted_ingr = gr.Textbox(visible=False)

            with gr.Row():
                checkboxes = gr.CheckboxGroup(label="Ingredient required", interactive=True)
                new_ingr = gr.Textbox(label="Addtional ingredients", max_lines=1)
                    # with gr.Row():
                    #     new_btn_clear = gr.Button("Clear")
                    #     new_btn = gr.Button("Add", variant="primary")

            add_ingr = gr.Textbox(visible=False)

            with gr.Row():
                clear_ingr_btn = gr.Button("Reset")
                ingr_btn = gr.Button("Confirm", variant="primary")

            # output: recipe and its image
            with gr.Row():
                out_recipe = gr.Textbox(label="Your recipe", value="Spagetti ---\n1. cook it!")
                out_image = gr.Image(label="Looks yummy ><")

        with gr.TabItem("Example"):
            image_button = gr.Button("Flip")
        
        image_btn.click(img2ingr, inputs=image_input, outputs=predicted_ingr)
        predicted_ingr.change(fn=change_checkbox, inputs=predicted_ingr, outputs=checkboxes)

        # new_btn.click(img2ingr, inputs=new_ingr, outputs=predicted_ingr)
        new_ingr.submit(fn=add_to_checkbox, inputs=[checkboxes, new_ingr], outputs=checkboxes)

        ingr_btn.click(img_ingr2recipe, inputs=[image_input, checkboxes], outputs=[out_image, out_recipe])


demo.launch(debug=True, share=True)