bhacquin commited on
Commit
dd3858d
·
verified ·
1 Parent(s): 8649637

Update demo.py

Browse files
Files changed (1) hide show
  1. demo.py +173 -114
demo.py CHANGED
@@ -14,8 +14,8 @@ from firebase_admin import db, credentials
14
 
15
  # Constants for video display
16
  VIDEO_FOLDERS = {
17
- "ours": "./userstudy_200_ours/",
18
- "omni": "./userstudy_200_omni/"
19
  }
20
  NUMBER_OF_EXPERIMENTS = 200 # Assuming sample0.mp4 to sample199.mp4
21
 
@@ -126,21 +126,22 @@ def generate_new_experiment() -> Experiment:
126
  )
127
 
128
 
129
- def save(mode, experiment, video_left_component, video_right_component, message_component):
130
  """
131
- Saves the user's selection to Firebase.
132
- - mode: "save" or "skip"
133
  """
134
- if mode == "save":
135
- if experiment is None or experiment.get("selected_video") is None:
136
- # Update the message component with a warning
137
- message_component.value = "⚠️ You must select a video before submitting ⚠️"
138
- return [experiment, video_left_component, video_right_component, message_component]
139
- elif mode == "skip":
140
- experiment["selected_video"] = "None"
141
 
 
142
  try:
143
- dict_to_save = experiment_to_dict(experiment, skip=(mode == "skip"))
144
  firebase_data_ref.push(dict_to_save)
145
 
146
  print("=====================")
@@ -154,69 +155,154 @@ def save(mode, experiment, video_left_component, video_right_component, message_
154
  message_component.value = f"❌ Failed to save your choice: {e} ❌"
155
  print(f"Error saving to Firebase: {e}")
156
 
157
- return next_experiment()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
158
 
159
-
160
- ##################################################################
161
- # UI Layer
162
- ##################################################################
163
 
164
 
165
- def next_experiment():
166
  """
167
- Prepares the next set of videos for the user to evaluate.
 
168
  """
169
- new_experiment = generate_new_experiment()
170
-
171
- # Create video components with initial state as unselected
172
- video_left_component = gr.Video(
173
- value=new_experiment["video_left"],
174
- label="left",
175
- elem_id="video-left",
176
- show_label=False,
177
- show_download_button=False,
178
- show_share_button=False,
179
- interactive=True
180
- )
181
- video_right_component = gr.Video(
182
- value=new_experiment["video_right"],
183
- label="right",
184
- elem_id="video-right",
185
- show_label=False,
186
- show_download_button=False,
187
- show_share_button=False,
188
- interactive=True
189
- )
190
 
191
- return [new_experiment, video_left_component, video_right_component, ""] # Empty message
 
192
 
 
 
 
 
193
 
194
- def on_select(selected_label, experiment, video_left_component, video_right_component, message_component):
195
- """
196
- Handles the selection of a video by the user.
197
- """
198
- if selected_label.lower() == "left":
199
- experiment["selected_video"] = "left"
200
- elif selected_label.lower() == "right":
201
- experiment["selected_video"] = "right"
202
- else:
203
- experiment["selected_video"] = None # For safety
204
 
205
- # Update the video components to reflect selection
206
- if experiment["selected_video"] == "left":
207
- video_left_component.update(elem_id="sel")
208
- video_right_component.update(elem_id="unsel")
209
- elif experiment["selected_video"] == "right":
210
- video_left_component.update(elem_id="unsel")
211
- video_right_component.update(elem_id="sel")
212
- else:
213
- video_left_component.update(elem_id="unsel")
214
- video_right_component.update(elem_id="unsel")
215
 
216
- # Clear any previous messages
217
- message_component.value = ""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
218
 
219
- return [experiment, video_left_component, video_right_component, message_component]
 
 
 
 
 
220
 
221
 
222
  css = """
@@ -234,36 +320,13 @@ css = """
234
  padding-left: 2%;
235
  padding-right: 2%;
236
  }
237
- .video-container {
238
- position: relative;
239
- display: inline-block;
240
- }
241
- .select-overlay {
242
- position: absolute;
243
- top: 0;
244
- left: 0;
245
  width: 100%;
246
- height: 100%;
247
- cursor: pointer;
248
- background-color: rgba(0, 0, 0, 0); /* Transparent */
249
  }
250
- .select-overlay:hover {
251
- background-color: rgba(0, 0, 0, 0.1); /* Slight overlay on hover */
252
- }
253
- .select-button {
254
- position: absolute;
255
- top: 10px;
256
- left: 10px;
257
- padding: 5px 10px;
258
- background-color: rgba(0, 0, 0, 0.5);
259
  color: white;
260
- border: none;
261
- border-radius: 5px;
262
- cursor: pointer;
263
- display: none;
264
- }
265
- .video-container:hover .select-button {
266
- display: block;
267
  }
268
  """
269
 
@@ -276,7 +339,6 @@ with gr.Blocks(title="Unsupervised Video Editing", css=css) as demo:
276
  gr.Markdown("<div style='width: 100%'><h1 style='text-align: center;'>Choose Your Preferred Video</h1></div>")
277
  gr.Markdown("<div style='width: 100%'><h3 style='text-align: center;'>Select the video you prefer.<br/>⚠️Consider fidelity and quality⚠️</h3></div>")
278
  btn_skip = gr.Button("I have no preference")
279
- btn_submit = gr.Button("Submit preference")
280
  message_component = gr.Markdown("") # For displaying messages
281
 
282
  with gr.Row():
@@ -288,7 +350,9 @@ with gr.Blocks(title="Unsupervised Video Editing", css=css) as demo:
288
  show_label=False,
289
  show_download_button=False,
290
  show_share_button=False,
291
- interactive=True
 
 
292
  )
293
  with gr.Column(scale=1):
294
  video_right_component = gr.Video(
@@ -297,44 +361,39 @@ with gr.Blocks(title="Unsupervised Video Editing", css=css) as demo:
297
  show_label=False,
298
  show_download_button=False,
299
  show_share_button=False,
300
- interactive=True
 
 
301
  )
302
 
303
  with gr.Row():
304
- # Now define the Select buttons after both video components are defined
305
  with gr.Column(scale=1):
306
- select_left = gr.Button("Select Left Video", elem_id="select-button-left")
307
  with gr.Column(scale=1):
308
- select_right = gr.Button("Select Right Video", elem_id="select-button-right")
309
 
310
  with gr.Row():
311
- # Configure the skip and submit buttons
312
  btn_skip.click(
313
- fn=partial(save, mode="skip"),
314
- inputs=[experiment, video_left_component, video_right_component, message_component],
315
- outputs=[experiment, video_left_component, video_right_component, message_component],
316
- queue=False,
317
- show_progress=False
318
- )
319
- btn_submit.click(
320
- fn=partial(save, mode="save"),
321
- inputs=[experiment, video_left_component, video_right_component, message_component],
322
  outputs=[experiment, video_left_component, video_right_component, message_component],
323
  queue=False,
324
  show_progress=False
325
  )
326
 
327
- # Attach select events to select buttons
328
  select_left.click(
329
- fn=partial(on_select, selected_label="left"),
330
- inputs=[experiment, video_left_component, video_right_component, message_component],
331
  outputs=[experiment, video_left_component, video_right_component, message_component],
332
  queue=False,
333
  show_progress=False
334
  )
335
  select_right.click(
336
- fn=partial(on_select, selected_label="right"),
337
- inputs=[experiment, video_left_component, video_right_component, message_component],
338
  outputs=[experiment, video_left_component, video_right_component, message_component],
339
  queue=False,
340
  show_progress=False
@@ -342,7 +401,7 @@ with gr.Blocks(title="Unsupervised Video Editing", css=css) as demo:
342
 
343
  # Load the first experiment on app startup
344
  demo.load(
345
- fn=next_experiment,
346
  inputs=None,
347
  outputs=[experiment, video_left_component, video_right_component, message_component]
348
  )
 
14
 
15
  # Constants for video display
16
  VIDEO_FOLDERS = {
17
+ "ours": "./videos/userstudy_200_ours/",
18
+ "omni": "./videos/userstudy_200_omni/"
19
  }
20
  NUMBER_OF_EXPERIMENTS = 200 # Assuming sample0.mp4 to sample199.mp4
21
 
 
126
  )
127
 
128
 
129
+ def select_and_load(selected_label, experiment, message_component):
130
  """
131
+ Handles the selection of a video by the user.
132
+ Saves the selection and loads the next experiment.
133
  """
134
+ # Update the experiment's selected video
135
+ if selected_label.lower() == "left":
136
+ experiment["selected_video"] = "left"
137
+ elif selected_label.lower() == "right":
138
+ experiment["selected_video"] = "right"
139
+ else:
140
+ experiment["selected_video"] = None # For safety
141
 
142
+ # Save the current selection to Firebase
143
  try:
144
+ dict_to_save = experiment_to_dict(experiment, skip=False)
145
  firebase_data_ref.push(dict_to_save)
146
 
147
  print("=====================")
 
155
  message_component.value = f"❌ Failed to save your choice: {e} ❌"
156
  print(f"Error saving to Firebase: {e}")
157
 
158
+ # Generate the next experiment
159
+ try:
160
+ new_experiment = generate_new_experiment()
161
+
162
+ # Create new video components
163
+ video_left_new = gr.Video(
164
+ value=new_experiment["video_left"],
165
+ label="left",
166
+ elem_id="video-left",
167
+ show_label=False,
168
+ show_download_button=False,
169
+ show_share_button=False,
170
+ interactive=True,
171
+ source="remote",
172
+ type="filepath"
173
+ )
174
+ video_right_new = gr.Video(
175
+ value=new_experiment["video_right"],
176
+ label="right",
177
+ elem_id="video-right",
178
+ show_label=False,
179
+ show_download_button=False,
180
+ show_share_button=False,
181
+ interactive=True,
182
+ source="remote",
183
+ type="filepath"
184
+ )
185
+ except Exception as e:
186
+ # If generating a new experiment fails, notify the user
187
+ message_component.value = f"❌ Failed to load new videos: {e} ❌"
188
+ print(f"Error generating new experiment: {e}")
189
+ # Keep the current experiment and videos
190
+ video_left_new = gr.Video(
191
+ value=experiment["video_left"],
192
+ label="left",
193
+ elem_id="video-left",
194
+ show_label=False,
195
+ show_download_button=False,
196
+ show_share_button=False,
197
+ interactive=True,
198
+ source="remote",
199
+ type="filepath"
200
+ )
201
+ video_right_new = gr.Video(
202
+ value=experiment["video_right"],
203
+ label="right",
204
+ elem_id="video-right",
205
+ show_label=False,
206
+ show_download_button=False,
207
+ show_share_button=False,
208
+ interactive=True,
209
+ source="remote",
210
+ type="filepath"
211
+ )
212
+ new_experiment = experiment # Keep the current experiment
213
 
214
+ return [new_experiment, video_left_new, video_right_new, message_component.value]
 
 
 
215
 
216
 
217
+ def skip_experiment(mode, experiment, message_component):
218
  """
219
+ Handles the skipping of an experiment.
220
+ Saves the skip and loads the next experiment.
221
  """
222
+ if mode != "skip":
223
+ return [experiment, gr.Video(), gr.Video(), ""]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
224
 
225
+ # Set selected_video to "None" to indicate skip
226
+ experiment["selected_video"] = "None"
227
 
228
+ # Save the skip to Firebase
229
+ try:
230
+ dict_to_save = experiment_to_dict(experiment, skip=True)
231
+ firebase_data_ref.push(dict_to_save)
232
 
233
+ print("=====================")
234
+ print(dict_to_save)
235
+ print("=====================")
 
 
 
 
 
 
 
236
 
237
+ # Update the message component with a success message
238
+ message_component.value = " Your skip has been recorded ✅"
239
+ except Exception as e:
240
+ # Update the message component with an error message
241
+ message_component.value = f"❌ Failed to record your skip: {e} ❌"
242
+ print(f"Error saving skip to Firebase: {e}")
 
 
 
 
243
 
244
+ # Generate the next experiment
245
+ try:
246
+ new_experiment = generate_new_experiment()
247
+
248
+ # Create new video components
249
+ video_left_new = gr.Video(
250
+ value=new_experiment["video_left"],
251
+ label="left",
252
+ elem_id="video-left",
253
+ show_label=False,
254
+ show_download_button=False,
255
+ show_share_button=False,
256
+ interactive=True,
257
+ source="remote",
258
+ type="filepath"
259
+ )
260
+ video_right_new = gr.Video(
261
+ value=new_experiment["video_right"],
262
+ label="right",
263
+ elem_id="video-right",
264
+ show_label=False,
265
+ show_download_button=False,
266
+ show_share_button=False,
267
+ interactive=True,
268
+ source="remote",
269
+ type="filepath"
270
+ )
271
+ except Exception as e:
272
+ # If generating a new experiment fails, notify the user
273
+ message_component.value = f"❌ Failed to load new videos: {e} ❌"
274
+ print(f"Error generating new experiment: {e}")
275
+ # Keep the current experiment and videos
276
+ video_left_new = gr.Video(
277
+ value=experiment["video_left"],
278
+ label="left",
279
+ elem_id="video-left",
280
+ show_label=False,
281
+ show_download_button=False,
282
+ show_share_button=False,
283
+ interactive=True,
284
+ source="remote",
285
+ type="filepath"
286
+ )
287
+ video_right_new = gr.Video(
288
+ value=experiment["video_right"],
289
+ label="right",
290
+ elem_id="video-right",
291
+ show_label=False,
292
+ show_download_button=False,
293
+ show_share_button=False,
294
+ interactive=True,
295
+ source="remote",
296
+ type="filepath"
297
+ )
298
+ new_experiment = experiment # Keep the current experiment
299
 
300
+ return [new_experiment, video_left_new, video_right_new, message_component.value]
301
+
302
+
303
+ ##################################################################
304
+ # UI Layer
305
+ ##################################################################
306
 
307
 
308
  css = """
 
320
  padding-left: 2%;
321
  padding-right: 2%;
322
  }
323
+ .select-button {
324
+ margin-top: 10px;
 
 
 
 
 
 
325
  width: 100%;
 
 
 
326
  }
327
+ .select-button:hover {
328
+ background-color: #00c0ff;
 
 
 
 
 
 
 
329
  color: white;
 
 
 
 
 
 
 
330
  }
331
  """
332
 
 
339
  gr.Markdown("<div style='width: 100%'><h1 style='text-align: center;'>Choose Your Preferred Video</h1></div>")
340
  gr.Markdown("<div style='width: 100%'><h3 style='text-align: center;'>Select the video you prefer.<br/>⚠️Consider fidelity and quality⚠️</h3></div>")
341
  btn_skip = gr.Button("I have no preference")
 
342
  message_component = gr.Markdown("") # For displaying messages
343
 
344
  with gr.Row():
 
350
  show_label=False,
351
  show_download_button=False,
352
  show_share_button=False,
353
+ interactive=True,
354
+ source="remote",
355
+ type="filepath"
356
  )
357
  with gr.Column(scale=1):
358
  video_right_component = gr.Video(
 
361
  show_label=False,
362
  show_download_button=False,
363
  show_share_button=False,
364
+ interactive=True,
365
+ source="remote",
366
+ type="filepath"
367
  )
368
 
369
  with gr.Row():
370
+ # Add Select buttons below each video
371
  with gr.Column(scale=1):
372
+ select_left = gr.Button("Select Left Video", elem_id="select-button-left", variant="primary")
373
  with gr.Column(scale=1):
374
+ select_right = gr.Button("Select Right Video", elem_id="select-button-right", variant="primary")
375
 
376
  with gr.Row():
377
+ # Configure the skip button
378
  btn_skip.click(
379
+ fn=partial(skip_experiment, mode="skip"),
380
+ inputs=[experiment, message_component],
 
 
 
 
 
 
 
381
  outputs=[experiment, video_left_component, video_right_component, message_component],
382
  queue=False,
383
  show_progress=False
384
  )
385
 
386
+ # Configure the select buttons to handle selection and load next experiment
387
  select_left.click(
388
+ fn=partial(select_and_load, selected_label="left"),
389
+ inputs=[experiment, message_component],
390
  outputs=[experiment, video_left_component, video_right_component, message_component],
391
  queue=False,
392
  show_progress=False
393
  )
394
  select_right.click(
395
+ fn=partial(select_and_load, selected_label="right"),
396
+ inputs=[experiment, message_component],
397
  outputs=[experiment, video_left_component, video_right_component, message_component],
398
  queue=False,
399
  show_progress=False
 
401
 
402
  # Load the first experiment on app startup
403
  demo.load(
404
+ fn=generate_new_experiment,
405
  inputs=None,
406
  outputs=[experiment, video_left_component, video_right_component, message_component]
407
  )