File size: 5,416 Bytes
e74edb5
 
 
 
 
 
 
 
 
 
 
 
25ae2ed
e74edb5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
25ae2ed
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e74edb5
 
 
 
 
 
 
 
 
 
 
7d1b46e
e74edb5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
140
import os
import requests
import json
import torch 
import timm
import torch.nn as nn
import torchvision
from torchvision import transforms, datasets, models
import torch.nn.functional as F
import PIL
import PIL.Image as Image
import numpy as np
from transformers import CLIPProcessor, CLIPModel


classes_outside_india = ['apple pie', 'baby back ribs', 'baklava', 'beef carpaccio', 'beef tartare',
 'beet salad', 'beignets', 'bibimbap', 'bread pudding', 'breakfast burrito',
 'bruschetta', 'caesar_salad', 'cannoli', 'caprese salad', 'carrot cake',
 'ceviche', 'cheese plate', 'cheesecake', 'chicken curry',
 'chicken quesadilla', 'chicken wings', 'chocolate cake', 'chocolate mousse',
 'churros', 'clam chowder', 'club sandwich', 'crab cakes', 'creme brulee',
 'croque madame', 'cup cakes', 'deviled eggs', 'donuts', 'dumplings', 'edamame',
 'eggs benedict', 'escargots', 'falafel', 'filet mignon', 'fish and chips',
 'foie gras', 'french fries', 'french onion soup', 'french toast',
 'fried calamari', 'fried rice', 'frozen yogurt', 'garlic bread', 'gnocchi',
 'greek salad', 'grilled cheese sandwich', 'grilled salmon', 'guacamole',
 'gyoza', 'hamburger', 'hot and sour soup', 'hot dog', 'huevos rancheros',
 'hummus', 'ice cream', 'lasagna', 'lobster bisque', 'lobster roll sandwich',
 'macaroni and cheese', 'macarons', 'miso soup', 'mussels', 'nachos',
 'omelette', 'onion rings', 'oysters', 'pad thai', 'paella', 'pancakes',
 'panna cotta', 'peking duck', 'pho', 'pizza', 'pork chop', 'poutine',
 'prime rib', 'pulled pork sandwich', 'ramen', 'ravioli', 'red velvet cake',
 'risotto', 'samosa', 'sashimi', 'scallops', 'seaweed salad',
 'shrimp and grits', 'spaghetti bolognese', 'spaghetti carbonara',
 'spring rolls', 'steak', 'strawberry_shortcake', 'sushi', 'tacos', 'takoyaki',
 'tiramisu', 'tuna tartare', 'waffles']

classes_india = ['burger','butter_naan', 'chai', 'chapati', 'chole_bhature', 'dal_makhani', 'dhokla', 'fried_rice', 'idli',
           'jalebi', 'kaathi_rolls', 'kadai_paneer', 'kulfi', 'masala_dosa', 'momos', 'paani_puri', 'pakode', 'pav_bhaji',
           'pizza', 'samosa']


def food_nofood_pred(input_image):
    # input labels for clip model
    labels = ['food', 'not food']

        # CLIP Model for classification
    food_nofood_model = CLIPModel.from_pretrained("flax-community/clip-rsicd-v2")
    processor = CLIPProcessor.from_pretrained("flax-community/clip-rsicd-v2")
  
 #         image = Image.open(requests.get(uploaded_file, stream=True).raw)
    inputs = processor(text=[f"a photo of a {l}" for l in labels], images=input_image, return_tensors="pt", padding=True)
    outputs = food_nofood_model(**inputs)
    logits_per_image = outputs.logits_per_image 
    probs = logits_per_image.softmax(dim=1)
    print(probs)
    pred = probs.detach().cpu().numpy().argmax(axis=1)
    pred_class = labels[pred[0]]
    return pred_class

def make_pred_outside_india(input_img, model, device, user_location):
    input_img = input_img.unsqueeze(0)
    model.eval()
    pred = model(input_img)
#     if torch.cuda.is_available():
#         pred = F.softmax(pred).detach().cpu().numpy()  
#         y_prob = pred.argmax(axis=1)[0]   #return index with highest class probability 
#     else:
    pred = F.softmax(pred).detach().numpy()
    y_prob = pred.argmax(axis=1)[0]

    if(user_location=='Outside India'):
        class_label = classes_outside_india[y_prob]
    elif(user_location=='India'):
        class_label = classes_india[y_prob]
    return class_label


def getmodel_outside_india(model_path):
#     device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
    effnet_b0 = timm.create_model(pretrained=True, model_name='tf_efficientnet_b0')

    for param in effnet_b0.parameters():
        param.requires_grad = True

    effnet_b0.classifier = nn.Linear(1280, len(classes_outside_india))
    effnet_b0 = effnet_b0

    #Model Loading
    effnet_b0.load_state_dict(torch.load(model_path,map_location='cpu'))
    return effnet_b0


def getmodel_india(model_path):
    #defining model
#     device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
    effnet_b0 = timm.create_model(pretrained=True, model_name='tf_efficientnet_b0')

    for param in effnet_b0.parameters():
        param.requires_grad = True

    effnet_b0.classifier = nn.Linear(1280, len(classes_india))
    effnet_b0 = effnet_b0

    #Model Loading
    effnet_b0.load_state_dict(torch.load(model_path, map_location='cpu'))
    return effnet_b0


def load_prepare_img(image):
    normalize = transforms.Normalize(
    [0.485, 0.456, 0.406], 
    [0.229, 0.224, 0.225]
    )

    test_transform = transforms.Compose([
        transforms.Resize((225, 225)),
        transforms.CenterCrop(224),
        transforms.ToTensor(),
        normalize,
    ])
    input_img = test_transform(image)
    device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
    return input_img,device

def fetch_recipe(food_name):
    url = "https://recipesapi2.p.rapidapi.com/recipes/"+food_name
    querystring = {"maxRecipes":"1"}

    headers = {
        'x-rapidapi-host': "recipesapi2.p.rapidapi.com",
        'x-rapidapi-key': "f6f6823b91msh9e92fed91d5356ap136f5djsn494d8f582fb3"
        }

    response = requests.request("GET", url, headers=headers, params=querystring)
    json_data = json.loads(response.text)

    recipe_data = json_data['data'][0]

    return recipe_data