Spaces:
Sleeping
Sleeping
alrichardbollans
commited on
Commit
·
5107c4c
1
Parent(s):
4db8fed
Revert "Attempt to add multiprocessing"
Browse filesThis reverts commit 3e5ea4d1975476e2a39b42e0f6f4953d2084469f.
- app.py +40 -19
- python_utils/__init__.py +1 -1
- python_utils/{running_model.py → get_model.py} +2 -71
- shared.py +1 -1
- tips.csv +245 -0
app.py
CHANGED
|
@@ -9,13 +9,21 @@
|
|
| 9 |
# except:
|
| 10 |
# print('Couldnt find CUDA device')
|
| 11 |
|
|
|
|
| 12 |
import tempfile
|
|
|
|
|
|
|
| 13 |
|
| 14 |
import pandas as pd
|
|
|
|
| 15 |
from shiny import App, ui, render, reactive, Session
|
| 16 |
|
| 17 |
-
from python_utils import
|
|
|
|
|
|
|
| 18 |
|
|
|
|
|
|
|
| 19 |
app_ui = ui.page_fluid(
|
| 20 |
ui.include_css("styles.css"),
|
| 21 |
ui.panel_title(ui.div("Orchid TZ Viability Analyzer", class_="navbar-title")),
|
|
@@ -26,10 +34,10 @@ app_ui = ui.page_fluid(
|
|
| 26 |
ui.layout_sidebar(
|
| 27 |
ui.sidebar(
|
| 28 |
ui.input_file("upload", "Upload Images",
|
| 29 |
-
|
| 30 |
-
|
| 31 |
ui.input_action_button("analyze", "Analyze", class_="btn-success"),
|
| 32 |
-
width=300
|
| 33 |
),
|
| 34 |
ui.output_ui("results_container"),
|
| 35 |
border=False,
|
|
@@ -38,9 +46,9 @@ app_ui = ui.page_fluid(
|
|
| 38 |
)
|
| 39 |
|
| 40 |
|
|
|
|
| 41 |
def server(input, output, session: Session):
|
| 42 |
analysis_results = reactive.Value([])
|
| 43 |
-
is_running = reactive.Value(False) # Flag to enable/disable loading spinner
|
| 44 |
|
| 45 |
@reactive.Effect
|
| 46 |
@reactive.event(input.analyze)
|
|
@@ -49,25 +57,36 @@ def server(input, output, session: Session):
|
|
| 49 |
if not files:
|
| 50 |
return
|
| 51 |
|
| 52 |
-
|
| 53 |
-
|
| 54 |
-
|
| 55 |
-
|
| 56 |
-
|
| 57 |
-
|
| 58 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 59 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 60 |
|
| 61 |
@output
|
| 62 |
@render.ui
|
| 63 |
def results_container():
|
| 64 |
-
if is_running.get():
|
| 65 |
-
return ui.div(
|
| 66 |
-
ui.div(class_="spinner-border text-primary", role="status", style="width: 3rem; height: 3rem;"),
|
| 67 |
-
ui.div("Analyzing images, please wait...", class_="text-muted", style="margin-top: 10px;"),
|
| 68 |
-
style="text-align: center; margin-top: 30px;"
|
| 69 |
-
)
|
| 70 |
-
|
| 71 |
results = analysis_results.get()
|
| 72 |
if not results:
|
| 73 |
return ui.div("No results yet. Upload images and click 'Analyze'.",
|
|
@@ -108,6 +127,8 @@ def server(input, output, session: Session):
|
|
| 108 |
|
| 109 |
app = App(app_ui, server)
|
| 110 |
|
|
|
|
|
|
|
| 111 |
# --------------------------------------------------------
|
| 112 |
# Reactive calculations and effects
|
| 113 |
# --------------------------------------------------------
|
|
|
|
| 9 |
# except:
|
| 10 |
# print('Couldnt find CUDA device')
|
| 11 |
|
| 12 |
+
import base64
|
| 13 |
import tempfile
|
| 14 |
+
import cv2
|
| 15 |
+
from io import BytesIO
|
| 16 |
|
| 17 |
import pandas as pd
|
| 18 |
+
from PIL import Image
|
| 19 |
from shiny import App, ui, render, reactive, Session
|
| 20 |
|
| 21 |
+
from python_utils import load_model
|
| 22 |
+
# Load data and compute static values
|
| 23 |
+
from shared import app_dir
|
| 24 |
|
| 25 |
+
# Load the prediction model
|
| 26 |
+
predictor = load_model()
|
| 27 |
app_ui = ui.page_fluid(
|
| 28 |
ui.include_css("styles.css"),
|
| 29 |
ui.panel_title(ui.div("Orchid TZ Viability Analyzer", class_="navbar-title")),
|
|
|
|
| 34 |
ui.layout_sidebar(
|
| 35 |
ui.sidebar(
|
| 36 |
ui.input_file("upload", "Upload Images",
|
| 37 |
+
multiple=True,
|
| 38 |
+
accept=[".png", ".jpg", ".jpeg"]),
|
| 39 |
ui.input_action_button("analyze", "Analyze", class_="btn-success"),
|
| 40 |
+
width =300
|
| 41 |
),
|
| 42 |
ui.output_ui("results_container"),
|
| 43 |
border=False,
|
|
|
|
| 46 |
)
|
| 47 |
|
| 48 |
|
| 49 |
+
|
| 50 |
def server(input, output, session: Session):
|
| 51 |
analysis_results = reactive.Value([])
|
|
|
|
| 52 |
|
| 53 |
@reactive.Effect
|
| 54 |
@reactive.event(input.analyze)
|
|
|
|
| 57 |
if not files:
|
| 58 |
return
|
| 59 |
|
| 60 |
+
results = []
|
| 61 |
+
with tempfile.TemporaryDirectory() as temp_dir:
|
| 62 |
+
for idx, file in enumerate(files):
|
| 63 |
+
# Read image using OpenCV
|
| 64 |
+
im = cv2.imread(file["datapath"])
|
| 65 |
+
|
| 66 |
+
# Convert BGR to RGB for display
|
| 67 |
+
im_rgb = cv2.cvtColor(im, cv2.COLOR_BGR2RGB)
|
| 68 |
+
pil_img = Image.fromarray(im_rgb)
|
| 69 |
+
|
| 70 |
+
# Convert to base64 for HTML display
|
| 71 |
+
buffered = BytesIO()
|
| 72 |
+
pil_img.save(buffered, format="PNG")
|
| 73 |
+
img_base64 = base64.b64encode(buffered.getvalue()).decode()
|
| 74 |
+
|
| 75 |
+
# Run prediction with original BGR image
|
| 76 |
+
prediction = predictor(im)
|
| 77 |
|
| 78 |
+
results.append({
|
| 79 |
+
"filename": file["name"],
|
| 80 |
+
"image": img_base64,
|
| 81 |
+
**prediction
|
| 82 |
+
})
|
| 83 |
+
|
| 84 |
+
# Update reactive value
|
| 85 |
+
analysis_results.set(results)
|
| 86 |
|
| 87 |
@output
|
| 88 |
@render.ui
|
| 89 |
def results_container():
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 90 |
results = analysis_results.get()
|
| 91 |
if not results:
|
| 92 |
return ui.div("No results yet. Upload images and click 'Analyze'.",
|
|
|
|
| 127 |
|
| 128 |
app = App(app_ui, server)
|
| 129 |
|
| 130 |
+
|
| 131 |
+
|
| 132 |
# --------------------------------------------------------
|
| 133 |
# Reactive calculations and effects
|
| 134 |
# --------------------------------------------------------
|
python_utils/__init__.py
CHANGED
|
@@ -1 +1 @@
|
|
| 1 |
-
from .
|
|
|
|
| 1 |
+
from .get_model import *
|
python_utils/{running_model.py → get_model.py}
RENAMED
|
@@ -1,11 +1,3 @@
|
|
| 1 |
-
import base64
|
| 2 |
-
from io import BytesIO
|
| 3 |
-
from PIL import Image
|
| 4 |
-
import torch
|
| 5 |
-
import cv2
|
| 6 |
-
import multiprocessing
|
| 7 |
-
|
| 8 |
-
|
| 9 |
def get_set_up():
|
| 10 |
import torch
|
| 11 |
TORCH_VERSION = ".".join(torch.__version__.split(".")[:2])
|
|
@@ -28,6 +20,7 @@ def load_model():
|
|
| 28 |
from detectron2.config import get_cfg
|
| 29 |
from detectron2.data.datasets import register_coco_instances
|
| 30 |
|
|
|
|
| 31 |
import numpy as np
|
| 32 |
|
| 33 |
## define relevant parameters
|
|
@@ -85,68 +78,6 @@ def load_model():
|
|
| 85 |
predictor = DefaultPredictor(cfg)
|
| 86 |
return predictor
|
| 87 |
|
| 88 |
-
|
| 89 |
-
def load_from_file(file):
|
| 90 |
-
# Read image using OpenCV
|
| 91 |
-
im = cv2.imread(file["datapath"])
|
| 92 |
-
|
| 93 |
-
# Convert BGR to RGB for display
|
| 94 |
-
im_rgb = cv2.cvtColor(im, cv2.COLOR_BGR2RGB)
|
| 95 |
-
pil_img = Image.fromarray(im_rgb)
|
| 96 |
-
|
| 97 |
-
# Convert to base64 for HTML display
|
| 98 |
-
buffered = BytesIO()
|
| 99 |
-
pil_img.save(buffered, format="PNG")
|
| 100 |
-
img_base64 = base64.b64encode(buffered.getvalue()).decode()
|
| 101 |
-
return im, img_base64
|
| 102 |
-
|
| 103 |
-
|
| 104 |
-
def process_file(file, predictor_=None):
|
| 105 |
-
im, img_base64 = load_from_file(file)
|
| 106 |
-
## Where using multiprocessing, use the global predictor
|
| 107 |
-
if predictor_ is None:
|
| 108 |
-
prediction = predictor(im)
|
| 109 |
-
|
| 110 |
-
else:
|
| 111 |
-
# otherwise use the passed predictor
|
| 112 |
-
prediction = predictor_(im)
|
| 113 |
-
print(prediction)
|
| 114 |
-
return {
|
| 115 |
-
"filename": file["name"],
|
| 116 |
-
"image": img_base64,
|
| 117 |
-
**prediction
|
| 118 |
-
}
|
| 119 |
-
|
| 120 |
-
|
| 121 |
-
def run_predictions(files):
|
| 122 |
-
results = []
|
| 123 |
-
|
| 124 |
-
## When using GPU, run single instance
|
| 125 |
-
## Or if not checking many files, as loading multiple models isn't worthwhile
|
| 126 |
-
if True:#torch.cuda.is_available() or len(files) < 4:
|
| 127 |
-
print(f'Using 1 process')
|
| 128 |
-
|
| 129 |
-
predictor_ = load_model()
|
| 130 |
-
|
| 131 |
-
for file in files:
|
| 132 |
-
# Run prediction with original BGR image
|
| 133 |
-
prediction_output = process_file(file, predictor_=predictor_)
|
| 134 |
-
|
| 135 |
-
results.append(prediction_output)
|
| 136 |
-
else:
|
| 137 |
-
## Else use multiprocessing to run in parallel with 2 processes
|
| 138 |
-
|
| 139 |
-
print(f'Using {multiprocessing.cpu_count()} cpus apparently')
|
| 140 |
-
# Set up to load one model per worker process
|
| 141 |
-
def init_worker():
|
| 142 |
-
global predictor
|
| 143 |
-
predictor = load_model() # Load once per worker process
|
| 144 |
-
|
| 145 |
-
with multiprocessing.Pool(initializer=init_worker, processes=2) as pool:
|
| 146 |
-
results = pool.map(process_file, files)
|
| 147 |
-
return results
|
| 148 |
-
|
| 149 |
-
|
| 150 |
if __name__ == '__main__':
|
| 151 |
# get_set_up()
|
| 152 |
-
load_model()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
def get_set_up():
|
| 2 |
import torch
|
| 3 |
TORCH_VERSION = ".".join(torch.__version__.split(".")[:2])
|
|
|
|
| 20 |
from detectron2.config import get_cfg
|
| 21 |
from detectron2.data.datasets import register_coco_instances
|
| 22 |
|
| 23 |
+
import os
|
| 24 |
import numpy as np
|
| 25 |
|
| 26 |
## define relevant parameters
|
|
|
|
| 78 |
predictor = DefaultPredictor(cfg)
|
| 79 |
return predictor
|
| 80 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 81 |
if __name__ == '__main__':
|
| 82 |
# get_set_up()
|
| 83 |
+
load_model()
|
shared.py
CHANGED
|
@@ -3,4 +3,4 @@ from pathlib import Path
|
|
| 3 |
import pandas as pd
|
| 4 |
|
| 5 |
app_dir = Path(__file__).parent
|
| 6 |
-
|
|
|
|
| 3 |
import pandas as pd
|
| 4 |
|
| 5 |
app_dir = Path(__file__).parent
|
| 6 |
+
tips = pd.read_csv(app_dir / "tips.csv")
|
tips.csv
ADDED
|
@@ -0,0 +1,245 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
total_bill,tip,sex,smoker,day,time,size
|
| 2 |
+
16.99,1.01,Female,No,Sun,Dinner,2
|
| 3 |
+
10.34,1.66,Male,No,Sun,Dinner,3
|
| 4 |
+
21.01,3.5,Male,No,Sun,Dinner,3
|
| 5 |
+
23.68,3.31,Male,No,Sun,Dinner,2
|
| 6 |
+
24.59,3.61,Female,No,Sun,Dinner,4
|
| 7 |
+
25.29,4.71,Male,No,Sun,Dinner,4
|
| 8 |
+
8.77,2.0,Male,No,Sun,Dinner,2
|
| 9 |
+
26.88,3.12,Male,No,Sun,Dinner,4
|
| 10 |
+
15.04,1.96,Male,No,Sun,Dinner,2
|
| 11 |
+
14.78,3.23,Male,No,Sun,Dinner,2
|
| 12 |
+
10.27,1.71,Male,No,Sun,Dinner,2
|
| 13 |
+
35.26,5.0,Female,No,Sun,Dinner,4
|
| 14 |
+
15.42,1.57,Male,No,Sun,Dinner,2
|
| 15 |
+
18.43,3.0,Male,No,Sun,Dinner,4
|
| 16 |
+
14.83,3.02,Female,No,Sun,Dinner,2
|
| 17 |
+
21.58,3.92,Male,No,Sun,Dinner,2
|
| 18 |
+
10.33,1.67,Female,No,Sun,Dinner,3
|
| 19 |
+
16.29,3.71,Male,No,Sun,Dinner,3
|
| 20 |
+
16.97,3.5,Female,No,Sun,Dinner,3
|
| 21 |
+
20.65,3.35,Male,No,Sat,Dinner,3
|
| 22 |
+
17.92,4.08,Male,No,Sat,Dinner,2
|
| 23 |
+
20.29,2.75,Female,No,Sat,Dinner,2
|
| 24 |
+
15.77,2.23,Female,No,Sat,Dinner,2
|
| 25 |
+
39.42,7.58,Male,No,Sat,Dinner,4
|
| 26 |
+
19.82,3.18,Male,No,Sat,Dinner,2
|
| 27 |
+
17.81,2.34,Male,No,Sat,Dinner,4
|
| 28 |
+
13.37,2.0,Male,No,Sat,Dinner,2
|
| 29 |
+
12.69,2.0,Male,No,Sat,Dinner,2
|
| 30 |
+
21.7,4.3,Male,No,Sat,Dinner,2
|
| 31 |
+
19.65,3.0,Female,No,Sat,Dinner,2
|
| 32 |
+
9.55,1.45,Male,No,Sat,Dinner,2
|
| 33 |
+
18.35,2.5,Male,No,Sat,Dinner,4
|
| 34 |
+
15.06,3.0,Female,No,Sat,Dinner,2
|
| 35 |
+
20.69,2.45,Female,No,Sat,Dinner,4
|
| 36 |
+
17.78,3.27,Male,No,Sat,Dinner,2
|
| 37 |
+
24.06,3.6,Male,No,Sat,Dinner,3
|
| 38 |
+
16.31,2.0,Male,No,Sat,Dinner,3
|
| 39 |
+
16.93,3.07,Female,No,Sat,Dinner,3
|
| 40 |
+
18.69,2.31,Male,No,Sat,Dinner,3
|
| 41 |
+
31.27,5.0,Male,No,Sat,Dinner,3
|
| 42 |
+
16.04,2.24,Male,No,Sat,Dinner,3
|
| 43 |
+
17.46,2.54,Male,No,Sun,Dinner,2
|
| 44 |
+
13.94,3.06,Male,No,Sun,Dinner,2
|
| 45 |
+
9.68,1.32,Male,No,Sun,Dinner,2
|
| 46 |
+
30.4,5.6,Male,No,Sun,Dinner,4
|
| 47 |
+
18.29,3.0,Male,No,Sun,Dinner,2
|
| 48 |
+
22.23,5.0,Male,No,Sun,Dinner,2
|
| 49 |
+
32.4,6.0,Male,No,Sun,Dinner,4
|
| 50 |
+
28.55,2.05,Male,No,Sun,Dinner,3
|
| 51 |
+
18.04,3.0,Male,No,Sun,Dinner,2
|
| 52 |
+
12.54,2.5,Male,No,Sun,Dinner,2
|
| 53 |
+
10.29,2.6,Female,No,Sun,Dinner,2
|
| 54 |
+
34.81,5.2,Female,No,Sun,Dinner,4
|
| 55 |
+
9.94,1.56,Male,No,Sun,Dinner,2
|
| 56 |
+
25.56,4.34,Male,No,Sun,Dinner,4
|
| 57 |
+
19.49,3.51,Male,No,Sun,Dinner,2
|
| 58 |
+
38.01,3.0,Male,Yes,Sat,Dinner,4
|
| 59 |
+
26.41,1.5,Female,No,Sat,Dinner,2
|
| 60 |
+
11.24,1.76,Male,Yes,Sat,Dinner,2
|
| 61 |
+
48.27,6.73,Male,No,Sat,Dinner,4
|
| 62 |
+
20.29,3.21,Male,Yes,Sat,Dinner,2
|
| 63 |
+
13.81,2.0,Male,Yes,Sat,Dinner,2
|
| 64 |
+
11.02,1.98,Male,Yes,Sat,Dinner,2
|
| 65 |
+
18.29,3.76,Male,Yes,Sat,Dinner,4
|
| 66 |
+
17.59,2.64,Male,No,Sat,Dinner,3
|
| 67 |
+
20.08,3.15,Male,No,Sat,Dinner,3
|
| 68 |
+
16.45,2.47,Female,No,Sat,Dinner,2
|
| 69 |
+
3.07,1.0,Female,Yes,Sat,Dinner,1
|
| 70 |
+
20.23,2.01,Male,No,Sat,Dinner,2
|
| 71 |
+
15.01,2.09,Male,Yes,Sat,Dinner,2
|
| 72 |
+
12.02,1.97,Male,No,Sat,Dinner,2
|
| 73 |
+
17.07,3.0,Female,No,Sat,Dinner,3
|
| 74 |
+
26.86,3.14,Female,Yes,Sat,Dinner,2
|
| 75 |
+
25.28,5.0,Female,Yes,Sat,Dinner,2
|
| 76 |
+
14.73,2.2,Female,No,Sat,Dinner,2
|
| 77 |
+
10.51,1.25,Male,No,Sat,Dinner,2
|
| 78 |
+
17.92,3.08,Male,Yes,Sat,Dinner,2
|
| 79 |
+
27.2,4.0,Male,No,Thur,Lunch,4
|
| 80 |
+
22.76,3.0,Male,No,Thur,Lunch,2
|
| 81 |
+
17.29,2.71,Male,No,Thur,Lunch,2
|
| 82 |
+
19.44,3.0,Male,Yes,Thur,Lunch,2
|
| 83 |
+
16.66,3.4,Male,No,Thur,Lunch,2
|
| 84 |
+
10.07,1.83,Female,No,Thur,Lunch,1
|
| 85 |
+
32.68,5.0,Male,Yes,Thur,Lunch,2
|
| 86 |
+
15.98,2.03,Male,No,Thur,Lunch,2
|
| 87 |
+
34.83,5.17,Female,No,Thur,Lunch,4
|
| 88 |
+
13.03,2.0,Male,No,Thur,Lunch,2
|
| 89 |
+
18.28,4.0,Male,No,Thur,Lunch,2
|
| 90 |
+
24.71,5.85,Male,No,Thur,Lunch,2
|
| 91 |
+
21.16,3.0,Male,No,Thur,Lunch,2
|
| 92 |
+
28.97,3.0,Male,Yes,Fri,Dinner,2
|
| 93 |
+
22.49,3.5,Male,No,Fri,Dinner,2
|
| 94 |
+
5.75,1.0,Female,Yes,Fri,Dinner,2
|
| 95 |
+
16.32,4.3,Female,Yes,Fri,Dinner,2
|
| 96 |
+
22.75,3.25,Female,No,Fri,Dinner,2
|
| 97 |
+
40.17,4.73,Male,Yes,Fri,Dinner,4
|
| 98 |
+
27.28,4.0,Male,Yes,Fri,Dinner,2
|
| 99 |
+
12.03,1.5,Male,Yes,Fri,Dinner,2
|
| 100 |
+
21.01,3.0,Male,Yes,Fri,Dinner,2
|
| 101 |
+
12.46,1.5,Male,No,Fri,Dinner,2
|
| 102 |
+
11.35,2.5,Female,Yes,Fri,Dinner,2
|
| 103 |
+
15.38,3.0,Female,Yes,Fri,Dinner,2
|
| 104 |
+
44.3,2.5,Female,Yes,Sat,Dinner,3
|
| 105 |
+
22.42,3.48,Female,Yes,Sat,Dinner,2
|
| 106 |
+
20.92,4.08,Female,No,Sat,Dinner,2
|
| 107 |
+
15.36,1.64,Male,Yes,Sat,Dinner,2
|
| 108 |
+
20.49,4.06,Male,Yes,Sat,Dinner,2
|
| 109 |
+
25.21,4.29,Male,Yes,Sat,Dinner,2
|
| 110 |
+
18.24,3.76,Male,No,Sat,Dinner,2
|
| 111 |
+
14.31,4.0,Female,Yes,Sat,Dinner,2
|
| 112 |
+
14.0,3.0,Male,No,Sat,Dinner,2
|
| 113 |
+
7.25,1.0,Female,No,Sat,Dinner,1
|
| 114 |
+
38.07,4.0,Male,No,Sun,Dinner,3
|
| 115 |
+
23.95,2.55,Male,No,Sun,Dinner,2
|
| 116 |
+
25.71,4.0,Female,No,Sun,Dinner,3
|
| 117 |
+
17.31,3.5,Female,No,Sun,Dinner,2
|
| 118 |
+
29.93,5.07,Male,No,Sun,Dinner,4
|
| 119 |
+
10.65,1.5,Female,No,Thur,Lunch,2
|
| 120 |
+
12.43,1.8,Female,No,Thur,Lunch,2
|
| 121 |
+
24.08,2.92,Female,No,Thur,Lunch,4
|
| 122 |
+
11.69,2.31,Male,No,Thur,Lunch,2
|
| 123 |
+
13.42,1.68,Female,No,Thur,Lunch,2
|
| 124 |
+
14.26,2.5,Male,No,Thur,Lunch,2
|
| 125 |
+
15.95,2.0,Male,No,Thur,Lunch,2
|
| 126 |
+
12.48,2.52,Female,No,Thur,Lunch,2
|
| 127 |
+
29.8,4.2,Female,No,Thur,Lunch,6
|
| 128 |
+
8.52,1.48,Male,No,Thur,Lunch,2
|
| 129 |
+
14.52,2.0,Female,No,Thur,Lunch,2
|
| 130 |
+
11.38,2.0,Female,No,Thur,Lunch,2
|
| 131 |
+
22.82,2.18,Male,No,Thur,Lunch,3
|
| 132 |
+
19.08,1.5,Male,No,Thur,Lunch,2
|
| 133 |
+
20.27,2.83,Female,No,Thur,Lunch,2
|
| 134 |
+
11.17,1.5,Female,No,Thur,Lunch,2
|
| 135 |
+
12.26,2.0,Female,No,Thur,Lunch,2
|
| 136 |
+
18.26,3.25,Female,No,Thur,Lunch,2
|
| 137 |
+
8.51,1.25,Female,No,Thur,Lunch,2
|
| 138 |
+
10.33,2.0,Female,No,Thur,Lunch,2
|
| 139 |
+
14.15,2.0,Female,No,Thur,Lunch,2
|
| 140 |
+
16.0,2.0,Male,Yes,Thur,Lunch,2
|
| 141 |
+
13.16,2.75,Female,No,Thur,Lunch,2
|
| 142 |
+
17.47,3.5,Female,No,Thur,Lunch,2
|
| 143 |
+
34.3,6.7,Male,No,Thur,Lunch,6
|
| 144 |
+
41.19,5.0,Male,No,Thur,Lunch,5
|
| 145 |
+
27.05,5.0,Female,No,Thur,Lunch,6
|
| 146 |
+
16.43,2.3,Female,No,Thur,Lunch,2
|
| 147 |
+
8.35,1.5,Female,No,Thur,Lunch,2
|
| 148 |
+
18.64,1.36,Female,No,Thur,Lunch,3
|
| 149 |
+
11.87,1.63,Female,No,Thur,Lunch,2
|
| 150 |
+
9.78,1.73,Male,No,Thur,Lunch,2
|
| 151 |
+
7.51,2.0,Male,No,Thur,Lunch,2
|
| 152 |
+
14.07,2.5,Male,No,Sun,Dinner,2
|
| 153 |
+
13.13,2.0,Male,No,Sun,Dinner,2
|
| 154 |
+
17.26,2.74,Male,No,Sun,Dinner,3
|
| 155 |
+
24.55,2.0,Male,No,Sun,Dinner,4
|
| 156 |
+
19.77,2.0,Male,No,Sun,Dinner,4
|
| 157 |
+
29.85,5.14,Female,No,Sun,Dinner,5
|
| 158 |
+
48.17,5.0,Male,No,Sun,Dinner,6
|
| 159 |
+
25.0,3.75,Female,No,Sun,Dinner,4
|
| 160 |
+
13.39,2.61,Female,No,Sun,Dinner,2
|
| 161 |
+
16.49,2.0,Male,No,Sun,Dinner,4
|
| 162 |
+
21.5,3.5,Male,No,Sun,Dinner,4
|
| 163 |
+
12.66,2.5,Male,No,Sun,Dinner,2
|
| 164 |
+
16.21,2.0,Female,No,Sun,Dinner,3
|
| 165 |
+
13.81,2.0,Male,No,Sun,Dinner,2
|
| 166 |
+
17.51,3.0,Female,Yes,Sun,Dinner,2
|
| 167 |
+
24.52,3.48,Male,No,Sun,Dinner,3
|
| 168 |
+
20.76,2.24,Male,No,Sun,Dinner,2
|
| 169 |
+
31.71,4.5,Male,No,Sun,Dinner,4
|
| 170 |
+
10.59,1.61,Female,Yes,Sat,Dinner,2
|
| 171 |
+
10.63,2.0,Female,Yes,Sat,Dinner,2
|
| 172 |
+
50.81,10.0,Male,Yes,Sat,Dinner,3
|
| 173 |
+
15.81,3.16,Male,Yes,Sat,Dinner,2
|
| 174 |
+
7.25,5.15,Male,Yes,Sun,Dinner,2
|
| 175 |
+
31.85,3.18,Male,Yes,Sun,Dinner,2
|
| 176 |
+
16.82,4.0,Male,Yes,Sun,Dinner,2
|
| 177 |
+
32.9,3.11,Male,Yes,Sun,Dinner,2
|
| 178 |
+
17.89,2.0,Male,Yes,Sun,Dinner,2
|
| 179 |
+
14.48,2.0,Male,Yes,Sun,Dinner,2
|
| 180 |
+
9.6,4.0,Female,Yes,Sun,Dinner,2
|
| 181 |
+
34.63,3.55,Male,Yes,Sun,Dinner,2
|
| 182 |
+
34.65,3.68,Male,Yes,Sun,Dinner,4
|
| 183 |
+
23.33,5.65,Male,Yes,Sun,Dinner,2
|
| 184 |
+
45.35,3.5,Male,Yes,Sun,Dinner,3
|
| 185 |
+
23.17,6.5,Male,Yes,Sun,Dinner,4
|
| 186 |
+
40.55,3.0,Male,Yes,Sun,Dinner,2
|
| 187 |
+
20.69,5.0,Male,No,Sun,Dinner,5
|
| 188 |
+
20.9,3.5,Female,Yes,Sun,Dinner,3
|
| 189 |
+
30.46,2.0,Male,Yes,Sun,Dinner,5
|
| 190 |
+
18.15,3.5,Female,Yes,Sun,Dinner,3
|
| 191 |
+
23.1,4.0,Male,Yes,Sun,Dinner,3
|
| 192 |
+
15.69,1.5,Male,Yes,Sun,Dinner,2
|
| 193 |
+
19.81,4.19,Female,Yes,Thur,Lunch,2
|
| 194 |
+
28.44,2.56,Male,Yes,Thur,Lunch,2
|
| 195 |
+
15.48,2.02,Male,Yes,Thur,Lunch,2
|
| 196 |
+
16.58,4.0,Male,Yes,Thur,Lunch,2
|
| 197 |
+
7.56,1.44,Male,No,Thur,Lunch,2
|
| 198 |
+
10.34,2.0,Male,Yes,Thur,Lunch,2
|
| 199 |
+
43.11,5.0,Female,Yes,Thur,Lunch,4
|
| 200 |
+
13.0,2.0,Female,Yes,Thur,Lunch,2
|
| 201 |
+
13.51,2.0,Male,Yes,Thur,Lunch,2
|
| 202 |
+
18.71,4.0,Male,Yes,Thur,Lunch,3
|
| 203 |
+
12.74,2.01,Female,Yes,Thur,Lunch,2
|
| 204 |
+
13.0,2.0,Female,Yes,Thur,Lunch,2
|
| 205 |
+
16.4,2.5,Female,Yes,Thur,Lunch,2
|
| 206 |
+
20.53,4.0,Male,Yes,Thur,Lunch,4
|
| 207 |
+
16.47,3.23,Female,Yes,Thur,Lunch,3
|
| 208 |
+
26.59,3.41,Male,Yes,Sat,Dinner,3
|
| 209 |
+
38.73,3.0,Male,Yes,Sat,Dinner,4
|
| 210 |
+
24.27,2.03,Male,Yes,Sat,Dinner,2
|
| 211 |
+
12.76,2.23,Female,Yes,Sat,Dinner,2
|
| 212 |
+
30.06,2.0,Male,Yes,Sat,Dinner,3
|
| 213 |
+
25.89,5.16,Male,Yes,Sat,Dinner,4
|
| 214 |
+
48.33,9.0,Male,No,Sat,Dinner,4
|
| 215 |
+
13.27,2.5,Female,Yes,Sat,Dinner,2
|
| 216 |
+
28.17,6.5,Female,Yes,Sat,Dinner,3
|
| 217 |
+
12.9,1.1,Female,Yes,Sat,Dinner,2
|
| 218 |
+
28.15,3.0,Male,Yes,Sat,Dinner,5
|
| 219 |
+
11.59,1.5,Male,Yes,Sat,Dinner,2
|
| 220 |
+
7.74,1.44,Male,Yes,Sat,Dinner,2
|
| 221 |
+
30.14,3.09,Female,Yes,Sat,Dinner,4
|
| 222 |
+
12.16,2.2,Male,Yes,Fri,Lunch,2
|
| 223 |
+
13.42,3.48,Female,Yes,Fri,Lunch,2
|
| 224 |
+
8.58,1.92,Male,Yes,Fri,Lunch,1
|
| 225 |
+
15.98,3.0,Female,No,Fri,Lunch,3
|
| 226 |
+
13.42,1.58,Male,Yes,Fri,Lunch,2
|
| 227 |
+
16.27,2.5,Female,Yes,Fri,Lunch,2
|
| 228 |
+
10.09,2.0,Female,Yes,Fri,Lunch,2
|
| 229 |
+
20.45,3.0,Male,No,Sat,Dinner,4
|
| 230 |
+
13.28,2.72,Male,No,Sat,Dinner,2
|
| 231 |
+
22.12,2.88,Female,Yes,Sat,Dinner,2
|
| 232 |
+
24.01,2.0,Male,Yes,Sat,Dinner,4
|
| 233 |
+
15.69,3.0,Male,Yes,Sat,Dinner,3
|
| 234 |
+
11.61,3.39,Male,No,Sat,Dinner,2
|
| 235 |
+
10.77,1.47,Male,No,Sat,Dinner,2
|
| 236 |
+
15.53,3.0,Male,Yes,Sat,Dinner,2
|
| 237 |
+
10.07,1.25,Male,No,Sat,Dinner,2
|
| 238 |
+
12.6,1.0,Male,Yes,Sat,Dinner,2
|
| 239 |
+
32.83,1.17,Male,Yes,Sat,Dinner,2
|
| 240 |
+
35.83,4.67,Female,No,Sat,Dinner,3
|
| 241 |
+
29.03,5.92,Male,No,Sat,Dinner,3
|
| 242 |
+
27.18,2.0,Female,Yes,Sat,Dinner,2
|
| 243 |
+
22.67,2.0,Male,Yes,Sat,Dinner,2
|
| 244 |
+
17.82,1.75,Male,No,Sat,Dinner,2
|
| 245 |
+
18.78,3.0,Female,No,Thur,Dinner,2
|