Jon Solow commited on
Commit
03fc4f2
·
1 Parent(s): fe1c3a3

Add django app

Browse files
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 ["python3", "-m", "gunicorn", "grubguesser.wsgi", "--reload", "--workers=1, "--host", "0.0.0.0", "--port", "7860"]
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.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/labels.txt ADDED
@@ -0,0 +1,101 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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/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_client.py ADDED
@@ -0,0 +1,92 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from time import time
2
+ from typing import List, Optional, Tuple, Union
3
+ import json
4
+ import os
5
+ import requests
6
+ from urllib.parse import urljoin
7
+
8
+ from django.core.files.uploadedfile import InMemoryUploadedFile, TemporaryUploadedFile
9
+
10
+ import logging
11
+
12
+
13
+ MODEL_ENDPOINT_URL = os.getenv("MODEL_ENDPOINT_URL", "https://0.0.0.0:2000")
14
+
15
+
16
+ def try_make_request(request_kwargs, request_type: str):
17
+ try:
18
+ request_kwargs["timeout"] = 3
19
+ if request_type.lower() == "get":
20
+ response = requests.get(**request_kwargs)
21
+ elif request_type.lower() == "post":
22
+ response = requests.post(**request_kwargs)
23
+ else:
24
+ raise Exception("Request Type not Supported. Only get, post supported.")
25
+
26
+ return json.loads(response.content)
27
+ except requests.exceptions.ConnectionError:
28
+ logging.warning("Failed Model prediction", exc_info=True)
29
+ return ["Image Failed to Predict", "Try Another Image", "", "", ""]
30
+ except Exception:
31
+ logging.warning("Failed Model prediction", exc_info=True)
32
+ return ["Image Failed to Predict", "Try Another Image", "", "", ""]
33
+
34
+
35
+ def predict_url(url: str) -> List[str]:
36
+ params = {"url": url}
37
+ headers = {"content-type": "application/json", "Accept-Charset": "UTF-8"}
38
+ request_url = urljoin(MODEL_ENDPOINT_URL, "predict_url")
39
+ request_kwargs = dict(url=request_url, params=params, headers=headers)
40
+ return try_make_request(request_kwargs, "get")
41
+
42
+
43
+ def predict_file(image_file) -> List[str]:
44
+ image_file.seek(0)
45
+ file_ob = {
46
+ "upload_file": (image_file.name, image_file.read(), image_file.content_type)
47
+ }
48
+ request_url = urljoin(MODEL_ENDPOINT_URL, "predict_file")
49
+ request_kwargs = dict(url=request_url, files=file_ob)
50
+ return try_make_request(request_kwargs, "post")
51
+
52
+
53
+ def get_color_labels(guesses: List[str], actual_label: Optional[str]) -> List[str]:
54
+ if not actual_label:
55
+ return ["white"] * len(guesses)
56
+ return ["lime" if x == actual_label else "white" for x in guesses]
57
+
58
+
59
+ def url_image_vars(
60
+ input_img: Union[str, InMemoryUploadedFile, TemporaryUploadedFile], label: str
61
+ ) -> Tuple[List[str], List[str]]:
62
+ actual_label = label.title()
63
+ if not is_healthy():
64
+ logging.error("Model failed healthcheck")
65
+ top_guesses = ["Model Offline", "Try Again Later", "", "", ""]
66
+ elif isinstance(input_img, str):
67
+ top_guesses = predict_url(input_img)
68
+ elif isinstance(input_img, (InMemoryUploadedFile, TemporaryUploadedFile)):
69
+ top_guesses = predict_file(input_img)
70
+ else:
71
+ logging.error(f"Unknown input type: {type(input_img)=}")
72
+ top_guesses = ["Unknown Input Type", "", "", "", ""]
73
+ color_labels = get_color_labels(top_guesses, actual_label)
74
+ return top_guesses, color_labels
75
+
76
+
77
+ def is_healthy() -> bool:
78
+ request_url = urljoin(MODEL_ENDPOINT_URL, "healthcheck")
79
+ try:
80
+ response = requests.get(url=request_url, timeout=1)
81
+ except Exception:
82
+ logging.error("Failed to make healthcheck request")
83
+ return False
84
+ if response.status_code == 200:
85
+ try:
86
+ response_content = json.loads(response.content)
87
+ except Exception:
88
+ logging.error("Failed to load healthcheck content")
89
+ return False
90
+ if response_content == {"status": "alive"}:
91
+ return True
92
+ return False
src/requirements.in CHANGED
@@ -1,6 +1,8 @@
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
src/requirements.txt CHANGED
@@ -4,171 +4,69 @@
4
  #
5
  # pip-compile --resolver=backtracking requirements.in
6
  #
7
- 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
33
- google-auth-oauthlib==1.0.0
34
- # via tensorboard
35
- google-pasta==0.2.0
36
- # via tensorflow
37
- 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
62
- # via tensorboard
63
- markupsafe==2.1.2
64
- # via werkzeug
65
- ml-dtypes==0.1.0
66
- # via jax
67
- networkx==3.1
68
- # via scikit-image
69
  numpy==1.23.5
70
  # via
71
  # -r requirements.in
72
- # h5py
73
- # imageio
74
- # jax
75
- # ml-dtypes
76
- # opt-einsum
77
- # pywavelets
78
- # scikit-image
79
- # scipy
80
- # tensorboard
81
- # tensorflow
82
- # tifffile
83
- oauthlib==3.2.2
84
- # via requests-oauthlib
85
- opt-einsum==3.3.0
86
- # via
87
- # jax
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
101
- pyasn1==0.5.0
102
- # via
103
- # pyasn1-modules
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
127
- six==1.16.0
128
  # via
129
- # astunparse
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
140
- # via tensorboard
141
- tensorflow==2.12.0
142
  # via -r requirements.in
143
- tensorflow-estimator==2.12.0
144
- # via tensorflow
145
- tensorflow-io-gcs-filesystem==0.32.0
146
- # via tensorflow
147
- 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
171
- # via importlib-metadata
172
 
173
  # The following packages are considered to be unsafe in a requirements file:
174
  # setuptools
 
4
  #
5
  # pip-compile --resolver=backtracking requirements.in
6
  #
7
+ asgiref==3.7.1
8
+ # via django
9
+ backports-zoneinfo==0.2.1
10
+ # via django
 
 
 
 
 
 
11
  certifi==2023.5.7
12
  # via requests
13
  charset-normalizer==3.1.0
14
  # via requests
15
+ django==4.2.1
 
 
16
  # via -r requirements.in
17
+ filelock==3.12.0
 
 
 
 
 
 
 
 
 
 
 
 
18
  # via
19
+ # huggingface-hub
20
+ # transformers
21
+ fsspec==2023.5.0
22
+ # via huggingface-hub
23
+ gunicorn==20.1.0
24
+ # via -r requirements.in
25
+ huggingface-hub==0.14.1
26
+ # via transformers
27
  idna==3.4
28
+ # via requests
29
+ joblib==1.2.0
30
+ # via -r requirements.in
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
31
  numpy==1.23.5
32
  # via
33
  # -r requirements.in
34
+ # transformers
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
35
  packaging==23.1
36
  # via
37
+ # huggingface-hub
38
+ # transformers
39
  pillow==9.5.0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
40
  # via -r requirements.in
41
+ pyyaml==6.0
 
 
42
  # via
43
+ # huggingface-hub
44
+ # transformers
45
+ regex==2023.5.5
46
+ # via transformers
47
+ requests==2.30.0
 
 
 
 
 
 
 
 
48
  # via
49
+ # -r requirements.in
50
+ # huggingface-hub
51
+ # transformers
52
+ sqlparse==0.4.4
53
+ # via django
54
+ tokenizers==0.13.3
55
+ # via transformers
56
+ tqdm==4.65.0
57
+ # via
58
+ # huggingface-hub
59
+ # transformers
60
+ transformers==4.29.2
 
61
  # via -r requirements.in
 
 
 
 
 
 
 
 
62
  typing-extensions==4.5.0
63
  # via
64
+ # asgiref
65
+ # huggingface-hub
 
66
  urllib3==1.26.15
67
+ # via requests
68
+ whitenoise==6.4.0
 
 
69
  # via -r requirements.in
 
 
 
 
 
 
 
 
 
 
70
 
71
  # The following packages are considered to be unsafe in a requirements file:
72
  # setuptools
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