Dockerfile CHANGED
@@ -24,4 +24,4 @@ WORKDIR /opt/src
24
 
25
 
26
  FROM copy-src as production
27
- CMD ["python3", "-m", "uvicorn", "main:app", "--workers", "1", "--host", "0.0.0.0", "--port", "7860"]
 
24
 
25
 
26
  FROM copy-src as production
27
+ CMD ["bash" "./run_app.sh"]
src/config.py DELETED
@@ -1,4 +0,0 @@
1
- import os
2
-
3
- MODEL_HDF5_PATH = os.getenv("MODEL_HDF5_PATH")
4
-
 
 
 
 
 
src/grubguesser/__init__.py ADDED
File without changes
src/grubguesser/asgi.py ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ ASGI config for grubguesser project.
3
+
4
+ It exposes the ASGI callable as a module-level variable named ``application``.
5
+
6
+ For more information on this file, see
7
+ https://docs.djangoproject.com/en/4.0/howto/deployment/asgi/
8
+ """
9
+
10
+ import os
11
+
12
+ from django.core.asgi import get_asgi_application
13
+
14
+ os.environ.setdefault("DJANGO_SETTINGS_MODULE", "grubguesser.settings")
15
+
16
+ application = get_asgi_application()
src/grubguesser/forms.py ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from django import forms
2
+
3
+
4
+ class URLInputForm(forms.Form):
5
+ post = forms.URLField(label="Paste image url here:")
6
+ label = forms.CharField(label="Type of Food:", required=False)
7
+
8
+
9
+ class ImageUploadForm(forms.Form):
10
+ img = forms.ImageField(label="User uploaded image")
11
+ label = forms.CharField(label="Type of Food:", required=False)
src/grubguesser/settings.py ADDED
@@ -0,0 +1,135 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ Django settings for grubguesser project.
3
+
4
+ Generated by 'django-admin startproject' using Django 4.0.3.
5
+
6
+ For more information on this file, see
7
+ https://docs.djangoproject.com/en/4.0/topics/settings/
8
+
9
+ For the full list of settings and their values, see
10
+ https://docs.djangoproject.com/en/4.0/ref/settings/
11
+ """
12
+
13
+ import os
14
+ from pathlib import Path
15
+
16
+ # Build paths inside the project like this: BASE_DIR / 'subdir'.
17
+ BASE_DIR = Path(__file__).resolve().parent
18
+
19
+
20
+ # Quick-start development settings - unsuitable for production
21
+ # See https://docs.djangoproject.com/en/4.0/howto/deployment/checklist/
22
+
23
+ # SECURITY WARNING: keep the secret key used in production secret!
24
+ SECRET_KEY = os.getenv("APP_PASSWORD")
25
+
26
+ # SECURITY WARNING: don't run with debug turned on in production!
27
+ DEBUG = os.getenv("DEBUG_MODE", "False").lower() == "true"
28
+
29
+ ALLOWED_HOSTS: list = []
30
+
31
+ app_name = os.getenv("HEROKU_APP_NAME")
32
+ if app_name:
33
+ ALLOWED_HOSTS.append(f"{app_name}.herokuapp.com")
34
+
35
+
36
+ # Application definition
37
+
38
+ INSTALLED_APPS = [
39
+ "django.contrib.admin",
40
+ "django.contrib.auth",
41
+ "django.contrib.contenttypes",
42
+ "django.contrib.sessions",
43
+ "django.contrib.messages",
44
+ "django.contrib.staticfiles",
45
+ "grubguesser",
46
+ ]
47
+
48
+ MIDDLEWARE = [
49
+ "django.middleware.security.SecurityMiddleware",
50
+ "django.contrib.sessions.middleware.SessionMiddleware",
51
+ "django.middleware.common.CommonMiddleware",
52
+ "django.middleware.csrf.CsrfViewMiddleware",
53
+ "django.contrib.auth.middleware.AuthenticationMiddleware",
54
+ "django.contrib.messages.middleware.MessageMiddleware",
55
+ "django.middleware.clickjacking.XFrameOptionsMiddleware",
56
+ "whitenoise.middleware.WhiteNoiseMiddleware",
57
+ ]
58
+
59
+ ROOT_URLCONF = "grubguesser.urls"
60
+
61
+ TEMPLATES = [
62
+ {
63
+ "BACKEND": "django.template.backends.django.DjangoTemplates",
64
+ "DIRS": [],
65
+ "APP_DIRS": True,
66
+ "OPTIONS": {
67
+ "context_processors": [
68
+ "django.template.context_processors.debug",
69
+ "django.template.context_processors.request",
70
+ "django.contrib.auth.context_processors.auth",
71
+ "django.contrib.messages.context_processors.messages",
72
+ ],
73
+ },
74
+ },
75
+ ]
76
+
77
+ WSGI_APPLICATION = "grubguesser.wsgi.application"
78
+
79
+
80
+ # Database
81
+ # https://docs.djangoproject.com/en/4.0/ref/settings/#databases
82
+
83
+ DATABASES: dict = {}
84
+
85
+
86
+ # Password validation
87
+ # https://docs.djangoproject.com/en/4.0/ref/settings/#auth-password-validators
88
+
89
+ AUTH_PASSWORD_VALIDATORS = [
90
+ {
91
+ "NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator", # noqa
92
+ },
93
+ {
94
+ "NAME": "django.contrib.auth.password_validation.MinimumLengthValidator",
95
+ },
96
+ {
97
+ "NAME": "django.contrib.auth.password_validation.CommonPasswordValidator",
98
+ },
99
+ {
100
+ "NAME": "django.contrib.auth.password_validation.NumericPasswordValidator",
101
+ },
102
+ ]
103
+
104
+
105
+ # Internationalization
106
+ # https://docs.djangoproject.com/en/4.0/topics/i18n/
107
+
108
+ LANGUAGE_CODE = "en-us"
109
+
110
+ TIME_ZONE = "UTC"
111
+
112
+ USE_I18N = True
113
+
114
+ USE_TZ = True
115
+
116
+
117
+ # Static files (CSS, JavaScript, Images)
118
+ # https://docs.djangoproject.com/en/4.0/howto/static-files/
119
+
120
+ STATIC_ROOT = os.path.join(BASE_DIR, "staticfiles")
121
+ STATIC_URL = "/static/"
122
+
123
+ # Extra places for collectstatic to find static files.
124
+ STATICFILES_DIRS = (os.path.join(BASE_DIR, "static"),)
125
+
126
+ # Default primary key field type
127
+ # https://docs.djangoproject.com/en/4.0/ref/settings/#default-auto-field
128
+
129
+ DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField"
130
+
131
+
132
+ # Simplified static file serving.
133
+ # https://warehouse.python.org/project/whitenoise/
134
+
135
+ STATICFILES_STORAGE = "whitenoise.storage.CompressedManifestStaticFilesStorage"
src/grubguesser/templates/base.html ADDED
@@ -0,0 +1,136 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {% load static %}
2
+ <!DOCTYPE html>
3
+ <html>
4
+ <head>
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Grub Guesser - Feed me Seymour!</title>
7
+ <link rel="stylesheet" type="text/css" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css" />
8
+ <link rel="shortcut icon" href="{% static 'gg-favicon.png'%}">
9
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
10
+ <script type="text/javascript" src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
11
+ <style type="text/css">
12
+ .jumbotron {
13
+ background: #cc6600;
14
+ color: white;
15
+ padding-bottom: 80px
16
+ }
17
+ .btn-primary {
18
+ background: #cc6600;
19
+ border-color: #cc6600
20
+ }
21
+ .btn-primary:hover {
22
+ background: hsl(30, 100%, 30%)
23
+ }
24
+ .jumbotron p {
25
+ color: #d9ccee;
26
+ max-width: 75%;
27
+ margin: 1em auto 2em
28
+ }
29
+ .navbar+.jumbotron {
30
+ margin-top: -20px
31
+ }
32
+ .jumbotron .gg-logo {
33
+ display: block;
34
+ background: #b01302;
35
+ border-radius: 50%;
36
+ overflow: hidden;
37
+ width: 100px;
38
+ height: 100px;
39
+ margin: auto;
40
+ border: 2px solid white
41
+ }
42
+ .jumbotron .gg-logo img {
43
+ max-width: 100%
44
+ }
45
+ .navbar-inverse {
46
+ background: #C13100;
47
+ color: #FFFBD0;
48
+ position: fixed;
49
+ top: 0;
50
+ width: 100%;
51
+ }
52
+ .navbar-nav {
53
+ background: #C13100;
54
+ color: #FFFBD0;
55
+ }
56
+ .navbar-inverse .navbar-nav>.active>a, .navbar-inverse .navbar-nav>.active>a:focus, .navbar-inverse .navbar-nav>.active>a:hover {
57
+ background: #C13100;
58
+ color: #FFFBD0
59
+ }
60
+ .navbar-inverse .navbar-nav>.open>a, .navbar-inverse .navbar-nav>.open>a:focus, .navbar-inverse .navbar-nav>.open>a:hover {
61
+ background: #C13100;
62
+ color: #FFFBD0
63
+ }
64
+ .navbar-inverse .navbar-nav>li>a {
65
+ background: #C13100;
66
+ color: #FFFBD0
67
+ }
68
+ .dropdown-menu {
69
+ color:#000000;
70
+ }
71
+ .navbar-nav>li>form {
72
+ padding-top: 5px;
73
+ padding-bottom: 5px;
74
+ }
75
+ @media (min-width: 768px) {
76
+ .navbar-nav>li>form {
77
+ padding-top: 8px;
78
+ padding-bottom: 8px;
79
+ }
80
+ }
81
+ input {
82
+ margin:10px;
83
+ width: 375px
84
+ }
85
+ </style>
86
+ </head>
87
+ <body>
88
+ <nav class="navbar navbar-default navbar-static-top navbar-inverse">
89
+ <div class="container">
90
+ <ul class="nav navbar-nav">
91
+ <li class="active">
92
+ <a href="/"><span class="glyphicon glyphicon-home"></span> Home</a>
93
+ </li>
94
+ <li class="dropdown">
95
+ <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false"><span class="glyphicon glyphicon-info-sign"></span> Predict Image from URL <span class="caret"></span></a>
96
+ <ul class="dropdown-menu" role="menu" style="width:600px">
97
+ <li>
98
+ <form method="POST" style="margin:10px 20px">
99
+ {% csrf_token %}
100
+ {{ url_form.as_p }}
101
+ <button class="btn btn-primary" type="submit" name="action" value="SubmitURL"> Submit</button>
102
+ </form>
103
+ </li>
104
+ </ul>
105
+ </li>
106
+ <li class="dropdown">
107
+ <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false"><span class="glyphicon glyphicon-info-sign"></span> Upload an Image <span class="caret"></span></a>
108
+ <ul class="dropdown-menu" role="menu" style="width:600px">
109
+ <li>
110
+ <form enctype="multipart/form-data" method="POST" style="margin:10px 20px">
111
+ {% csrf_token %}
112
+ {{ image_form.as_p }}
113
+ <button class="btn btn-primary" type="submit" name="action" value="SubmitImage"> Submit</button>
114
+ </form>
115
+ </li>
116
+ </ul>
117
+ </li>
118
+ <li>
119
+ <form method="POST">
120
+ {% csrf_token %}
121
+ <button class="btn btn-primary" type="submit" name="action" value="LoadRandom" ><span class="glyphicon glyphicon-refresh"></span> Load Random Sample</button>
122
+ </form>
123
+ </li>
124
+ </ul>
125
+ <ul class="nav navbar-nav navbar-right">
126
+ <li class="navbar-right">
127
+ <a href="https://github.com/JonSolow/foodid"><span class="glyphicon glyphicon-book"></span>Model Source Github</a>
128
+ </li>
129
+ </ul>
130
+ </div>
131
+ </nav>
132
+
133
+ {% block content %}{% endblock %}
134
+
135
+ </body>
136
+ </html>
src/grubguesser/templates/index.html ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {% extends "base.html" %}
2
+ {% load static %}
3
+
4
+ {% block content %}
5
+ <br>
6
+ <div class="jumbotron text-center">
7
+ <div class="container">
8
+ <img class="img-responsive" src="{% static 'gg_logo_1.png'%}">
9
+ <h1>Welcome to Grub Guesser</h1>
10
+ <p>Grub Guesser is a model developed in Python using Keras and Tensorflow. <br> Try out a random sample image or paste a url to an image of your own!</p>
11
+ <a type="button" class="btn btn-lg btn-default" href="https://github.com/JonSolow/foodid"><span class="glyphicon glyphicon-download"></span> Model Source on GitHub</a>
12
+ </div>
13
+ </div>
14
+ {% endblock %}
src/grubguesser/templates/request.html ADDED
@@ -0,0 +1,55 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {% extends "base.html" %}
2
+ {% load static %}
3
+
4
+ {% block content %}
5
+ <br>
6
+ <div class="jumbotron text-center">
7
+ <div class="container" style="margin-bottom:10px">
8
+ <img class="img-responsive" src="{% static 'gg_logo_1.png'%}" style="display:inline;">
9
+ <h1>Top 5 Model Guesses</h1>
10
+ </div>
11
+ <div class="container">
12
+ <div class="col-sm-8">
13
+ <img class="img-responsive center-block" src="{{img_src}}" style="height:440px">
14
+ <h2>Actual: {{actual_label}}</h2>
15
+ </div>
16
+ <div class="col-sm-4">
17
+ <table>
18
+ <tbody class="text-left" style="font-size: 2.5rem; font-weight: bold">
19
+ <tr style="height:80px">
20
+ <!-- <td style="padding-right:10px; color: {{color_labels.0}}"> &nbsp1. </td> -->
21
+ <td style="color: {{color_labels.0}}">1. {{top_guesses.0}}</td>
22
+ <!-- <td style="padding-right:10px; color: {{color_labels.5}}"> &nbsp6. </td>
23
+ <td style="color: {{color_labels.5}}">{{top_guesses.5}}</td> -->
24
+ </tr>
25
+ <tr style="height:80px">
26
+ <!-- <td style="padding-right:10px; color: {{color_labels.1}}"> &nbsp2. </td> -->
27
+ <td style="color: {{color_labels.1}}">2. {{top_guesses.1}}</td>
28
+ <!-- <td style="padding-right:10px; color: {{color_labels.6}}"> &nbsp7. </td>
29
+ <td style="color: {{color_labels.6}}">{{top_guesses.6}}</td> -->
30
+ </tr>
31
+ <tr style="height:80px">
32
+ <!-- <td style="padding-right:10px; color: {{color_labels.2}}"> &nbsp3. </td> -->
33
+ <td style="color: {{color_labels.2}}">3. {{top_guesses.2}}</td>
34
+ <!-- <td style="padding-right:10px; color: {{color_labels.7}}"> &nbsp8. </td>
35
+ <td style="color: {{color_labels.7}}">{{top_guesses.7}}</td> -->
36
+ </tr>
37
+ <tr style="height:80px">
38
+ <!-- <td style="padding-right:10px; color: {{color_labels.3}}"> &nbsp4. </td> -->
39
+ <td style="color: {{color_labels.3}}">4. {{top_guesses.3}}</td>
40
+ <!-- <td style="padding-right:10px; color: {{color_labels.8}}"> &nbsp9. </td>
41
+ <td style="color: {{color_labels.8}}">{{top_guesses.8}}</td> -->
42
+ </tr>
43
+ <tr style="height:80px">
44
+ <!-- <td style="padding-right:10px; color: {{color_labels.4}}"> &nbsp5. </td> -->
45
+ <td style="color: {{color_labels.4}}">5. {{top_guesses.4}}</td>
46
+ <!-- <td style="padding-right:10px; color: {{color_labels.9}}">10. </td>
47
+ <td style="color: {{color_labels.9}}">{{top_guesses.9}}</td> -->
48
+ </tr>
49
+ </tbody>
50
+ </table>
51
+ </div>
52
+
53
+ </div>
54
+ </div>
55
+ {% endblock %}
src/grubguesser/urls.py ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """grubguesser URL Configuration
2
+
3
+ The `urlpatterns` list routes URLs to views. For more information please see:
4
+ https://docs.djangoproject.com/en/4.0/topics/http/urls/
5
+ Examples:
6
+ Function views
7
+ 1. Add an import: from my_app import views
8
+ 2. Add a URL to urlpatterns: path('', views.home, name='home')
9
+ Class-based views
10
+ 1. Add an import: from other_app.views import Home
11
+ 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
12
+ Including another URLconf
13
+ 1. Import the include() function: from django.urls import include, path
14
+ 2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
15
+ """
16
+ from django.urls import path
17
+ from grubguesser import views
18
+
19
+ urlpatterns = [
20
+ path("", views.HomeView.as_view(), name="index"),
21
+ ]
src/grubguesser/views.py ADDED
@@ -0,0 +1,73 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from django.shortcuts import render
2
+ from django.views.generic import TemplateView
3
+ from model_client import url_image_vars
4
+ from sample_loader import get_random_sample_image
5
+ from .forms import ImageUploadForm, URLInputForm
6
+ from base64 import b64encode
7
+
8
+
9
+ def get_default_form_context():
10
+ return {
11
+ "url_form": URLInputForm(),
12
+ "image_form": ImageUploadForm(),
13
+ }
14
+
15
+
16
+ class HomeView(TemplateView):
17
+ template_name = "index.html"
18
+
19
+ def render_for_img_url_label(self, request, img_url: str, label: str):
20
+ img_src = img_url
21
+ top_guesses, color_labels = url_image_vars(img_url, label)
22
+ context_dict = get_default_form_context()
23
+ context_dict.update(
24
+ {
25
+ "img_src": img_src,
26
+ "top_guesses": top_guesses,
27
+ "actual_label": label or "Unknown",
28
+ "color_labels": color_labels,
29
+ }
30
+ )
31
+ return render(request, "request.html", context_dict)
32
+
33
+ def render_for_img_file_label(self, request, img_file, label: str):
34
+ decoded_img = b64encode(img_file.read()).decode("utf-8")
35
+ img_src = f"data:{img_file.content_type};base64,{decoded_img}"
36
+ top_guesses, color_labels = url_image_vars(img_file, label)
37
+ context_dict = get_default_form_context()
38
+ context_dict.update(
39
+ {
40
+ "top_guesses": top_guesses,
41
+ "actual_label": label or "Unknown",
42
+ "color_labels": color_labels,
43
+ "img_src": img_src,
44
+ }
45
+ )
46
+ return render(request, "request.html", context_dict)
47
+
48
+ def get(self, request):
49
+ context_dict = get_default_form_context()
50
+ return render(request, self.template_name, context_dict)
51
+
52
+ def post(self, request):
53
+ action = request.POST["action"]
54
+ context_dict = get_default_form_context()
55
+ if action == "SubmitURL":
56
+ form = URLInputForm(request.POST)
57
+ if form.is_valid():
58
+ img_url = form.cleaned_data["post"]
59
+ label = form.cleaned_data["label"]
60
+ return self.render_for_img_url_label(request, img_url, label)
61
+
62
+ if action == "SubmitImage":
63
+ form = ImageUploadForm(request.POST, request.FILES)
64
+ assert form.is_valid()
65
+ if form.is_valid():
66
+ image_field = form.cleaned_data["img"]
67
+ label = form.cleaned_data["label"]
68
+ return self.render_for_img_file_label(request, image_field, label)
69
+
70
+ if action == "LoadRandom":
71
+ img_url, label = get_random_sample_image()
72
+ return self.render_for_img_url_label(request, img_url, label)
73
+ return render(request, self.template_name, context_dict)
src/grubguesser/wsgi.py ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ WSGI config for grubguesser project.
3
+
4
+ It exposes the WSGI callable as a module-level variable named ``application``.
5
+
6
+ For more information on this file, see
7
+ https://docs.djangoproject.com/en/4.0/howto/deployment/wsgi/
8
+ """
9
+
10
+ import os
11
+
12
+ from django.core.wsgi import get_wsgi_application
13
+
14
+ os.environ.setdefault("DJANGO_SETTINGS_MODULE", "grubguesser.settings")
15
+
16
+ application = get_wsgi_application()
src/huggingface_client/__init__.py ADDED
File without changes
src/{handler.py β†’ huggingface_client/handler.py} RENAMED
@@ -1,9 +1,8 @@
1
- from fastapi import UploadFile
2
  from skimage.io import imread
3
  from io import BytesIO
4
  import numpy as np
5
  import urllib
6
- from tensorflow.keras.preprocessing.image import array_to_img, img_to_array
7
 
8
  from PIL import Image
9
 
@@ -32,7 +31,7 @@ def read_imagefile(file):
32
  return image
33
 
34
 
35
- def handle_file(file: UploadFile) -> np.ndarray:
36
  img_data = read_imagefile(file)
37
  processed_img = preprocess(img_data)
38
  img_array = np.array([processed_img])
 
 
1
  from skimage.io import imread
2
  from io import BytesIO
3
  import numpy as np
4
  import urllib
5
+ from tensorflow.keras.utils import array_to_img, img_to_array
6
 
7
  from PIL import Image
8
 
 
31
  return image
32
 
33
 
34
+ def handle_file(file) -> np.ndarray:
35
  img_data = read_imagefile(file)
36
  processed_img = preprocess(img_data)
37
  img_array = np.array([processed_img])
src/huggingface_client/labels.py ADDED
@@ -0,0 +1,103 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ CLASS_LABELS = [
2
+ "Apple pie",
3
+ "Baby back ribs",
4
+ "Baklava",
5
+ "Beef carpaccio",
6
+ "Beef tartare",
7
+ "Beet salad",
8
+ "Beignets",
9
+ "Bibimbap",
10
+ "Bread pudding",
11
+ "Breakfast burrito",
12
+ "Bruschetta",
13
+ "Caesar salad",
14
+ "Cannoli",
15
+ "Caprese salad",
16
+ "Carrot cake",
17
+ "Ceviche",
18
+ "Cheesecake",
19
+ "Cheese plate",
20
+ "Chicken curry",
21
+ "Chicken quesadilla",
22
+ "Chicken wings",
23
+ "Chocolate cake",
24
+ "Chocolate mousse",
25
+ "Churros",
26
+ "Clam chowder",
27
+ "Club sandwich",
28
+ "Crab cakes",
29
+ "Creme brulee",
30
+ "Croque madame",
31
+ "Cup cakes",
32
+ "Deviled eggs",
33
+ "Donuts",
34
+ "Dumplings",
35
+ "Edamame",
36
+ "Eggs benedict",
37
+ "Escargots",
38
+ "Falafel",
39
+ "Filet mignon",
40
+ "Fish and chips",
41
+ "Foie gras",
42
+ "French fries",
43
+ "French onion soup",
44
+ "French toast",
45
+ "Fried calamari",
46
+ "Fried rice",
47
+ "Frozen yogurt",
48
+ "Garlic bread",
49
+ "Gnocchi",
50
+ "Greek salad",
51
+ "Grilled cheese sandwich",
52
+ "Grilled salmon",
53
+ "Guacamole",
54
+ "Gyoza",
55
+ "Hamburger",
56
+ "Hot and sour soup",
57
+ "Hot dog",
58
+ "Huevos rancheros",
59
+ "Hummus",
60
+ "Ice cream",
61
+ "Lasagna",
62
+ "Lobster bisque",
63
+ "Lobster roll sandwich",
64
+ "Macaroni and cheese",
65
+ "Macarons",
66
+ "Miso soup",
67
+ "Mussels",
68
+ "Nachos",
69
+ "Omelette",
70
+ "Onion rings",
71
+ "Oysters",
72
+ "Pad thai",
73
+ "Paella",
74
+ "Pancakes",
75
+ "Panna cotta",
76
+ "Peking duck",
77
+ "Pho",
78
+ "Pizza",
79
+ "Pork chop",
80
+ "Poutine",
81
+ "Prime rib",
82
+ "Pulled pork sandwich",
83
+ "Ramen",
84
+ "Ravioli",
85
+ "Red velvet cake",
86
+ "Risotto",
87
+ "Samosa",
88
+ "Sashimi",
89
+ "Scallops",
90
+ "Seaweed salad",
91
+ "Shrimp and grits",
92
+ "Spaghetti bolognese",
93
+ "Spaghetti carbonara",
94
+ "Spring rolls",
95
+ "Steak",
96
+ "Strawberry shortcake",
97
+ "Sushi",
98
+ "Tacos",
99
+ "Takoyaki",
100
+ "Tiramisu",
101
+ "Tuna tartare",
102
+ "Waffles",
103
+ ]
src/huggingface_client/model.py ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ from huggingface_hub import from_pretrained_keras
2
+
3
+
4
+ MODEL = from_pretrained_keras("jsolow/grubguesser")
src/huggingface_client/predict.py ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from .model import MODEL
2
+ from .handler import handle_file, handle_url
3
+ from .labels import CLASS_LABELS
4
+
5
+
6
+
7
+ def predict_model(img_array, n_top_guesses:int = 10):
8
+ class_prob = MODEL.predict(img_array)
9
+ top_values_index = (-class_prob).argsort()[0][:n_top_guesses]
10
+ top_guesses = [CLASS_LABELS[i].title() for i in top_values_index]
11
+ return top_guesses
12
+
13
+
14
+ def predict_file(file):
15
+ handled_array = handle_file(file)
16
+ return predict_model(handled_array)
17
+
18
+
19
+
20
+ def predict_url(url: str):
21
+ handled_array = handle_url(url)
22
+ return predict_model(handled_array)
23
+
src/labels.txt DELETED
@@ -1,101 +0,0 @@
1
- Apple pie
2
- Baby back ribs
3
- Baklava
4
- Beef carpaccio
5
- Beef tartare
6
- Beet salad
7
- Beignets
8
- Bibimbap
9
- Bread pudding
10
- Breakfast burrito
11
- Bruschetta
12
- Caesar salad
13
- Cannoli
14
- Caprese salad
15
- Carrot cake
16
- Ceviche
17
- Cheesecake
18
- Cheese plate
19
- Chicken curry
20
- Chicken quesadilla
21
- Chicken wings
22
- Chocolate cake
23
- Chocolate mousse
24
- Churros
25
- Clam chowder
26
- Club sandwich
27
- Crab cakes
28
- Creme brulee
29
- Croque madame
30
- Cup cakes
31
- Deviled eggs
32
- Donuts
33
- Dumplings
34
- Edamame
35
- Eggs benedict
36
- Escargots
37
- Falafel
38
- Filet mignon
39
- Fish and chips
40
- Foie gras
41
- French fries
42
- French onion soup
43
- French toast
44
- Fried calamari
45
- Fried rice
46
- Frozen yogurt
47
- Garlic bread
48
- Gnocchi
49
- Greek salad
50
- Grilled cheese sandwich
51
- Grilled salmon
52
- Guacamole
53
- Gyoza
54
- Hamburger
55
- Hot and sour soup
56
- Hot dog
57
- Huevos rancheros
58
- Hummus
59
- Ice cream
60
- Lasagna
61
- Lobster bisque
62
- Lobster roll sandwich
63
- Macaroni and cheese
64
- Macarons
65
- Miso soup
66
- Mussels
67
- Nachos
68
- Omelette
69
- Onion rings
70
- Oysters
71
- Pad thai
72
- Paella
73
- Pancakes
74
- Panna cotta
75
- Peking duck
76
- Pho
77
- Pizza
78
- Pork chop
79
- Poutine
80
- Prime rib
81
- Pulled pork sandwich
82
- Ramen
83
- Ravioli
84
- Red velvet cake
85
- Risotto
86
- Samosa
87
- Sashimi
88
- Scallops
89
- Seaweed salad
90
- Shrimp and grits
91
- Spaghetti bolognese
92
- Spaghetti carbonara
93
- Spring rolls
94
- Steak
95
- Strawberry shortcake
96
- Sushi
97
- Tacos
98
- Takoyaki
99
- Tiramisu
100
- Tuna tartare
101
- Waffles
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/main.py DELETED
@@ -1,44 +0,0 @@
1
- from fastapi import FastAPI, UploadFile, File, HTTPException, status, Header
2
- from fastapi.responses import RedirectResponse
3
-
4
- from handler import handle_file, handle_url
5
- from predict import predict_model
6
-
7
-
8
- app = FastAPI()
9
-
10
- @app.get("/")
11
- async def docs_redirect():
12
- return RedirectResponse(url='/docs')
13
-
14
-
15
- @app.get("/predict_url")
16
- async def predict_url(url: str):
17
- model_input = handle_url(url)
18
- model_output = predict_model(model_input)
19
- return model_output
20
-
21
-
22
- @app.get("/healthcheck")
23
- async def healthcheck():
24
- return {"status": "alive"}
25
-
26
-
27
- def validate_image_content(content_type: str = Header(...)):
28
- """Require request MIME-type to be image/*"""
29
-
30
- content_main_type = content_type.split("/")[0]
31
- if content_main_type != "image":
32
- raise HTTPException(
33
- status.HTTP_415_UNSUPPORTED_MEDIA_TYPE,
34
- f"Unsupported media type: {content_type}."
35
- " It must be image/",
36
- )
37
-
38
-
39
- @app.post("/predict_file")
40
- async def predict_file(upload_file: UploadFile = File(...)):
41
- validate_image_content(upload_file.content_type)
42
- model_input = handle_file(await upload_file.read())
43
- model_output = predict_model(model_input)
44
- return model_output
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/manage.py ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python
2
+ """Django's command-line utility for administrative tasks."""
3
+ import os
4
+ import sys
5
+
6
+
7
+ def main():
8
+ """Run administrative tasks."""
9
+ os.environ.setdefault("DJANGO_SETTINGS_MODULE", "grubguesser.settings")
10
+ try:
11
+ from django.core.management import execute_from_command_line
12
+ except ImportError as exc:
13
+ raise ImportError(
14
+ "Couldn't import Django. Are you sure it's installed and "
15
+ "available on your PYTHONPATH environment variable? Did you "
16
+ "forget to activate a virtual environment?"
17
+ ) from exc
18
+ execute_from_command_line(sys.argv)
19
+
20
+
21
+ if __name__ == "__main__":
22
+ main()
src/model.py DELETED
@@ -1,62 +0,0 @@
1
- import numpy as np
2
- from tensorflow.keras.utils import get_file
3
- from config import MODEL_HDF5_PATH
4
-
5
-
6
- with open("labels.txt", "r") as f:
7
- LABELS = list(filter(None, f.read().split("\n")))
8
-
9
-
10
-
11
- def initialize_model():
12
- # import the necessary packages
13
- from tensorflow.keras.models import Sequential
14
- from tensorflow.keras.layers import BatchNormalization
15
- from tensorflow.keras.layers import Conv2D, MaxPooling2D
16
- from tensorflow.keras.layers import Flatten, Dropout, Dense
17
-
18
- # CONV => RELU => POOL
19
- cnn = Sequential()
20
- inputShape = (224, 224, 3)
21
- chanDim = -1
22
- classes = 101
23
- # Sequence of Convolution (scan filters), BatchNormalization (normalize numbers),
24
- # MaxPooling (shrink tensor down), Dropout (prevent overfit)
25
- cnn.add(
26
- Conv2D(32, (3, 3), padding="same", input_shape=inputShape, activation="relu")
27
- )
28
- cnn.add(BatchNormalization(axis=chanDim))
29
- cnn.add(MaxPooling2D(pool_size=(3, 3)))
30
- cnn.add(Dropout(rate=0.25))
31
- cnn.add(Conv2D(64, (3, 3), padding="same", activation="relu"))
32
- cnn.add(BatchNormalization(axis=chanDim))
33
- cnn.add(Conv2D(64, (3, 3), padding="same", activation="relu"))
34
- cnn.add(BatchNormalization(axis=chanDim))
35
- cnn.add(MaxPooling2D(pool_size=(2, 2)))
36
- cnn.add(Dropout(rate=0.25))
37
- cnn.add(Conv2D(128, (3, 3), padding="same", activation="relu"))
38
- cnn.add(BatchNormalization(axis=chanDim))
39
- cnn.add(Conv2D(128, (3, 3), padding="same", activation="relu"))
40
- cnn.add(BatchNormalization(axis=chanDim))
41
- cnn.add(MaxPooling2D(pool_size=(2, 2)))
42
- cnn.add(Dropout(rate=0.25))
43
- cnn.add(Flatten())
44
- cnn.add(Dense(1024, activation="relu"))
45
- cnn.add(BatchNormalization())
46
- cnn.add(Dropout(rate=0.5))
47
- # softmax classifier
48
- cnn.add(Dense(classes, activation="softmax"))
49
-
50
- return cnn
51
-
52
-
53
- CNN = initialize_model()
54
-
55
-
56
- CNN.load_weights(
57
- get_file(
58
- "weights.hdf5",
59
- MODEL_HDF5_PATH,
60
- cache_dir="."
61
- )
62
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/model_client.py ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from typing import List, Optional, Tuple, Union
2
+
3
+ from django.core.files.uploadedfile import InMemoryUploadedFile, TemporaryUploadedFile
4
+
5
+ import logging
6
+
7
+ from huggingface_client.predict import predict_file, predict_url
8
+
9
+
10
+
11
+ def get_color_labels(guesses: List[str], actual_label: Optional[str]) -> List[str]:
12
+ if not actual_label:
13
+ return ["white"] * len(guesses)
14
+ return ["lime" if x == actual_label else "white" for x in guesses]
15
+
16
+
17
+ def url_image_vars(
18
+ input_img: Union[str, InMemoryUploadedFile, TemporaryUploadedFile], label: str
19
+ ) -> Tuple[List[str], List[str]]:
20
+ actual_label = label.title()
21
+ if isinstance(input_img, str):
22
+ top_guesses = predict_url(input_img)
23
+ elif isinstance(input_img, (InMemoryUploadedFile, TemporaryUploadedFile)):
24
+ input_img.seek(0)
25
+ top_guesses = predict_file(input_img.read())
26
+ else:
27
+ logging.error(f"Unknown input type: {type(input_img)=}")
28
+ top_guesses = ["Unknown Input Type", "", "", "", ""]
29
+ color_labels = get_color_labels(top_guesses, actual_label)
30
+ return top_guesses, color_labels
31
+
src/predict.py DELETED
@@ -1,10 +0,0 @@
1
- from model import CNN, LABELS
2
-
3
-
4
-
5
- def predict_model(img_array):
6
- class_prob = CNN.predict(img_array)
7
- top_values_index = (-class_prob).argsort()[0][:10]
8
- top_guesses = [LABELS[i].title() for i in top_values_index]
9
-
10
- return top_guesses
 
 
 
 
 
 
 
 
 
 
 
src/requirements.in CHANGED
@@ -1,6 +1,10 @@
 
 
 
 
 
 
 
 
1
  tensorflow
2
- fastapi
3
- uvicorn
4
  scikit-image
5
- numpy
6
- python-multipart
 
1
+ django
2
+ gunicorn
3
+ requests
4
+ numpy
5
+ joblib
6
+ whitenoise
7
+ pillow
8
+ transformers
9
  tensorflow
 
 
10
  scikit-image
 
 
src/requirements.txt CHANGED
@@ -8,25 +8,31 @@ absl-py==1.4.0
8
  # via
9
  # tensorboard
10
  # tensorflow
11
- anyio==3.6.2
12
- # via starlette
13
  astunparse==1.6.3
14
  # via tensorflow
 
 
15
  cachetools==5.3.0
16
  # via google-auth
17
  certifi==2023.5.7
18
  # via requests
19
  charset-normalizer==3.1.0
20
  # via requests
21
- click==8.1.3
22
- # via uvicorn
23
- fastapi==0.95.2
24
  # via -r requirements.in
25
- flatbuffers==23.5.9
 
 
 
 
26
  # via tensorflow
 
 
27
  gast==0.4.0
28
  # via tensorflow
29
- google-auth==2.18.1
30
  # via
31
  # google-auth-oauthlib
32
  # tensorboard
@@ -38,24 +44,24 @@ grpcio==1.54.2
38
  # via
39
  # tensorboard
40
  # tensorflow
41
- h11==0.14.0
42
- # via uvicorn
43
  h5py==3.8.0
44
  # via tensorflow
 
 
45
  idna==3.4
46
- # via
47
- # anyio
48
- # requests
49
- imageio==2.28.1
50
  # via scikit-image
51
  importlib-metadata==6.6.0
52
  # via markdown
53
  jax==0.4.10
54
  # via tensorflow
 
 
55
  keras==2.12.0
56
  # via tensorflow
57
- lazy-loader==0.2
58
- # via scikit-image
59
  libclang==16.0.0
60
  # via tensorflow
61
  markdown==3.4.3
@@ -80,6 +86,7 @@ numpy==1.23.5
80
  # tensorboard
81
  # tensorflow
82
  # tifffile
 
83
  oauthlib==3.2.2
84
  # via requests-oauthlib
85
  opt-einsum==3.3.0
@@ -88,13 +95,16 @@ opt-einsum==3.3.0
88
  # tensorflow
89
  packaging==23.1
90
  # via
 
91
  # scikit-image
92
  # tensorflow
 
93
  pillow==9.5.0
94
  # via
 
95
  # imageio
96
  # scikit-image
97
- protobuf==4.23.1
98
  # via
99
  # tensorboard
100
  # tensorflow
@@ -104,23 +114,28 @@ pyasn1==0.5.0
104
  # rsa
105
  pyasn1-modules==0.3.0
106
  # via google-auth
107
- pydantic==1.10.7
108
- # via fastapi
109
- python-multipart==0.0.6
110
- # via -r requirements.in
111
  pywavelets==1.4.1
112
  # via scikit-image
 
 
 
 
 
 
113
  requests==2.30.0
114
  # via
 
 
115
  # requests-oauthlib
116
  # tensorboard
 
117
  requests-oauthlib==1.3.1
118
  # via google-auth-oauthlib
119
  rsa==4.9
120
  # via google-auth
121
- scikit-image==0.20.0
122
  # via -r requirements.in
123
- scipy==1.9.1
124
  # via
125
  # jax
126
  # scikit-image
@@ -130,10 +145,8 @@ six==1.16.0
130
  # google-auth
131
  # google-pasta
132
  # tensorflow
133
- sniffio==1.3.0
134
- # via anyio
135
- starlette==0.27.0
136
- # via fastapi
137
  tensorboard==2.12.3
138
  # via tensorflow
139
  tensorboard-data-server==0.7.0
@@ -148,23 +161,31 @@ termcolor==2.3.0
148
  # via tensorflow
149
  tifffile==2023.4.12
150
  # via scikit-image
 
 
 
 
 
 
 
 
151
  typing-extensions==4.5.0
152
  # via
153
- # pydantic
154
- # starlette
155
  # tensorflow
156
  urllib3==1.26.15
157
  # via
158
  # google-auth
159
  # requests
160
- uvicorn==0.22.0
161
- # via -r requirements.in
162
  werkzeug==2.3.4
163
  # via tensorboard
164
  wheel==0.40.0
165
  # via
166
  # astunparse
167
  # tensorboard
 
 
168
  wrapt==1.14.1
169
  # via tensorflow
170
  zipp==3.15.0
 
8
  # via
9
  # tensorboard
10
  # tensorflow
11
+ asgiref==3.7.1
12
+ # via django
13
  astunparse==1.6.3
14
  # via tensorflow
15
+ backports-zoneinfo==0.2.1
16
+ # via django
17
  cachetools==5.3.0
18
  # via google-auth
19
  certifi==2023.5.7
20
  # via requests
21
  charset-normalizer==3.1.0
22
  # via requests
23
+ django==4.2.1
 
 
24
  # via -r requirements.in
25
+ filelock==3.12.0
26
+ # via
27
+ # huggingface-hub
28
+ # transformers
29
+ flatbuffers==23.5.26
30
  # via tensorflow
31
+ fsspec==2023.5.0
32
+ # via huggingface-hub
33
  gast==0.4.0
34
  # via tensorflow
35
+ google-auth==2.19.0
36
  # via
37
  # google-auth-oauthlib
38
  # tensorboard
 
44
  # via
45
  # tensorboard
46
  # tensorflow
47
+ gunicorn==20.1.0
48
+ # via -r requirements.in
49
  h5py==3.8.0
50
  # via tensorflow
51
+ huggingface-hub==0.14.1
52
+ # via transformers
53
  idna==3.4
54
+ # via requests
55
+ imageio==2.29.0
 
 
56
  # via scikit-image
57
  importlib-metadata==6.6.0
58
  # via markdown
59
  jax==0.4.10
60
  # via tensorflow
61
+ joblib==1.2.0
62
+ # via -r requirements.in
63
  keras==2.12.0
64
  # via tensorflow
 
 
65
  libclang==16.0.0
66
  # via tensorflow
67
  markdown==3.4.3
 
86
  # tensorboard
87
  # tensorflow
88
  # tifffile
89
+ # transformers
90
  oauthlib==3.2.2
91
  # via requests-oauthlib
92
  opt-einsum==3.3.0
 
95
  # tensorflow
96
  packaging==23.1
97
  # via
98
+ # huggingface-hub
99
  # scikit-image
100
  # tensorflow
101
+ # transformers
102
  pillow==9.5.0
103
  # via
104
+ # -r requirements.in
105
  # imageio
106
  # scikit-image
107
+ protobuf==4.23.2
108
  # via
109
  # tensorboard
110
  # tensorflow
 
114
  # rsa
115
  pyasn1-modules==0.3.0
116
  # via google-auth
 
 
 
 
117
  pywavelets==1.4.1
118
  # via scikit-image
119
+ pyyaml==6.0
120
+ # via
121
+ # huggingface-hub
122
+ # transformers
123
+ regex==2023.5.5
124
+ # via transformers
125
  requests==2.30.0
126
  # via
127
+ # -r requirements.in
128
+ # huggingface-hub
129
  # requests-oauthlib
130
  # tensorboard
131
+ # transformers
132
  requests-oauthlib==1.3.1
133
  # via google-auth-oauthlib
134
  rsa==4.9
135
  # via google-auth
136
+ scikit-image==0.19.3
137
  # via -r requirements.in
138
+ scipy==1.10.1
139
  # via
140
  # jax
141
  # scikit-image
 
145
  # google-auth
146
  # google-pasta
147
  # tensorflow
148
+ sqlparse==0.4.4
149
+ # via django
 
 
150
  tensorboard==2.12.3
151
  # via tensorflow
152
  tensorboard-data-server==0.7.0
 
161
  # via tensorflow
162
  tifffile==2023.4.12
163
  # via scikit-image
164
+ tokenizers==0.13.3
165
+ # via transformers
166
+ tqdm==4.65.0
167
+ # via
168
+ # huggingface-hub
169
+ # transformers
170
+ transformers==4.29.2
171
+ # via -r requirements.in
172
  typing-extensions==4.5.0
173
  # via
174
+ # asgiref
175
+ # huggingface-hub
176
  # tensorflow
177
  urllib3==1.26.15
178
  # via
179
  # google-auth
180
  # requests
 
 
181
  werkzeug==2.3.4
182
  # via tensorboard
183
  wheel==0.40.0
184
  # via
185
  # astunparse
186
  # tensorboard
187
+ whitenoise==6.4.0
188
+ # via -r requirements.in
189
  wrapt==1.14.1
190
  # via tensorflow
191
  zipp==3.15.0
src/run_app.sh ADDED
@@ -0,0 +1 @@
 
 
1
+ python3 -m gunicorn grubguesser.wsgi --reload --workers=1 -b 0.0.0.0:7860
src/sample_list.txt ADDED
@@ -0,0 +1,1000 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ sample_images/fish_and_chips/1168170.jpg
2
+ sample_images/chocolate_cake/259749.jpg
3
+ sample_images/filet_mignon/1193043.jpg
4
+ sample_images/ramen/503328.jpg
5
+ sample_images/pancakes/3607557.jpg
6
+ sample_images/clam_chowder/3412571.jpg
7
+ sample_images/bruschetta/908968.jpg
8
+ sample_images/frozen_yogurt/2032662.jpg
9
+ sample_images/paella/1494747.jpg
10
+ sample_images/pizza/3475871.jpg
11
+ sample_images/oysters/142616.jpg
12
+ sample_images/tuna_tartare/3624042.jpg
13
+ sample_images/beef_carpaccio/3914142.jpg
14
+ sample_images/hummus/1888173.jpg
15
+ sample_images/baby_back_ribs/3446846.jpg
16
+ sample_images/beef_tartare/3782956.jpg
17
+ sample_images/falafel/94008.jpg
18
+ sample_images/ceviche/2754053.jpg
19
+ sample_images/ice_cream/1504172.jpg
20
+ sample_images/edamame/3800272.jpg
21
+ sample_images/dumplings/1517770.jpg
22
+ sample_images/french_onion_soup/373134.jpg
23
+ sample_images/baby_back_ribs/2032061.jpg
24
+ sample_images/dumplings/513541.jpg
25
+ sample_images/chicken_quesadilla/2738733.jpg
26
+ sample_images/cannoli/2060152.jpg
27
+ sample_images/red_velvet_cake/133541.jpg
28
+ sample_images/fish_and_chips/475763.jpg
29
+ sample_images/falafel/652718.jpg
30
+ sample_images/fish_and_chips/55493.jpg
31
+ sample_images/chicken_quesadilla/371885.jpg
32
+ sample_images/shrimp_and_grits/188249.jpg
33
+ sample_images/ceviche/3122438.jpg
34
+ sample_images/eggs_benedict/3596887.jpg
35
+ sample_images/spaghetti_carbonara/1546914.jpg
36
+ sample_images/baklava/3009508.jpg
37
+ sample_images/gyoza/3250513.jpg
38
+ sample_images/pancakes/2226088.jpg
39
+ sample_images/lasagna/976466.jpg
40
+ sample_images/scallops/3192548.jpg
41
+ sample_images/oysters/3391415.jpg
42
+ sample_images/red_velvet_cake/3227242.jpg
43
+ sample_images/greek_salad/3787249.jpg
44
+ sample_images/foie_gras/556139.jpg
45
+ sample_images/chocolate_cake/641521.jpg
46
+ sample_images/fried_rice/1054627.jpg
47
+ sample_images/pulled_pork_sandwich/2120438.jpg
48
+ sample_images/greek_salad/359977.jpg
49
+ sample_images/deviled_eggs/3395530.jpg
50
+ sample_images/pizza/331644.jpg
51
+ sample_images/macaroni_and_cheese/1692489.jpg
52
+ sample_images/beignets/48150.jpg
53
+ sample_images/french_onion_soup/3766155.jpg
54
+ sample_images/onion_rings/321297.jpg
55
+ sample_images/greek_salad/1961350.jpg
56
+ sample_images/caesar_salad/2521424.jpg
57
+ sample_images/chicken_curry/392185.jpg
58
+ sample_images/bruschetta/829232.jpg
59
+ sample_images/chocolate_mousse/3607716.jpg
60
+ sample_images/onion_rings/2573722.jpg
61
+ sample_images/cheesecake/3049427.jpg
62
+ sample_images/cannoli/1628010.jpg
63
+ sample_images/paella/2809000.jpg
64
+ sample_images/tiramisu/3369477.jpg
65
+ sample_images/cup_cakes/60474.jpg
66
+ sample_images/shrimp_and_grits/1955741.jpg
67
+ sample_images/french_fries/3586758.jpg
68
+ sample_images/ramen/291516.jpg
69
+ sample_images/huevos_rancheros/3606775.jpg
70
+ sample_images/chocolate_mousse/60139.jpg
71
+ sample_images/bibimbap/1952881.jpg
72
+ sample_images/steak/2921355.jpg
73
+ sample_images/eggs_benedict/3665428.jpg
74
+ sample_images/bibimbap/3434800.jpg
75
+ sample_images/huevos_rancheros/1800868.jpg
76
+ sample_images/tiramisu/3412914.jpg
77
+ sample_images/strawberry_shortcake/587263.jpg
78
+ sample_images/carrot_cake/2183129.jpg
79
+ sample_images/fried_rice/331282.jpg
80
+ sample_images/nachos/1075209.jpg
81
+ sample_images/panna_cotta/481801.jpg
82
+ sample_images/bruschetta/239704.jpg
83
+ sample_images/fish_and_chips/2192937.jpg
84
+ sample_images/donuts/2804713.jpg
85
+ sample_images/crab_cakes/2611772.jpg
86
+ sample_images/shrimp_and_grits/899184.jpg
87
+ sample_images/tuna_tartare/2014856.jpg
88
+ sample_images/apple_pie/3746599.jpg
89
+ sample_images/hot_and_sour_soup/3204149.jpg
90
+ sample_images/croque_madame/195657.jpg
91
+ sample_images/beef_tartare/2752297.jpg
92
+ sample_images/fried_rice/2186269.jpg
93
+ sample_images/crab_cakes/3068010.jpg
94
+ sample_images/chicken_curry/1409451.jpg
95
+ sample_images/baby_back_ribs/1873449.jpg
96
+ sample_images/carrot_cake/2277561.jpg
97
+ sample_images/pizza/212995.jpg
98
+ sample_images/spaghetti_carbonara/1853583.jpg
99
+ sample_images/pancakes/473383.jpg
100
+ sample_images/prime_rib/2596724.jpg
101
+ sample_images/ceviche/3143954.jpg
102
+ sample_images/bruschetta/3718167.jpg
103
+ sample_images/fried_calamari/2178804.jpg
104
+ sample_images/nachos/1168757.jpg
105
+ sample_images/pizza/1060407.jpg
106
+ sample_images/onion_rings/890921.jpg
107
+ sample_images/ice_cream/3743054.jpg
108
+ sample_images/chicken_curry/3351502.jpg
109
+ sample_images/bibimbap/548018.jpg
110
+ sample_images/beet_salad/454409.jpg
111
+ sample_images/pho/452762.jpg
112
+ sample_images/grilled_cheese_sandwich/1551096.jpg
113
+ sample_images/pulled_pork_sandwich/3703370.jpg
114
+ sample_images/pho/1139062.jpg
115
+ sample_images/hot_and_sour_soup/3177114.jpg
116
+ sample_images/escargots/1224760.jpg
117
+ sample_images/spaghetti_carbonara/1545299.jpg
118
+ sample_images/churros/2537428.jpg
119
+ sample_images/deviled_eggs/662604.jpg
120
+ sample_images/lobster_bisque/1111396.jpg
121
+ sample_images/chicken_wings/705250.jpg
122
+ sample_images/ice_cream/3410886.jpg
123
+ sample_images/baklava/1448425.jpg
124
+ sample_images/huevos_rancheros/1287764.jpg
125
+ sample_images/pizza/300157.jpg
126
+ sample_images/macaroni_and_cheese/3008448.jpg
127
+ sample_images/peking_duck/1012816.jpg
128
+ sample_images/caprese_salad/1807742.jpg
129
+ sample_images/pancakes/3900036.jpg
130
+ sample_images/deviled_eggs/2122001.jpg
131
+ sample_images/huevos_rancheros/613887.jpg
132
+ sample_images/club_sandwich/1096667.jpg
133
+ sample_images/paella/932110.jpg
134
+ sample_images/cheesecake/1890669.jpg
135
+ sample_images/ravioli/2878865.jpg
136
+ sample_images/tacos/2893468.jpg
137
+ sample_images/pad_thai/2227933.jpg
138
+ sample_images/macaroni_and_cheese/2897942.jpg
139
+ sample_images/caesar_salad/3244439.jpg
140
+ sample_images/sashimi/2114915.jpg
141
+ sample_images/grilled_salmon/3058966.jpg
142
+ sample_images/carrot_cake/1389512.jpg
143
+ sample_images/french_fries/2269039.jpg
144
+ sample_images/fish_and_chips/64762.jpg
145
+ sample_images/clam_chowder/21937.jpg
146
+ sample_images/escargots/451050.jpg
147
+ sample_images/french_onion_soup/3485582.jpg
148
+ sample_images/huevos_rancheros/1979878.jpg
149
+ sample_images/dumplings/2178767.jpg
150
+ sample_images/waffles/549187.jpg
151
+ sample_images/mussels/819222.jpg
152
+ sample_images/ceviche/2565501.jpg
153
+ sample_images/mussels/2625250.jpg
154
+ sample_images/waffles/2834849.jpg
155
+ sample_images/sashimi/2594076.jpg
156
+ sample_images/chocolate_mousse/1622112.jpg
157
+ sample_images/bread_pudding/1777993.jpg
158
+ sample_images/fish_and_chips/820685.jpg
159
+ sample_images/samosa/2773043.jpg
160
+ sample_images/samosa/3125094.jpg
161
+ sample_images/grilled_salmon/3237769.jpg
162
+ sample_images/tacos/322915.jpg
163
+ sample_images/baklava/2718099.jpg
164
+ sample_images/oysters/3361558.jpg
165
+ sample_images/ramen/3067372.jpg
166
+ sample_images/spaghetti_bolognese/2494379.jpg
167
+ sample_images/frozen_yogurt/3735306.jpg
168
+ sample_images/tuna_tartare/2958593.jpg
169
+ sample_images/churros/95272.jpg
170
+ sample_images/grilled_salmon/2652526.jpg
171
+ sample_images/pulled_pork_sandwich/1651676.jpg
172
+ sample_images/chocolate_mousse/3449482.jpg
173
+ sample_images/edamame/70117.jpg
174
+ sample_images/ramen/753557.jpg
175
+ sample_images/hamburger/577684.jpg
176
+ sample_images/nachos/2232364.jpg
177
+ sample_images/edamame/1620027.jpg
178
+ sample_images/lobster_roll_sandwich/2177217.jpg
179
+ sample_images/risotto/228300.jpg
180
+ sample_images/creme_brulee/3315681.jpg
181
+ sample_images/lobster_bisque/1008682.jpg
182
+ sample_images/waffles/1676746.jpg
183
+ sample_images/hot_dog/3495622.jpg
184
+ sample_images/dumplings/323499.jpg
185
+ sample_images/peking_duck/3027643.jpg
186
+ sample_images/ice_cream/519165.jpg
187
+ sample_images/omelette/3902864.jpg
188
+ sample_images/hot_dog/2503827.jpg
189
+ sample_images/garlic_bread/3697388.jpg
190
+ sample_images/sushi/3325565.jpg
191
+ sample_images/hummus/929626.jpg
192
+ sample_images/french_onion_soup/3475000.jpg
193
+ sample_images/pancakes/1800178.jpg
194
+ sample_images/french_onion_soup/2656204.jpg
195
+ sample_images/gnocchi/2605818.jpg
196
+ sample_images/miso_soup/3919372.jpg
197
+ sample_images/red_velvet_cake/2011498.jpg
198
+ sample_images/edamame/70183.jpg
199
+ sample_images/ceviche/953430.jpg
200
+ sample_images/chicken_curry/390080.jpg
201
+ sample_images/strawberry_shortcake/319500.jpg
202
+ sample_images/takoyaki/1022404.jpg
203
+ sample_images/lobster_roll_sandwich/283653.jpg
204
+ sample_images/samosa/730084.jpg
205
+ sample_images/caesar_salad/1369936.jpg
206
+ sample_images/shrimp_and_grits/2797598.jpg
207
+ sample_images/red_velvet_cake/569810.jpg
208
+ sample_images/strawberry_shortcake/844054.jpg
209
+ sample_images/ice_cream/2985290.jpg
210
+ sample_images/caesar_salad/267740.jpg
211
+ sample_images/tiramisu/3517382.jpg
212
+ sample_images/takoyaki/3310286.jpg
213
+ sample_images/lasagna/3098534.jpg
214
+ sample_images/lasagna/3762742.jpg
215
+ sample_images/frozen_yogurt/3550815.jpg
216
+ sample_images/risotto/727450.jpg
217
+ sample_images/gnocchi/3382390.jpg
218
+ sample_images/red_velvet_cake/3317730.jpg
219
+ sample_images/hamburger/1816650.jpg
220
+ sample_images/bruschetta/2160577.jpg
221
+ sample_images/paella/752587.jpg
222
+ sample_images/huevos_rancheros/2609320.jpg
223
+ sample_images/chocolate_mousse/2036876.jpg
224
+ sample_images/frozen_yogurt/2738125.jpg
225
+ sample_images/baby_back_ribs/1352978.jpg
226
+ sample_images/carrot_cake/1452452.jpg
227
+ sample_images/paella/964623.jpg
228
+ sample_images/escargots/1902762.jpg
229
+ sample_images/chicken_quesadilla/823085.jpg
230
+ sample_images/lobster_bisque/2149820.jpg
231
+ sample_images/chocolate_mousse/899470.jpg
232
+ sample_images/cheese_plate/1358652.jpg
233
+ sample_images/sushi/1676252.jpg
234
+ sample_images/dumplings/2372842.jpg
235
+ sample_images/nachos/3293771.jpg
236
+ sample_images/caprese_salad/1847628.jpg
237
+ sample_images/crab_cakes/2780770.jpg
238
+ sample_images/ravioli/128223.jpg
239
+ sample_images/chocolate_cake/3257568.jpg
240
+ sample_images/chocolate_cake/2340379.jpg
241
+ sample_images/donuts/3701283.jpg
242
+ sample_images/risotto/1239465.jpg
243
+ sample_images/bibimbap/1888221.jpg
244
+ sample_images/edamame/2198173.jpg
245
+ sample_images/pho/2844050.jpg
246
+ sample_images/baklava/3455436.jpg
247
+ sample_images/ramen/3295452.jpg
248
+ sample_images/pancakes/2893734.jpg
249
+ sample_images/croque_madame/1594573.jpg
250
+ sample_images/steak/2685931.jpg
251
+ sample_images/dumplings/514100.jpg
252
+ sample_images/greek_salad/2772598.jpg
253
+ sample_images/seaweed_salad/758365.jpg
254
+ sample_images/chocolate_cake/71490.jpg
255
+ sample_images/edamame/2545734.jpg
256
+ sample_images/oysters/446176.jpg
257
+ sample_images/pancakes/3608337.jpg
258
+ sample_images/mussels/3118008.jpg
259
+ sample_images/tacos/1983024.jpg
260
+ sample_images/beef_tartare/1835611.jpg
261
+ sample_images/pancakes/863585.jpg
262
+ sample_images/oysters/3333073.jpg
263
+ sample_images/caesar_salad/3716003.jpg
264
+ sample_images/pho/3087779.jpg
265
+ sample_images/foie_gras/1590207.jpg
266
+ sample_images/hot_and_sour_soup/3824797.jpg
267
+ sample_images/carrot_cake/869679.jpg
268
+ sample_images/pizza/2572488.jpg
269
+ sample_images/cannoli/3487659.jpg
270
+ sample_images/caprese_salad/3049523.jpg
271
+ sample_images/ramen/2598193.jpg
272
+ sample_images/macaroni_and_cheese/3256717.jpg
273
+ sample_images/edamame/453226.jpg
274
+ sample_images/carrot_cake/664311.jpg
275
+ sample_images/foie_gras/865452.jpg
276
+ sample_images/french_toast/1349772.jpg
277
+ sample_images/tiramisu/2473828.jpg
278
+ sample_images/onion_rings/2322074.jpg
279
+ sample_images/grilled_cheese_sandwich/2889391.jpg
280
+ sample_images/foie_gras/3677569.jpg
281
+ sample_images/ramen/398993.jpg
282
+ sample_images/fried_calamari/3134017.jpg
283
+ sample_images/tuna_tartare/3122272.jpg
284
+ sample_images/clam_chowder/1601126.jpg
285
+ sample_images/bruschetta/710425.jpg
286
+ sample_images/sushi/2800107.jpg
287
+ sample_images/crab_cakes/3468933.jpg
288
+ sample_images/lasagna/3874120.jpg
289
+ sample_images/ravioli/709670.jpg
290
+ sample_images/fried_calamari/1389368.jpg
291
+ sample_images/grilled_cheese_sandwich/1355521.jpg
292
+ sample_images/bibimbap/3431728.jpg
293
+ sample_images/greek_salad/54573.jpg
294
+ sample_images/donuts/2702384.jpg
295
+ sample_images/prime_rib/3025684.jpg
296
+ sample_images/churros/3546196.jpg
297
+ sample_images/caprese_salad/1502492.jpg
298
+ sample_images/paella/2438403.jpg
299
+ sample_images/macaroni_and_cheese/172982.jpg
300
+ sample_images/grilled_salmon/3851924.jpg
301
+ sample_images/filet_mignon/279236.jpg
302
+ sample_images/macaroni_and_cheese/637469.jpg
303
+ sample_images/pancakes/2829729.jpg
304
+ sample_images/cheese_plate/878085.jpg
305
+ sample_images/cannoli/726697.jpg
306
+ sample_images/pancakes/2563821.jpg
307
+ sample_images/baby_back_ribs/2897079.jpg
308
+ sample_images/guacamole/2614565.jpg
309
+ sample_images/gyoza/347465.jpg
310
+ sample_images/macarons/2103619.jpg
311
+ sample_images/pork_chop/1125422.jpg
312
+ sample_images/foie_gras/1896875.jpg
313
+ sample_images/bibimbap/3316386.jpg
314
+ sample_images/pancakes/3642018.jpg
315
+ sample_images/caprese_salad/3579079.jpg
316
+ sample_images/samosa/3492341.jpg
317
+ sample_images/ice_cream/1488989.jpg
318
+ sample_images/edamame/1721784.jpg
319
+ sample_images/steak/653303.jpg
320
+ sample_images/strawberry_shortcake/3632935.jpg
321
+ sample_images/churros/3513246.jpg
322
+ sample_images/cheesecake/708439.jpg
323
+ sample_images/gyoza/2388184.jpg
324
+ sample_images/lobster_bisque/1262226.jpg
325
+ sample_images/pulled_pork_sandwich/608734.jpg
326
+ sample_images/edamame/1426533.jpg
327
+ sample_images/samosa/1583992.jpg
328
+ sample_images/chicken_quesadilla/3009173.jpg
329
+ sample_images/frozen_yogurt/453269.jpg
330
+ sample_images/edamame/2293007.jpg
331
+ sample_images/caesar_salad/2269300.jpg
332
+ sample_images/cheese_plate/654994.jpg
333
+ sample_images/sushi/858157.jpg
334
+ sample_images/paella/904487.jpg
335
+ sample_images/samosa/626821.jpg
336
+ sample_images/deviled_eggs/885350.jpg
337
+ sample_images/tuna_tartare/568199.jpg
338
+ sample_images/grilled_salmon/3601246.jpg
339
+ sample_images/sashimi/1593443.jpg
340
+ sample_images/spring_rolls/2776715.jpg
341
+ sample_images/scallops/1036780.jpg
342
+ sample_images/grilled_salmon/3732483.jpg
343
+ sample_images/chocolate_mousse/2475136.jpg
344
+ sample_images/garlic_bread/2500649.jpg
345
+ sample_images/paella/1081232.jpg
346
+ sample_images/spring_rolls/3725958.jpg
347
+ sample_images/foie_gras/3473853.jpg
348
+ sample_images/pork_chop/2560929.jpg
349
+ sample_images/ice_cream/2040874.jpg
350
+ sample_images/ceviche/2450809.jpg
351
+ sample_images/omelette/1940523.jpg
352
+ sample_images/panna_cotta/2616026.jpg
353
+ sample_images/macarons/3323983.jpg
354
+ sample_images/chicken_curry/2947167.jpg
355
+ sample_images/gnocchi/1600493.jpg
356
+ sample_images/dumplings/2385016.jpg
357
+ sample_images/spaghetti_carbonara/154021.jpg
358
+ sample_images/lobster_roll_sandwich/2486975.jpg
359
+ sample_images/donuts/222806.jpg
360
+ sample_images/poutine/2657558.jpg
361
+ sample_images/beignets/2249116.jpg
362
+ sample_images/omelette/2353178.jpg
363
+ sample_images/cup_cakes/951611.jpg
364
+ sample_images/crab_cakes/3504994.jpg
365
+ sample_images/hot_dog/115411.jpg
366
+ sample_images/omelette/955537.jpg
367
+ sample_images/pork_chop/1071034.jpg
368
+ sample_images/cup_cakes/137560.jpg
369
+ sample_images/cheese_plate/1769785.jpg
370
+ sample_images/pulled_pork_sandwich/800659.jpg
371
+ sample_images/macarons/1075.jpg
372
+ sample_images/ravioli/1155126.jpg
373
+ sample_images/fried_rice/28981.jpg
374
+ sample_images/fried_rice/3902013.jpg
375
+ sample_images/oysters/1670024.jpg
376
+ sample_images/filet_mignon/3144085.jpg
377
+ sample_images/spaghetti_carbonara/3916536.jpg
378
+ sample_images/cheese_plate/1597591.jpg
379
+ sample_images/ice_cream/3135306.jpg
380
+ sample_images/greek_salad/33170.jpg
381
+ sample_images/pork_chop/1337951.jpg
382
+ sample_images/huevos_rancheros/2854900.jpg
383
+ sample_images/pork_chop/2751178.jpg
384
+ sample_images/frozen_yogurt/801625.jpg
385
+ sample_images/bibimbap/3622080.jpg
386
+ sample_images/waffles/1554866.jpg
387
+ sample_images/fried_rice/61401.jpg
388
+ sample_images/gyoza/341182.jpg
389
+ sample_images/breakfast_burrito/1318619.jpg
390
+ sample_images/shrimp_and_grits/2540818.jpg
391
+ sample_images/spring_rolls/732464.jpg
392
+ sample_images/tiramisu/627976.jpg
393
+ sample_images/lobster_roll_sandwich/2299697.jpg
394
+ sample_images/club_sandwich/1290943.jpg
395
+ sample_images/spaghetti_bolognese/2377001.jpg
396
+ sample_images/seaweed_salad/2684780.jpg
397
+ sample_images/seaweed_salad/627232.jpg
398
+ sample_images/carrot_cake/2115502.jpg
399
+ sample_images/lasagna/2555366.jpg
400
+ sample_images/pho/2564969.jpg
401
+ sample_images/guacamole/244609.jpg
402
+ sample_images/cup_cakes/8898.jpg
403
+ sample_images/paella/700738.jpg
404
+ sample_images/chicken_quesadilla/3614780.jpg
405
+ sample_images/risotto/3841341.jpg
406
+ sample_images/beignets/657579.jpg
407
+ sample_images/red_velvet_cake/2601161.jpg
408
+ sample_images/ramen/1368561.jpg
409
+ sample_images/lasagna/2664248.jpg
410
+ sample_images/guacamole/496267.jpg
411
+ sample_images/frozen_yogurt/1512742.jpg
412
+ sample_images/waffles/1845952.jpg
413
+ sample_images/tuna_tartare/3274262.jpg
414
+ sample_images/caesar_salad/1700074.jpg
415
+ sample_images/prime_rib/1917065.jpg
416
+ sample_images/tiramisu/353454.jpg
417
+ sample_images/carrot_cake/759507.jpg
418
+ sample_images/escargots/3589932.jpg
419
+ sample_images/waffles/2969913.jpg
420
+ sample_images/strawberry_shortcake/574064.jpg
421
+ sample_images/fried_calamari/1822912.jpg
422
+ sample_images/nachos/1117309.jpg
423
+ sample_images/donuts/3014911.jpg
424
+ sample_images/strawberry_shortcake/81547.jpg
425
+ sample_images/chicken_wings/2687060.jpg
426
+ sample_images/escargots/81395.jpg
427
+ sample_images/french_fries/885543.jpg
428
+ sample_images/falafel/1579072.jpg
429
+ sample_images/baklava/763258.jpg
430
+ sample_images/hummus/1071114.jpg
431
+ sample_images/hamburger/3563379.jpg
432
+ sample_images/fish_and_chips/1961695.jpg
433
+ sample_images/miso_soup/2702196.jpg
434
+ sample_images/crab_cakes/2126255.jpg
435
+ sample_images/gnocchi/1696103.jpg
436
+ sample_images/sushi/988559.jpg
437
+ sample_images/falafel/1264312.jpg
438
+ sample_images/prime_rib/1570554.jpg
439
+ sample_images/ice_cream/2769826.jpg
440
+ sample_images/fish_and_chips/1563192.jpg
441
+ sample_images/shrimp_and_grits/3890680.jpg
442
+ sample_images/clam_chowder/3137442.jpg
443
+ sample_images/spaghetti_bolognese/3215075.jpg
444
+ sample_images/hamburger/398340.jpg
445
+ sample_images/pulled_pork_sandwich/904515.jpg
446
+ sample_images/cheesecake/2332717.jpg
447
+ sample_images/pho/108075.jpg
448
+ sample_images/lasagna/2467378.jpg
449
+ sample_images/caesar_salad/1046195.jpg
450
+ sample_images/lobster_roll_sandwich/946365.jpg
451
+ sample_images/eggs_benedict/2496776.jpg
452
+ sample_images/steak/3548389.jpg
453
+ sample_images/seaweed_salad/1775079.jpg
454
+ sample_images/shrimp_and_grits/1530531.jpg
455
+ sample_images/tuna_tartare/90780.jpg
456
+ sample_images/ice_cream/1482943.jpg
457
+ sample_images/mussels/3113057.jpg
458
+ sample_images/nachos/217585.jpg
459
+ sample_images/dumplings/923590.jpg
460
+ sample_images/caesar_salad/355980.jpg
461
+ sample_images/chicken_wings/2573245.jpg
462
+ sample_images/filet_mignon/2204089.jpg
463
+ sample_images/lobster_bisque/813441.jpg
464
+ sample_images/samosa/2111434.jpg
465
+ sample_images/fried_calamari/601291.jpg
466
+ sample_images/breakfast_burrito/3582859.jpg
467
+ sample_images/falafel/1785678.jpg
468
+ sample_images/paella/1297738.jpg
469
+ sample_images/hot_dog/2295811.jpg
470
+ sample_images/chicken_wings/644288.jpg
471
+ sample_images/cheese_plate/1023521.jpg
472
+ sample_images/eggs_benedict/2526121.jpg
473
+ sample_images/prime_rib/2910802.jpg
474
+ sample_images/macaroni_and_cheese/1825607.jpg
475
+ sample_images/bruschetta/1018048.jpg
476
+ sample_images/omelette/3125509.jpg
477
+ sample_images/filet_mignon/2610109.jpg
478
+ sample_images/beignets/3333828.jpg
479
+ sample_images/edamame/814753.jpg
480
+ sample_images/caprese_salad/129865.jpg
481
+ sample_images/spaghetti_carbonara/1223435.jpg
482
+ sample_images/cannoli/1087676.jpg
483
+ sample_images/edamame/401098.jpg
484
+ sample_images/cup_cakes/3685871.jpg
485
+ sample_images/shrimp_and_grits/1078946.jpg
486
+ sample_images/prime_rib/131503.jpg
487
+ sample_images/deviled_eggs/546418.jpg
488
+ sample_images/grilled_cheese_sandwich/3533671.jpg
489
+ sample_images/club_sandwich/2256162.jpg
490
+ sample_images/ravioli/722639.jpg
491
+ sample_images/takoyaki/398037.jpg
492
+ sample_images/chocolate_cake/2585626.jpg
493
+ sample_images/mussels/3402102.jpg
494
+ sample_images/pho/2001863.jpg
495
+ sample_images/lasagna/3628964.jpg
496
+ sample_images/tiramisu/909253.jpg
497
+ sample_images/apple_pie/1514110.jpg
498
+ sample_images/fried_calamari/80030.jpg
499
+ sample_images/bread_pudding/375776.jpg
500
+ sample_images/beef_tartare/948352.jpg
501
+ sample_images/bibimbap/1117690.jpg
502
+ sample_images/filet_mignon/3661944.jpg
503
+ sample_images/ice_cream/580476.jpg
504
+ sample_images/red_velvet_cake/153479.jpg
505
+ sample_images/filet_mignon/1038503.jpg
506
+ sample_images/nachos/2533863.jpg
507
+ sample_images/club_sandwich/3298554.jpg
508
+ sample_images/crab_cakes/1005068.jpg
509
+ sample_images/grilled_salmon/2802649.jpg
510
+ sample_images/bruschetta/1714870.jpg
511
+ sample_images/escargots/2064789.jpg
512
+ sample_images/falafel/1898638.jpg
513
+ sample_images/fried_calamari/756355.jpg
514
+ sample_images/filet_mignon/3608344.jpg
515
+ sample_images/lasagna/2704381.jpg
516
+ sample_images/red_velvet_cake/2593077.jpg
517
+ sample_images/filet_mignon/2046519.jpg
518
+ sample_images/shrimp_and_grits/552618.jpg
519
+ sample_images/guacamole/2222704.jpg
520
+ sample_images/edamame/1530694.jpg
521
+ sample_images/sushi/1795747.jpg
522
+ sample_images/clam_chowder/3399924.jpg
523
+ sample_images/poutine/3073839.jpg
524
+ sample_images/french_toast/95614.jpg
525
+ sample_images/donuts/317068.jpg
526
+ sample_images/chicken_curry/617523.jpg
527
+ sample_images/ice_cream/3523878.jpg
528
+ sample_images/chicken_curry/1351520.jpg
529
+ sample_images/cannoli/1975469.jpg
530
+ sample_images/huevos_rancheros/1510794.jpg
531
+ sample_images/hamburger/2034553.jpg
532
+ sample_images/panna_cotta/467863.jpg
533
+ sample_images/caesar_salad/2877666.jpg
534
+ sample_images/bruschetta/938199.jpg
535
+ sample_images/lobster_bisque/517646.jpg
536
+ sample_images/beef_carpaccio/898749.jpg
537
+ sample_images/edamame/3181559.jpg
538
+ sample_images/fried_rice/2349818.jpg
539
+ sample_images/waffles/389675.jpg
540
+ sample_images/dumplings/7421.jpg
541
+ sample_images/french_onion_soup/297334.jpg
542
+ sample_images/red_velvet_cake/1297812.jpg
543
+ sample_images/baby_back_ribs/1495381.jpg
544
+ sample_images/deviled_eggs/1970158.jpg
545
+ sample_images/fried_calamari/38346.jpg
546
+ sample_images/cannoli/1763885.jpg
547
+ sample_images/club_sandwich/3900686.jpg
548
+ sample_images/fish_and_chips/3589353.jpg
549
+ sample_images/beef_tartare/2580153.jpg
550
+ sample_images/french_fries/566728.jpg
551
+ sample_images/french_fries/2838364.jpg
552
+ sample_images/grilled_salmon/3922365.jpg
553
+ sample_images/creme_brulee/2661416.jpg
554
+ sample_images/poutine/2754839.jpg
555
+ sample_images/croque_madame/2348177.jpg
556
+ sample_images/fish_and_chips/1164299.jpg
557
+ sample_images/greek_salad/233254.jpg
558
+ sample_images/ice_cream/1756584.jpg
559
+ sample_images/cup_cakes/1157931.jpg
560
+ sample_images/huevos_rancheros/1691890.jpg
561
+ sample_images/pho/2872388.jpg
562
+ sample_images/creme_brulee/2960858.jpg
563
+ sample_images/filet_mignon/256822.jpg
564
+ sample_images/cannoli/1922681.jpg
565
+ sample_images/eggs_benedict/900631.jpg
566
+ sample_images/ceviche/597917.jpg
567
+ sample_images/chocolate_mousse/1008451.jpg
568
+ sample_images/fried_rice/2834370.jpg
569
+ sample_images/grilled_salmon/3376638.jpg
570
+ sample_images/filet_mignon/134179.jpg
571
+ sample_images/escargots/3051922.jpg
572
+ sample_images/chicken_wings/1220851.jpg
573
+ sample_images/beet_salad/2199309.jpg
574
+ sample_images/hummus/288902.jpg
575
+ sample_images/caprese_salad/1375670.jpg
576
+ sample_images/chicken_wings/726396.jpg
577
+ sample_images/mussels/3471255.jpg
578
+ sample_images/tacos/1737798.jpg
579
+ sample_images/waffles/2923372.jpg
580
+ sample_images/oysters/3814235.jpg
581
+ sample_images/chicken_wings/2522049.jpg
582
+ sample_images/peking_duck/907389.jpg
583
+ sample_images/fried_rice/332814.jpg
584
+ sample_images/ceviche/1716967.jpg
585
+ sample_images/garlic_bread/471541.jpg
586
+ sample_images/chicken_quesadilla/1872009.jpg
587
+ sample_images/club_sandwich/797815.jpg
588
+ sample_images/spaghetti_carbonara/2282781.jpg
589
+ sample_images/french_fries/1394977.jpg
590
+ sample_images/shrimp_and_grits/440236.jpg
591
+ sample_images/edamame/1318975.jpg
592
+ sample_images/baby_back_ribs/1150028.jpg
593
+ sample_images/caesar_salad/1348525.jpg
594
+ sample_images/gnocchi/3193637.jpg
595
+ sample_images/nachos/101954.jpg
596
+ sample_images/creme_brulee/47184.jpg
597
+ sample_images/oysters/2635092.jpg
598
+ sample_images/steak/66207.jpg
599
+ sample_images/apple_pie/2214366.jpg
600
+ sample_images/donuts/1536111.jpg
601
+ sample_images/oysters/1044823.jpg
602
+ sample_images/macarons/1529761.jpg
603
+ sample_images/french_fries/2783225.jpg
604
+ sample_images/gyoza/448142.jpg
605
+ sample_images/seaweed_salad/967376.jpg
606
+ sample_images/fish_and_chips/5705.jpg
607
+ sample_images/oysters/2682469.jpg
608
+ sample_images/fried_calamari/2397782.jpg
609
+ sample_images/oysters/3865179.jpg
610
+ sample_images/fried_rice/2872060.jpg
611
+ sample_images/bread_pudding/3434169.jpg
612
+ sample_images/gnocchi/2402288.jpg
613
+ sample_images/hamburger/272642.jpg
614
+ sample_images/cup_cakes/665426.jpg
615
+ sample_images/strawberry_shortcake/2451314.jpg
616
+ sample_images/apple_pie/2477191.jpg
617
+ sample_images/cannoli/2535080.jpg
618
+ sample_images/hot_dog/3142993.jpg
619
+ sample_images/garlic_bread/3165078.jpg
620
+ sample_images/breakfast_burrito/1000920.jpg
621
+ sample_images/ceviche/442941.jpg
622
+ sample_images/cheesecake/3278890.jpg
623
+ sample_images/macarons/3798098.jpg
624
+ sample_images/onion_rings/1949982.jpg
625
+ sample_images/strawberry_shortcake/3626999.jpg
626
+ sample_images/risotto/580259.jpg
627
+ sample_images/grilled_cheese_sandwich/1475505.jpg
628
+ sample_images/caesar_salad/1050382.jpg
629
+ sample_images/sushi/3257589.jpg
630
+ sample_images/macaroni_and_cheese/610691.jpg
631
+ sample_images/macaroni_and_cheese/663594.jpg
632
+ sample_images/beef_carpaccio/499131.jpg
633
+ sample_images/hot_dog/76618.jpg
634
+ sample_images/dumplings/3363745.jpg
635
+ sample_images/hamburger/281733.jpg
636
+ sample_images/pancakes/420861.jpg
637
+ sample_images/creme_brulee/829640.jpg
638
+ sample_images/grilled_salmon/1771963.jpg
639
+ sample_images/fried_calamari/1123519.jpg
640
+ sample_images/baby_back_ribs/2272205.jpg
641
+ sample_images/tacos/1910630.jpg
642
+ sample_images/cheesecake/2439835.jpg
643
+ sample_images/baby_back_ribs/1005066.jpg
644
+ sample_images/fried_calamari/3550738.jpg
645
+ sample_images/club_sandwich/2643704.jpg
646
+ sample_images/prime_rib/1283817.jpg
647
+ sample_images/greek_salad/2151262.jpg
648
+ sample_images/grilled_cheese_sandwich/1854869.jpg
649
+ sample_images/panna_cotta/3562574.jpg
650
+ sample_images/onion_rings/57508.jpg
651
+ sample_images/bruschetta/2477638.jpg
652
+ sample_images/panna_cotta/985635.jpg
653
+ sample_images/fried_calamari/2007862.jpg
654
+ sample_images/pizza/1220156.jpg
655
+ sample_images/hamburger/2836933.jpg
656
+ sample_images/hummus/339879.jpg
657
+ sample_images/donuts/3049824.jpg
658
+ sample_images/dumplings/3532122.jpg
659
+ sample_images/pork_chop/1408421.jpg
660
+ sample_images/chicken_curry/3050643.jpg
661
+ sample_images/churros/2562650.jpg
662
+ sample_images/club_sandwich/3582066.jpg
663
+ sample_images/tuna_tartare/2116073.jpg
664
+ sample_images/dumplings/3781725.jpg
665
+ sample_images/tuna_tartare/3394841.jpg
666
+ sample_images/carrot_cake/1070211.jpg
667
+ sample_images/chicken_curry/205916.jpg
668
+ sample_images/risotto/3668243.jpg
669
+ sample_images/beef_tartare/2654675.jpg
670
+ sample_images/eggs_benedict/3516091.jpg
671
+ sample_images/ceviche/1584989.jpg
672
+ sample_images/risotto/493827.jpg
673
+ sample_images/ramen/1476274.jpg
674
+ sample_images/cheese_plate/1777806.jpg
675
+ sample_images/gyoza/1391144.jpg
676
+ sample_images/churros/2037510.jpg
677
+ sample_images/guacamole/1019363.jpg
678
+ sample_images/steak/673127.jpg
679
+ sample_images/fish_and_chips/2583722.jpg
680
+ sample_images/tuna_tartare/3771542.jpg
681
+ sample_images/caprese_salad/840906.jpg
682
+ sample_images/hamburger/1317285.jpg
683
+ sample_images/chicken_wings/44776.jpg
684
+ sample_images/grilled_salmon/2023671.jpg
685
+ sample_images/garlic_bread/1647989.jpg
686
+ sample_images/poutine/2354170.jpg
687
+ sample_images/french_toast/331736.jpg
688
+ sample_images/red_velvet_cake/1373641.jpg
689
+ sample_images/miso_soup/2699022.jpg
690
+ sample_images/creme_brulee/216644.jpg
691
+ sample_images/nachos/1568961.jpg
692
+ sample_images/french_fries/2737860.jpg
693
+ sample_images/fish_and_chips/1973869.jpg
694
+ sample_images/macaroni_and_cheese/2177740.jpg
695
+ sample_images/fried_calamari/1952068.jpg
696
+ sample_images/steak/2619782.jpg
697
+ sample_images/frozen_yogurt/1620424.jpg
698
+ sample_images/poutine/2205207.jpg
699
+ sample_images/baklava/1264253.jpg
700
+ sample_images/cheese_plate/3106234.jpg
701
+ sample_images/fish_and_chips/210499.jpg
702
+ sample_images/tiramisu/538788.jpg
703
+ sample_images/macaroni_and_cheese/2715762.jpg
704
+ sample_images/panna_cotta/1710156.jpg
705
+ sample_images/escargots/225653.jpg
706
+ sample_images/bruschetta/2188008.jpg
707
+ sample_images/macaroni_and_cheese/2449426.jpg
708
+ sample_images/guacamole/3223459.jpg
709
+ sample_images/ramen/326043.jpg
710
+ sample_images/dumplings/3485502.jpg
711
+ sample_images/crab_cakes/3670.jpg
712
+ sample_images/shrimp_and_grits/3197830.jpg
713
+ sample_images/cannoli/2985044.jpg
714
+ sample_images/crab_cakes/70919.jpg
715
+ sample_images/macaroni_and_cheese/714369.jpg
716
+ sample_images/hot_dog/335113.jpg
717
+ sample_images/beef_tartare/2265986.jpg
718
+ sample_images/chicken_wings/76731.jpg
719
+ sample_images/steak/690477.jpg
720
+ sample_images/pancakes/359152.jpg
721
+ sample_images/cheesecake/1092082.jpg
722
+ sample_images/cheese_plate/3912932.jpg
723
+ sample_images/club_sandwich/869999.jpg
724
+ sample_images/caesar_salad/2593985.jpg
725
+ sample_images/beef_tartare/1743614.jpg
726
+ sample_images/apple_pie/1854241.jpg
727
+ sample_images/seaweed_salad/1886174.jpg
728
+ sample_images/gnocchi/330166.jpg
729
+ sample_images/shrimp_and_grits/2030234.jpg
730
+ sample_images/pizza/2003290.jpg
731
+ sample_images/cannoli/2338677.jpg
732
+ sample_images/gyoza/3245704.jpg
733
+ sample_images/bread_pudding/3196664.jpg
734
+ sample_images/foie_gras/3384537.jpg
735
+ sample_images/lobster_bisque/2544717.jpg
736
+ sample_images/mussels/1456992.jpg
737
+ sample_images/takoyaki/2332481.jpg
738
+ sample_images/beignets/957130.jpg
739
+ sample_images/foie_gras/2949484.jpg
740
+ sample_images/mussels/273189.jpg
741
+ sample_images/risotto/1226468.jpg
742
+ sample_images/garlic_bread/661873.jpg
743
+ sample_images/prime_rib/842936.jpg
744
+ sample_images/ramen/2339284.jpg
745
+ sample_images/mussels/556142.jpg
746
+ sample_images/churros/2371997.jpg
747
+ sample_images/gyoza/2350002.jpg
748
+ sample_images/escargots/329198.jpg
749
+ sample_images/gnocchi/293829.jpg
750
+ sample_images/apple_pie/1526484.jpg
751
+ sample_images/caesar_salad/130246.jpg
752
+ sample_images/lasagna/3609916.jpg
753
+ sample_images/strawberry_shortcake/3043860.jpg
754
+ sample_images/hamburger/85915.jpg
755
+ sample_images/beignets/1242023.jpg
756
+ sample_images/apple_pie/3720779.jpg
757
+ sample_images/fish_and_chips/3635042.jpg
758
+ sample_images/pho/898135.jpg
759
+ sample_images/peking_duck/704368.jpg
760
+ sample_images/ceviche/1469050.jpg
761
+ sample_images/ice_cream/3532895.jpg
762
+ sample_images/filet_mignon/3802696.jpg
763
+ sample_images/pancakes/3816498.jpg
764
+ sample_images/pad_thai/380868.jpg
765
+ sample_images/seaweed_salad/365450.jpg
766
+ sample_images/crab_cakes/2704452.jpg
767
+ sample_images/pulled_pork_sandwich/272941.jpg
768
+ sample_images/gyoza/2323610.jpg
769
+ sample_images/beef_carpaccio/2224490.jpg
770
+ sample_images/ceviche/3406403.jpg
771
+ sample_images/panna_cotta/3413766.jpg
772
+ sample_images/onion_rings/2727446.jpg
773
+ sample_images/pancakes/1042445.jpg
774
+ sample_images/cheesecake/2522718.jpg
775
+ sample_images/peking_duck/1893881.jpg
776
+ sample_images/bruschetta/3092131.jpg
777
+ sample_images/takoyaki/3282391.jpg
778
+ sample_images/french_toast/395267.jpg
779
+ sample_images/apple_pie/812047.jpg
780
+ sample_images/waffles/153584.jpg
781
+ sample_images/baklava/1029051.jpg
782
+ sample_images/sushi/1654256.jpg
783
+ sample_images/hummus/709420.jpg
784
+ sample_images/beef_tartare/683016.jpg
785
+ sample_images/cheese_plate/3544634.jpg
786
+ sample_images/frozen_yogurt/25464.jpg
787
+ sample_images/fried_rice/855247.jpg
788
+ sample_images/bread_pudding/3871497.jpg
789
+ sample_images/escargots/3057366.jpg
790
+ sample_images/lobster_roll_sandwich/962425.jpg
791
+ sample_images/omelette/281036.jpg
792
+ sample_images/deviled_eggs/1923960.jpg
793
+ sample_images/hot_and_sour_soup/2760407.jpg
794
+ sample_images/prime_rib/1520728.jpg
795
+ sample_images/cup_cakes/206408.jpg
796
+ sample_images/chicken_curry/1560488.jpg
797
+ sample_images/beef_carpaccio/2502843.jpg
798
+ sample_images/french_fries/3184259.jpg
799
+ sample_images/tacos/1777864.jpg
800
+ sample_images/hot_and_sour_soup/3174858.jpg
801
+ sample_images/tiramisu/524973.jpg
802
+ sample_images/pad_thai/788616.jpg
803
+ sample_images/greek_salad/2004121.jpg
804
+ sample_images/bread_pudding/120781.jpg
805
+ sample_images/ravioli/655833.jpg
806
+ sample_images/ceviche/2328743.jpg
807
+ sample_images/pancakes/253922.jpg
808
+ sample_images/mussels/1445945.jpg
809
+ sample_images/hot_dog/2310992.jpg
810
+ sample_images/pulled_pork_sandwich/2148902.jpg
811
+ sample_images/huevos_rancheros/1920552.jpg
812
+ sample_images/chocolate_mousse/2310232.jpg
813
+ sample_images/pulled_pork_sandwich/3825873.jpg
814
+ sample_images/beef_tartare/2884746.jpg
815
+ sample_images/lobster_bisque/2358791.jpg
816
+ sample_images/macaroni_and_cheese/3399102.jpg
817
+ sample_images/sashimi/1070787.jpg
818
+ sample_images/beef_carpaccio/1044312.jpg
819
+ sample_images/baby_back_ribs/3581600.jpg
820
+ sample_images/tiramisu/1662188.jpg
821
+ sample_images/steak/912108.jpg
822
+ sample_images/churros/776000.jpg
823
+ sample_images/french_toast/3513889.jpg
824
+ sample_images/pulled_pork_sandwich/992038.jpg
825
+ sample_images/lobster_bisque/65607.jpg
826
+ sample_images/pork_chop/3553986.jpg
827
+ sample_images/shrimp_and_grits/1870791.jpg
828
+ sample_images/baklava/558342.jpg
829
+ sample_images/poutine/756270.jpg
830
+ sample_images/ravioli/237327.jpg
831
+ sample_images/seaweed_salad/2678051.jpg
832
+ sample_images/cheese_plate/2967561.jpg
833
+ sample_images/cheese_plate/33708.jpg
834
+ sample_images/grilled_cheese_sandwich/1101184.jpg
835
+ sample_images/lobster_bisque/3282626.jpg
836
+ sample_images/frozen_yogurt/3266829.jpg
837
+ sample_images/beef_carpaccio/3868777.jpg
838
+ sample_images/ceviche/1863783.jpg
839
+ sample_images/chocolate_cake/126340.jpg
840
+ sample_images/samosa/1024186.jpg
841
+ sample_images/baby_back_ribs/1427390.jpg
842
+ sample_images/nachos/1710310.jpg
843
+ sample_images/grilled_cheese_sandwich/2974529.jpg
844
+ sample_images/fried_rice/2763606.jpg
845
+ sample_images/crab_cakes/2724489.jpg
846
+ sample_images/beet_salad/477056.jpg
847
+ sample_images/cup_cakes/2387290.jpg
848
+ sample_images/french_onion_soup/2729004.jpg
849
+ sample_images/gnocchi/2746458.jpg
850
+ sample_images/poutine/1215105.jpg
851
+ sample_images/guacamole/346511.jpg
852
+ sample_images/tacos/281538.jpg
853
+ sample_images/tacos/3308866.jpg
854
+ sample_images/edamame/3031267.jpg
855
+ sample_images/cannoli/3830551.jpg
856
+ sample_images/red_velvet_cake/3696503.jpg
857
+ sample_images/lobster_roll_sandwich/785083.jpg
858
+ sample_images/risotto/504168.jpg
859
+ sample_images/prime_rib/1816297.jpg
860
+ sample_images/lobster_bisque/2979039.jpg
861
+ sample_images/bread_pudding/3058253.jpg
862
+ sample_images/oysters/1717597.jpg
863
+ sample_images/grilled_salmon/3149788.jpg
864
+ sample_images/croque_madame/3556471.jpg
865
+ sample_images/frozen_yogurt/647326.jpg
866
+ sample_images/chocolate_mousse/1617802.jpg
867
+ sample_images/onion_rings/2254620.jpg
868
+ sample_images/falafel/3376916.jpg
869
+ sample_images/cheesecake/3476761.jpg
870
+ sample_images/takoyaki/377590.jpg
871
+ sample_images/chicken_quesadilla/2364093.jpg
872
+ sample_images/churros/3531551.jpg
873
+ sample_images/poutine/3050934.jpg
874
+ sample_images/hummus/2735302.jpg
875
+ sample_images/ravioli/1290195.jpg
876
+ sample_images/gyoza/3433423.jpg
877
+ sample_images/gyoza/403076.jpg
878
+ sample_images/caprese_salad/2930536.jpg
879
+ sample_images/huevos_rancheros/3900589.jpg
880
+ sample_images/creme_brulee/2000973.jpg
881
+ sample_images/eggs_benedict/3792846.jpg
882
+ sample_images/macaroni_and_cheese/3519796.jpg
883
+ sample_images/croque_madame/3584334.jpg
884
+ sample_images/bread_pudding/3333038.jpg
885
+ sample_images/caesar_salad/1918486.jpg
886
+ sample_images/poutine/1594696.jpg
887
+ sample_images/macaroni_and_cheese/3155068.jpg
888
+ sample_images/samosa/1088007.jpg
889
+ sample_images/takoyaki/1161535.jpg
890
+ sample_images/chicken_wings/1493300.jpg
891
+ sample_images/filet_mignon/1666949.jpg
892
+ sample_images/peking_duck/293439.jpg
893
+ sample_images/cheese_plate/3293044.jpg
894
+ sample_images/tiramisu/152790.jpg
895
+ sample_images/carrot_cake/3889387.jpg
896
+ sample_images/carrot_cake/2643464.jpg
897
+ sample_images/macaroni_and_cheese/2760529.jpg
898
+ sample_images/chicken_quesadilla/1994905.jpg
899
+ sample_images/ravioli/2106789.jpg
900
+ sample_images/grilled_cheese_sandwich/672855.jpg
901
+ sample_images/grilled_cheese_sandwich/2520949.jpg
902
+ sample_images/grilled_cheese_sandwich/3044491.jpg
903
+ sample_images/sashimi/3670207.jpg
904
+ sample_images/bread_pudding/1404136.jpg
905
+ sample_images/prime_rib/1160521.jpg
906
+ sample_images/filet_mignon/384251.jpg
907
+ sample_images/caprese_salad/3352476.jpg
908
+ sample_images/french_toast/2017411.jpg
909
+ sample_images/creme_brulee/2766155.jpg
910
+ sample_images/chicken_quesadilla/3731711.jpg
911
+ sample_images/risotto/483749.jpg
912
+ sample_images/poutine/3047736.jpg
913
+ sample_images/churros/2697646.jpg
914
+ sample_images/french_toast/253913.jpg
915
+ sample_images/beef_tartare/3718617.jpg
916
+ sample_images/onion_rings/774706.jpg
917
+ sample_images/creme_brulee/3379434.jpg
918
+ sample_images/pho/149799.jpg
919
+ sample_images/grilled_cheese_sandwich/1484401.jpg
920
+ sample_images/deviled_eggs/55117.jpg
921
+ sample_images/strawberry_shortcake/397562.jpg
922
+ sample_images/panna_cotta/3067767.jpg
923
+ sample_images/french_toast/1606269.jpg
924
+ sample_images/pancakes/3889048.jpg
925
+ sample_images/macaroni_and_cheese/1027098.jpg
926
+ sample_images/bread_pudding/3306095.jpg
927
+ sample_images/red_velvet_cake/97406.jpg
928
+ sample_images/bibimbap/573996.jpg
929
+ sample_images/cheese_plate/564929.jpg
930
+ sample_images/edamame/3432193.jpg
931
+ sample_images/chocolate_mousse/1042851.jpg
932
+ sample_images/cannoli/1982314.jpg
933
+ sample_images/greek_salad/222202.jpg
934
+ sample_images/gnocchi/3832332.jpg
935
+ sample_images/frozen_yogurt/2720129.jpg
936
+ sample_images/fish_and_chips/626758.jpg
937
+ sample_images/garlic_bread/3177101.jpg
938
+ sample_images/breakfast_burrito/3750414.jpg
939
+ sample_images/macarons/3261547.jpg
940
+ sample_images/ceviche/2013289.jpg
941
+ sample_images/panna_cotta/3001135.jpg
942
+ sample_images/hot_dog/1596409.jpg
943
+ sample_images/caprese_salad/3753434.jpg
944
+ sample_images/french_onion_soup/962989.jpg
945
+ sample_images/samosa/1754253.jpg
946
+ sample_images/pulled_pork_sandwich/985218.jpg
947
+ sample_images/bread_pudding/1658714.jpg
948
+ sample_images/caesar_salad/1655236.jpg
949
+ sample_images/filet_mignon/2861763.jpg
950
+ sample_images/miso_soup/3316198.jpg
951
+ sample_images/waffles/1055825.jpg
952
+ sample_images/sashimi/79501.jpg
953
+ sample_images/ice_cream/669677.jpg
954
+ sample_images/red_velvet_cake/195989.jpg
955
+ sample_images/bibimbap/216516.jpg
956
+ sample_images/scallops/986280.jpg
957
+ sample_images/pancakes/3239937.jpg
958
+ sample_images/chocolate_cake/2372754.jpg
959
+ sample_images/bruschetta/552733.jpg
960
+ sample_images/frozen_yogurt/1155025.jpg
961
+ sample_images/shrimp_and_grits/433649.jpg
962
+ sample_images/donuts/3234687.jpg
963
+ sample_images/beef_carpaccio/3156761.jpg
964
+ sample_images/french_toast/122362.jpg
965
+ sample_images/creme_brulee/2271190.jpg
966
+ sample_images/apple_pie/3809728.jpg
967
+ sample_images/french_toast/2069063.jpg
968
+ sample_images/filet_mignon/3270177.jpg
969
+ sample_images/miso_soup/312662.jpg
970
+ sample_images/cannoli/1220585.jpg
971
+ sample_images/carrot_cake/3000921.jpg
972
+ sample_images/gnocchi/343838.jpg
973
+ sample_images/hot_dog/1154965.jpg
974
+ sample_images/ice_cream/33485.jpg
975
+ sample_images/beef_tartare/3780975.jpg
976
+ sample_images/nachos/3554143.jpg
977
+ sample_images/nachos/3234783.jpg
978
+ sample_images/pork_chop/280765.jpg
979
+ sample_images/bread_pudding/614955.jpg
980
+ sample_images/baklava/120691.jpg
981
+ sample_images/pho/2236360.jpg
982
+ sample_images/carrot_cake/2524264.jpg
983
+ sample_images/shrimp_and_grits/2025628.jpg
984
+ sample_images/dumplings/2834398.jpg
985
+ sample_images/frozen_yogurt/1666374.jpg
986
+ sample_images/bread_pudding/2118042.jpg
987
+ sample_images/french_fries/2858185.jpg
988
+ sample_images/pork_chop/1597626.jpg
989
+ sample_images/lobster_roll_sandwich/1309325.jpg
990
+ sample_images/churros/3799876.jpg
991
+ sample_images/cheesecake/972877.jpg
992
+ sample_images/french_toast/1008722.jpg
993
+ sample_images/carrot_cake/3354237.jpg
994
+ sample_images/pho/344698.jpg
995
+ sample_images/fried_calamari/735945.jpg
996
+ sample_images/panna_cotta/2105260.jpg
997
+ sample_images/sashimi/3090849.jpg
998
+ sample_images/omelette/1019294.jpg
999
+ sample_images/deviled_eggs/1446781.jpg
1000
+ sample_images/chicken_wings/2619083.jpg
src/sample_loader.py ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import numpy as np
2
+ import os
3
+ from typing import Tuple
4
+
5
+
6
+ SAMPLE_IMAGE_S3_PATH = os.getenv("SAMPLE_IMAGE_S3_PATH", ".")
7
+
8
+
9
+ def get_random_sample_image() -> Tuple[str, str]:
10
+ rnd_img_sub_path: str = np.random.choice(
11
+ np.loadtxt("sample_list.txt", dtype=object)
12
+ )
13
+ rnd_img = os.path.join(SAMPLE_IMAGE_S3_PATH, rnd_img_sub_path)
14
+ label = rnd_img.split("/")[-2].replace("_", " ").title()
15
+ return rnd_img, label
src/start.sh DELETED
@@ -1 +0,0 @@
1
- python3 -m uvicorn main:app --workers 1 --host 0.0.0.0 --port 7860