Spaces:
Build error
Build error
Jon Solow
commited on
Commit
·
03fc4f2
1
Parent(s):
fe1c3a3
Add django app
Browse files- Dockerfile +1 -1
- src/grubguesser/__init__.py +0 -0
- src/grubguesser/asgi.py +16 -0
- src/grubguesser/forms.py +11 -0
- src/grubguesser/settings.py +135 -0
- src/grubguesser/templates/base.html +136 -0
- src/grubguesser/templates/index.html +14 -0
- src/grubguesser/templates/request.html +55 -0
- src/grubguesser/urls.py +21 -0
- src/grubguesser/views.py +73 -0
- src/grubguesser/wsgi.py +16 -0
- src/labels.txt +101 -0
- src/manage.py +22 -0
- src/model_client.py +92 -0
- src/requirements.in +7 -5
- src/requirements.txt +42 -144
- src/sample_list.txt +1000 -0
- src/sample_loader.py +15 -0
Dockerfile
CHANGED
|
@@ -24,4 +24,4 @@ WORKDIR /opt/src
|
|
| 24 |
|
| 25 |
|
| 26 |
FROM copy-src as production
|
| 27 |
-
CMD ["python3", "-m", "
|
|
|
|
| 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}}">  1. </td> -->
|
| 21 |
+
<td style="color: {{color_labels.0}}">1. {{top_guesses.0}}</td>
|
| 22 |
+
<!-- <td style="padding-right:10px; color: {{color_labels.5}}">  6. </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}}">  2. </td> -->
|
| 27 |
+
<td style="color: {{color_labels.1}}">2. {{top_guesses.1}}</td>
|
| 28 |
+
<!-- <td style="padding-right:10px; color: {{color_labels.6}}">  7. </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}}">  3. </td> -->
|
| 33 |
+
<td style="color: {{color_labels.2}}">3. {{top_guesses.2}}</td>
|
| 34 |
+
<!-- <td style="padding-right:10px; color: {{color_labels.7}}">  8. </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}}">  4. </td> -->
|
| 39 |
+
<td style="color: {{color_labels.3}}">4. {{top_guesses.3}}</td>
|
| 40 |
+
<!-- <td style="padding-right:10px; color: {{color_labels.8}}">  9. </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}}">  5. </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 |
-
|
| 2 |
-
|
| 3 |
-
|
| 4 |
-
scikit-image
|
| 5 |
numpy
|
| 6 |
-
|
|
|
|
|
|
|
|
|
|
|
|
| 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 |
-
|
| 8 |
-
# via
|
| 9 |
-
|
| 10 |
-
#
|
| 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 |
-
|
| 22 |
-
# via uvicorn
|
| 23 |
-
fastapi==0.95.2
|
| 24 |
# via -r requirements.in
|
| 25 |
-
|
| 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 |
-
#
|
| 40 |
-
#
|
| 41 |
-
|
| 42 |
-
# via
|
| 43 |
-
|
| 44 |
-
# via
|
|
|
|
|
|
|
| 45 |
idna==3.4
|
| 46 |
-
# via
|
| 47 |
-
|
| 48 |
-
#
|
| 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 |
-
#
|
| 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 |
-
#
|
| 92 |
-
#
|
| 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 |
-
|
| 112 |
-
# via scikit-image
|
| 113 |
-
requests==2.30.0
|
| 114 |
# via
|
| 115 |
-
#
|
| 116 |
-
#
|
| 117 |
-
|
| 118 |
-
# via
|
| 119 |
-
|
| 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 |
-
#
|
| 130 |
-
#
|
| 131 |
-
#
|
| 132 |
-
|
| 133 |
-
|
| 134 |
-
|
| 135 |
-
|
| 136 |
-
|
| 137 |
-
|
| 138 |
-
#
|
| 139 |
-
|
| 140 |
-
|
| 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 |
-
#
|
| 154 |
-
#
|
| 155 |
-
# tensorflow
|
| 156 |
urllib3==1.26.15
|
| 157 |
-
# via
|
| 158 |
-
|
| 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
|