Mayamaya commited on
Commit
c6c7739
·
1 Parent(s): c946eca
app.py CHANGED
@@ -1,5 +1,5 @@
1
  # ==============================================================================
2
- # evaluation_interface のコードブロック(修正済み)
3
  # ==============================================================================
4
  import os
5
  import sys
@@ -12,31 +12,13 @@ from collections import defaultdict, Counter
12
 
13
  import gradio as gr
14
  from loguru import logger
15
- from PIL import Image # ★ 修正点1: PILライブラリをインポート
16
  import re
17
 
 
 
18
 
19
- # --- Global State ---
20
- GLOBAL_STATE = {
21
- "participant_id": None,
22
- "data_loaded": False,
23
- "all_eval_data": [],
24
- "shuffled_indices": [],
25
- "current_prompt_index": 0,
26
- "current_criterion_index": 0,
27
- "image_mapping": {},
28
- "image_dir": "",
29
- "evaluation_results": {},
30
- "image_orders": {},
31
- "start_time": None,
32
- "end_time": None,
33
- "current_ranks": {},
34
- "current_absolute_score": None,
35
- "current_absolute_score_worst": None,
36
- "hide_bbox_dict": {}, # ★ 修正点2: マスキング情報を格納するキーを追加
37
- }
38
-
39
- # --- Configuration ---
40
  BASE_RESULTS_DIR = "./results"
41
  LOG_DIR = "./logs"
42
  COMBINED_DATA_DIR = "./combined_data"
@@ -44,18 +26,6 @@ IMAGE_SUBDIR = os.path.join("lapwing", "images")
44
  MAPPING_FILENAME = "combination_to_filename.json"
45
  CONDITIONS = ["Ours", "w_o_Proto_Loss", "w_o_HitL", "w_o_Tuning", "LLM-based"]
46
  CRITERIA = ["Alignment", "Naturalness", "Attractiveness"]
47
-
48
- # CRITERIA_GUIDANCE_JP = [
49
- # "テキストと表情がどれだけ一致しているか",
50
- # "テキストの感情に沿ったセリフを言っていると想像したとき、表情がどれだけ自然か",
51
- # "テキストの感情に沿ったセリフを言っていると想像したとき、表情がどれだけ魅力的か"
52
- # ]
53
- # CRITERIA_GUIDANCE_EN = [
54
- # "how well the expression aligns with the text",
55
- # "imagining the character is speaking a line that matches the emotion of the text, how natural the facial expression is",
56
- # "imagining the character is speaking a line that matches the emotion of the text, how attractive the facial expression is"
57
- # ]
58
-
59
  CRITERIA_GUIDANCE_JP = [
60
  "テキストと上半分の表情がどれだけ一致していますか?",
61
  "提示されたテキストと上半分の表情を考慮した上で、このキャラクターはどれだけ自然に見えますか?",
@@ -69,24 +39,23 @@ CRITERIA_GUIDANCE_EN = [
69
  IMAGE_LABELS = ['A', 'B', 'C', 'D', 'E']
70
 
71
 
72
- # ★ 修正点3: マスキング用のヘルパー関数を classification_interface からコピー
73
- # --- Helper Functions ---
74
- def load_bbox_json(bbox_json_path):
75
- """バウンディングボックス情報をJSONファイルから読み込む"""
76
  try:
77
  with open(bbox_json_path, 'r', encoding='utf-8') as f:
78
  bbox_data = json.load(f)
79
- # evaluation_interface では hide (隠す領域) のみ必要
80
- GLOBAL_STATE["hide_bbox_dict"] = bbox_data.get("Hide", {})
81
  logger.info(f"Successfully loaded bounding box data from {bbox_json_path}")
82
  except Exception as e:
83
  logger.error(f"Failed to load bounding box JSON: {e}")
84
- GLOBAL_STATE["hide_bbox_dict"] = {}
 
85
 
86
 
87
- def create_masked_image(image: Image.Image):
88
  """画像に黒塗りのマスクを適用する"""
89
- hide_bbox_dict = GLOBAL_STATE.get("hide_bbox_dict", {})
90
  if not hide_bbox_dict:
91
  return image
92
  masked_img = image.copy()
@@ -97,8 +66,8 @@ def create_masked_image(image: Image.Image):
97
  return masked_img
98
 
99
 
100
- def get_image_path_from_prediction(prediction: dict) -> str:
101
- if not GLOBAL_STATE["image_mapping"]:
102
  logger.error("Image mapping is not loaded.")
103
  return ""
104
  indices = prediction.get("blendshape_index", {})
@@ -107,36 +76,35 @@ def get_image_path_from_prediction(prediction: dict) -> str:
107
  return ""
108
  sorted_indices = sorted(indices.items(), key=lambda item: int(item[0]))
109
  key = ",".join(str(idx) for _, idx in sorted_indices)
110
- filename = GLOBAL_STATE["image_mapping"].get(key)
111
  if not filename:
112
  logger.warning(f"No image found for blendshape key: {key}")
113
  return ""
114
- return os.path.join(GLOBAL_STATE["image_dir"], filename)
115
 
116
 
117
- def load_evaluation_data(participant_id: str):
118
- #修正点4: バウンディングボックス情報を読み込む処理を追加
119
- # classification_interfaceのパス構造を参考に、bboxファイルのパスを構築
120
  bbox_json_path = os.path.join(COMBINED_DATA_DIR, "lapwing", "texts", "bounding_boxes.json")
121
  if os.path.exists(bbox_json_path):
122
- load_bbox_json(bbox_json_path)
123
  else:
124
  logger.warning(f"Bounding box file not found at {bbox_json_path}. Images will not be masked.")
125
- GLOBAL_STATE["hide_bbox_dict"] = {}
126
 
127
  mapping_path = os.path.join(COMBINED_DATA_DIR, MAPPING_FILENAME)
128
  if not os.path.exists(mapping_path):
129
- return f"<p class='feedback red'>Error: Mapping file not found at {mapping_path}</p>", gr.update(
130
  interactive=True), gr.update(interactive=False)
131
 
132
  with open(mapping_path, 'r', encoding='utf-8') as f:
133
- GLOBAL_STATE["image_mapping"] = json.load(f)["mapping"]
134
- GLOBAL_STATE["image_dir"] = os.path.join(COMBINED_DATA_DIR, IMAGE_SUBDIR)
135
- logger.info(f"Successfully loaded image mapping. Image directory: {GLOBAL_STATE['image_dir']}")
136
 
137
  participant_dir = os.path.join(BASE_RESULTS_DIR, participant_id)
138
  if not os.path.isdir(participant_dir):
139
- return f"<p class='feedback red'>Error: Participant directory not found: {participant_dir}</p>", gr.update(
140
  interactive=True), gr.update(interactive=False)
141
 
142
  merged_data = defaultdict(lambda: {"predictions": {}, "category": None})
@@ -158,38 +126,38 @@ def load_evaluation_data(participant_id: str):
158
  merged_data[prompt]["category"] = data.get("prompt_category")
159
 
160
  if found_files != len(CONDITIONS):
161
- return f"<p class='feedback red'>Error: Found prediction files for only {found_files}/{len(CONDITIONS)} conditions.</p>", gr.update(
162
  interactive=True), gr.update(interactive=False)
163
 
164
- GLOBAL_STATE["all_eval_data"] = [
165
  {"prompt": p, "predictions": d["predictions"], "category": d["category"]}
166
  for p, d in merged_data.items() if len(d["predictions"]) == len(CONDITIONS)
167
  ]
168
 
169
- if not GLOBAL_STATE["all_eval_data"]:
170
- return "<p class='feedback red'>Error: No valid evaluation data could be loaded.</p>", gr.update(
171
  interactive=True), gr.update(interactive=False)
172
 
173
- GLOBAL_STATE["shuffled_indices"] = list(range(len(GLOBAL_STATE["all_eval_data"])))
174
- random.shuffle(GLOBAL_STATE["shuffled_indices"])
175
- GLOBAL_STATE["current_prompt_index"] = 0
176
- GLOBAL_STATE["current_criterion_index"] = 0
177
- GLOBAL_STATE["data_loaded"] = True
178
- GLOBAL_STATE["start_time"] = datetime.now()
179
- for i in range(len(GLOBAL_STATE["all_eval_data"])):
180
- prompt_text = GLOBAL_STATE["all_eval_data"][i]["prompt"]
181
- GLOBAL_STATE["evaluation_results"][prompt_text] = {}
182
-
183
- logger.info(f"Loaded and merged data for {len(GLOBAL_STATE['all_eval_data'])} prompts.")
184
  done_msg = "<p class='feedback green'>Data loaded successfully. Please proceed to the 'Evaluation' tab. / データの読み込みに成功しました。「評価」タブに進んでください。</p>"
185
- return done_msg, gr.update(interactive=False, visible=False), gr.update(interactive=True)
186
 
187
 
188
- # --- Core Logic (unchanged) ---
189
- def _create_button_updates():
190
  updates = []
191
  for img_label in IMAGE_LABELS:
192
- selected_rank = GLOBAL_STATE["current_ranks"].get(img_label)
193
  for rank_val in range(1, 6):
194
  if rank_val == selected_rank:
195
  updates.append(gr.update(variant='primary'))
@@ -198,75 +166,77 @@ def _create_button_updates():
198
  return updates
199
 
200
 
201
- def handle_rank_button_click(image_label, rank):
202
- if GLOBAL_STATE["current_ranks"].get(image_label) == rank:
203
- GLOBAL_STATE["current_ranks"][image_label] = None
204
  else:
205
- GLOBAL_STATE["current_ranks"][image_label] = rank
206
- return _create_button_updates()
207
 
208
 
209
- def handle_absolute_score_click(score):
210
- if GLOBAL_STATE["current_absolute_score"] == score:
211
- GLOBAL_STATE["current_absolute_score"] = None
212
  else:
213
- GLOBAL_STATE["current_absolute_score"] = score
214
  updates = []
215
  for i in range(1, 8):
216
- if i == GLOBAL_STATE["current_absolute_score"]:
217
  updates.append(gr.update(variant='primary'))
218
  else:
219
  updates.append(gr.update(variant='secondary'))
220
- return updates
221
 
222
 
223
- def handle_absolute_score_worst_click(score):
224
- if GLOBAL_STATE["current_absolute_score_worst"] == score:
225
- GLOBAL_STATE["current_absolute_score_worst"] = None
226
  else:
227
- GLOBAL_STATE["current_absolute_score_worst"] = score
228
  updates = []
229
  for i in range(1, 8):
230
- if i == GLOBAL_STATE["current_absolute_score_worst"]:
231
  updates.append(gr.update(variant='primary'))
232
  else:
233
  updates.append(gr.update(variant='secondary'))
234
- return updates
235
 
236
 
237
- # --- UI Logic ---
238
- def display_current_prompt_and_criterion():
239
- if not GLOBAL_STATE["data_loaded"] or GLOBAL_STATE["current_prompt_index"] >= len(GLOBAL_STATE["all_eval_data"]):
240
  done_msg = "<p class='feedback green' style='text-align: center; font-size: 1.2em;'>All prompts have been evaluated! Please proceed to the 'Export' tab. <br>すべてのプロンプトの評価が完了しました!「エクスポート」タブに進んでください。</p>"
241
  empty_button_updates = [gr.update(variant='secondary')] * 25
242
  empty_abs_updates = [gr.update(variant='secondary')] * 7
243
  return [
244
- gr.update(value="Finished! / 完了!"), # progress_text
245
- gr.update(value=""), # combined_instructions_display
246
- gr.update(value=""), # prompt_display
247
- gr.update(value=done_msg, visible=True), # error_display
248
  *[gr.update(value=None)] * 5,
249
  *empty_button_updates,
250
- gr.update(visible=False), # abs_group_best
251
  *empty_abs_updates,
252
- gr.update(visible=False), # abs_group_worst
253
  *empty_abs_updates,
254
  gr.update(interactive=False),
255
  gr.update(interactive=False)
256
  ]
257
 
258
- prompt_idx = GLOBAL_STATE["shuffled_indices"][GLOBAL_STATE["current_prompt_index"]]
259
- criterion_idx = GLOBAL_STATE["current_criterion_index"]
260
 
261
- current_data = GLOBAL_STATE["all_eval_data"][prompt_idx]
262
  prompt_text = current_data["prompt"]
263
  criterion_name = CRITERIA[criterion_idx]
264
 
265
- progress_text = f"Prompt {GLOBAL_STATE['current_prompt_index'] + 1} / {len(GLOBAL_STATE['all_eval_data'])} - **{criterion_name}**"
266
  prompt_display_text = f"<p style='font-size: 3em; font-weight: bold;'>テキスト(TEXT): {prompt_text}</p>"
 
267
  guidance_part = (
268
  f"<p style='color: red; font-weight: bold; font-size: 1.1em;'>"
269
  f"5つの画像を、「{CRITERIA_GUIDANCE_JP[criterion_idx]}」を基準にランキングしてください。<br>"
 
270
  f"Please rank the 5 images based on {CRITERIA_GUIDANCE_EN[criterion_idx]}"
271
  f"</p>"
272
  )
@@ -291,23 +261,22 @@ def display_current_prompt_and_criterion():
291
  combined_instructions = f"{guidance_part}<hr>{rules_part}<hr>{ai_note_part}"
292
 
293
  if criterion_idx == 0:
294
- GLOBAL_STATE["image_orders"] = {}
295
 
296
- if criterion_name not in GLOBAL_STATE["image_orders"]:
297
  conditions_shuffled = random.sample(CONDITIONS, len(CONDITIONS))
298
- GLOBAL_STATE["image_orders"][criterion_name] = conditions_shuffled
299
 
300
- current_image_order = GLOBAL_STATE["image_orders"][criterion_name]
301
  image_updates = []
302
  for cond_name in current_image_order:
303
  prediction = current_data["predictions"][cond_name]
304
- img_path = get_image_path_from_prediction(prediction)
305
 
306
- # ★ 修正点5: 画像を読み込み、マスキングを適用する
307
  if img_path and os.path.exists(img_path):
308
  try:
309
  pil_img = Image.open(img_path).convert('RGB')
310
- masked_img = create_masked_image(pil_img)
311
  image_updates.append(gr.update(value=masked_img))
312
  except Exception as e:
313
  logger.error(f"Failed to open or mask image {img_path}: {e}")
@@ -315,42 +284,42 @@ def display_current_prompt_and_criterion():
315
  else:
316
  image_updates.append(gr.update(value=None))
317
 
318
- saved_ranks_dict = GLOBAL_STATE["evaluation_results"].get(prompt_text, {}).get("ranks", {}).get(criterion_name)
319
  if saved_ranks_dict:
320
  label_to_condition = {label: cond for label, cond in zip(IMAGE_LABELS, current_image_order)}
321
  condition_to_label = {v: k for k, v in label_to_condition.items()}
322
- GLOBAL_STATE["current_ranks"] = {
323
  condition_to_label[cond]: rank for cond, rank in saved_ranks_dict.items() if cond in condition_to_label
324
  }
325
  else:
326
- GLOBAL_STATE["current_ranks"] = {label: None for label in IMAGE_LABELS}
327
 
328
- button_updates = _create_button_updates()
329
 
330
  is_alignment_criterion = (criterion_name == "Alignment")
331
  abs_group_update = gr.update(visible=is_alignment_criterion)
332
- saved_abs_score = GLOBAL_STATE["evaluation_results"].get(prompt_text, {}).get("absolute_score")
333
- GLOBAL_STATE["current_absolute_score"] = saved_abs_score if is_alignment_criterion else None
334
 
335
  abs_button_updates = []
336
  for i in range(1, 8):
337
- variant = 'primary' if i == GLOBAL_STATE["current_absolute_score"] else 'secondary'
338
  abs_button_updates.append(gr.update(variant=variant))
339
 
340
  abs_group_worst_update = gr.update(visible=is_alignment_criterion)
341
- saved_abs_score_worst = GLOBAL_STATE["evaluation_results"].get(prompt_text, {}).get("absolute_score_worst")
342
- GLOBAL_STATE["current_absolute_score_worst"] = saved_abs_score_worst if is_alignment_criterion else None
343
 
344
  abs_button_worst_updates = []
345
  for i in range(1, 8):
346
- variant = 'primary' if i == GLOBAL_STATE["current_absolute_score_worst"] else 'secondary'
347
  abs_button_worst_updates.append(gr.update(variant=variant))
348
 
349
  return [
350
  gr.update(value=progress_text),
351
  gr.update(value=combined_instructions),
352
  gr.update(value=prompt_display_text),
353
- gr.update(value="", visible=False), # Error display
354
  *image_updates,
355
  *button_updates,
356
  abs_group_update,
@@ -358,31 +327,30 @@ def display_current_prompt_and_criterion():
358
  abs_group_worst_update,
359
  *abs_button_worst_updates,
360
  gr.update(
361
- interactive=(GLOBAL_STATE["current_prompt_index"] > 0 or GLOBAL_STATE["current_criterion_index"] > 0)),
362
  gr.update(interactive=True)
363
  ]
364
 
365
 
366
- # --- (以降の関数は変更なし) ---
367
- def validate_and_navigate():
368
- ranks = GLOBAL_STATE["current_ranks"]
369
  error_msg = None
370
- criterion_name = CRITERIA[GLOBAL_STATE["current_criterion_index"]]
371
  is_alignment_criterion = (criterion_name == "Alignment")
372
 
373
  if any(r is None for r in ranks.values()):
374
  error_msg = "Please rank all 5 images. / 5つすべての画像を評価してください。"
375
  elif 1 not in ranks.values():
376
  error_msg = "You must assign a rank of '1' to at least one image. / 最低1つは「1位」を付けてください。"
377
- elif is_alignment_criterion and GLOBAL_STATE["current_absolute_score"] is None:
378
  error_msg = "Please provide an absolute score for the BEST matching image (1-7). / 最も一致している画像について、絶対評価(1~7)を選択してください。"
379
- elif is_alignment_criterion and GLOBAL_STATE["current_absolute_score_worst"] is None:
380
  error_msg = "Please provide an absolute score for the WORST matching image (1-7). / 最も一致していない画像について、絶対評価(1~7)を選択してください。"
381
  elif (
382
  is_alignment_criterion
383
- and GLOBAL_STATE["current_absolute_score"] is not None
384
- and GLOBAL_STATE["current_absolute_score_worst"] is not None
385
- and GLOBAL_STATE["current_absolute_score_worst"] > GLOBAL_STATE["current_absolute_score"]
386
  ):
387
  error_msg = (
388
  "The score for the WORST matching image cannot be higher than the score for the BEST matching image.<br>"
@@ -390,11 +358,15 @@ def validate_and_navigate():
390
  )
391
 
392
  if error_msg:
393
- no_change_updates = [gr.update()] * 53
394
- no_change_updates[4] = gr.update(
 
 
395
  value=f"<p class='feedback red' style='font-size: 1.2em; text-align: center;'>{error_msg}</p>",
396
  visible=True)
397
- return no_change_updates
 
 
398
 
399
  sorted_ranks = sorted(list(ranks.values()))
400
  rank_counts = Counter(sorted_ranks)
@@ -410,59 +382,70 @@ def validate_and_navigate():
410
  break
411
  i += count
412
  if error_msg:
413
- no_change_updates = [gr.update()] * 53
414
- no_change_updates[4] = gr.update(
 
 
415
  value=f"<p class='feedback red' style='font-size: 1.2em; text-align: center;'>{error_msg}</p>",
416
  visible=True)
417
- return no_change_updates
 
418
 
419
- prompt_idx = GLOBAL_STATE["shuffled_indices"][GLOBAL_STATE["current_prompt_index"]]
420
- current_data = GLOBAL_STATE["all_eval_data"][prompt_idx]
421
  prompt_text = current_data["prompt"]
422
- current_image_order = GLOBAL_STATE["image_orders"][criterion_name]
423
 
424
  label_to_condition = {label: cond for label, cond in zip(IMAGE_LABELS, current_image_order)}
425
  ranks_by_condition = {label_to_condition[label]: rank for label, rank in ranks.items()}
426
 
427
- if "ranks" not in GLOBAL_STATE["evaluation_results"][prompt_text]:
428
- GLOBAL_STATE["evaluation_results"][prompt_text]["ranks"] = {}
429
- if "orders" not in GLOBAL_STATE["evaluation_results"][prompt_text]:
430
- GLOBAL_STATE["evaluation_results"][prompt_text]["orders"] = {}
 
 
 
 
 
 
431
 
432
- GLOBAL_STATE["evaluation_results"][prompt_text]["ranks"][criterion_name] = ranks_by_condition
433
- GLOBAL_STATE["evaluation_results"][prompt_text]["orders"][criterion_name] = current_image_order
434
 
435
  if is_alignment_criterion:
436
- GLOBAL_STATE["evaluation_results"][prompt_text]["absolute_score"] = GLOBAL_STATE["current_absolute_score"]
437
- GLOBAL_STATE["evaluation_results"][prompt_text]["absolute_score_worst"] = GLOBAL_STATE[
438
- "current_absolute_score_worst"]
439
 
440
- logger.info(
441
- f"Saved rank for P:{GLOBAL_STATE['participant_id']}, Prompt:'{prompt_text}', Criterion:{criterion_name}, Ranks:{ranks_by_condition}")
 
442
 
443
- GLOBAL_STATE["current_criterion_index"] += 1
444
- if GLOBAL_STATE["current_criterion_index"] >= len(CRITERIA):
445
- GLOBAL_STATE["current_criterion_index"] = 0
446
- GLOBAL_STATE["current_prompt_index"] += 1
447
 
448
- if GLOBAL_STATE["current_prompt_index"] >= len(GLOBAL_STATE["all_eval_data"]):
449
- GLOBAL_STATE["end_time"] = datetime.now()
450
- eval_panel_updates = display_current_prompt_and_criterion()
451
- return [gr.update(interactive=True)] + eval_panel_updates
452
- else:
453
- return [gr.update()] + display_current_prompt_and_criterion()
 
 
 
 
 
454
 
455
 
456
- def navigate_previous():
457
- GLOBAL_STATE["current_criterion_index"] -= 1
458
- if GLOBAL_STATE["current_criterion_index"] < 0:
459
- GLOBAL_STATE["current_criterion_index"] = len(CRITERIA) - 1
460
- GLOBAL_STATE["current_prompt_index"] -= 1
461
- GLOBAL_STATE["current_prompt_index"] = max(0, GLOBAL_STATE["current_prompt_index"])
462
- return display_current_prompt_and_criterion()
463
 
 
 
464
 
465
- def export_results(participant_id, alignment_reason, naturalness_reason, attractiveness_reason, optional_comment):
 
 
466
  if not alignment_reason.strip() or not naturalness_reason.strip() or not attractiveness_reason.strip():
467
  error_msg = "<p class='feedback red'>Please fill in the reasoning for all three criteria (Alignment, Naturalness, Attractiveness). / 3つの評価基準(一致度, 自然さ, 魅力度)すべての判断理由を記入してください。</p>"
468
  return None, error_msg
@@ -475,15 +458,15 @@ def export_results(participant_id, alignment_reason, naturalness_reason, attract
475
  filename = f"evaluation_results_{participant_id}_{datetime.now().strftime('%Y%m%d_%H%M%S')}.json"
476
  filepath = os.path.join(output_dir, filename)
477
 
478
- duration = (GLOBAL_STATE["end_time"] - GLOBAL_STATE["start_time"]).total_seconds() if GLOBAL_STATE.get(
479
- "start_time") and GLOBAL_STATE.get("end_time") else None
480
 
481
- prompt_to_category = {item["prompt"]: item["category"] for item in GLOBAL_STATE["all_eval_data"]}
482
 
483
  final_results_list = []
484
- for prompt, data in GLOBAL_STATE["evaluation_results"].items():
485
  if not data: continue
486
-
487
  ranks_data = data.get("ranks", {})
488
  orders_data = data.get("orders", {})
489
 
@@ -516,6 +499,8 @@ def export_results(participant_id, alignment_reason, naturalness_reason, attract
516
  "results": final_results_list
517
  }
518
 
 
 
519
  try:
520
  with open(filepath, 'w', encoding='utf-8') as f:
521
  json.dump(export_data, f, ensure_ascii=False, indent=2)
@@ -537,6 +522,7 @@ def export_results(participant_id, alignment_reason, naturalness_reason, attract
537
 
538
  def create_gradio_interface():
539
  css = """
 
540
  .gradio-container { font-family: 'Arial', sans-serif; }
541
  .feedback { padding: 10px; border-radius: 5px; font-weight: bold; text-align: center; margin-top: 10px; }
542
  .feedback.green { background-color: #e6ffed; color: #2f6f4a; }
@@ -544,44 +530,41 @@ def create_gradio_interface():
544
  .image-label { font-size: 2.5em; font-weight: bold; margin-bottom: 10px; color: #333; }
545
  .prompt-display { text-align: center; margin-bottom: 15px; padding: 10px; background-color: #f0f8ff; border-radius: 8px; }
546
  .rank-btn-row { justify-content: center; gap: 5px !important; }
547
- .rank-btn {
548
- min-width: 65px !important;
549
- max-width: 65px !important;
550
- height: 45px !important;
551
- font-size: 1.2em !important;
552
- font-weight: bold !important;
553
- border-radius: 8px !important;
554
- border: 1px solid #ccc !important;
555
- }
556
- .rank-btn.secondary {
557
- background: #f0f0f0 !important;
558
- color: #333 !important;
559
- }
560
- .rank-btn.secondary:hover {
561
- background: #e0e0e0 !important;
562
- border-color: #bbb !important;
563
- }
564
- .absolute-eval-group {
565
- border: 1px solid #ddd;
566
- border-radius: 8px;
567
- padding: 15px;
568
- margin-top: 20px;
569
- }
570
- .instructions-container {
571
- padding: 15px;
572
- border: 1px solid #ccc;
573
- border-radius: 8px;
574
- margin-bottom: 20px;
575
- background-color: #fafafa;
576
- }
577
  .instructions-container ul { padding-left: 20px; margin-top: 5px; margin-bottom: 5px; }
578
  .instructions-container hr { margin: 15px 0; }
579
  """
580
 
581
  with gr.Blocks(title="Expression Evaluation Experiment", css=css) as app:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
582
  gr.Markdown("# Text-to-Expression Evaluation Experiment / テキストからの表情生成 評価実験")
583
 
584
  with gr.Tabs() as tabs:
 
585
  with gr.TabItem("1. Setup / セットアップ") as tab_setup:
586
  gr.Markdown("## (A) Participant Information / 参加者情報")
587
  gr.Markdown("Please enter your participant ID and click 'Confirm'. / 参加者IDを入力して「確定」を押してください。")
@@ -599,6 +582,7 @@ def create_gradio_interface():
599
  <li><b>この作業はPCで行ってください。/ Please perform this task on a PC.</b></li>
600
  <li>途中で止めずに最後まで続けてください。ファイルをアップロードして完了となります。/ Please continue until the end. The experiment is complete when you upload the file.</li>
601
  <li>ブラウザーをリロードしないでください (データが破損します)。/ Do not reload the browser (this will corrupt the data).</li>
 
602
  </ul></div>""")
603
  gr.Markdown(
604
  "Click the button below to load your evaluation data. / 下のボタンを押して、評価データを読み込んでください。")
@@ -618,7 +602,7 @@ def create_gradio_interface():
618
  with gr.Column(scale=1):
619
  with gr.Group():
620
  gr.Markdown(f"<div class='image-label' style='text-align: center;'>{label}</div>")
621
- img = gr.Image(type="pil", show_label=False, height=300) # typeを"pil"に変更
622
  image_components.append(img)
623
  with gr.Row(elem_classes="rank-btn-row"):
624
  rank_list = ["1位", "2位", "3位", "4位", "5位"]
@@ -691,18 +675,20 @@ def create_gradio_interface():
691
  download_file = gr.File(label="Download JSON", visible=False)
692
  export_status = gr.Markdown()
693
 
694
- # --- Event Handlers ---
695
- def check_and_confirm_id(pid):
696
  pid = pid.strip()
697
  if re.fullmatch(r"P\d{2}", pid):
698
- GLOBAL_STATE["participant_id"] = pid
699
- return gr.update(visible=False), gr.update(visible=True)
700
  else:
701
  error_msg = "<p class='feedback red'>Invalid ID. Must be 'P' followed by two digits (e.g., P01). / 無効なIDです。「P」と数字2桁の形式(例: P01)で入力してください。</p>"
702
- return gr.update(value=error_msg, visible=True), gr.update(visible=False)
703
 
704
- confirm_id_btn.click(check_and_confirm_id, [participant_id_input], [setup_warning, setup_main_group])
705
- load_data_btn.click(load_evaluation_data, [participant_id_input], [setup_status, load_data_btn, tab_evaluation])
 
 
706
 
707
  all_eval_outputs = [
708
  progress_text, combined_instructions_display, prompt_display, error_display, *image_components,
@@ -716,45 +702,48 @@ def create_gradio_interface():
716
  for label in IMAGE_LABELS:
717
  for rank_val in range(1, 6):
718
  btn = rank_buttons[btn_idx]
 
719
  btn.click(
720
  partial(handle_rank_button_click, label, rank_val),
721
- [],
722
- rank_buttons
723
  )
724
  btn_idx += 1
725
 
726
  for i, btn in enumerate(absolute_score_buttons):
727
  btn.click(
728
  partial(handle_absolute_score_click, i + 1),
729
- [],
730
- absolute_score_buttons
731
  )
732
 
733
  for i, btn in enumerate(absolute_score_worst_buttons):
734
  btn.click(
735
  partial(handle_absolute_score_worst_click, i + 1),
736
- [],
737
- absolute_score_worst_buttons
738
  )
739
 
740
- tab_evaluation.select(display_current_prompt_and_criterion, [], all_eval_outputs)
741
- next_btn.click(validate_and_navigate, [], [tab_export, *all_eval_outputs])
742
- prev_btn.click(navigate_previous, [], all_eval_outputs)
 
 
743
 
744
  export_tab_interactive_components = [alignment_reason_box, naturalness_reason_box, attractiveness_reason_box,
745
  optional_comment_box, export_btn]
746
 
747
- def on_select_export_tab():
748
- if GLOBAL_STATE.get("end_time"):
749
  return [gr.update(interactive=True)] * 5
750
  return [gr.update(interactive=False)] * 5
751
 
752
- tab_export.select(on_select_export_tab, [], export_tab_interactive_components)
753
 
754
  export_btn.click(
755
  export_results,
756
  [participant_id_input, alignment_reason_box, naturalness_reason_box, attractiveness_reason_box,
757
- optional_comment_box],
758
  [download_file, export_status]
759
  )
760
 
 
1
  # ==============================================================================
2
+ # evaluation_interface のコードブロック(セッションステート対応済み)
3
  # ==============================================================================
4
  import os
5
  import sys
 
12
 
13
  import gradio as gr
14
  from loguru import logger
15
+ from PIL import Image
16
  import re
17
 
18
+ # --- ★ 修正: GLOBAL_STATE を削除 ---
19
+ # グローバルな状態管理を廃止し、Gradioのセッションステート (gr.State) に移行します。
20
 
21
+ # --- Configuration (変更なし) ---
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
22
  BASE_RESULTS_DIR = "./results"
23
  LOG_DIR = "./logs"
24
  COMBINED_DATA_DIR = "./combined_data"
 
26
  MAPPING_FILENAME = "combination_to_filename.json"
27
  CONDITIONS = ["Ours", "w_o_Proto_Loss", "w_o_HitL", "w_o_Tuning", "LLM-based"]
28
  CRITERIA = ["Alignment", "Naturalness", "Attractiveness"]
 
 
 
 
 
 
 
 
 
 
 
 
29
  CRITERIA_GUIDANCE_JP = [
30
  "テキストと上半分の表情がどれだけ一致していますか?",
31
  "提示されたテキストと上半分の表情を考慮した上で、このキャラクターはどれだけ自然に見えますか?",
 
39
  IMAGE_LABELS = ['A', 'B', 'C', 'D', 'E']
40
 
41
 
42
+ # --- Helper Functions (修正: stateを引数に追加) ---
43
+ def load_bbox_json(bbox_json_path, state):
44
+ """バウンディングボックス情報をJSONファイルから読み込み、stateに格納する"""
 
45
  try:
46
  with open(bbox_json_path, 'r', encoding='utf-8') as f:
47
  bbox_data = json.load(f)
48
+ state["hide_bbox_dict"] = bbox_data.get("Hide", {})
 
49
  logger.info(f"Successfully loaded bounding box data from {bbox_json_path}")
50
  except Exception as e:
51
  logger.error(f"Failed to load bounding box JSON: {e}")
52
+ state["hide_bbox_dict"] = {}
53
+ return state
54
 
55
 
56
+ def create_masked_image(image: Image.Image, state: dict):
57
  """画像に黒塗りのマスクを適用する"""
58
+ hide_bbox_dict = state.get("hide_bbox_dict", {})
59
  if not hide_bbox_dict:
60
  return image
61
  masked_img = image.copy()
 
66
  return masked_img
67
 
68
 
69
+ def get_image_path_from_prediction(prediction: dict, state: dict) -> str:
70
+ if not state["image_mapping"]:
71
  logger.error("Image mapping is not loaded.")
72
  return ""
73
  indices = prediction.get("blendshape_index", {})
 
76
  return ""
77
  sorted_indices = sorted(indices.items(), key=lambda item: int(item[0]))
78
  key = ",".join(str(idx) for _, idx in sorted_indices)
79
+ filename = state["image_mapping"].get(key)
80
  if not filename:
81
  logger.warning(f"No image found for blendshape key: {key}")
82
  return ""
83
+ return os.path.join(state["image_dir"], filename)
84
 
85
 
86
+ def load_evaluation_data(participant_id: str, state: dict):
87
+ """修正: stateを引数で受け取り、更新したstateを返す """
 
88
  bbox_json_path = os.path.join(COMBINED_DATA_DIR, "lapwing", "texts", "bounding_boxes.json")
89
  if os.path.exists(bbox_json_path):
90
+ state = load_bbox_json(bbox_json_path, state)
91
  else:
92
  logger.warning(f"Bounding box file not found at {bbox_json_path}. Images will not be masked.")
93
+ state["hide_bbox_dict"] = {}
94
 
95
  mapping_path = os.path.join(COMBINED_DATA_DIR, MAPPING_FILENAME)
96
  if not os.path.exists(mapping_path):
97
+ return state, f"<p class='feedback red'>Error: Mapping file not found at {mapping_path}</p>", gr.update(
98
  interactive=True), gr.update(interactive=False)
99
 
100
  with open(mapping_path, 'r', encoding='utf-8') as f:
101
+ state["image_mapping"] = json.load(f)["mapping"]
102
+ state["image_dir"] = os.path.join(COMBINED_DATA_DIR, IMAGE_SUBDIR)
103
+ logger.info(f"Successfully loaded image mapping. Image directory: {state['image_dir']}")
104
 
105
  participant_dir = os.path.join(BASE_RESULTS_DIR, participant_id)
106
  if not os.path.isdir(participant_dir):
107
+ return state, f"<p class='feedback red'>Error: Participant directory not found: {participant_dir}</p>", gr.update(
108
  interactive=True), gr.update(interactive=False)
109
 
110
  merged_data = defaultdict(lambda: {"predictions": {}, "category": None})
 
126
  merged_data[prompt]["category"] = data.get("prompt_category")
127
 
128
  if found_files != len(CONDITIONS):
129
+ return state, f"<p class='feedback red'>Error: Found prediction files for only {found_files}/{len(CONDITIONS)} conditions.</p>", gr.update(
130
  interactive=True), gr.update(interactive=False)
131
 
132
+ state["all_eval_data"] = [
133
  {"prompt": p, "predictions": d["predictions"], "category": d["category"]}
134
  for p, d in merged_data.items() if len(d["predictions"]) == len(CONDITIONS)
135
  ]
136
 
137
+ if not state["all_eval_data"]:
138
+ return state, "<p class='feedback red'>Error: No valid evaluation data could be loaded.</p>", gr.update(
139
  interactive=True), gr.update(interactive=False)
140
 
141
+ state["shuffled_indices"] = list(range(len(state["all_eval_data"])))
142
+ random.shuffle(state["shuffled_indices"])
143
+ state["current_prompt_index"] = 0
144
+ state["current_criterion_index"] = 0
145
+ state["data_loaded"] = True
146
+ state["start_time"] = datetime.now()
147
+ for i in range(len(state["all_eval_data"])):
148
+ prompt_text = state["all_eval_data"][i]["prompt"]
149
+ state["evaluation_results"][prompt_text] = {}
150
+
151
+ logger.info(f"Loaded and merged data for {len(state['all_eval_data'])} prompts.")
152
  done_msg = "<p class='feedback green'>Data loaded successfully. Please proceed to the 'Evaluation' tab. / データの読み込みに成功しました。「評価」タブに進んでください。</p>"
153
+ return state, done_msg, gr.update(interactive=False, visible=False), gr.update(interactive=True)
154
 
155
 
156
+ # --- Core Logic (★ 修正: stateを引数に追加) ---
157
+ def _create_button_updates(state: dict):
158
  updates = []
159
  for img_label in IMAGE_LABELS:
160
+ selected_rank = state["current_ranks"].get(img_label)
161
  for rank_val in range(1, 6):
162
  if rank_val == selected_rank:
163
  updates.append(gr.update(variant='primary'))
 
166
  return updates
167
 
168
 
169
+ def handle_rank_button_click(image_label, rank, state: dict):
170
+ if state["current_ranks"].get(image_label) == rank:
171
+ state["current_ranks"][image_label] = None
172
  else:
173
+ state["current_ranks"][image_label] = rank
174
+ return state, *_create_button_updates(state)
175
 
176
 
177
+ def handle_absolute_score_click(score, state: dict):
178
+ if state["current_absolute_score"] == score:
179
+ state["current_absolute_score"] = None
180
  else:
181
+ state["current_absolute_score"] = score
182
  updates = []
183
  for i in range(1, 8):
184
+ if i == state["current_absolute_score"]:
185
  updates.append(gr.update(variant='primary'))
186
  else:
187
  updates.append(gr.update(variant='secondary'))
188
+ return state, *updates
189
 
190
 
191
+ def handle_absolute_score_worst_click(score, state: dict):
192
+ if state["current_absolute_score_worst"] == score:
193
+ state["current_absolute_score_worst"] = None
194
  else:
195
+ state["current_absolute_score_worst"] = score
196
  updates = []
197
  for i in range(1, 8):
198
+ if i == state["current_absolute_score_worst"]:
199
  updates.append(gr.update(variant='primary'))
200
  else:
201
  updates.append(gr.update(variant='secondary'))
202
+ return state, *updates
203
 
204
 
205
+ # --- UI Logic (★ 修正: stateを引数に追加) ---
206
+ def display_current_prompt_and_criterion(state: dict):
207
+ if not state["data_loaded"] or state["current_prompt_index"] >= len(state["all_eval_data"]):
208
  done_msg = "<p class='feedback green' style='text-align: center; font-size: 1.2em;'>All prompts have been evaluated! Please proceed to the 'Export' tab. <br>すべてのプロンプトの評価が完了しました!「エクスポート」タブに進んでください。</p>"
209
  empty_button_updates = [gr.update(variant='secondary')] * 25
210
  empty_abs_updates = [gr.update(variant='secondary')] * 7
211
  return [
212
+ gr.update(value="Finished! / 完了!"),
213
+ gr.update(value=""),
214
+ gr.update(value=""),
215
+ gr.update(value=done_msg, visible=True),
216
  *[gr.update(value=None)] * 5,
217
  *empty_button_updates,
218
+ gr.update(visible=False),
219
  *empty_abs_updates,
220
+ gr.update(visible=False),
221
  *empty_abs_updates,
222
  gr.update(interactive=False),
223
  gr.update(interactive=False)
224
  ]
225
 
226
+ prompt_idx = state["shuffled_indices"][state["current_prompt_index"]]
227
+ criterion_idx = state["current_criterion_index"]
228
 
229
+ current_data = state["all_eval_data"][prompt_idx]
230
  prompt_text = current_data["prompt"]
231
  criterion_name = CRITERIA[criterion_idx]
232
 
233
+ progress_text = f"Prompt {state['current_prompt_index'] + 1} / {len(state['all_eval_data'])} - **{criterion_name}**"
234
  prompt_display_text = f"<p style='font-size: 3em; font-weight: bold;'>テキスト(TEXT): {prompt_text}</p>"
235
+ # (Instructions text is unchanged)
236
  guidance_part = (
237
  f"<p style='color: red; font-weight: bold; font-size: 1.1em;'>"
238
  f"5つの画像を、「{CRITERIA_GUIDANCE_JP[criterion_idx]}」を基準にランキングしてください。<br>"
239
+ f"「ランキングの方法」をよく読んでつけてください。<br>"
240
  f"Please rank the 5 images based on {CRITERIA_GUIDANCE_EN[criterion_idx]}"
241
  f"</p>"
242
  )
 
261
  combined_instructions = f"{guidance_part}<hr>{rules_part}<hr>{ai_note_part}"
262
 
263
  if criterion_idx == 0:
264
+ state["image_orders"] = {}
265
 
266
+ if criterion_name not in state["image_orders"]:
267
  conditions_shuffled = random.sample(CONDITIONS, len(CONDITIONS))
268
+ state["image_orders"][criterion_name] = conditions_shuffled
269
 
270
+ current_image_order = state["image_orders"][criterion_name]
271
  image_updates = []
272
  for cond_name in current_image_order:
273
  prediction = current_data["predictions"][cond_name]
274
+ img_path = get_image_path_from_prediction(prediction, state)
275
 
 
276
  if img_path and os.path.exists(img_path):
277
  try:
278
  pil_img = Image.open(img_path).convert('RGB')
279
+ masked_img = create_masked_image(pil_img, state)
280
  image_updates.append(gr.update(value=masked_img))
281
  except Exception as e:
282
  logger.error(f"Failed to open or mask image {img_path}: {e}")
 
284
  else:
285
  image_updates.append(gr.update(value=None))
286
 
287
+ saved_ranks_dict = state["evaluation_results"].get(prompt_text, {}).get("ranks", {}).get(criterion_name)
288
  if saved_ranks_dict:
289
  label_to_condition = {label: cond for label, cond in zip(IMAGE_LABELS, current_image_order)}
290
  condition_to_label = {v: k for k, v in label_to_condition.items()}
291
+ state["current_ranks"] = {
292
  condition_to_label[cond]: rank for cond, rank in saved_ranks_dict.items() if cond in condition_to_label
293
  }
294
  else:
295
+ state["current_ranks"] = {label: None for label in IMAGE_LABELS}
296
 
297
+ button_updates = _create_button_updates(state)
298
 
299
  is_alignment_criterion = (criterion_name == "Alignment")
300
  abs_group_update = gr.update(visible=is_alignment_criterion)
301
+ saved_abs_score = state["evaluation_results"].get(prompt_text, {}).get("absolute_score")
302
+ state["current_absolute_score"] = saved_abs_score if is_alignment_criterion else None
303
 
304
  abs_button_updates = []
305
  for i in range(1, 8):
306
+ variant = 'primary' if i == state["current_absolute_score"] else 'secondary'
307
  abs_button_updates.append(gr.update(variant=variant))
308
 
309
  abs_group_worst_update = gr.update(visible=is_alignment_criterion)
310
+ saved_abs_score_worst = state["evaluation_results"].get(prompt_text, {}).get("absolute_score_worst")
311
+ state["current_absolute_score_worst"] = saved_abs_score_worst if is_alignment_criterion else None
312
 
313
  abs_button_worst_updates = []
314
  for i in range(1, 8):
315
+ variant = 'primary' if i == state["current_absolute_score_worst"] else 'secondary'
316
  abs_button_worst_updates.append(gr.update(variant=variant))
317
 
318
  return [
319
  gr.update(value=progress_text),
320
  gr.update(value=combined_instructions),
321
  gr.update(value=prompt_display_text),
322
+ gr.update(value="", visible=False),
323
  *image_updates,
324
  *button_updates,
325
  abs_group_update,
 
327
  abs_group_worst_update,
328
  *abs_button_worst_updates,
329
  gr.update(
330
+ interactive=(state["current_prompt_index"] > 0 or state["current_criterion_index"] > 0)),
331
  gr.update(interactive=True)
332
  ]
333
 
334
 
335
+ def validate_and_navigate(state: dict):
336
+ ranks = state["current_ranks"]
 
337
  error_msg = None
338
+ criterion_name = CRITERIA[state["current_criterion_index"]]
339
  is_alignment_criterion = (criterion_name == "Alignment")
340
 
341
  if any(r is None for r in ranks.values()):
342
  error_msg = "Please rank all 5 images. / 5つすべての画像を評価してください。"
343
  elif 1 not in ranks.values():
344
  error_msg = "You must assign a rank of '1' to at least one image. / 最低1つは「1位」を付けてください。"
345
+ elif is_alignment_criterion and state["current_absolute_score"] is None:
346
  error_msg = "Please provide an absolute score for the BEST matching image (1-7). / 最も一致している画像について、絶対評価(1~7)を選択してください。"
347
+ elif is_alignment_criterion and state["current_absolute_score_worst"] is None:
348
  error_msg = "Please provide an absolute score for the WORST matching image (1-7). / 最も一致していない画像について、絶対評価(1~7)を選択してください。"
349
  elif (
350
  is_alignment_criterion
351
+ and state["current_absolute_score"] is not None
352
+ and state["current_absolute_score_worst"] is not None
353
+ and state["current_absolute_score_worst"] > state["current_absolute_score"]
354
  ):
355
  error_msg = (
356
  "The score for the WORST matching image cannot be higher than the score for the BEST matching image.<br>"
 
358
  )
359
 
360
  if error_msg:
361
+ # ★ 修正点: no_change_updates の要素数を 52 に変更
362
+ no_change_updates = [gr.update()] * 52
363
+ # error_display は all_eval_outputs の4番目(インデックス3)のコンポーネント
364
+ no_change_updates[3] = gr.update(
365
  value=f"<p class='feedback red' style='font-size: 1.2em; text-align: center;'>{error_msg}</p>",
366
  visible=True)
367
+ # 戻り値の総数が54個 (state, tab_exportの更新, all_eval_outputsの更新) になるように調整
368
+ return state, gr.update(), *no_change_updates
369
+
370
 
371
  sorted_ranks = sorted(list(ranks.values()))
372
  rank_counts = Counter(sorted_ranks)
 
382
  break
383
  i += count
384
  if error_msg:
385
+ # ★ 修正点: こちらも同様に no_change_updates の要素数を 52 に変更
386
+ no_change_updates = [gr.update()] * 52
387
+ # error_display は all_eval_outputs の4番目(インデックス3)のコンポーネント
388
+ no_change_updates[3] = gr.update(
389
  value=f"<p class='feedback red' style='font-size: 1.2em; text-align: center;'>{error_msg}</p>",
390
  visible=True)
391
+ # 戻り値の総数が54個になるように調整
392
+ return state, gr.update(), *no_change_updates
393
 
394
+ prompt_idx = state["shuffled_indices"][state["current_prompt_index"]]
395
+ current_data = state["all_eval_data"][prompt_idx]
396
  prompt_text = current_data["prompt"]
397
+ current_image_order = state["image_orders"][criterion_name]
398
 
399
  label_to_condition = {label: cond for label, cond in zip(IMAGE_LABELS, current_image_order)}
400
  ranks_by_condition = {label_to_condition[label]: rank for label, rank in ranks.items()}
401
 
402
+ if "ranks" not in state["evaluation_results"][prompt_text]:
403
+ state["evaluation_results"][prompt_text]["ranks"] = {}
404
+ if "orders" not in state["evaluation_results"][prompt_text]:
405
+ state["evaluation_results"][prompt_text]["orders"] = {}
406
+
407
+ state["evaluation_results"][prompt_text]["ranks"][criterion_name] = ranks_by_condition
408
+ state["evaluation_results"][prompt_text]["orders"][criterion_name] = current_image_order
409
+
410
+ logger.info(
411
+ f"Saved rank for P:{state['participant_id']}, Prompt:'{prompt_text}', Criterion:{criterion_name}, Ranks:{ranks_by_condition}, Orders:{current_image_order}, ")
412
 
 
 
413
 
414
  if is_alignment_criterion:
415
+ state["evaluation_results"][prompt_text]["absolute_score"] = state["current_absolute_score"]
416
+ state["evaluation_results"][prompt_text]["absolute_score_worst"] = state["current_absolute_score_worst"]
 
417
 
418
+ logger.info(
419
+ f"Saved absolute scores for P:{state['participant_id']}, Prompt:'{prompt_text}', "
420
+ f"Best Score:{state['current_absolute_score']}, Worst Score:{state['current_absolute_score_worst']}")
421
 
 
 
 
 
422
 
423
+ state["current_criterion_index"] += 1
424
+ if state["current_criterion_index"] >= len(CRITERIA):
425
+ state["current_criterion_index"] = 0
426
+ state["current_prompt_index"] += 1
427
+
428
+ if state["current_prompt_index"] >= len(state["all_eval_data"]):
429
+ state["end_time"] = datetime.now()
430
+
431
+ eval_panel_updates = display_current_prompt_and_criterion(state)
432
+ export_tab_update = gr.update(interactive=(state.get("end_time") is not None))
433
+ return state, export_tab_update, *eval_panel_updates
434
 
435
 
436
+ def navigate_previous(state: dict):
437
+ state["current_criterion_index"] -= 1
438
+ if state["current_criterion_index"] < 0:
439
+ state["current_criterion_index"] = len(CRITERIA) - 1
440
+ state["current_prompt_index"] -= 1
441
+ state["current_prompt_index"] = max(0, state["current_prompt_index"])
 
442
 
443
+ # ★ 修正: display_current_prompt_and_criterion は state を返さないので、ここで state を返す
444
+ return state, *display_current_prompt_and_criterion(state)
445
 
446
+
447
+ def export_results(participant_id, alignment_reason, naturalness_reason, attractiveness_reason, optional_comment,
448
+ state: dict):
449
  if not alignment_reason.strip() or not naturalness_reason.strip() or not attractiveness_reason.strip():
450
  error_msg = "<p class='feedback red'>Please fill in the reasoning for all three criteria (Alignment, Naturalness, Attractiveness). / 3つの評価基準(一致度, 自然さ, 魅力度)すべての判断理由を記入してください。</p>"
451
  return None, error_msg
 
458
  filename = f"evaluation_results_{participant_id}_{datetime.now().strftime('%Y%m%d_%H%M%S')}.json"
459
  filepath = os.path.join(output_dir, filename)
460
 
461
+ duration = (state["end_time"] - state["start_time"]).total_seconds() if state.get(
462
+ "start_time") and state.get("end_time") else None
463
 
464
+ prompt_to_category = {item["prompt"]: item["category"] for item in state["all_eval_data"]}
465
 
466
  final_results_list = []
467
+ for prompt, data in state["evaluation_results"].items():
468
  if not data: continue
469
+ # (以降、データ構造の作成部分は変更なし)
470
  ranks_data = data.get("ranks", {})
471
  orders_data = data.get("orders", {})
472
 
 
499
  "results": final_results_list
500
  }
501
 
502
+ logger.info(f"Exporting results for participant metadata: {export_data['metadata']}")
503
+
504
  try:
505
  with open(filepath, 'w', encoding='utf-8') as f:
506
  json.dump(export_data, f, ensure_ascii=False, indent=2)
 
522
 
523
  def create_gradio_interface():
524
  css = """
525
+ /* (CSSは変更なし) */
526
  .gradio-container { font-family: 'Arial', sans-serif; }
527
  .feedback { padding: 10px; border-radius: 5px; font-weight: bold; text-align: center; margin-top: 10px; }
528
  .feedback.green { background-color: #e6ffed; color: #2f6f4a; }
 
530
  .image-label { font-size: 2.5em; font-weight: bold; margin-bottom: 10px; color: #333; }
531
  .prompt-display { text-align: center; margin-bottom: 15px; padding: 10px; background-color: #f0f8ff; border-radius: 8px; }
532
  .rank-btn-row { justify-content: center; gap: 5px !important; }
533
+ .rank-btn { min-width: 65px !important; max-width: 65px !important; height: 45px !important; font-size: 1.2em !important; font-weight: bold !important; border-radius: 8px !important; border: 1px solid #ccc !important; }
534
+ .rank-btn.secondary { background: #f0f0f0 !important; color: #333 !important; }
535
+ .rank-btn.secondary:hover { background: #e0e0e0 !important; border-color: #bbb !important; }
536
+ .absolute-eval-group { border: 1px solid #ddd; border-radius: 8px; padding: 15px; margin-top: 20px; }
537
+ .instructions-container { padding: 15px; border: 1px solid #ccc; border-radius: 8px; margin-bottom: 20px; background-color: #fafafa; }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
538
  .instructions-container ul { padding-left: 20px; margin-top: 5px; margin-bottom: 5px; }
539
  .instructions-container hr { margin: 15px 0; }
540
  """
541
 
542
  with gr.Blocks(title="Expression Evaluation Experiment", css=css) as app:
543
+ # ★ 修正: セッションステート (gr.State) を初期化
544
+ initial_state = {
545
+ "participant_id": None,
546
+ "data_loaded": False,
547
+ "all_eval_data": [],
548
+ "shuffled_indices": [],
549
+ "current_prompt_index": 0,
550
+ "current_criterion_index": 0,
551
+ "image_mapping": {},
552
+ "image_dir": "",
553
+ "evaluation_results": {},
554
+ "image_orders": {},
555
+ "start_time": None,
556
+ "end_time": None,
557
+ "current_ranks": {},
558
+ "current_absolute_score": None,
559
+ "current_absolute_score_worst": None,
560
+ "hide_bbox_dict": {},
561
+ }
562
+ state = gr.State(value=initial_state)
563
+
564
  gr.Markdown("# Text-to-Expression Evaluation Experiment / テキストからの表情生成 評価実験")
565
 
566
  with gr.Tabs() as tabs:
567
+ # (UI定義は変更なし)
568
  with gr.TabItem("1. Setup / セットアップ") as tab_setup:
569
  gr.Markdown("## (A) Participant Information / 参加者情報")
570
  gr.Markdown("Please enter your participant ID and click 'Confirm'. / 参加者IDを入力して「確定」を押してください。")
 
582
  <li><b>この作業はPCで行ってください。/ Please perform this task on a PC.</b></li>
583
  <li>途中で止めずに最後まで続けてください。ファイルをアップロードして完了となります。/ Please continue until the end. The experiment is complete when you upload the file.</li>
584
  <li>ブラウザーをリロードしないでください (データが破損します)。/ Do not reload the browser (this will corrupt the data).</li>
585
+ <li><b>指示と注意書きをよく読んでください。</b></li>
586
  </ul></div>""")
587
  gr.Markdown(
588
  "Click the button below to load your evaluation data. / 下のボタンを押して、評価データを読み込んでください。")
 
602
  with gr.Column(scale=1):
603
  with gr.Group():
604
  gr.Markdown(f"<div class='image-label' style='text-align: center;'>{label}</div>")
605
+ img = gr.Image(type="pil", show_label=False, height=300)
606
  image_components.append(img)
607
  with gr.Row(elem_classes="rank-btn-row"):
608
  rank_list = ["1位", "2位", "3位", "4位", "5位"]
 
675
  download_file = gr.File(label="Download JSON", visible=False)
676
  export_status = gr.Markdown()
677
 
678
+ # --- Event Handlers (★ 修正: stateを入出力に追加) ---
679
+ def check_and_confirm_id(pid, state):
680
  pid = pid.strip()
681
  if re.fullmatch(r"P\d{2}", pid):
682
+ state["participant_id"] = pid
683
+ return state, gr.update(visible=False), gr.update(visible=True)
684
  else:
685
  error_msg = "<p class='feedback red'>Invalid ID. Must be 'P' followed by two digits (e.g., P01). / 無効なIDです。「P」と数字2桁の形式(例: P01)で入力してください。</p>"
686
+ return state, gr.update(value=error_msg, visible=True), gr.update(visible=False)
687
 
688
+ confirm_id_btn.click(check_and_confirm_id, [participant_id_input, state],
689
+ [state, setup_warning, setup_main_group])
690
+ load_data_btn.click(load_evaluation_data, [participant_id_input, state],
691
+ [state, setup_status, load_data_btn, tab_evaluation])
692
 
693
  all_eval_outputs = [
694
  progress_text, combined_instructions_display, prompt_display, error_display, *image_components,
 
702
  for label in IMAGE_LABELS:
703
  for rank_val in range(1, 6):
704
  btn = rank_buttons[btn_idx]
705
+ # functools.partial を使うことで、state以外の引数を固定できます
706
  btn.click(
707
  partial(handle_rank_button_click, label, rank_val),
708
+ [state],
709
+ [state, *rank_buttons]
710
  )
711
  btn_idx += 1
712
 
713
  for i, btn in enumerate(absolute_score_buttons):
714
  btn.click(
715
  partial(handle_absolute_score_click, i + 1),
716
+ [state],
717
+ [state, *absolute_score_buttons]
718
  )
719
 
720
  for i, btn in enumerate(absolute_score_worst_buttons):
721
  btn.click(
722
  partial(handle_absolute_score_worst_click, i + 1),
723
+ [state],
724
+ [state, *absolute_score_worst_buttons]
725
  )
726
 
727
+ tab_evaluation.select(display_current_prompt_and_criterion, [state], all_eval_outputs)
728
+
729
+ # next_btn と prev_btn の出力に state を追加
730
+ next_btn.click(validate_and_navigate, [state], [state, tab_export, *all_eval_outputs])
731
+ prev_btn.click(navigate_previous, [state], [state, *all_eval_outputs])
732
 
733
  export_tab_interactive_components = [alignment_reason_box, naturalness_reason_box, attractiveness_reason_box,
734
  optional_comment_box, export_btn]
735
 
736
+ def on_select_export_tab(state):
737
+ if state.get("end_time"):
738
  return [gr.update(interactive=True)] * 5
739
  return [gr.update(interactive=False)] * 5
740
 
741
+ tab_export.select(on_select_export_tab, [state], export_tab_interactive_components)
742
 
743
  export_btn.click(
744
  export_results,
745
  [participant_id_input, alignment_reason_box, naturalness_reason_box, attractiveness_reason_box,
746
+ optional_comment_box, state],
747
  [download_file, export_status]
748
  )
749
 
logs/evaluation_ui_log_2025-08-02_14-41-24_427858.log ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ 2025-08-02 14:41:39.852 | INFO | __main__:load_bbox_json:49 - Successfully loaded bounding box data from ./combined_data\lapwing\texts\bounding_boxes.json
2
+ 2025-08-02 14:41:39.853 | INFO | __main__:load_evaluation_data:103 - Successfully loaded image mapping. Image directory: ./combined_data\lapwing\images
3
+ 2025-08-02 14:41:39.855 | INFO | __main__:load_evaluation_data:151 - Loaded and merged data for 28 prompts.
logs/evaluation_ui_log_2025-08-02_14-47-08_666920.log ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ 2025-08-02 14:47:18.374 | INFO | __main__:load_bbox_json:49 - Successfully loaded bounding box data from ./combined_data\lapwing\texts\bounding_boxes.json
2
+ 2025-08-02 14:47:18.375 | INFO | __main__:load_evaluation_data:103 - Successfully loaded image mapping. Image directory: ./combined_data\lapwing\images
3
+ 2025-08-02 14:47:18.397 | INFO | __main__:load_evaluation_data:151 - Loaded and merged data for 28 prompts.
4
+ 2025-08-02 14:47:37.979 | INFO | __main__:validate_and_navigate:403 - Saved rank for P:P99, Prompt:'suspecious', Criterion:Alignment, Ranks:{'w_o_HitL': 4, 'Ours': 1, 'w_o_Tuning': 5, 'LLM-based': 1, 'w_o_Proto_Loss': 1}, Orders:['w_o_HitL', 'Ours', 'w_o_Tuning', 'LLM-based', 'w_o_Proto_Loss'],
5
+ 2025-08-02 14:47:37.979 | INFO | __main__:validate_and_navigate:410 - Saved absolute scores for P:P99, Prompt:'suspecious', Best Score:6, Worst Score:2
6
+ 2025-08-02 14:47:48.661 | INFO | __main__:validate_and_navigate:403 - Saved rank for P:P99, Prompt:'suspecious', Criterion:Naturalness, Ranks:{'w_o_HitL': 5, 'Ours': 1, 'LLM-based': 1, 'w_o_Proto_Loss': 1, 'w_o_Tuning': 4}, Orders:['w_o_HitL', 'Ours', 'LLM-based', 'w_o_Proto_Loss', 'w_o_Tuning'],
logs/evaluation_ui_log_2025-08-02_14-51-10_704186.log ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ 2025-08-02 14:51:30.272 | INFO | __main__:load_bbox_json:49 - Successfully loaded bounding box data from ./combined_data\lapwing\texts\bounding_boxes.json
2
+ 2025-08-02 14:51:30.273 | INFO | __main__:load_evaluation_data:103 - Successfully loaded image mapping. Image directory: ./combined_data\lapwing\images
3
+ 2025-08-02 14:51:30.276 | INFO | __main__:load_evaluation_data:151 - Loaded and merged data for 28 prompts.
4
+ 2025-08-02 14:51:45.724 | INFO | __main__:validate_and_navigate:403 - Saved rank for P:P99, Prompt:'annoyed', Criterion:Alignment, Ranks:{'LLM-based': 5, 'w_o_Proto_Loss': 1, 'w_o_HitL': 4, 'Ours': 2, 'w_o_Tuning': 3}, Orders:['LLM-based', 'w_o_Proto_Loss', 'w_o_HitL', 'Ours', 'w_o_Tuning'],
5
+ 2025-08-02 14:51:45.725 | INFO | __main__:validate_and_navigate:410 - Saved absolute scores for P:P99, Prompt:'annoyed', Best Score:6, Worst Score:2
6
+ 2025-08-02 14:52:06.249 | INFO | __main__:validate_and_navigate:403 - Saved rank for P:P99, Prompt:'annoyed', Criterion:Naturalness, Ranks:{'w_o_Proto_Loss': 2, 'Ours': 1, 'w_o_HitL': 4, 'LLM-based': 3, 'w_o_Tuning': 5}, Orders:['w_o_Proto_Loss', 'Ours', 'w_o_HitL', 'LLM-based', 'w_o_Tuning'],
7
+ 2025-08-02 14:52:18.331 | INFO | __main__:validate_and_navigate:403 - Saved rank for P:P99, Prompt:'annoyed', Criterion:Attractiveness, Ranks:{'w_o_Tuning': 4, 'w_o_Proto_Loss': 2, 'w_o_HitL': 3, 'LLM-based': 5, 'Ours': 1}, Orders:['w_o_Tuning', 'w_o_Proto_Loss', 'w_o_HitL', 'LLM-based', 'Ours'],
logs/evaluation_ui_log_2025-08-02_14-55-09_654842.log ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ 2025-08-02 14:55:20.980 | INFO | __main__:load_bbox_json:49 - Successfully loaded bounding box data from ./combined_data\lapwing\texts\bounding_boxes.json
2
+ 2025-08-02 14:55:20.981 | INFO | __main__:load_evaluation_data:103 - Successfully loaded image mapping. Image directory: ./combined_data\lapwing\images
3
+ 2025-08-02 14:55:20.983 | INFO | __main__:load_evaluation_data:151 - Loaded and merged data for 28 prompts.
4
+ 2025-08-02 14:55:39.663 | INFO | __main__:validate_and_navigate:403 - Saved rank for P:P99, Prompt:'disgusted', Criterion:Alignment, Ranks:{'Ours': 1, 'w_o_HitL': 2, 'LLM-based': 3, 'w_o_Proto_Loss': 5, 'w_o_Tuning': 4}, Orders:['Ours', 'w_o_HitL', 'LLM-based', 'w_o_Proto_Loss', 'w_o_Tuning'],
5
+ 2025-08-02 14:55:39.664 | INFO | __main__:validate_and_navigate:410 - Saved absolute scores for P:P99, Prompt:'disgusted', Best Score:6, Worst Score:2
6
+ 2025-08-02 14:55:55.613 | INFO | __main__:validate_and_navigate:403 - Saved rank for P:P99, Prompt:'disgusted', Criterion:Naturalness, Ranks:{'LLM-based': 2, 'w_o_Proto_Loss': 4, 'w_o_HitL': 5, 'w_o_Tuning': 3, 'Ours': 1}, Orders:['LLM-based', 'w_o_Proto_Loss', 'w_o_HitL', 'w_o_Tuning', 'Ours'],
7
+ 2025-08-02 14:56:07.162 | INFO | __main__:validate_and_navigate:403 - Saved rank for P:P99, Prompt:'disgusted', Criterion:Attractiveness, Ranks:{'Ours': 1, 'w_o_HitL': 4, 'w_o_Tuning': 2, 'w_o_Proto_Loss': 5, 'LLM-based': 3}, Orders:['Ours', 'w_o_HitL', 'w_o_Tuning', 'w_o_Proto_Loss', 'LLM-based'],
logs/evaluation_ui_log_2025-08-02_15-00-37_160749.log ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 2025-08-02 15:00:54.581 | INFO | __main__:load_bbox_json:49 - Successfully loaded bounding box data from ./combined_data\lapwing\texts\bounding_boxes.json
2
+ 2025-08-02 15:00:54.581 | INFO | __main__:load_evaluation_data:103 - Successfully loaded image mapping. Image directory: ./combined_data\lapwing\images
3
+ 2025-08-02 15:00:54.583 | INFO | __main__:load_evaluation_data:151 - Loaded and merged data for 28 prompts.
4
+ 2025-08-02 15:01:34.620 | INFO | __main__:validate_and_navigate:410 - Saved rank for P:P99, Prompt:'empty', Criterion:Alignment, Ranks:{'Ours': 3, 'w_o_Tuning': 5, 'w_o_Proto_Loss': 3, 'LLM-based': 1, 'w_o_HitL': 2}, Orders:['Ours', 'w_o_Tuning', 'w_o_Proto_Loss', 'LLM-based', 'w_o_HitL'],
5
+ 2025-08-02 15:01:34.621 | INFO | __main__:validate_and_navigate:418 - Saved absolute scores for P:P99, Prompt:'empty', Best Score:6, Worst Score:2
6
+ 2025-08-02 15:01:47.160 | INFO | __main__:validate_and_navigate:410 - Saved rank for P:P99, Prompt:'empty', Criterion:Naturalness, Ranks:{'w_o_Proto_Loss': 1, 'Ours': 1, 'LLM-based': 3, 'w_o_Tuning': 5, 'w_o_HitL': 4}, Orders:['w_o_Proto_Loss', 'Ours', 'LLM-based', 'w_o_Tuning', 'w_o_HitL'],
7
+ 2025-08-02 15:01:58.405 | INFO | __main__:validate_and_navigate:410 - Saved rank for P:P99, Prompt:'empty', Criterion:Attractiveness, Ranks:{'LLM-based': 3, 'w_o_Tuning': 4, 'w_o_HitL': 5, 'Ours': 2, 'w_o_Proto_Loss': 1}, Orders:['LLM-based', 'w_o_Tuning', 'w_o_HitL', 'Ours', 'w_o_Proto_Loss'],
8
+ 2025-08-02 15:02:26.776 | INFO | __main__:validate_and_navigate:410 - Saved rank for P:P99, Prompt:'hate', Criterion:Alignment, Ranks:{'w_o_Proto_Loss': 3, 'w_o_HitL': 1, 'w_o_Tuning': 2, 'Ours': 3, 'LLM-based': 5}, Orders:['w_o_Proto_Loss', 'w_o_HitL', 'w_o_Tuning', 'Ours', 'LLM-based'],
9
+ 2025-08-02 15:02:26.776 | INFO | __main__:validate_and_navigate:418 - Saved absolute scores for P:P99, Prompt:'hate', Best Score:6, Worst Score:2
10
+ 2025-08-02 15:02:36.858 | INFO | __main__:validate_and_navigate:410 - Saved rank for P:P99, Prompt:'hate', Criterion:Naturalness, Ranks:{'LLM-based': 4, 'w_o_HitL': 3, 'w_o_Tuning': 5, 'w_o_Proto_Loss': 1, 'Ours': 1}, Orders:['LLM-based', 'w_o_HitL', 'w_o_Tuning', 'w_o_Proto_Loss', 'Ours'],
11
+ 2025-08-02 15:02:50.653 | INFO | __main__:validate_and_navigate:410 - Saved rank for P:P99, Prompt:'hate', Criterion:Attractiveness, Ranks:{'w_o_Tuning': 4, 'Ours': 2, 'LLM-based': 5, 'w_o_Proto_Loss': 2, 'w_o_HitL': 1}, Orders:['w_o_Tuning', 'Ours', 'LLM-based', 'w_o_Proto_Loss', 'w_o_HitL'],
12
+ 2025-08-02 15:03:06.892 | INFO | __main__:validate_and_navigate:410 - Saved rank for P:P99, Prompt:'contempt', Criterion:Alignment, Ranks:{'LLM-based': 2, 'w_o_HitL': 4, 'w_o_Proto_Loss': 5, 'Ours': 3, 'w_o_Tuning': 1}, Orders:['LLM-based', 'w_o_HitL', 'w_o_Proto_Loss', 'Ours', 'w_o_Tuning'],
13
+ 2025-08-02 15:03:06.892 | INFO | __main__:validate_and_navigate:418 - Saved absolute scores for P:P99, Prompt:'contempt', Best Score:6, Worst Score:2
14
+ 2025-08-02 15:03:19.231 | INFO | __main__:validate_and_navigate:410 - Saved rank for P:P99, Prompt:'contempt', Criterion:Naturalness, Ranks:{'w_o_Tuning': 1, 'w_o_HitL': 3, 'Ours': 5, 'LLM-based': 2, 'w_o_Proto_Loss': 5}, Orders:['w_o_Tuning', 'w_o_HitL', 'Ours', 'LLM-based', 'w_o_Proto_Loss'],
15
+ 2025-08-02 15:03:35.775 | INFO | __main__:validate_and_navigate:410 - Saved rank for P:P99, Prompt:'contempt', Criterion:Attractiveness, Ranks:{'w_o_HitL': 1, 'LLM-based': 3, 'w_o_Proto_Loss': 5, 'w_o_Tuning': 2, 'Ours': 5}, Orders:['w_o_HitL', 'LLM-based', 'w_o_Proto_Loss', 'w_o_Tuning', 'Ours'],
16
+ 2025-08-02 15:04:01.160 | INFO | __main__:validate_and_navigate:410 - Saved rank for P:P99, Prompt:'fun', Criterion:Alignment, Ranks:{'w_o_Proto_Loss': 3, 'w_o_HitL': 4, 'Ours': 2, 'LLM-based': 1, 'w_o_Tuning': 5}, Orders:['w_o_Proto_Loss', 'w_o_HitL', 'Ours', 'LLM-based', 'w_o_Tuning'],
17
+ 2025-08-02 15:04:01.161 | INFO | __main__:validate_and_navigate:418 - Saved absolute scores for P:P99, Prompt:'fun', Best Score:6, Worst Score:2
18
+ 2025-08-02 15:04:14.325 | INFO | __main__:validate_and_navigate:410 - Saved rank for P:P99, Prompt:'fun', Criterion:Naturalness, Ranks:{'Ours': 1, 'w_o_Proto_Loss': 3, 'w_o_Tuning': 4, 'LLM-based': 2, 'w_o_HitL': 5}, Orders:['Ours', 'w_o_Proto_Loss', 'w_o_Tuning', 'LLM-based', 'w_o_HitL'],
results/P16/HitL_results_P16.json ADDED
The diff for this file is too large to render. See raw diff
 
results/P16/LLM-based/P16_LLM-based_all_predictions.jsonl ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {"participant_id": "P16", "condition": "LLM-based", "text_prompt": "happy", "prompt_category": "basic_emotion", "prediction": {"blendshape_names": {"Eyes": "笑い", "Eye Brow": "にこり"}, "blendshape_index": {"0": 1, "1": 3}, "blendshape_confidence": {"0": 1.0, "1": 1.0}}}
2
+ {"participant_id": "P16", "condition": "LLM-based", "text_prompt": "sad", "prompt_category": "basic_emotion", "prediction": {"blendshape_names": {"Eyes": "なごみ", "Eye Brow": "困る"}, "blendshape_index": {"0": 2, "1": 1}, "blendshape_confidence": {"0": 1.0, "1": 1.0}}}
3
+ {"participant_id": "P16", "condition": "LLM-based", "text_prompt": "angry", "prompt_category": "basic_emotion", "prediction": {"blendshape_names": {"Eyes": "じと目", "Eye Brow": "怒り"}, "blendshape_index": {"0": 4, "1": 2}, "blendshape_confidence": {"0": 1.0, "1": 1.0}}}
4
+ {"participant_id": "P16", "condition": "LLM-based", "text_prompt": "surprised", "prompt_category": "basic_emotion", "prediction": {"blendshape_names": {"Eyes": "びっくり", "Eye Brow": "上"}, "blendshape_index": {"0": 3, "1": 4}, "blendshape_confidence": {"0": 1.0, "1": 1.0}}}
5
+ {"participant_id": "P16", "condition": "LLM-based", "text_prompt": "disgusted", "prompt_category": "basic_emotion", "prediction": {"blendshape_names": {"Eyes": "じと目", "Eye Brow": "困る"}, "blendshape_index": {"0": 4, "1": 1}, "blendshape_confidence": {"0": 1.0, "1": 1.0}}}
6
+ {"participant_id": "P16", "condition": "LLM-based", "text_prompt": "fearful", "prompt_category": "basic_emotion", "prediction": {"blendshape_names": {"Eyes": "びっくり", "Eye Brow": "困る"}, "blendshape_index": {"0": 3, "1": 1}, "blendshape_confidence": {"0": 1.0, "1": 1.0}}}
7
+ {"participant_id": "P16", "condition": "LLM-based", "text_prompt": "neutral", "prompt_category": "basic_emotion", "prediction": {"blendshape_names": {"Eyes": "none", "Eye Brow": "none"}, "blendshape_index": {"0": -1, "1": -1}, "blendshape_confidence": {"0": 1.0, "1": 1.0}}}
8
+ {"participant_id": "P16", "condition": "LLM-based", "text_prompt": "contempt", "prompt_category": "basic_emotion", "prediction": {"blendshape_names": {"Eyes": "じと目", "Eye Brow": "browDownAngry"}, "blendshape_index": {"0": 4, "1": 7}, "blendshape_confidence": {"0": 1.0, "1": 1.0}}}
9
+ {"participant_id": "P16", "condition": "LLM-based", "text_prompt": "a little funny", "prompt_category": "nuanced_emotion", "prediction": {"blendshape_names": {"Eyes": "笑い", "Eye Brow": "にこり"}, "blendshape_index": {"0": 1, "1": 3}, "blendshape_confidence": {"0": 1.0, "1": 1.0}}}
10
+ {"participant_id": "P16", "condition": "LLM-based", "text_prompt": "a little happy", "prompt_category": "nuanced_emotion", "prediction": {"blendshape_names": {"Eyes": "笑い", "Eye Brow": "にこり"}, "blendshape_index": {"0": 1, "1": 3}, "blendshape_confidence": {"0": 1.0, "1": 1.0}}}
11
+ {"participant_id": "P16", "condition": "LLM-based", "text_prompt": "disappointed", "prompt_category": "nuanced_emotion", "prediction": {"blendshape_names": {"Eyes": "じと目", "Eye Brow": "困る"}, "blendshape_index": {"0": 4, "1": 1}, "blendshape_confidence": {"0": 1.0, "1": 1.0}}}
12
+ {"participant_id": "P16", "condition": "LLM-based", "text_prompt": "shocked", "prompt_category": "nuanced_emotion", "prediction": {"blendshape_names": {"Eyes": "びっくり", "Eye Brow": "上"}, "blendshape_index": {"0": 3, "1": 4}, "blendshape_confidence": {"0": 1.0, "1": 1.0}}}
13
+ {"participant_id": "P16", "condition": "LLM-based", "text_prompt": "very angry", "prompt_category": "nuanced_emotion", "prediction": {"blendshape_names": {"Eyes": "じと目", "Eye Brow": "怒り"}, "blendshape_index": {"0": 4, "1": 2}, "blendshape_confidence": {"0": 1.0, "1": 1.0}}}
14
+ {"participant_id": "P16", "condition": "LLM-based", "text_prompt": "very funny", "prompt_category": "nuanced_emotion", "prediction": {"blendshape_names": {"Eyes": "笑い", "Eye Brow": "にこり"}, "blendshape_index": {"0": 1, "1": 3}, "blendshape_confidence": {"0": 1.0, "1": 1.0}}}
15
+ {"participant_id": "P16", "condition": "LLM-based", "text_prompt": "very happy", "prompt_category": "nuanced_emotion", "prediction": {"blendshape_names": {"Eyes": "笑い", "Eye Brow": "にこり"}, "blendshape_index": {"0": 1, "1": 3}, "blendshape_confidence": {"0": 1.0, "1": 1.0}}}
16
+ {"participant_id": "P16", "condition": "LLM-based", "text_prompt": "very shocked", "prompt_category": "nuanced_emotion", "prediction": {"blendshape_names": {"Eyes": "びっくり", "Eye Brow": "上"}, "blendshape_index": {"0": 3, "1": 4}, "blendshape_confidence": {"0": 1.0, "1": 1.0}}}
17
+ {"participant_id": "P16", "condition": "LLM-based", "text_prompt": "success", "prompt_category": "zero_shot_emotion", "prediction": {"blendshape_names": {"Eyes": "笑い", "Eye Brow": "にこり"}, "blendshape_index": {"0": 1, "1": 3}, "blendshape_confidence": {"0": 1.0, "1": 1.0}}}
18
+ {"participant_id": "P16", "condition": "LLM-based", "text_prompt": "amazing", "prompt_category": "zero_shot_emotion", "prediction": {"blendshape_names": {"Eyes": "びっくり", "Eye Brow": "上"}, "blendshape_index": {"0": 3, "1": 4}, "blendshape_confidence": {"0": 1.0, "1": 1.0}}}
19
+ {"participant_id": "P16", "condition": "LLM-based", "text_prompt": "awesome", "prompt_category": "zero_shot_emotion", "prediction": {"blendshape_names": {"Eyes": "笑い", "Eye Brow": "にこり"}, "blendshape_index": {"0": 1, "1": 3}, "blendshape_confidence": {"0": 1.0, "1": 1.0}}}
20
+ {"participant_id": "P16", "condition": "LLM-based", "text_prompt": "hate", "prompt_category": "zero_shot_emotion", "prediction": {"blendshape_names": {"Eyes": "じと目", "Eye Brow": "怒り"}, "blendshape_index": {"0": 4, "1": 2}, "blendshape_confidence": {"0": 1.0, "1": 1.0}}}
21
+ {"participant_id": "P16", "condition": "LLM-based", "text_prompt": "fear", "prompt_category": "zero_shot_emotion", "prediction": {"blendshape_names": {"Eyes": "びっくり", "Eye Brow": "困る"}, "blendshape_index": {"0": 3, "1": 1}, "blendshape_confidence": {"0": 1.0, "1": 1.0}}}
22
+ {"participant_id": "P16", "condition": "LLM-based", "text_prompt": "pain", "prompt_category": "zero_shot_emotion", "prediction": {"blendshape_names": {"Eyes": "じと目", "Eye Brow": "困る"}, "blendshape_index": {"0": 4, "1": 1}, "blendshape_confidence": {"0": 1.0, "1": 1.0}}}
23
+ {"participant_id": "P16", "condition": "LLM-based", "text_prompt": "bored", "prompt_category": "zero_shot_emotion", "prediction": {"blendshape_names": {"Eyes": "じと目", "Eye Brow": "下"}, "blendshape_index": {"0": 4, "1": 5}, "blendshape_confidence": {"0": 1.0, "1": 1.0}}}
24
+ {"participant_id": "P16", "condition": "LLM-based", "text_prompt": "empty", "prompt_category": "zero_shot_emotion", "prediction": {"blendshape_names": {"Eyes": "none", "Eye Brow": "none"}, "blendshape_index": {"0": -1, "1": -1}, "blendshape_confidence": {"0": 1.0, "1": 1.0}}}
25
+ {"participant_id": "P16", "condition": "LLM-based", "text_prompt": "resigned", "prompt_category": "zero_shot_emotion", "prediction": {"blendshape_names": {"Eyes": "なごみ", "Eye Brow": "下"}, "blendshape_index": {"0": 2, "1": 5}, "blendshape_confidence": {"0": 1.0, "1": 1.0}}}
26
+ {"participant_id": "P16", "condition": "LLM-based", "text_prompt": "peace", "prompt_category": "zero_shot_emotion", "prediction": {"blendshape_names": {"Eyes": "なごみ", "Eye Brow": "にこり"}, "blendshape_index": {"0": 2, "1": 3}, "blendshape_confidence": {"0": 1.0, "1": 1.0}}}
27
+ {"participant_id": "P16", "condition": "LLM-based", "text_prompt": "rest", "prompt_category": "zero_shot_emotion", "prediction": {"blendshape_names": {"Eyes": "なごみ", "Eye Brow": "none"}, "blendshape_index": {"0": 2, "1": -1}, "blendshape_confidence": {"0": 1.0, "1": 1.0}}}
28
+ {"participant_id": "P16", "condition": "LLM-based", "text_prompt": "dream", "prompt_category": "zero_shot_emotion", "prediction": {"blendshape_names": {"Eyes": "なごみ", "Eye Brow": "none"}, "blendshape_index": {"0": 2, "1": -1}, "blendshape_confidence": {"0": 1.0, "1": 1.0}}}
results/P16/Ours/P16_Ours_all_predictions.jsonl ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {"participant_id": "P16", "condition": "Ours", "text_prompt": "happy", "prompt_category": "basic_emotion", "prediction": {"blendshape_names": {"Eyes": "none", "Eye Brow": "真面目"}, "blendshape_index": {"0": -1, "1": 0}, "blendshape_confidence": {"0": 0.9492596983909607, "1": 0.6670171022415161}}}
2
+ {"participant_id": "P16", "condition": "Ours", "text_prompt": "sad", "prompt_category": "basic_emotion", "prediction": {"blendshape_names": {"Eyes": "irisSwap", "Eye Brow": "にこり"}, "blendshape_index": {"0": 5, "1": 3}, "blendshape_confidence": {"0": 0.9606900215148926, "1": 0.23715966939926147}}}
3
+ {"participant_id": "P16", "condition": "Ours", "text_prompt": "angry", "prompt_category": "basic_emotion", "prediction": {"blendshape_names": {"Eyes": "まばたき", "Eye Brow": "browDownAngry"}, "blendshape_index": {"0": 0, "1": 7}, "blendshape_confidence": {"0": 0.6469842791557312, "1": 0.9690301418304443}}}
4
+ {"participant_id": "P16", "condition": "Ours", "text_prompt": "surprised", "prompt_category": "basic_emotion", "prediction": {"blendshape_names": {"Eyes": "irisShrink", "Eye Brow": "怒り"}, "blendshape_index": {"0": 6, "1": 2}, "blendshape_confidence": {"0": 0.9448403120040894, "1": 0.5298275351524353}}}
5
+ {"participant_id": "P16", "condition": "Ours", "text_prompt": "disgusted", "prompt_category": "basic_emotion", "prediction": {"blendshape_names": {"Eyes": "irisShrink", "Eye Brow": "怒り"}, "blendshape_index": {"0": 6, "1": 2}, "blendshape_confidence": {"0": 0.9451183676719666, "1": 0.5280351042747498}}}
6
+ {"participant_id": "P16", "condition": "Ours", "text_prompt": "fearful", "prompt_category": "basic_emotion", "prediction": {"blendshape_names": {"Eyes": "笑い", "Eye Brow": "browArcDown"}, "blendshape_index": {"0": 1, "1": 6}, "blendshape_confidence": {"0": 0.9505174160003662, "1": 0.9635135531425476}}}
7
+ {"participant_id": "P16", "condition": "Ours", "text_prompt": "neutral", "prompt_category": "basic_emotion", "prediction": {"blendshape_names": {"Eyes": "まばたき", "Eye Brow": "browDownAngry"}, "blendshape_index": {"0": 0, "1": 7}, "blendshape_confidence": {"0": 0.6529861092567444, "1": 0.7712710499763489}}}
8
+ {"participant_id": "P16", "condition": "Ours", "text_prompt": "contempt", "prompt_category": "basic_emotion", "prediction": {"blendshape_names": {"Eyes": "じと目", "Eye Brow": "browArcDown"}, "blendshape_index": {"0": 4, "1": 6}, "blendshape_confidence": {"0": 0.9725663065910339, "1": 0.9883859157562256}}}
9
+ {"participant_id": "P16", "condition": "Ours", "text_prompt": "a little funny", "prompt_category": "nuanced_emotion", "prediction": {"blendshape_names": {"Eyes": "笑い", "Eye Brow": "困る"}, "blendshape_index": {"0": 1, "1": 1}, "blendshape_confidence": {"0": 0.9818972945213318, "1": 0.28428274393081665}}}
10
+ {"participant_id": "P16", "condition": "Ours", "text_prompt": "a little happy", "prompt_category": "nuanced_emotion", "prediction": {"blendshape_names": {"Eyes": "なごみ", "Eye Brow": "真面目"}, "blendshape_index": {"0": 2, "1": 0}, "blendshape_confidence": {"0": 0.609362006187439, "1": 0.9380427002906799}}}
11
+ {"participant_id": "P16", "condition": "Ours", "text_prompt": "disappointed", "prompt_category": "nuanced_emotion", "prediction": {"blendshape_names": {"Eyes": "じと目", "Eye Brow": "browArcDown"}, "blendshape_index": {"0": 4, "1": 6}, "blendshape_confidence": {"0": 0.9804338812828064, "1": 0.9907417297363281}}}
12
+ {"participant_id": "P16", "condition": "Ours", "text_prompt": "shocked", "prompt_category": "nuanced_emotion", "prediction": {"blendshape_names": {"Eyes": "irisShrink", "Eye Brow": "怒り"}, "blendshape_index": {"0": 6, "1": 2}, "blendshape_confidence": {"0": 0.9434607625007629, "1": 0.5284018516540527}}}
13
+ {"participant_id": "P16", "condition": "Ours", "text_prompt": "very angry", "prompt_category": "nuanced_emotion", "prediction": {"blendshape_names": {"Eyes": "じと目", "Eye Brow": "browDownAngry"}, "blendshape_index": {"0": 4, "1": 7}, "blendshape_confidence": {"0": 0.4148564040660858, "1": 0.9449126124382019}}}
14
+ {"participant_id": "P16", "condition": "Ours", "text_prompt": "very funny", "prompt_category": "nuanced_emotion", "prediction": {"blendshape_names": {"Eyes": "笑い", "Eye Brow": "browArcDown"}, "blendshape_index": {"0": 1, "1": 6}, "blendshape_confidence": {"0": 0.9673089981079102, "1": 0.9892383813858032}}}
15
+ {"participant_id": "P16", "condition": "Ours", "text_prompt": "very happy", "prompt_category": "nuanced_emotion", "prediction": {"blendshape_names": {"Eyes": "びっくり", "Eye Brow": "none"}, "blendshape_index": {"0": 3, "1": -1}, "blendshape_confidence": {"0": 0.9651579856872559, "1": 0.22379831969738007}}}
16
+ {"participant_id": "P16", "condition": "Ours", "text_prompt": "very shocked", "prompt_category": "nuanced_emotion", "prediction": {"blendshape_names": {"Eyes": "irisShrink", "Eye Brow": "困る"}, "blendshape_index": {"0": 6, "1": 1}, "blendshape_confidence": {"0": 0.9350981116294861, "1": 0.24193401634693146}}}
17
+ {"participant_id": "P16", "condition": "Ours", "text_prompt": "success", "prompt_category": "zero_shot_emotion", "prediction": {"blendshape_names": {"Eyes": "none", "Eye Brow": "真面目"}, "blendshape_index": {"0": -1, "1": 0}, "blendshape_confidence": {"0": 0.9471761584281921, "1": 0.7616352438926697}}}
18
+ {"participant_id": "P16", "condition": "Ours", "text_prompt": "amazing", "prompt_category": "zero_shot_emotion", "prediction": {"blendshape_names": {"Eyes": "笑い", "Eye Brow": "browArcDown"}, "blendshape_index": {"0": 1, "1": 6}, "blendshape_confidence": {"0": 0.9528500437736511, "1": 0.9657498002052307}}}
19
+ {"participant_id": "P16", "condition": "Ours", "text_prompt": "awesome", "prompt_category": "zero_shot_emotion", "prediction": {"blendshape_names": {"Eyes": "irisSwap", "Eye Brow": "browDownAngry"}, "blendshape_index": {"0": 5, "1": 7}, "blendshape_confidence": {"0": 0.8296573162078857, "1": 0.511085569858551}}}
20
+ {"participant_id": "P16", "condition": "Ours", "text_prompt": "hate", "prompt_category": "zero_shot_emotion", "prediction": {"blendshape_names": {"Eyes": "まばたき", "Eye Brow": "browDownAngry"}, "blendshape_index": {"0": 0, "1": 7}, "blendshape_confidence": {"0": 0.6370428204536438, "1": 0.970213770866394}}}
21
+ {"participant_id": "P16", "condition": "Ours", "text_prompt": "fear", "prompt_category": "zero_shot_emotion", "prediction": {"blendshape_names": {"Eyes": "irisShrink", "Eye Brow": "怒り"}, "blendshape_index": {"0": 6, "1": 2}, "blendshape_confidence": {"0": 0.9422263503074646, "1": 0.5305290222167969}}}
22
+ {"participant_id": "P16", "condition": "Ours", "text_prompt": "pain", "prompt_category": "zero_shot_emotion", "prediction": {"blendshape_names": {"Eyes": "まばたき", "Eye Brow": "browDownAngry"}, "blendshape_index": {"0": 0, "1": 7}, "blendshape_confidence": {"0": 0.6359920501708984, "1": 0.9706328511238098}}}
23
+ {"participant_id": "P16", "condition": "Ours", "text_prompt": "bored", "prompt_category": "zero_shot_emotion", "prediction": {"blendshape_names": {"Eyes": "笑い", "Eye Brow": "browArcDown"}, "blendshape_index": {"0": 1, "1": 6}, "blendshape_confidence": {"0": 0.9406657814979553, "1": 0.9443497657775879}}}
24
+ {"participant_id": "P16", "condition": "Ours", "text_prompt": "empty", "prompt_category": "zero_shot_emotion", "prediction": {"blendshape_names": {"Eyes": "まばたき", "Eye Brow": "browDownAngry"}, "blendshape_index": {"0": 0, "1": 7}, "blendshape_confidence": {"0": 0.48001936078071594, "1": 0.9590783715248108}}}
25
+ {"participant_id": "P16", "condition": "Ours", "text_prompt": "resigned", "prompt_category": "zero_shot_emotion", "prediction": {"blendshape_names": {"Eyes": "じと目", "Eye Brow": "browArcDown"}, "blendshape_index": {"0": 4, "1": 6}, "blendshape_confidence": {"0": 0.9802145957946777, "1": 0.2746669352054596}}}
26
+ {"participant_id": "P16", "condition": "Ours", "text_prompt": "peace", "prompt_category": "zero_shot_emotion", "prediction": {"blendshape_names": {"Eyes": "none", "Eye Brow": "真面目"}, "blendshape_index": {"0": -1, "1": 0}, "blendshape_confidence": {"0": 0.9481146335601807, "1": 0.713408350944519}}}
27
+ {"participant_id": "P16", "condition": "Ours", "text_prompt": "rest", "prompt_category": "zero_shot_emotion", "prediction": {"blendshape_names": {"Eyes": "none", "Eye Brow": "にこり"}, "blendshape_index": {"0": -1, "1": 3}, "blendshape_confidence": {"0": 0.9580990076065063, "1": 0.22329644858837128}}}
28
+ {"participant_id": "P16", "condition": "Ours", "text_prompt": "dream", "prompt_category": "zero_shot_emotion", "prediction": {"blendshape_names": {"Eyes": "none", "Eye Brow": "真面目"}, "blendshape_index": {"0": -1, "1": 0}, "blendshape_confidence": {"0": 0.9551511406898499, "1": 0.22201047837734222}}}
results/P16/w_o_HitL/P16_w_o_HitL_all_predictions.jsonl ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {"participant_id": "P16", "condition": "w_o_HitL", "text_prompt": "happy", "prompt_category": "basic_emotion", "prediction": {"blendshape_names": {"Eyes": "none", "Eye Brow": "none"}, "blendshape_index": {"0": -1, "1": -1}, "blendshape_confidence": {"0": 0.962712287902832, "1": 0.359679639339447}}}
2
+ {"participant_id": "P16", "condition": "w_o_HitL", "text_prompt": "sad", "prompt_category": "basic_emotion", "prediction": {"blendshape_names": {"Eyes": "irisSwap", "Eye Brow": "none"}, "blendshape_index": {"0": 5, "1": -1}, "blendshape_confidence": {"0": 0.986799955368042, "1": 0.3524633049964905}}}
3
+ {"participant_id": "P16", "condition": "w_o_HitL", "text_prompt": "angry", "prompt_category": "basic_emotion", "prediction": {"blendshape_names": {"Eyes": "まばたき", "Eye Brow": "browDownAngry"}, "blendshape_index": {"0": 0, "1": 7}, "blendshape_confidence": {"0": 0.9771600365638733, "1": 0.9556713700294495}}}
4
+ {"participant_id": "P16", "condition": "w_o_HitL", "text_prompt": "surprised", "prompt_category": "basic_emotion", "prediction": {"blendshape_names": {"Eyes": "じと目", "Eye Brow": "browArcDown"}, "blendshape_index": {"0": 4, "1": 6}, "blendshape_confidence": {"0": 0.8247701525688171, "1": 0.5974222421646118}}}
5
+ {"participant_id": "P16", "condition": "w_o_HitL", "text_prompt": "disgusted", "prompt_category": "basic_emotion", "prediction": {"blendshape_names": {"Eyes": "じと目", "Eye Brow": "browArcDown"}, "blendshape_index": {"0": 4, "1": 6}, "blendshape_confidence": {"0": 0.8438608646392822, "1": 0.7930833697319031}}}
6
+ {"participant_id": "P16", "condition": "w_o_HitL", "text_prompt": "fearful", "prompt_category": "basic_emotion", "prediction": {"blendshape_names": {"Eyes": "びっくり", "Eye Brow": "下"}, "blendshape_index": {"0": 3, "1": 5}, "blendshape_confidence": {"0": 0.9271237254142761, "1": 0.9049108624458313}}}
7
+ {"participant_id": "P16", "condition": "w_o_HitL", "text_prompt": "neutral", "prompt_category": "basic_emotion", "prediction": {"blendshape_names": {"Eyes": "none", "Eye Brow": "none"}, "blendshape_index": {"0": -1, "1": -1}, "blendshape_confidence": {"0": 0.9651304483413696, "1": 0.3202117681503296}}}
8
+ {"participant_id": "P16", "condition": "w_o_HitL", "text_prompt": "contempt", "prompt_category": "basic_emotion", "prediction": {"blendshape_names": {"Eyes": "まばたき", "Eye Brow": "browDownAngry"}, "blendshape_index": {"0": 0, "1": 7}, "blendshape_confidence": {"0": 0.9764460325241089, "1": 0.9679782390594482}}}
9
+ {"participant_id": "P16", "condition": "w_o_HitL", "text_prompt": "a little funny", "prompt_category": "nuanced_emotion", "prediction": {"blendshape_names": {"Eyes": "まばたき", "Eye Brow": "browArcDown"}, "blendshape_index": {"0": 0, "1": 6}, "blendshape_confidence": {"0": 0.9438269138336182, "1": 0.9780333638191223}}}
10
+ {"participant_id": "P16", "condition": "w_o_HitL", "text_prompt": "a little happy", "prompt_category": "nuanced_emotion", "prediction": {"blendshape_names": {"Eyes": "まばたき", "Eye Brow": "browArcDown"}, "blendshape_index": {"0": 0, "1": 6}, "blendshape_confidence": {"0": 0.9387567043304443, "1": 0.9782640933990479}}}
11
+ {"participant_id": "P16", "condition": "w_o_HitL", "text_prompt": "disappointed", "prompt_category": "nuanced_emotion", "prediction": {"blendshape_names": {"Eyes": "irisSwap", "Eye Brow": "none"}, "blendshape_index": {"0": 5, "1": -1}, "blendshape_confidence": {"0": 0.9834548234939575, "1": 0.3410274386405945}}}
12
+ {"participant_id": "P16", "condition": "w_o_HitL", "text_prompt": "shocked", "prompt_category": "nuanced_emotion", "prediction": {"blendshape_names": {"Eyes": "じと目", "Eye Brow": "browArcDown"}, "blendshape_index": {"0": 4, "1": 6}, "blendshape_confidence": {"0": 0.8236276507377625, "1": 0.5127918124198914}}}
13
+ {"participant_id": "P16", "condition": "w_o_HitL", "text_prompt": "very angry", "prompt_category": "nuanced_emotion", "prediction": {"blendshape_names": {"Eyes": "びっくり", "Eye Brow": "browDownAngry"}, "blendshape_index": {"0": 3, "1": 7}, "blendshape_confidence": {"0": 0.9570594429969788, "1": 0.9309858679771423}}}
14
+ {"participant_id": "P16", "condition": "w_o_HitL", "text_prompt": "very funny", "prompt_category": "nuanced_emotion", "prediction": {"blendshape_names": {"Eyes": "びっくり", "Eye Brow": "にこり"}, "blendshape_index": {"0": 3, "1": 3}, "blendshape_confidence": {"0": 0.9934462904930115, "1": 0.35580042004585266}}}
15
+ {"participant_id": "P16", "condition": "w_o_HitL", "text_prompt": "very happy", "prompt_category": "nuanced_emotion", "prediction": {"blendshape_names": {"Eyes": "びっくり", "Eye Brow": "にこり"}, "blendshape_index": {"0": 3, "1": 3}, "blendshape_confidence": {"0": 0.9950509667396545, "1": 0.36536848545074463}}}
16
+ {"participant_id": "P16", "condition": "w_o_HitL", "text_prompt": "very shocked", "prompt_category": "nuanced_emotion", "prediction": {"blendshape_names": {"Eyes": "じと目", "Eye Brow": "browArcDown"}, "blendshape_index": {"0": 4, "1": 6}, "blendshape_confidence": {"0": 0.8097712397575378, "1": 0.32667437195777893}}}
17
+ {"participant_id": "P16", "condition": "w_o_HitL", "text_prompt": "success", "prompt_category": "zero_shot_emotion", "prediction": {"blendshape_names": {"Eyes": "none", "Eye Brow": "none"}, "blendshape_index": {"0": -1, "1": -1}, "blendshape_confidence": {"0": 0.9648783802986145, "1": 0.3616655766963959}}}
18
+ {"participant_id": "P16", "condition": "w_o_HitL", "text_prompt": "amazing", "prompt_category": "zero_shot_emotion", "prediction": {"blendshape_names": {"Eyes": "びっくり", "Eye Brow": "none"}, "blendshape_index": {"0": 3, "1": -1}, "blendshape_confidence": {"0": 0.9918829202651978, "1": 0.3112771809101105}}}
19
+ {"participant_id": "P16", "condition": "w_o_HitL", "text_prompt": "awesome", "prompt_category": "zero_shot_emotion", "prediction": {"blendshape_names": {"Eyes": "びっくり", "Eye Brow": "にこり"}, "blendshape_index": {"0": 3, "1": 3}, "blendshape_confidence": {"0": 0.9917681217193604, "1": 0.319681316614151}}}
20
+ {"participant_id": "P16", "condition": "w_o_HitL", "text_prompt": "hate", "prompt_category": "zero_shot_emotion", "prediction": {"blendshape_names": {"Eyes": "まばたき", "Eye Brow": "browDownAngry"}, "blendshape_index": {"0": 0, "1": 7}, "blendshape_confidence": {"0": 0.9771487712860107, "1": 0.9566535353660583}}}
21
+ {"participant_id": "P16", "condition": "w_o_HitL", "text_prompt": "fear", "prompt_category": "zero_shot_emotion", "prediction": {"blendshape_names": {"Eyes": "irisSwap", "Eye Brow": "none"}, "blendshape_index": {"0": 5, "1": -1}, "blendshape_confidence": {"0": 0.984332799911499, "1": 0.3501189649105072}}}
22
+ {"participant_id": "P16", "condition": "w_o_HitL", "text_prompt": "pain", "prompt_category": "zero_shot_emotion", "prediction": {"blendshape_names": {"Eyes": "まばたき", "Eye Brow": "browDownAngry"}, "blendshape_index": {"0": 0, "1": 7}, "blendshape_confidence": {"0": 0.9765784740447998, "1": 0.9544554948806763}}}
23
+ {"participant_id": "P16", "condition": "w_o_HitL", "text_prompt": "bored", "prompt_category": "zero_shot_emotion", "prediction": {"blendshape_names": {"Eyes": "irisSwap", "Eye Brow": "none"}, "blendshape_index": {"0": 5, "1": -1}, "blendshape_confidence": {"0": 0.9830050468444824, "1": 0.29630428552627563}}}
24
+ {"participant_id": "P16", "condition": "w_o_HitL", "text_prompt": "empty", "prompt_category": "zero_shot_emotion", "prediction": {"blendshape_names": {"Eyes": "まばたき", "Eye Brow": "browDownAngry"}, "blendshape_index": {"0": 0, "1": 7}, "blendshape_confidence": {"0": 0.9766973257064819, "1": 0.9696959853172302}}}
25
+ {"participant_id": "P16", "condition": "w_o_HitL", "text_prompt": "resigned", "prompt_category": "zero_shot_emotion", "prediction": {"blendshape_names": {"Eyes": "まばたき", "Eye Brow": "browDownAngry"}, "blendshape_index": {"0": 0, "1": 7}, "blendshape_confidence": {"0": 0.975721001625061, "1": 0.947089672088623}}}
26
+ {"participant_id": "P16", "condition": "w_o_HitL", "text_prompt": "peace", "prompt_category": "zero_shot_emotion", "prediction": {"blendshape_names": {"Eyes": "none", "Eye Brow": "none"}, "blendshape_index": {"0": -1, "1": -1}, "blendshape_confidence": {"0": 0.965904951095581, "1": 0.3756828010082245}}}
27
+ {"participant_id": "P16", "condition": "w_o_HitL", "text_prompt": "rest", "prompt_category": "zero_shot_emotion", "prediction": {"blendshape_names": {"Eyes": "irisSwap", "Eye Brow": "none"}, "blendshape_index": {"0": 5, "1": -1}, "blendshape_confidence": {"0": 0.9824476838111877, "1": 0.31615200638771057}}}
28
+ {"participant_id": "P16", "condition": "w_o_HitL", "text_prompt": "dream", "prompt_category": "zero_shot_emotion", "prediction": {"blendshape_names": {"Eyes": "none", "Eye Brow": "none"}, "blendshape_index": {"0": -1, "1": -1}, "blendshape_confidence": {"0": 0.9665331840515137, "1": 0.38752350211143494}}}
results/P16/w_o_Proto_Loss/P16_w_o_Proto_Loss_all_predictions.jsonl ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {"participant_id": "P16", "condition": "w_o_Proto_Loss", "text_prompt": "happy", "prompt_category": "basic_emotion", "prediction": {"blendshape_names": {"Eyes": "none", "Eye Brow": "真面目"}, "blendshape_index": {"0": -1, "1": 0}, "blendshape_confidence": {"0": 0.9195575714111328, "1": 0.9566390514373779}}}
2
+ {"participant_id": "P16", "condition": "w_o_Proto_Loss", "text_prompt": "sad", "prompt_category": "basic_emotion", "prediction": {"blendshape_names": {"Eyes": "irisSwap", "Eye Brow": "browArcDown"}, "blendshape_index": {"0": 5, "1": 6}, "blendshape_confidence": {"0": 0.9952162504196167, "1": 0.8618800640106201}}}
3
+ {"participant_id": "P16", "condition": "w_o_Proto_Loss", "text_prompt": "angry", "prompt_category": "basic_emotion", "prediction": {"blendshape_names": {"Eyes": "まばたき", "Eye Brow": "browDownAngry"}, "blendshape_index": {"0": 0, "1": 7}, "blendshape_confidence": {"0": 0.6777116060256958, "1": 0.6453943252563477}}}
4
+ {"participant_id": "P16", "condition": "w_o_Proto_Loss", "text_prompt": "surprised", "prompt_category": "basic_emotion", "prediction": {"blendshape_names": {"Eyes": "irisShrink", "Eye Brow": "下"}, "blendshape_index": {"0": 6, "1": 5}, "blendshape_confidence": {"0": 0.7684522867202759, "1": 0.6743249893188477}}}
5
+ {"participant_id": "P16", "condition": "w_o_Proto_Loss", "text_prompt": "disgusted", "prompt_category": "basic_emotion", "prediction": {"blendshape_names": {"Eyes": "irisShrink", "Eye Brow": "下"}, "blendshape_index": {"0": 6, "1": 5}, "blendshape_confidence": {"0": 0.7175862789154053, "1": 0.6777569055557251}}}
6
+ {"participant_id": "P16", "condition": "w_o_Proto_Loss", "text_prompt": "fearful", "prompt_category": "basic_emotion", "prediction": {"blendshape_names": {"Eyes": "まばたき", "Eye Brow": "browDownAngry"}, "blendshape_index": {"0": 0, "1": 7}, "blendshape_confidence": {"0": 0.5352120399475098, "1": 0.9596059918403625}}}
7
+ {"participant_id": "P16", "condition": "w_o_Proto_Loss", "text_prompt": "neutral", "prompt_category": "basic_emotion", "prediction": {"blendshape_names": {"Eyes": "none", "Eye Brow": "困る"}, "blendshape_index": {"0": -1, "1": 1}, "blendshape_confidence": {"0": 0.9288369417190552, "1": 0.3153211176395416}}}
8
+ {"participant_id": "P16", "condition": "w_o_Proto_Loss", "text_prompt": "contempt", "prompt_category": "basic_emotion", "prediction": {"blendshape_names": {"Eyes": "まばたき", "Eye Brow": "browDownAngry"}, "blendshape_index": {"0": 0, "1": 7}, "blendshape_confidence": {"0": 0.6675456166267395, "1": 0.9299483895301819}}}
9
+ {"participant_id": "P16", "condition": "w_o_Proto_Loss", "text_prompt": "a little funny", "prompt_category": "nuanced_emotion", "prediction": {"blendshape_names": {"Eyes": "笑い", "Eye Brow": "none"}, "blendshape_index": {"0": 1, "1": -1}, "blendshape_confidence": {"0": 0.9993659853935242, "1": 0.9439524412155151}}}
10
+ {"participant_id": "P16", "condition": "w_o_Proto_Loss", "text_prompt": "a little happy", "prompt_category": "nuanced_emotion", "prediction": {"blendshape_names": {"Eyes": "なごみ", "Eye Brow": "none"}, "blendshape_index": {"0": 2, "1": -1}, "blendshape_confidence": {"0": 0.7111021280288696, "1": 0.24300743639469147}}}
11
+ {"participant_id": "P16", "condition": "w_o_Proto_Loss", "text_prompt": "disappointed", "prompt_category": "nuanced_emotion", "prediction": {"blendshape_names": {"Eyes": "じと目", "Eye Brow": "browArcDown"}, "blendshape_index": {"0": 4, "1": 6}, "blendshape_confidence": {"0": 0.9648445248603821, "1": 0.9141896367073059}}}
12
+ {"participant_id": "P16", "condition": "w_o_Proto_Loss", "text_prompt": "shocked", "prompt_category": "nuanced_emotion", "prediction": {"blendshape_names": {"Eyes": "irisShrink", "Eye Brow": "下"}, "blendshape_index": {"0": 6, "1": 5}, "blendshape_confidence": {"0": 0.7670702934265137, "1": 0.68238765001297}}}
13
+ {"participant_id": "P16", "condition": "w_o_Proto_Loss", "text_prompt": "very angry", "prompt_category": "nuanced_emotion", "prediction": {"blendshape_names": {"Eyes": "irisSwap", "Eye Brow": "browDownAngry"}, "blendshape_index": {"0": 5, "1": 7}, "blendshape_confidence": {"0": 0.8232160210609436, "1": 0.9902864694595337}}}
14
+ {"participant_id": "P16", "condition": "w_o_Proto_Loss", "text_prompt": "very funny", "prompt_category": "nuanced_emotion", "prediction": {"blendshape_names": {"Eyes": "笑い", "Eye Brow": "browArcDown"}, "blendshape_index": {"0": 1, "1": 6}, "blendshape_confidence": {"0": 0.9973451495170593, "1": 0.7104917168617249}}}
15
+ {"participant_id": "P16", "condition": "w_o_Proto_Loss", "text_prompt": "very happy", "prompt_category": "nuanced_emotion", "prediction": {"blendshape_names": {"Eyes": "びっくり", "Eye Brow": "browArcDown"}, "blendshape_index": {"0": 3, "1": 6}, "blendshape_confidence": {"0": 0.9923366904258728, "1": 0.8447840809822083}}}
16
+ {"participant_id": "P16", "condition": "w_o_Proto_Loss", "text_prompt": "very shocked", "prompt_category": "nuanced_emotion", "prediction": {"blendshape_names": {"Eyes": "irisShrink", "Eye Brow": "browArcDown"}, "blendshape_index": {"0": 6, "1": 6}, "blendshape_confidence": {"0": 0.9778264760971069, "1": 0.9932977557182312}}}
17
+ {"participant_id": "P16", "condition": "w_o_Proto_Loss", "text_prompt": "success", "prompt_category": "zero_shot_emotion", "prediction": {"blendshape_names": {"Eyes": "none", "Eye Brow": "真面目"}, "blendshape_index": {"0": -1, "1": 0}, "blendshape_confidence": {"0": 0.9354007244110107, "1": 0.933943510055542}}}
18
+ {"participant_id": "P16", "condition": "w_o_Proto_Loss", "text_prompt": "amazing", "prompt_category": "zero_shot_emotion", "prediction": {"blendshape_names": {"Eyes": "none", "Eye Brow": "真面目"}, "blendshape_index": {"0": -1, "1": 0}, "blendshape_confidence": {"0": 0.9203710556030273, "1": 0.9566336870193481}}}
19
+ {"participant_id": "P16", "condition": "w_o_Proto_Loss", "text_prompt": "awesome", "prompt_category": "zero_shot_emotion", "prediction": {"blendshape_names": {"Eyes": "none", "Eye Brow": "真面目"}, "blendshape_index": {"0": -1, "1": 0}, "blendshape_confidence": {"0": 0.9252161979675293, "1": 0.9491269588470459}}}
20
+ {"participant_id": "P16", "condition": "w_o_Proto_Loss", "text_prompt": "hate", "prompt_category": "zero_shot_emotion", "prediction": {"blendshape_names": {"Eyes": "まばたき", "Eye Brow": "browDownAngry"}, "blendshape_index": {"0": 0, "1": 7}, "blendshape_confidence": {"0": 0.6805888414382935, "1": 0.6035733222961426}}}
21
+ {"participant_id": "P16", "condition": "w_o_Proto_Loss", "text_prompt": "fear", "prompt_category": "zero_shot_emotion", "prediction": {"blendshape_names": {"Eyes": "irisShrink", "Eye Brow": "下"}, "blendshape_index": {"0": 6, "1": 5}, "blendshape_confidence": {"0": 0.736305296421051, "1": 0.6783642768859863}}}
22
+ {"participant_id": "P16", "condition": "w_o_Proto_Loss", "text_prompt": "pain", "prompt_category": "zero_shot_emotion", "prediction": {"blendshape_names": {"Eyes": "まばたき", "Eye Brow": "browDownAngry"}, "blendshape_index": {"0": 0, "1": 7}, "blendshape_confidence": {"0": 0.683143675327301, "1": 0.6321362257003784}}}
23
+ {"participant_id": "P16", "condition": "w_o_Proto_Loss", "text_prompt": "bored", "prompt_category": "zero_shot_emotion", "prediction": {"blendshape_names": {"Eyes": "irisSwap", "Eye Brow": "browArcDown"}, "blendshape_index": {"0": 5, "1": 6}, "blendshape_confidence": {"0": 0.9956795573234558, "1": 0.8425622582435608}}}
24
+ {"participant_id": "P16", "condition": "w_o_Proto_Loss", "text_prompt": "empty", "prompt_category": "zero_shot_emotion", "prediction": {"blendshape_names": {"Eyes": "none", "Eye Brow": "真面目"}, "blendshape_index": {"0": -1, "1": 0}, "blendshape_confidence": {"0": 0.9181281328201294, "1": 0.9338735342025757}}}
25
+ {"participant_id": "P16", "condition": "w_o_Proto_Loss", "text_prompt": "resigned", "prompt_category": "zero_shot_emotion", "prediction": {"blendshape_names": {"Eyes": "まばたき", "Eye Brow": "browDownAngry"}, "blendshape_index": {"0": 0, "1": 7}, "blendshape_confidence": {"0": 0.6549135446548462, "1": 0.56524258852005}}}
26
+ {"participant_id": "P16", "condition": "w_o_Proto_Loss", "text_prompt": "peace", "prompt_category": "zero_shot_emotion", "prediction": {"blendshape_names": {"Eyes": "none", "Eye Brow": "真面目"}, "blendshape_index": {"0": -1, "1": 0}, "blendshape_confidence": {"0": 0.9213952422142029, "1": 0.9570997357368469}}}
27
+ {"participant_id": "P16", "condition": "w_o_Proto_Loss", "text_prompt": "rest", "prompt_category": "zero_shot_emotion", "prediction": {"blendshape_names": {"Eyes": "none", "Eye Brow": "真面目"}, "blendshape_index": {"0": -1, "1": 0}, "blendshape_confidence": {"0": 0.9274438619613647, "1": 0.9359365105628967}}}
28
+ {"participant_id": "P16", "condition": "w_o_Proto_Loss", "text_prompt": "dream", "prompt_category": "zero_shot_emotion", "prediction": {"blendshape_names": {"Eyes": "none", "Eye Brow": "真面目"}, "blendshape_index": {"0": -1, "1": 0}, "blendshape_confidence": {"0": 0.9186090230941772, "1": 0.956093966960907}}}
results/P16/w_o_Tuning/P16_w_o_Tuning_all_predictions.jsonl ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {"participant_id": "P16", "condition": "w_o_Tuning", "text_prompt": "happy", "prompt_category": "basic_emotion", "prediction": {"blendshape_names": {"Eyes": "irisSwap", "Eye Brow": "下"}, "blendshape_index": {"0": 5, "1": 5}, "blendshape_confidence": {"0": 0.9481315612792969, "1": 0.3444276452064514}}}
2
+ {"participant_id": "P16", "condition": "w_o_Tuning", "text_prompt": "sad", "prompt_category": "basic_emotion", "prediction": {"blendshape_names": {"Eyes": "none", "Eye Brow": "下"}, "blendshape_index": {"0": -1, "1": 5}, "blendshape_confidence": {"0": 0.5000121593475342, "1": 0.17329074442386627}}}
3
+ {"participant_id": "P16", "condition": "w_o_Tuning", "text_prompt": "angry", "prompt_category": "basic_emotion", "prediction": {"blendshape_names": {"Eyes": "じと目", "Eye Brow": "怒り"}, "blendshape_index": {"0": 4, "1": 2}, "blendshape_confidence": {"0": 0.9552088975906372, "1": 0.18724988400936127}}}
4
+ {"participant_id": "P16", "condition": "w_o_Tuning", "text_prompt": "surprised", "prompt_category": "basic_emotion", "prediction": {"blendshape_names": {"Eyes": "none", "Eye Brow": "困る"}, "blendshape_index": {"0": -1, "1": 1}, "blendshape_confidence": {"0": 0.3981679379940033, "1": 0.15328086912631989}}}
5
+ {"participant_id": "P16", "condition": "w_o_Tuning", "text_prompt": "disgusted", "prompt_category": "basic_emotion", "prediction": {"blendshape_names": {"Eyes": "irisShrink", "Eye Brow": "browDownAngry"}, "blendshape_index": {"0": 6, "1": 7}, "blendshape_confidence": {"0": 0.7845066785812378, "1": 0.9812286496162415}}}
6
+ {"participant_id": "P16", "condition": "w_o_Tuning", "text_prompt": "fearful", "prompt_category": "basic_emotion", "prediction": {"blendshape_names": {"Eyes": "なごみ", "Eye Brow": "にこり"}, "blendshape_index": {"0": 2, "1": 3}, "blendshape_confidence": {"0": 0.9942188262939453, "1": 0.6948028802871704}}}
7
+ {"participant_id": "P16", "condition": "w_o_Tuning", "text_prompt": "neutral", "prompt_category": "basic_emotion", "prediction": {"blendshape_names": {"Eyes": "なごみ", "Eye Brow": "にこり"}, "blendshape_index": {"0": 2, "1": 3}, "blendshape_confidence": {"0": 0.9778452515602112, "1": 0.578363835811615}}}
8
+ {"participant_id": "P16", "condition": "w_o_Tuning", "text_prompt": "contempt", "prompt_category": "basic_emotion", "prediction": {"blendshape_names": {"Eyes": "なごみ", "Eye Brow": "にこり"}, "blendshape_index": {"0": 2, "1": 3}, "blendshape_confidence": {"0": 0.4883831739425659, "1": 0.4669913053512573}}}
9
+ {"participant_id": "P16", "condition": "w_o_Tuning", "text_prompt": "a little funny", "prompt_category": "nuanced_emotion", "prediction": {"blendshape_names": {"Eyes": "irisSwap", "Eye Brow": "下"}, "blendshape_index": {"0": 5, "1": 5}, "blendshape_confidence": {"0": 0.9328472018241882, "1": 0.26155993342399597}}}
10
+ {"participant_id": "P16", "condition": "w_o_Tuning", "text_prompt": "a little happy", "prompt_category": "nuanced_emotion", "prediction": {"blendshape_names": {"Eyes": "じと目", "Eye Brow": "怒り"}, "blendshape_index": {"0": 4, "1": 2}, "blendshape_confidence": {"0": 0.6503470540046692, "1": 0.16144150495529175}}}
11
+ {"participant_id": "P16", "condition": "w_o_Tuning", "text_prompt": "disappointed", "prompt_category": "nuanced_emotion", "prediction": {"blendshape_names": {"Eyes": "none", "Eye Brow": "にこり"}, "blendshape_index": {"0": -1, "1": 3}, "blendshape_confidence": {"0": 0.5511922240257263, "1": 0.5314074158668518}}}
12
+ {"participant_id": "P16", "condition": "w_o_Tuning", "text_prompt": "shocked", "prompt_category": "nuanced_emotion", "prediction": {"blendshape_names": {"Eyes": "none", "Eye Brow": "真面目"}, "blendshape_index": {"0": -1, "1": 0}, "blendshape_confidence": {"0": 0.5949457883834839, "1": 0.15164656937122345}}}
13
+ {"participant_id": "P16", "condition": "w_o_Tuning", "text_prompt": "very angry", "prompt_category": "nuanced_emotion", "prediction": {"blendshape_names": {"Eyes": "irisSwap", "Eye Brow": "browDownAngry"}, "blendshape_index": {"0": 5, "1": 7}, "blendshape_confidence": {"0": 0.46064361929893494, "1": 0.9522056579589844}}}
14
+ {"participant_id": "P16", "condition": "w_o_Tuning", "text_prompt": "very funny", "prompt_category": "nuanced_emotion", "prediction": {"blendshape_names": {"Eyes": "irisShrink", "Eye Brow": "上"}, "blendshape_index": {"0": 6, "1": 4}, "blendshape_confidence": {"0": 0.6141073107719421, "1": 0.5987728834152222}}}
15
+ {"participant_id": "P16", "condition": "w_o_Tuning", "text_prompt": "very happy", "prompt_category": "nuanced_emotion", "prediction": {"blendshape_names": {"Eyes": "irisShrink", "Eye Brow": "browDownAngry"}, "blendshape_index": {"0": 6, "1": 7}, "blendshape_confidence": {"0": 0.7866084575653076, "1": 0.8924419283866882}}}
16
+ {"participant_id": "P16", "condition": "w_o_Tuning", "text_prompt": "very shocked", "prompt_category": "nuanced_emotion", "prediction": {"blendshape_names": {"Eyes": "irisSwap", "Eye Brow": "にこり"}, "blendshape_index": {"0": 5, "1": 3}, "blendshape_confidence": {"0": 0.582662045955658, "1": 0.24059106409549713}}}
17
+ {"participant_id": "P16", "condition": "w_o_Tuning", "text_prompt": "success", "prompt_category": "zero_shot_emotion", "prediction": {"blendshape_names": {"Eyes": "irisSwap", "Eye Brow": "にこり"}, "blendshape_index": {"0": 5, "1": 3}, "blendshape_confidence": {"0": 0.9540913701057434, "1": 0.3064473271369934}}}
18
+ {"participant_id": "P16", "condition": "w_o_Tuning", "text_prompt": "amazing", "prompt_category": "zero_shot_emotion", "prediction": {"blendshape_names": {"Eyes": "irisShrink", "Eye Brow": "browArcDown"}, "blendshape_index": {"0": 6, "1": 6}, "blendshape_confidence": {"0": 0.9611456394195557, "1": 0.4031837582588196}}}
19
+ {"participant_id": "P16", "condition": "w_o_Tuning", "text_prompt": "awesome", "prompt_category": "zero_shot_emotion", "prediction": {"blendshape_names": {"Eyes": "none", "Eye Brow": "browDownAngry"}, "blendshape_index": {"0": -1, "1": 7}, "blendshape_confidence": {"0": 0.6316651105880737, "1": 0.4412817358970642}}}
20
+ {"participant_id": "P16", "condition": "w_o_Tuning", "text_prompt": "hate", "prompt_category": "zero_shot_emotion", "prediction": {"blendshape_names": {"Eyes": "irisSwap", "Eye Brow": "上"}, "blendshape_index": {"0": 5, "1": 4}, "blendshape_confidence": {"0": 0.9551994204521179, "1": 0.44521796703338623}}}
21
+ {"participant_id": "P16", "condition": "w_o_Tuning", "text_prompt": "fear", "prompt_category": "zero_shot_emotion", "prediction": {"blendshape_names": {"Eyes": "なごみ", "Eye Brow": "にこり"}, "blendshape_index": {"0": 2, "1": 3}, "blendshape_confidence": {"0": 0.5650838017463684, "1": 0.5936198234558105}}}
22
+ {"participant_id": "P16", "condition": "w_o_Tuning", "text_prompt": "pain", "prompt_category": "zero_shot_emotion", "prediction": {"blendshape_names": {"Eyes": "なごみ", "Eye Brow": "にこり"}, "blendshape_index": {"0": 2, "1": 3}, "blendshape_confidence": {"0": 0.9921459555625916, "1": 0.6525947451591492}}}
23
+ {"participant_id": "P16", "condition": "w_o_Tuning", "text_prompt": "bored", "prompt_category": "zero_shot_emotion", "prediction": {"blendshape_names": {"Eyes": "none", "Eye Brow": "にこり"}, "blendshape_index": {"0": -1, "1": 3}, "blendshape_confidence": {"0": 0.6731842756271362, "1": 0.3886412978172302}}}
24
+ {"participant_id": "P16", "condition": "w_o_Tuning", "text_prompt": "empty", "prompt_category": "zero_shot_emotion", "prediction": {"blendshape_names": {"Eyes": "irisSwap", "Eye Brow": "browDownAngry"}, "blendshape_index": {"0": 5, "1": 7}, "blendshape_confidence": {"0": 0.6628652215003967, "1": 0.9546783566474915}}}
25
+ {"participant_id": "P16", "condition": "w_o_Tuning", "text_prompt": "resigned", "prompt_category": "zero_shot_emotion", "prediction": {"blendshape_names": {"Eyes": "irisSwap", "Eye Brow": "にこり"}, "blendshape_index": {"0": 5, "1": 3}, "blendshape_confidence": {"0": 0.8161370158195496, "1": 0.22297778725624084}}}
26
+ {"participant_id": "P16", "condition": "w_o_Tuning", "text_prompt": "peace", "prompt_category": "zero_shot_emotion", "prediction": {"blendshape_names": {"Eyes": "irisShrink", "Eye Brow": "none"}, "blendshape_index": {"0": 6, "1": -1}, "blendshape_confidence": {"0": 0.9511870741844177, "1": 0.2891601324081421}}}
27
+ {"participant_id": "P16", "condition": "w_o_Tuning", "text_prompt": "rest", "prompt_category": "zero_shot_emotion", "prediction": {"blendshape_names": {"Eyes": "なごみ", "Eye Brow": "にこり"}, "blendshape_index": {"0": 2, "1": 3}, "blendshape_confidence": {"0": 0.9888344407081604, "1": 0.6265195608139038}}}
28
+ {"participant_id": "P16", "condition": "w_o_Tuning", "text_prompt": "dream", "prompt_category": "zero_shot_emotion", "prediction": {"blendshape_names": {"Eyes": "なごみ", "Eye Brow": "真面目"}, "blendshape_index": {"0": 2, "1": 0}, "blendshape_confidence": {"0": 0.4330196976661682, "1": 0.23035599291324615}}}