alrichardbollans commited on
Commit
5107c4c
·
1 Parent(s): 4db8fed

Revert "Attempt to add multiprocessing"

Browse files

This reverts commit 3e5ea4d1975476e2a39b42e0f6f4953d2084469f.

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 run_predictions
 
 
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
- multiple=True,
30
- accept=[".png", ".jpg", ".jpeg"]),
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
- is_running.set(True)
53
- try:
54
- results = run_predictions(files)
55
- print('DONE ALL PREDICTIONS')
56
- analysis_results.set(results)
57
- finally:
58
- is_running.set(False)
 
 
 
 
 
 
 
 
 
 
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 .running_model import *
 
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
- # tips = pd.read_csv(app_dir / "tips.csv")
 
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