ManishThota commited on
Commit
1fea0a0
1 Parent(s): 3245c07

Upload folder using huggingface_hub

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .gitattributes +7 -0
  2. ChatUniVi/__init__.py +1 -0
  3. ChatUniVi/__pycache__/__init__.cpython-310.pyc +0 -0
  4. ChatUniVi/__pycache__/constants.cpython-310.pyc +0 -0
  5. ChatUniVi/__pycache__/conversation.cpython-310.pyc +0 -0
  6. ChatUniVi/__pycache__/mm_utils.cpython-310.pyc +0 -0
  7. ChatUniVi/__pycache__/utils.cpython-310.pyc +0 -0
  8. ChatUniVi/config/__init__.py +15 -0
  9. ChatUniVi/config/dataset_config.py +41 -0
  10. ChatUniVi/config/mode_config.py +24 -0
  11. ChatUniVi/constants.py +19 -0
  12. ChatUniVi/conversation.py +273 -0
  13. ChatUniVi/demo.py +160 -0
  14. ChatUniVi/eval/evaluate/evaluate_benchmark_1_correctness.py +199 -0
  15. ChatUniVi/eval/evaluate/evaluate_benchmark_1_correctness_mi.py +201 -0
  16. ChatUniVi/eval/evaluate/evaluate_benchmark_2_detailed_orientation.py +199 -0
  17. ChatUniVi/eval/evaluate/evaluate_benchmark_2_detailed_orientation_mi.py +201 -0
  18. ChatUniVi/eval/evaluate/evaluate_benchmark_3_context.py +199 -0
  19. ChatUniVi/eval/evaluate/evaluate_benchmark_3_context_mi.py +201 -0
  20. ChatUniVi/eval/evaluate/evaluate_benchmark_4_temporal.py +198 -0
  21. ChatUniVi/eval/evaluate/evaluate_benchmark_4_temporal_mi.py +200 -0
  22. ChatUniVi/eval/evaluate/evaluate_benchmark_5_consistency.py +207 -0
  23. ChatUniVi/eval/evaluate/evaluate_benchmark_5_consistency_mi.py +208 -0
  24. ChatUniVi/eval/evaluate/evaluate_gpt_review_visual.py +118 -0
  25. ChatUniVi/eval/evaluate/evaluate_science_qa.py +142 -0
  26. ChatUniVi/eval/evaluate/evaluate_video_qa.py +212 -0
  27. ChatUniVi/eval/evaluate/evaluate_video_qa_mi.py +214 -0
  28. ChatUniVi/eval/evaluate/summarize_gpt_review.py +67 -0
  29. ChatUniVi/eval/model_coco_vqa.py +220 -0
  30. ChatUniVi/eval/model_video_consistency.py +252 -0
  31. ChatUniVi/eval/model_video_general.py +213 -0
  32. ChatUniVi/eval/model_video_qa.py +232 -0
  33. ChatUniVi/eval/model_vqa.py +125 -0
  34. ChatUniVi/eval/model_vqa_scienceqa.py +164 -0
  35. ChatUniVi/eval/questions/coco2014_val_qa_eval/qa90_gpt4_answer.jsonl +90 -0
  36. ChatUniVi/eval/questions/coco2014_val_qa_eval/qa90_questions.jsonl +90 -0
  37. ChatUniVi/eval/questions/coco_pope/coco_pope_adversarial.jsonl +0 -0
  38. ChatUniVi/eval/questions/coco_pope/coco_pope_popular.jsonl +0 -0
  39. ChatUniVi/eval/questions/coco_pope/coco_pope_random.jsonl +0 -0
  40. ChatUniVi/eval/questions/scienceqa/pid_splits.json +0 -0
  41. ChatUniVi/eval/questions/scienceqa/problems.json +3 -0
  42. ChatUniVi/eval/questions/scienceqa/test_QCM-LEA.json +0 -0
  43. ChatUniVi/eval/questions/video_qa/activitynet_a_list.json +2105 -0
  44. ChatUniVi/eval/questions/video_qa/activitynet_qa.json +0 -0
  45. ChatUniVi/eval/questions/video_qa/consistency_qa.json +0 -0
  46. ChatUniVi/eval/questions/video_qa/generic_qa.json +0 -0
  47. ChatUniVi/eval/questions/video_qa/msrvtt_a_list.json +4175 -0
  48. ChatUniVi/eval/questions/video_qa/msrvtt_qa.json +0 -0
  49. ChatUniVi/eval/questions/video_qa/msvd_a_list.json +1202 -0
  50. ChatUniVi/eval/questions/video_qa/msvd_qa.json +0 -0
.gitattributes CHANGED
@@ -33,3 +33,10 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ ChatUniVi/eval/questions/scienceqa/problems.json filter=lfs diff=lfs merge=lfs -text
37
+ examples/image0.jpg filter=lfs diff=lfs merge=lfs -text
38
+ examples/video0.mp4 filter=lfs diff=lfs merge=lfs -text
39
+ examples/video1.mp4 filter=lfs diff=lfs merge=lfs -text
40
+ examples/video2.mp4 filter=lfs diff=lfs merge=lfs -text
41
+ examples/video3.mp4 filter=lfs diff=lfs merge=lfs -text
42
+ examples/video4.mp4 filter=lfs diff=lfs merge=lfs -text
ChatUniVi/__init__.py ADDED
@@ -0,0 +1 @@
 
 
1
+ from .model import ChatUniViLlamaForCausalLM
ChatUniVi/__pycache__/__init__.cpython-310.pyc ADDED
Binary file (215 Bytes). View file
 
ChatUniVi/__pycache__/constants.cpython-310.pyc ADDED
Binary file (752 Bytes). View file
 
ChatUniVi/__pycache__/conversation.cpython-310.pyc ADDED
Binary file (7.38 kB). View file
 
ChatUniVi/__pycache__/mm_utils.cpython-310.pyc ADDED
Binary file (3.39 kB). View file
 
ChatUniVi/__pycache__/utils.cpython-310.pyc ADDED
Binary file (4.04 kB). View file
 
ChatUniVi/config/__init__.py ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from .dataset_config import *
2
+ from .mode_config import *
3
+
4
+
5
+ ModelConfig = {
6
+ "PRETUNE": model_config_pretune,
7
+ "FINETUNE": model_config_finetune,
8
+ }
9
+
10
+
11
+ DataConfig = {
12
+ "Pretrain": [Pretrain, COCO_CAP, COCO_REG, COCO_REC],
13
+ "SQA": [SQA],
14
+ "FINETUNE": [VIT, MIMIC_imageonly, VIDEO],
15
+ }
ChatUniVi/config/dataset_config.py ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Pretrain = {
2
+ "chat_path": "${PATH}/CC3M-595K/chat.json",
3
+ "CC3M": "${PATH}/CC3M-595K",
4
+ }
5
+
6
+ VIT = {
7
+ "chat_path": "${PATH}/llava_instruct_150k.json",
8
+ "COCO2017": "${PATH}/COCO2017/train2017",
9
+ }
10
+
11
+ MIMIC_imageonly = {
12
+ "chat_path": "${PATH}/MIMIC-IT-imageonly.json",
13
+ "CDG": "${PATH}/CGD/images",
14
+ "LA": "${PATH}/LA/images",
15
+ "SD": "${PATH}/SD/images",
16
+ }
17
+
18
+ COCO_CAP = {
19
+ "chat_path": "${PATH}/COCO/coco_cap_chat.json",
20
+ "COCO2014": "${PATH}/COCO2014/train2014",
21
+ }
22
+
23
+ COCO_REG = {
24
+ "chat_path": "${PATH}/COCO/coco_reg_chat.json",
25
+ "COCO2014": "${PATH}/COCO2014/train2014",
26
+ }
27
+
28
+ COCO_REC = {
29
+ "chat_path": "${PATH}/COCO/coco_rec_chat.json",
30
+ "COCO2014": "${PATH}/COCO2014/train2014",
31
+ }
32
+
33
+ VIDEO = {
34
+ "chat_path": "${PATH}/video_chat.json",
35
+ "VIDEO": "${PATH}/Activity_Videos",
36
+ }
37
+
38
+ SQA = {
39
+ "chat_path": "${PATH}/llava_train_QCM-LEA.json",
40
+ "ScienceQA": "${PATH}/scienceqa/train",
41
+ }
ChatUniVi/config/mode_config.py ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ model_config_pretune = {
2
+ "use_cluster": True,
3
+ "freeze": False,
4
+ "vision_tune": False,
5
+
6
+ "spatial_cluster_rate0": 64, # 0.25
7
+ "spatial_cluster_rate1": 32, # 0.5
8
+ "spatial_cluster_rate2": 16, # 0.5
9
+
10
+ "temporal_cluster_rate": 1/16,
11
+ }
12
+
13
+ model_config_finetune = {
14
+ "use_cluster": True,
15
+ "freeze": False,
16
+ "mm_tune": True,
17
+ "vision_tune": False,
18
+
19
+ "spatial_cluster_rate0": 64, # 0.25
20
+ "spatial_cluster_rate1": 32, # 0.5
21
+ "spatial_cluster_rate2": 16, # 0.5
22
+
23
+ "temporal_cluster_rate": 1/16,
24
+ }
ChatUniVi/constants.py ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ CONTROLLER_HEART_BEAT_EXPIRATION = 30
2
+ WORKER_HEART_BEAT_INTERVAL = 15
3
+
4
+ LOGDIR = "."
5
+
6
+ # Model Constants
7
+ MAX_IMAGE_LENGTH = 64
8
+ IGNORE_INDEX = -100
9
+ IMAGE_TOKEN_INDEX = -200
10
+ DEFAULT_IMAGE_TOKEN = "<image>"
11
+ DEFAULT_VIDEO_TOKEN = "<video>"
12
+ DEFAULT_IMAGE_PATCH_TOKEN = "<im_patch>"
13
+ DEFAULT_IM_START_TOKEN = "<im_start>"
14
+ DEFAULT_IM_END_TOKEN = "<im_end>"
15
+ DEFAULT_VIDEO_PATCH_TOKEN = "<vid_patch>"
16
+ DEFAULT_VID_START_TOKEN = "<vid_start>"
17
+ DEFAULT_VID_END_TOKEN = "<vid_end>"
18
+ DEFAULT_BOX_START_TOKEN = "<box_start>"
19
+ DEFAULT_BOX_END_TOKEN = "<box_end>"
ChatUniVi/conversation.py ADDED
@@ -0,0 +1,273 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import dataclasses
2
+ from enum import auto, Enum
3
+ from typing import List, Tuple
4
+
5
+
6
+ class SeparatorStyle(Enum):
7
+ """Different separator style."""
8
+ SINGLE = auto()
9
+ TWO = auto()
10
+ MPT = auto()
11
+ PLAIN = auto()
12
+ LLAMA_2 = auto()
13
+
14
+
15
+ @dataclasses.dataclass
16
+ class Conversation:
17
+ """A class that keeps all conversation history."""
18
+ system: str
19
+ roles: List[str]
20
+ messages: List[List[str]]
21
+ offset: int
22
+ sep_style: SeparatorStyle = SeparatorStyle.SINGLE
23
+ sep: str = "###"
24
+ sep2: str = None
25
+ version: str = "Unknown"
26
+
27
+ skip_next: bool = False
28
+
29
+ def get_prompt(self):
30
+ messages = self.messages
31
+ if len(messages) > 0 and type(messages[0][1]) is tuple:
32
+ messages = self.messages.copy()
33
+ init_role, init_msg = messages[0].copy()
34
+ init_msg = init_msg[0].replace("<image>", "").strip()
35
+ if 'mmtag' in self.version:
36
+ messages[0] = (init_role, init_msg)
37
+ messages.insert(0, (self.roles[0], "<Image><image></Image>"))
38
+ messages.insert(1, (self.roles[1], "Received."))
39
+ else:
40
+ messages[0] = (init_role, "<image>\n" + init_msg)
41
+
42
+ if self.sep_style == SeparatorStyle.SINGLE:
43
+ ret = self.system + self.sep
44
+ for role, message in messages:
45
+ if message:
46
+ if type(message) is tuple:
47
+ message, _, _ = message
48
+ ret += role + ": " + message + self.sep
49
+ else:
50
+ ret += role + ":"
51
+ elif self.sep_style == SeparatorStyle.TWO:
52
+ seps = [self.sep, self.sep2]
53
+ ret = self.system + seps[0]
54
+ for i, (role, message) in enumerate(messages):
55
+ if message:
56
+ if type(message) is tuple:
57
+ message, _, _ = message
58
+ ret += role + ": " + message + seps[i % 2]
59
+ else:
60
+ ret += role + ":"
61
+ elif self.sep_style == SeparatorStyle.MPT:
62
+ ret = self.system + self.sep
63
+ for role, message in messages:
64
+ if message:
65
+ if type(message) is tuple:
66
+ message, _, _ = message
67
+ ret += role + message + self.sep
68
+ else:
69
+ ret += role
70
+ elif self.sep_style == SeparatorStyle.LLAMA_2:
71
+ wrap_sys = lambda msg: f"<<SYS>>\n{msg}\n<</SYS>>\n\n"
72
+ wrap_inst = lambda msg: f"[INST] {msg} [/INST]"
73
+ ret = ""
74
+
75
+ for i, (role, message) in enumerate(messages):
76
+ if i == 0:
77
+ assert message, "first message should not be none"
78
+ assert role == self.roles[0], "first message should come from user"
79
+ if message:
80
+ if type(message) is tuple:
81
+ message, _, _ = message
82
+ if i == 0: message = wrap_sys(self.system) + message
83
+ if i % 2 == 0:
84
+ message = wrap_inst(message)
85
+ ret += self.sep + message
86
+ else:
87
+ ret += " " + message + " " + self.sep2
88
+ else:
89
+ ret += ""
90
+ ret = ret.lstrip(self.sep)
91
+ elif self.sep_style == SeparatorStyle.PLAIN:
92
+ seps = [self.sep, self.sep2]
93
+ ret = self.system
94
+ for i, (role, message) in enumerate(messages):
95
+ if message:
96
+ if type(message) is tuple:
97
+ message, _, _ = message
98
+ ret += message + seps[i % 2]
99
+ else:
100
+ ret += ""
101
+ else:
102
+ raise ValueError(f"Invalid style: {self.sep_style}")
103
+
104
+ return ret
105
+
106
+ def append_message(self, role, message):
107
+ self.messages.append([role, message])
108
+
109
+ def get_images(self, return_pil=False):
110
+ images = []
111
+ for i, (role, msg) in enumerate(self.messages[self.offset:]):
112
+ if i % 2 == 0:
113
+ if type(msg) is tuple:
114
+ import base64
115
+ from io import BytesIO
116
+ from PIL import Image
117
+ msg, image, image_process_mode = msg
118
+ if image_process_mode == "Pad":
119
+ def expand2square(pil_img, background_color=(122, 116, 104)):
120
+ width, height = pil_img.size
121
+ if width == height:
122
+ return pil_img
123
+ elif width > height:
124
+ result = Image.new(pil_img.mode, (width, width), background_color)
125
+ result.paste(pil_img, (0, (width - height) // 2))
126
+ return result
127
+ else:
128
+ result = Image.new(pil_img.mode, (height, height), background_color)
129
+ result.paste(pil_img, ((height - width) // 2, 0))
130
+ return result
131
+ image = expand2square(image)
132
+ elif image_process_mode == "Crop":
133
+ pass
134
+ elif image_process_mode == "Resize":
135
+ image = image.resize((336, 336))
136
+ else:
137
+ raise ValueError(f"Invalid image_process_mode: {image_process_mode}")
138
+ max_hw, min_hw = max(image.size), min(image.size)
139
+ aspect_ratio = max_hw / min_hw
140
+ max_len, min_len = 800, 400
141
+ shortest_edge = int(min(max_len / aspect_ratio, min_len, min_hw))
142
+ longest_edge = int(shortest_edge * aspect_ratio)
143
+ W, H = image.size
144
+ if H > W:
145
+ H, W = longest_edge, shortest_edge
146
+ else:
147
+ H, W = shortest_edge, longest_edge
148
+ image = image.resize((W, H))
149
+ if return_pil:
150
+ images.append(image)
151
+ else:
152
+ buffered = BytesIO()
153
+ image.save(buffered, format="PNG")
154
+ img_b64_str = base64.b64encode(buffered.getvalue()).decode()
155
+ images.append(img_b64_str)
156
+ return images
157
+
158
+ def to_gradio_chatbot(self):
159
+ ret = []
160
+ for i, (role, msg) in enumerate(self.messages[self.offset:]):
161
+ if i % 2 == 0:
162
+ if type(msg) is tuple:
163
+ import base64
164
+ from io import BytesIO
165
+ msg, image, image_process_mode = msg
166
+ max_hw, min_hw = max(image.size), min(image.size)
167
+ aspect_ratio = max_hw / min_hw
168
+ max_len, min_len = 800, 400
169
+ shortest_edge = int(min(max_len / aspect_ratio, min_len, min_hw))
170
+ longest_edge = int(shortest_edge * aspect_ratio)
171
+ W, H = image.size
172
+ if H > W:
173
+ H, W = longest_edge, shortest_edge
174
+ else:
175
+ H, W = shortest_edge, longest_edge
176
+ image = image.resize((W, H))
177
+ buffered = BytesIO()
178
+ image.save(buffered, format="JPEG")
179
+ img_b64_str = base64.b64encode(buffered.getvalue()).decode()
180
+ img_str = f'<img src="data:image/png;base64,{img_b64_str}" alt="user upload image" />'
181
+ ret.append([img_str, None])
182
+ msg = msg.replace('<image>', '').strip()
183
+ if len(msg) > 0:
184
+ ret.append([msg, None])
185
+ else:
186
+ ret.append([msg, None])
187
+ else:
188
+ ret[-1][-1] = msg
189
+ return ret
190
+
191
+ def copy(self):
192
+ return Conversation(
193
+ system=self.system,
194
+ roles=self.roles,
195
+ messages=[[x, y] for x, y in self.messages],
196
+ offset=self.offset,
197
+ sep_style=self.sep_style,
198
+ sep=self.sep,
199
+ sep2=self.sep2,
200
+ version=self.version)
201
+
202
+ def dict(self):
203
+ if len(self.get_images()) > 0:
204
+ return {
205
+ "system": self.system,
206
+ "roles": self.roles,
207
+ "messages": [[x, y[0] if type(y) is tuple else y] for x, y in self.messages],
208
+ "offset": self.offset,
209
+ "sep": self.sep,
210
+ "sep2": self.sep2,
211
+ }
212
+ return {
213
+ "system": self.system,
214
+ "roles": self.roles,
215
+ "messages": self.messages,
216
+ "offset": self.offset,
217
+ "sep": self.sep,
218
+ "sep2": self.sep2,
219
+ }
220
+
221
+
222
+ conv_v1 = Conversation(
223
+ system="A chat between a curious user and an artificial intelligence assistant. "
224
+ "The assistant gives helpful, detailed, and polite answers to the user's questions.",
225
+ roles=("USER", "ASSISTANT"),
226
+ version="v1",
227
+ messages=(),
228
+ offset=0,
229
+ sep_style=SeparatorStyle.TWO,
230
+ sep=" ",
231
+ sep2="</s>",
232
+ )
233
+
234
+
235
+ simple_qa = Conversation(
236
+ system="A chat between a curious human and an artificial intelligence assistant. "
237
+ "The assistant gives helpful, detailed, and polite answers to the human's questions. "
238
+ " If you don't know the answer to a question, please don't share false information.",
239
+ roles=("Human", "Assistant"),
240
+ messages=(
241
+ ("Human", "Is there a snowboard in the image?"),
242
+ ("Assistant", "Yes, there is a snowboard in the image, and the person is riding it down a snow-covered slope.")
243
+ ),
244
+ offset=2,
245
+ sep_style=SeparatorStyle.SINGLE,
246
+ sep="###",
247
+ )
248
+
249
+ simple_conv = Conversation(
250
+ system="A chat between a curious human and an artificial intelligence assistant. "
251
+ "The assistant gives helpful, detailed, and polite answers to the human's questions.",
252
+ roles=("Human", "Assistant"),
253
+ messages=(
254
+ ("Human", "Hi!"),
255
+ ("Assistant", "Hi there! How can I help you today?")
256
+ ),
257
+ offset=2,
258
+ sep_style=SeparatorStyle.SINGLE,
259
+ sep="###",
260
+ )
261
+
262
+
263
+ default_conversation = simple_conv
264
+ conv_templates = {
265
+ "default": simple_conv,
266
+ "simple": simple_conv,
267
+ "simpleqa": simple_qa,
268
+ "v1": conv_v1,
269
+ }
270
+
271
+
272
+ if __name__ == "__main__":
273
+ print(default_conversation.get_prompt())
ChatUniVi/demo.py ADDED
@@ -0,0 +1,160 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import torch
2
+ from .constants import *
3
+ from .conversation import conv_templates, SeparatorStyle
4
+ from .model.builder import load_pretrained_model
5
+ from .utils import disable_torch_init
6
+ from .mm_utils import tokenizer_image_token, KeywordsStoppingCriteria
7
+ from PIL import Image
8
+ import os
9
+ from decord import VideoReader, cpu
10
+ import numpy as np
11
+
12
+
13
+ class Chat:
14
+ def __init__(self, model_path, conv_mode="simple", load_8bit=False, load_4bit=False):
15
+ disable_torch_init()
16
+ self.tokenizer, self.model, self.image_processor, context_len = load_pretrained_model(model_path, None, model_name="ChatUniVi", load_8bit=load_8bit, load_4bit=load_4bit)
17
+ self.model.to("cuda:0")
18
+ mm_use_im_start_end = getattr(self.model.config, "mm_use_im_start_end", False)
19
+ mm_use_im_patch_token = getattr(self.model.config, "mm_use_im_patch_token", True)
20
+ if mm_use_im_patch_token:
21
+ self.tokenizer.add_tokens([DEFAULT_IMAGE_PATCH_TOKEN], special_tokens=True)
22
+ if mm_use_im_start_end:
23
+ self.tokenizer.add_tokens([DEFAULT_IM_START_TOKEN, DEFAULT_IM_END_TOKEN], special_tokens=True)
24
+ self.model.resize_token_embeddings(len(self.tokenizer))
25
+
26
+ vision_tower = self.model.get_vision_tower()
27
+ if not vision_tower.is_loaded:
28
+ vision_tower.load_model()
29
+
30
+ self.image_processor = vision_tower.image_processor
31
+ self.conv_mode = conv_mode
32
+ print(self.model)
33
+
34
+ def get_prompt(self, qs, state):
35
+ state.append_message(state.roles[0], qs)
36
+ state.append_message(state.roles[1], None)
37
+ return state
38
+
39
+ def _get_rawvideo_dec(self, video_path, image_processor, max_frames=MAX_IMAGE_LENGTH, image_resolution=224,
40
+ video_framerate=1, s=None, e=None):
41
+ if s is None:
42
+ start_time, end_time = None, None
43
+ else:
44
+ start_time = int(s)
45
+ end_time = int(e)
46
+ start_time = start_time if start_time >= 0. else 0.
47
+ end_time = end_time if end_time >= 0. else 0.
48
+ if start_time > end_time:
49
+ start_time, end_time = end_time, start_time
50
+ elif start_time == end_time:
51
+ end_time = start_time + 1
52
+
53
+ if os.path.exists(video_path):
54
+ vreader = VideoReader(video_path, ctx=cpu(0))
55
+ else:
56
+ print(video_path)
57
+ raise FileNotFoundError
58
+
59
+ fps = vreader.get_avg_fps()
60
+ f_start = 0 if start_time is None else int(start_time * fps)
61
+ f_end = int(min(1000000000 if end_time is None else end_time * fps, len(vreader) - 1))
62
+ num_frames = f_end - f_start + 1
63
+ if num_frames > 0:
64
+ sample_fps = int(video_framerate)
65
+ t_stride = int(round(float(fps) / sample_fps))
66
+
67
+ all_pos = list(range(f_start, f_end + 1, t_stride))
68
+ if len(all_pos) > max_frames:
69
+ sample_pos = [all_pos[_] for _ in np.linspace(0, len(all_pos) - 1, num=max_frames, dtype=int)]
70
+ else:
71
+ sample_pos = all_pos
72
+
73
+ patch_images = [Image.fromarray(f) for f in vreader.get_batch(sample_pos).asnumpy()]
74
+ return patch_images
75
+
76
+ @torch.inference_mode()
77
+ @spaces.GPU
78
+ def generate(self, images_tensor: list, prompt: str, first_run: bool, state):
79
+ tokenizer, model, image_processor = self.tokenizer, self.model, self.image_processor
80
+
81
+ state = self.get_prompt(prompt, state)
82
+ prompt = state.get_prompt()
83
+ print(prompt)
84
+
85
+ images_tensor = torch.stack(images_tensor, dim=0)
86
+ input_ids = tokenizer_image_token(prompt, tokenizer, IMAGE_TOKEN_INDEX, return_tensors='pt').unsqueeze(0).to("cuda:0")
87
+
88
+ temperature = 0.2
89
+ max_new_tokens = 1024
90
+
91
+ stop_str = conv_templates[self.conv_mode].copy().sep if conv_templates[self.conv_mode].copy().sep_style != SeparatorStyle.TWO else \
92
+ conv_templates[self.conv_mode].copy().sep2
93
+ keywords = [stop_str]
94
+ stopping_criteria = KeywordsStoppingCriteria(keywords, tokenizer, input_ids)
95
+
96
+ with torch.inference_mode():
97
+ output_ids = model.generate(
98
+ input_ids,
99
+ images=images_tensor,
100
+ do_sample=True,
101
+ temperature=temperature,
102
+ num_beams=1,
103
+ max_new_tokens=max_new_tokens,
104
+ use_cache=True,
105
+ stopping_criteria=[stopping_criteria])
106
+
107
+ input_token_len = input_ids.shape[1]
108
+ n_diff_input_output = (input_ids != output_ids[:, :input_token_len]).sum().item()
109
+ if n_diff_input_output > 0:
110
+ print(f'[Warning] {n_diff_input_output} output_ids are not the same as the input_ids')
111
+ outputs = tokenizer.batch_decode(output_ids[:, input_token_len:], skip_special_tokens=True)[0]
112
+ outputs = outputs.strip()
113
+ if outputs.endswith(stop_str):
114
+ outputs = outputs[:-len(stop_str)]
115
+ outputs = outputs.strip()
116
+
117
+ print('response', outputs)
118
+ return outputs, state
119
+
120
+
121
+
122
+ title_markdown = ("""
123
+ <div style="display: flex; justify-content: center; align-items: center; text-align: center;">
124
+ <a href="https://github.com/PKU-YuanGroup/Chat-UniVi" style="margin-right: 20px; text-decoration: none; display: flex; align-items: center;">
125
+ <img src="https://z1.ax1x.com/2023/11/22/pidlXh4.jpg" alt="Chat-UniVi🚀" style="max-width: 120px; height: auto;">
126
+ </a>
127
+ <div>
128
+ <h1 >Chat-UniVi: Unified Visual Representation Empowers Large Language Models with Image and Video Understanding</h1>
129
+ <h5 style="margin: 0;">If you like our project, please give us a star ✨ on Github for the latest update.</h5>
130
+ </div>
131
+ </div>
132
+ <div align="center">
133
+ <div style="display:flex; gap: 0.25rem;" align="center">
134
+ <a href='https://github.com/PKU-YuanGroup/Chat-UniVi'><img src='https://img.shields.io/badge/Github-Code-blue'></a>
135
+ <a href="https://arxiv.org/pdf/2311.08046.pdf"><img src="https://img.shields.io/badge/Arxiv-2311.08046-red"></a>
136
+ <a href='https://github.com/PKU-YuanGroup/Chat-UniVi/stargazers'><img src='https://img.shields.io/github/stars/PKU-YuanGroup/Chat-UniVi.svg?style=social'></a>
137
+ </div>
138
+ </div>
139
+ """)
140
+
141
+ block_css = """
142
+ #buttons button {
143
+ min-width: min(120px,100%);
144
+ }
145
+ """
146
+
147
+
148
+ tos_markdown = ("""
149
+ ### Terms of use
150
+ By using this service, users are required to agree to the following terms:
151
+ The service is a research preview intended for non-commercial use only. It only provides limited safety measures and may generate offensive content. It must not be used for any illegal, harmful, violent, racist, or sexual purposes. The service may collect user dialogue data for future research.
152
+ Please click the "Flag" button if you get any inappropriate answer! We will collect those to keep improving our moderator.
153
+ For an optimal experience, please use desktop computers for this demo, as mobile devices may compromise its quality.
154
+ """)
155
+
156
+
157
+ learn_more_markdown = ("""
158
+ ### License
159
+ The service is a research preview intended for non-commercial use only, subject to the model [License](https://github.com/facebookresearch/llama/blob/main/MODEL_CARD.md) of LLaMA, [Terms of Use](https://openai.com/policies/terms-of-use) of the data generated by OpenAI, and [Privacy Practices](https://chrome.google.com/webstore/detail/sharegpt-share-your-chatg/daiacboceoaocpibfodeljbdfacokfjb) of ShareGPT. Please contact us if you find any potential violation.
160
+ """)
ChatUniVi/eval/evaluate/evaluate_benchmark_1_correctness.py ADDED
@@ -0,0 +1,199 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import openai
2
+ import os
3
+ import argparse
4
+ import json
5
+ import jsonlines
6
+ import ast
7
+ from multiprocessing.pool import Pool
8
+
9
+
10
+ def read_jsonl(file):
11
+ results = []
12
+ with open(file, encoding='utf-8') as f:
13
+ for item in jsonlines.Reader(f):
14
+ results.append(item)
15
+ return results
16
+
17
+
18
+ def parse_args():
19
+ parser = argparse.ArgumentParser(description="question-answer-generation-using-gpt-3")
20
+ parser.add_argument("--pred_path", required=True, help="The path to file containing prediction.")
21
+ parser.add_argument("--output_dir", required=True, help="The path to save annotation json files.")
22
+ parser.add_argument("--output_json", required=True, help="The path to save annotation final combined json file.")
23
+ parser.add_argument("--api_key", required=True, help="OpenAI API key.")
24
+ parser.add_argument("--num_tasks", required=True, type=int, help="Number of splits.")
25
+ args = parser.parse_args()
26
+ return args
27
+
28
+
29
+ def annotate(prediction_set, caption_files, output_dir):
30
+ """
31
+ Evaluates question and answer pairs using GPT-3
32
+ Returns a score for correctness.
33
+ """
34
+ for file in caption_files:
35
+ key = file[:-5] # Strip file extension
36
+ qa_set = prediction_set[key]
37
+ question = qa_set['q']
38
+ answer = qa_set['a']
39
+ pred = qa_set['pred']
40
+ try:
41
+ # Compute the correctness score
42
+ completion = openai.ChatCompletion.create(
43
+ model="gpt-3.5-turbo",
44
+ messages=[
45
+ {
46
+ "role": "system",
47
+ "content":
48
+ "You are an intelligent chatbot designed for evaluating the factual accuracy of generative outputs for video-based question-answer pairs. "
49
+ "Your task is to compare the predicted answer with the correct answer and determine if they are factually consistent. Here's how you can accomplish the task:"
50
+ "------"
51
+ "##INSTRUCTIONS: "
52
+ "- Focus on the factual consistency between the predicted answer and the correct answer. The predicted answer should not contain any misinterpretations or misinformation.\n"
53
+ "- The predicted answer must be factually accurate and align with the video content.\n"
54
+ "- Consider synonyms or paraphrases as valid matches.\n"
55
+ "- Evaluate the factual accuracy of the prediction compared to the answer."
56
+ },
57
+ {
58
+ "role": "user",
59
+ "content":
60
+ "Please evaluate the following video-based question-answer pair:\n\n"
61
+ f"Question: {question}\n"
62
+ f"Correct Answer: {answer}\n"
63
+ f"Predicted Answer: {pred}\n\n"
64
+ "Provide your evaluation only as a factual accuracy score where the factual accuracy score is an integer value between 0 and 5, with 5 indicating the highest level of factual consistency. "
65
+ "Please generate the response in the form of a Python dictionary string with keys 'score', where its value is the factual accuracy score in INTEGER, not STRING."
66
+ "DO NOT PROVIDE ANY OTHER OUTPUT TEXT OR EXPLANATION. Only provide the Python dictionary string. "
67
+ "For example, your response should look like this: {''score': 4.8}."
68
+ }
69
+ ]
70
+ )
71
+ # Convert response to a Python dictionary.
72
+ response_message = completion["choices"][0]["message"]["content"]
73
+ response_dict = ast.literal_eval(response_message)
74
+ result_qa_pair = [response_dict, qa_set]
75
+
76
+ # Save the question-answer pairs to a json file.
77
+ with open(f"{output_dir}/{key}.json", "w") as f:
78
+ json.dump(result_qa_pair, f)
79
+
80
+ except Exception as e:
81
+ print(f"Error processing file '{key}': {e}")
82
+
83
+
84
+ def main():
85
+ """
86
+ Main function to control the flow of the program.
87
+ """
88
+ # Parse arguments.
89
+ args = parse_args()
90
+
91
+ file = args.pred_path
92
+ try:
93
+ pred_contents = json.load(file)
94
+ except:
95
+ pred_contents = read_jsonl(file)
96
+
97
+ # Dictionary to store the count of occurrences for each video_id
98
+ video_id_counts = {}
99
+ new_pred_contents = []
100
+
101
+ # Iterate through each sample in pred_contents
102
+ for sample in pred_contents:
103
+ sample['video_name'] = 1
104
+ video_id = sample['video_name']
105
+ if video_id in video_id_counts:
106
+ video_id_counts[video_id] += 1
107
+ else:
108
+ video_id_counts[video_id] = 0
109
+
110
+ # Create a new sample with the modified key
111
+ new_sample = sample
112
+ new_sample['video_name'] = f"{video_id}_{video_id_counts[video_id]}"
113
+ new_pred_contents.append(new_sample)
114
+
115
+ # Generating list of id's and corresponding files
116
+ id_list = [x['video_name'] for x in new_pred_contents]
117
+ caption_files = [f"{id}.json" for id in id_list]
118
+
119
+ output_dir = args.output_dir
120
+ # Generate output directory if not exists.
121
+ if not os.path.exists(output_dir):
122
+ os.makedirs(output_dir)
123
+
124
+ # Preparing dictionary of question-answer sets
125
+ prediction_set = {}
126
+ for sample in new_pred_contents:
127
+ id = sample['video_name']
128
+ question = sample['prompt']
129
+ answer = sample['answer']
130
+ pred = sample['text']
131
+ qa_set = {"q": question, "a": answer, "pred": pred}
132
+ prediction_set[id] = qa_set
133
+
134
+ # Set the OpenAI API key.
135
+ openai.api_key = args.api_key
136
+ num_tasks = args.num_tasks
137
+
138
+ # While loop to ensure that all captions are processed.
139
+ while True:
140
+ try:
141
+ # Files that have not been processed yet.
142
+ completed_files = os.listdir(output_dir)
143
+ print(f"completed_files: {len(completed_files)}")
144
+
145
+ # Files that have not been processed yet.
146
+ incomplete_files = [f for f in caption_files if f not in completed_files]
147
+ print(f"incomplete_files: {len(incomplete_files)}")
148
+
149
+ # Break the loop when there are no incomplete files
150
+ if len(incomplete_files) == 0:
151
+ break
152
+ if len(incomplete_files) <= num_tasks:
153
+ num_tasks = 1
154
+
155
+ # Split tasks into parts.
156
+ part_len = len(incomplete_files) // num_tasks
157
+ all_parts = [incomplete_files[i:i + part_len] for i in range(0, len(incomplete_files), part_len)]
158
+ task_args = [(prediction_set, part, args.output_dir) for part in all_parts]
159
+
160
+ # Use a pool of workers to process the files in parallel.
161
+ with Pool() as pool:
162
+ pool.starmap(annotate, task_args)
163
+
164
+ except Exception as e:
165
+ print(f"Error: {e}")
166
+
167
+ # Combine all the processed files into one
168
+ combined_contents = {}
169
+ json_path = args.output_json
170
+
171
+ # Iterate through json files
172
+ for file_name in os.listdir(output_dir):
173
+ if file_name.endswith(".json"):
174
+ file_path = os.path.join(output_dir, file_name)
175
+ with open(file_path, "r") as json_file:
176
+ content = json.load(json_file)
177
+ combined_contents[file_name[:-5]] = content
178
+
179
+ # Write combined content to a json file
180
+ with open(json_path, "w") as json_file:
181
+ json.dump(combined_contents, json_file)
182
+ print("All evaluation completed!")
183
+
184
+ # Calculate average score
185
+ score_sum = 0
186
+ count = 0
187
+ for key, result in combined_contents.items():
188
+ count += 1
189
+ score_match = result[0]['score']
190
+ score = int(score_match)
191
+ score_sum += score
192
+ average_score = score_sum / count
193
+
194
+ print("Average score for correctness:", average_score * 20)
195
+
196
+
197
+ if __name__ == "__main__":
198
+ main()
199
+
ChatUniVi/eval/evaluate/evaluate_benchmark_1_correctness_mi.py ADDED
@@ -0,0 +1,201 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import openai
2
+ import os
3
+ import argparse
4
+ import json
5
+ import jsonlines
6
+ import ast
7
+ from multiprocessing.pool import Pool
8
+
9
+
10
+ def read_jsonl(file):
11
+ results = []
12
+ with open(file, encoding='utf-8') as f:
13
+ for item in jsonlines.Reader(f):
14
+ results.append(item)
15
+ return results
16
+
17
+
18
+ def parse_args():
19
+ parser = argparse.ArgumentParser(description="question-answer-generation-using-gpt-3")
20
+ parser.add_argument("--pred_path", required=True, help="The path to file containing prediction.")
21
+ parser.add_argument("--output_dir", required=True, help="The path to save annotation json files.")
22
+ parser.add_argument("--output_json", required=True, help="The path to save annotation final combined json file.")
23
+ parser.add_argument("--api_key", required=True, help="OpenAI API key.")
24
+ parser.add_argument("--num_tasks", required=True, type=int, help="Number of splits.")
25
+ args = parser.parse_args()
26
+ return args
27
+
28
+
29
+ def annotate(prediction_set, caption_files, output_dir):
30
+ """
31
+ Evaluates question and answer pairs using GPT-3
32
+ Returns a score for correctness.
33
+ """
34
+ for file in caption_files:
35
+ key = file[:-5] # Strip file extension
36
+ qa_set = prediction_set[key]
37
+ question = qa_set['q']
38
+ answer = qa_set['a']
39
+ pred = qa_set['pred']
40
+ try:
41
+ # Compute the correctness score
42
+ completion = openai.ChatCompletion.create(
43
+ model="gpt-3.5-turbo",
44
+ messages=[
45
+ {
46
+ "role": "system",
47
+ "content":
48
+ "You are an intelligent chatbot designed for evaluating the factual accuracy of generative outputs for video-based question-answer pairs. "
49
+ "Your task is to compare the predicted answer with the correct answer and determine if they are factually consistent. Here's how you can accomplish the task:"
50
+ "------"
51
+ "##INSTRUCTIONS: "
52
+ "- Focus on the factual consistency between the predicted answer and the correct answer. The predicted answer should not contain any misinterpretations or misinformation.\n"
53
+ "- The predicted answer must be factually accurate and align with the video content.\n"
54
+ "- Consider synonyms or paraphrases as valid matches.\n"
55
+ "- Evaluate the factual accuracy of the prediction compared to the answer."
56
+ },
57
+ {
58
+ "role": "user",
59
+ "content":
60
+ "Please evaluate the following video-based question-answer pair:\n\n"
61
+ f"Question: {question}\n"
62
+ f"Correct Answer: {answer}\n"
63
+ f"Predicted Answer: {pred}\n\n"
64
+ "Provide your evaluation only as a factual accuracy score where the factual accuracy score is an integer value between 0 and 5, with 5 indicating the highest level of factual consistency. "
65
+ "Please generate the response in the form of a Python dictionary string with keys 'score', where its value is the factual accuracy score in INTEGER, not STRING."
66
+ "DO NOT PROVIDE ANY OTHER OUTPUT TEXT OR EXPLANATION. Only provide the Python dictionary string. "
67
+ "For example, your response should look like this: {''score': 4.8}."
68
+ }
69
+ ]
70
+ )
71
+ # Convert response to a Python dictionary.
72
+ response_message = completion["choices"][0]["message"]["content"]
73
+ response_dict = ast.literal_eval(response_message)
74
+ result_qa_pair = [response_dict, qa_set]
75
+
76
+ # Save the question-answer pairs to a json file.
77
+ with open(f"{output_dir}/{key}.json", "w") as f:
78
+ json.dump(result_qa_pair, f)
79
+
80
+ except Exception as e:
81
+ print(f"Error processing file '{key}': {e}")
82
+
83
+
84
+ def main():
85
+ """
86
+ Main function to control the flow of the program.
87
+ """
88
+ # Parse arguments.
89
+ args = parse_args()
90
+
91
+ file = args.pred_path
92
+ try:
93
+ pred_contents = json.load(file)
94
+ except:
95
+ pred_contents = read_jsonl(file)
96
+
97
+ # Dictionary to store the count of occurrences for each video_id
98
+ video_id_counts = {}
99
+ new_pred_contents = []
100
+
101
+ # Iterate through each sample in pred_contents
102
+ for sample in pred_contents:
103
+ sample['video_name'] = 1
104
+ video_id = sample['video_name']
105
+ if video_id in video_id_counts:
106
+ video_id_counts[video_id] += 1
107
+ else:
108
+ video_id_counts[video_id] = 0
109
+
110
+ # Create a new sample with the modified key
111
+ new_sample = sample
112
+ new_sample['video_name'] = f"{video_id}_{video_id_counts[video_id]}"
113
+ new_pred_contents.append(new_sample)
114
+
115
+ # Generating list of id's and corresponding files
116
+ id_list = [x['video_name'] for x in new_pred_contents]
117
+ caption_files = [f"{id}.json" for id in id_list]
118
+
119
+ output_dir = args.output_dir
120
+ # Generate output directory if not exists.
121
+ if not os.path.exists(output_dir):
122
+ os.makedirs(output_dir)
123
+
124
+ # Preparing dictionary of question-answer sets
125
+ prediction_set = {}
126
+ for sample in new_pred_contents:
127
+ id = sample['video_name']
128
+ question = sample['prompt']
129
+ answer = sample['answer']
130
+ pred = sample['text']
131
+ qa_set = {"q": question, "a": answer, "pred": pred}
132
+ prediction_set[id] = qa_set
133
+
134
+ # Set the OpenAI API key.
135
+ openai.api_key = args.api_key
136
+ openai.api_base = 'http://10.234.32.86:8000/lumi-proxy'
137
+ openai.api_key = "Don't Panic"
138
+ num_tasks = args.num_tasks
139
+
140
+ # While loop to ensure that all captions are processed.
141
+ while True:
142
+ try:
143
+ # Files that have not been processed yet.
144
+ completed_files = os.listdir(output_dir)
145
+ print(f"completed_files: {len(completed_files)}")
146
+
147
+ # Files that have not been processed yet.
148
+ incomplete_files = [f for f in caption_files if f not in completed_files]
149
+ print(f"incomplete_files: {len(incomplete_files)}")
150
+
151
+ # Break the loop when there are no incomplete files
152
+ if len(incomplete_files) == 0:
153
+ break
154
+ if len(incomplete_files) <= num_tasks:
155
+ num_tasks = 1
156
+
157
+ # Split tasks into parts.
158
+ part_len = len(incomplete_files) // num_tasks
159
+ all_parts = [incomplete_files[i:i + part_len] for i in range(0, len(incomplete_files), part_len)]
160
+ task_args = [(prediction_set, part, args.output_dir) for part in all_parts]
161
+
162
+ # Use a pool of workers to process the files in parallel.
163
+ with Pool() as pool:
164
+ pool.starmap(annotate, task_args)
165
+
166
+ except Exception as e:
167
+ print(f"Error: {e}")
168
+
169
+ # Combine all the processed files into one
170
+ combined_contents = {}
171
+ json_path = args.output_json
172
+
173
+ # Iterate through json files
174
+ for file_name in os.listdir(output_dir):
175
+ if file_name.endswith(".json"):
176
+ file_path = os.path.join(output_dir, file_name)
177
+ with open(file_path, "r") as json_file:
178
+ content = json.load(json_file)
179
+ combined_contents[file_name[:-5]] = content
180
+
181
+ # Write combined content to a json file
182
+ with open(json_path, "w") as json_file:
183
+ json.dump(combined_contents, json_file)
184
+ print("All evaluation completed!")
185
+
186
+ # Calculate average score
187
+ score_sum = 0
188
+ count = 0
189
+ for key, result in combined_contents.items():
190
+ count += 1
191
+ score_match = result[0]['score']
192
+ score = int(score_match)
193
+ score_sum += score
194
+ average_score = score_sum / count
195
+
196
+ print("Average score for correctness:", average_score * 20)
197
+
198
+
199
+ if __name__ == "__main__":
200
+ main()
201
+
ChatUniVi/eval/evaluate/evaluate_benchmark_2_detailed_orientation.py ADDED
@@ -0,0 +1,199 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import openai
2
+ import os
3
+ import argparse
4
+ import json
5
+ import jsonlines
6
+ import ast
7
+ from multiprocessing.pool import Pool
8
+
9
+
10
+ def read_jsonl(file):
11
+ results = []
12
+ with open(file, encoding='utf-8') as f:
13
+ for item in jsonlines.Reader(f):
14
+ results.append(item)
15
+ return results
16
+
17
+
18
+ def parse_args():
19
+ parser = argparse.ArgumentParser(description="question-answer-generation-using-gpt-3")
20
+ parser.add_argument("--pred_path", required=True, help="The path to file containing prediction.")
21
+ parser.add_argument("--output_dir", required=True, help="The path to save annotation json files.")
22
+ parser.add_argument("--output_json", required=True, help="The path to save annotation final combined json file.")
23
+ parser.add_argument("--api_key", required=True, help="OpenAI API key.")
24
+ parser.add_argument("--num_tasks", required=True, type=int, help="Number of splits.")
25
+ args = parser.parse_args()
26
+ return args
27
+
28
+
29
+ def annotate(prediction_set, caption_files, output_dir):
30
+ """
31
+ Evaluates question and answer pairs using GPT-3 and
32
+ returns a score for detailed orientation.
33
+ """
34
+ for file in caption_files:
35
+ key = file[:-5] # Strip file extension
36
+ qa_set = prediction_set[key]
37
+ question = qa_set['q']
38
+ answer = qa_set['a']
39
+ pred = qa_set['pred']
40
+ try:
41
+ # Compute the detailed-orientation score
42
+ completion = openai.ChatCompletion.create(
43
+ model="gpt-3.5-turbo",
44
+ messages=[
45
+ {
46
+ "role": "system",
47
+ "content":
48
+ "You are an intelligent chatbot designed for evaluating the detail orientation of generative outputs for video-based question-answer pairs. "
49
+ "Your task is to compare the predicted answer with the correct answer and determine its level of detail, considering both completeness and specificity. Here's how you can accomplish the task:"
50
+ "------"
51
+ "##INSTRUCTIONS: "
52
+ "- Check if the predicted answer covers all major points from the video. The response should not leave out any key aspects.\n"
53
+ "- Evaluate whether the predicted answer includes specific details rather than just generic points. It should provide comprehensive information that is tied to specific elements of the video.\n"
54
+ "- Consider synonyms or paraphrases as valid matches.\n"
55
+ "- Provide a single evaluation score that reflects the level of detail orientation of the prediction, considering both completeness and specificity."
56
+ },
57
+ {
58
+ "role": "user",
59
+ "content":
60
+ "Please evaluate the following video-based question-answer pair:\n\n"
61
+ f"Question: {question}\n"
62
+ f"Correct Answer: {answer}\n"
63
+ f"Predicted Answer: {pred}\n\n"
64
+ "Provide your evaluation only as a detail orientation score where the detail orientation score is an integer value between 0 and 5, with 5 indicating the highest level of detail orientation. "
65
+ "Please generate the response in the form of a Python dictionary string with keys 'score', where its value is the detail orientation score in INTEGER, not STRING."
66
+ "DO NOT PROVIDE ANY OTHER OUTPUT TEXT OR EXPLANATION. Only provide the Python dictionary string. "
67
+ "For example, your response should look like this: {''score': 4.8}."
68
+ }
69
+ ]
70
+ )
71
+ # Convert response to a Python dictionary.
72
+ response_message = completion["choices"][0]["message"]["content"]
73
+ response_dict = ast.literal_eval(response_message)
74
+ result_qa_pair = [response_dict, qa_set]
75
+
76
+ # Save the question-answer pairs to a json file.
77
+ with open(f"{output_dir}/{key}.json", "w") as f:
78
+ json.dump(result_qa_pair, f)
79
+
80
+ except Exception as e:
81
+ print(f"Error processing file '{key}': {e}")
82
+
83
+
84
+ def main():
85
+ """
86
+ Main function to control the flow of the program.
87
+ """
88
+ # Parse arguments.
89
+ args = parse_args()
90
+
91
+ file = args.pred_path
92
+ try:
93
+ pred_contents = json.load(file)
94
+ except:
95
+ pred_contents = read_jsonl(file)
96
+
97
+ # Dictionary to store the count of occurrences for each video_id
98
+ video_id_counts = {}
99
+ new_pred_contents = []
100
+
101
+ # Iterate through each sample in pred_contents
102
+ for sample in pred_contents:
103
+ sample['video_name'] = 1
104
+ video_id = sample['video_name']
105
+ if video_id in video_id_counts:
106
+ video_id_counts[video_id] += 1
107
+ else:
108
+ video_id_counts[video_id] = 0
109
+
110
+ # Create a new sample with the modified key
111
+ new_sample = sample
112
+ new_sample['video_name'] = f"{video_id}_{video_id_counts[video_id]}"
113
+ new_pred_contents.append(new_sample)
114
+
115
+ # Generating list of id's and corresponding files
116
+ id_list = [x['video_name'] for x in new_pred_contents]
117
+ caption_files = [f"{id}.json" for id in id_list]
118
+
119
+ output_dir = args.output_dir
120
+ # Generate output directory if not exists.
121
+ if not os.path.exists(output_dir):
122
+ os.makedirs(output_dir)
123
+
124
+ # Preparing dictionary of question-answer sets
125
+ prediction_set = {}
126
+ for sample in new_pred_contents:
127
+ id = sample['video_name']
128
+ question = sample['prompt']
129
+ answer = sample['answer']
130
+ pred = sample['text']
131
+ qa_set = {"q": question, "a": answer, "pred": pred}
132
+ prediction_set[id] = qa_set
133
+
134
+ # Set the OpenAI API key.
135
+ openai.api_key = args.api_key
136
+ num_tasks = args.num_tasks
137
+
138
+ # While loop to ensure that all captions are processed.
139
+ while True:
140
+ try:
141
+ # Files that have not been processed yet.
142
+ completed_files = os.listdir(output_dir)
143
+ print(f"completed_files: {len(completed_files)}")
144
+
145
+ # Files that have not been processed yet.
146
+ incomplete_files = [f for f in caption_files if f not in completed_files]
147
+ print(f"incomplete_files: {len(incomplete_files)}")
148
+
149
+ # Break the loop when there are no incomplete files
150
+ if len(incomplete_files) == 0:
151
+ break
152
+ if len(incomplete_files) <= num_tasks:
153
+ num_tasks = 1
154
+
155
+ # Split tasks into parts.
156
+ part_len = len(incomplete_files) // num_tasks
157
+ all_parts = [incomplete_files[i:i + part_len] for i in range(0, len(incomplete_files), part_len)]
158
+ task_args = [(prediction_set, part, args.output_dir) for part in all_parts]
159
+
160
+ # Use a pool of workers to process the files in parallel.
161
+ with Pool() as pool:
162
+ pool.starmap(annotate, task_args)
163
+
164
+ except Exception as e:
165
+ print(f"Error: {e}")
166
+
167
+ # Combine all the processed files into one
168
+ combined_contents = {}
169
+ json_path = args.output_json
170
+
171
+ # Iterate through json files
172
+ for file_name in os.listdir(output_dir):
173
+ if file_name.endswith(".json"):
174
+ file_path = os.path.join(output_dir, file_name)
175
+ with open(file_path, "r") as json_file:
176
+ content = json.load(json_file)
177
+ combined_contents[file_name[:-5]] = content
178
+
179
+ # Write combined content to a json file
180
+ with open(json_path, "w") as json_file:
181
+ json.dump(combined_contents, json_file)
182
+ print("All evaluation completed!")
183
+
184
+ # Calculate average score
185
+ score_sum = 0
186
+ count = 0
187
+ for key, result in combined_contents.items():
188
+ count += 1
189
+ score_match = result[0]['score']
190
+ score = int(score_match)
191
+ score_sum += score
192
+ average_score = score_sum / count
193
+
194
+ print("Average score for detailed orientation:", average_score * 20)
195
+
196
+
197
+ if __name__ == "__main__":
198
+ main()
199
+
ChatUniVi/eval/evaluate/evaluate_benchmark_2_detailed_orientation_mi.py ADDED
@@ -0,0 +1,201 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import openai
2
+ import os
3
+ import argparse
4
+ import json
5
+ import jsonlines
6
+ import ast
7
+ from multiprocessing.pool import Pool
8
+
9
+
10
+ def read_jsonl(file):
11
+ results = []
12
+ with open(file, encoding='utf-8') as f:
13
+ for item in jsonlines.Reader(f):
14
+ results.append(item)
15
+ return results
16
+
17
+
18
+ def parse_args():
19
+ parser = argparse.ArgumentParser(description="question-answer-generation-using-gpt-3")
20
+ parser.add_argument("--pred_path", required=True, help="The path to file containing prediction.")
21
+ parser.add_argument("--output_dir", required=True, help="The path to save annotation json files.")
22
+ parser.add_argument("--output_json", required=True, help="The path to save annotation final combined json file.")
23
+ parser.add_argument("--api_key", required=True, help="OpenAI API key.")
24
+ parser.add_argument("--num_tasks", required=True, type=int, help="Number of splits.")
25
+ args = parser.parse_args()
26
+ return args
27
+
28
+
29
+ def annotate(prediction_set, caption_files, output_dir):
30
+ """
31
+ Evaluates question and answer pairs using GPT-3 and
32
+ returns a score for detailed orientation.
33
+ """
34
+ for file in caption_files:
35
+ key = file[:-5] # Strip file extension
36
+ qa_set = prediction_set[key]
37
+ question = qa_set['q']
38
+ answer = qa_set['a']
39
+ pred = qa_set['pred']
40
+ try:
41
+ # Compute the detailed-orientation score
42
+ completion = openai.ChatCompletion.create(
43
+ model="gpt-3.5-turbo",
44
+ messages=[
45
+ {
46
+ "role": "system",
47
+ "content":
48
+ "You are an intelligent chatbot designed for evaluating the detail orientation of generative outputs for video-based question-answer pairs. "
49
+ "Your task is to compare the predicted answer with the correct answer and determine its level of detail, considering both completeness and specificity. Here's how you can accomplish the task:"
50
+ "------"
51
+ "##INSTRUCTIONS: "
52
+ "- Check if the predicted answer covers all major points from the video. The response should not leave out any key aspects.\n"
53
+ "- Evaluate whether the predicted answer includes specific details rather than just generic points. It should provide comprehensive information that is tied to specific elements of the video.\n"
54
+ "- Consider synonyms or paraphrases as valid matches.\n"
55
+ "- Provide a single evaluation score that reflects the level of detail orientation of the prediction, considering both completeness and specificity."
56
+ },
57
+ {
58
+ "role": "user",
59
+ "content":
60
+ "Please evaluate the following video-based question-answer pair:\n\n"
61
+ f"Question: {question}\n"
62
+ f"Correct Answer: {answer}\n"
63
+ f"Predicted Answer: {pred}\n\n"
64
+ "Provide your evaluation only as a detail orientation score where the detail orientation score is an integer value between 0 and 5, with 5 indicating the highest level of detail orientation. "
65
+ "Please generate the response in the form of a Python dictionary string with keys 'score', where its value is the detail orientation score in INTEGER, not STRING."
66
+ "DO NOT PROVIDE ANY OTHER OUTPUT TEXT OR EXPLANATION. Only provide the Python dictionary string. "
67
+ "For example, your response should look like this: {''score': 4.8}."
68
+ }
69
+ ]
70
+ )
71
+ # Convert response to a Python dictionary.
72
+ response_message = completion["choices"][0]["message"]["content"]
73
+ response_dict = ast.literal_eval(response_message)
74
+ result_qa_pair = [response_dict, qa_set]
75
+
76
+ # Save the question-answer pairs to a json file.
77
+ with open(f"{output_dir}/{key}.json", "w") as f:
78
+ json.dump(result_qa_pair, f)
79
+
80
+ except Exception as e:
81
+ print(f"Error processing file '{key}': {e}")
82
+
83
+
84
+ def main():
85
+ """
86
+ Main function to control the flow of the program.
87
+ """
88
+ # Parse arguments.
89
+ args = parse_args()
90
+
91
+ file = args.pred_path
92
+ try:
93
+ pred_contents = json.load(file)
94
+ except:
95
+ pred_contents = read_jsonl(file)
96
+
97
+ # Dictionary to store the count of occurrences for each video_id
98
+ video_id_counts = {}
99
+ new_pred_contents = []
100
+
101
+ # Iterate through each sample in pred_contents
102
+ for sample in pred_contents:
103
+ sample['video_name'] = 1
104
+ video_id = sample['video_name']
105
+ if video_id in video_id_counts:
106
+ video_id_counts[video_id] += 1
107
+ else:
108
+ video_id_counts[video_id] = 0
109
+
110
+ # Create a new sample with the modified key
111
+ new_sample = sample
112
+ new_sample['video_name'] = f"{video_id}_{video_id_counts[video_id]}"
113
+ new_pred_contents.append(new_sample)
114
+
115
+ # Generating list of id's and corresponding files
116
+ id_list = [x['video_name'] for x in new_pred_contents]
117
+ caption_files = [f"{id}.json" for id in id_list]
118
+
119
+ output_dir = args.output_dir
120
+ # Generate output directory if not exists.
121
+ if not os.path.exists(output_dir):
122
+ os.makedirs(output_dir)
123
+
124
+ # Preparing dictionary of question-answer sets
125
+ prediction_set = {}
126
+ for sample in new_pred_contents:
127
+ id = sample['video_name']
128
+ question = sample['prompt']
129
+ answer = sample['answer']
130
+ pred = sample['text']
131
+ qa_set = {"q": question, "a": answer, "pred": pred}
132
+ prediction_set[id] = qa_set
133
+
134
+ # Set the OpenAI API key.
135
+ openai.api_key = args.api_key
136
+ openai.api_base = 'http://10.234.32.86:8000/lumi-proxy'
137
+ openai.api_key = "Don't Panic"
138
+ num_tasks = args.num_tasks
139
+
140
+ # While loop to ensure that all captions are processed.
141
+ while True:
142
+ try:
143
+ # Files that have not been processed yet.
144
+ completed_files = os.listdir(output_dir)
145
+ print(f"completed_files: {len(completed_files)}")
146
+
147
+ # Files that have not been processed yet.
148
+ incomplete_files = [f for f in caption_files if f not in completed_files]
149
+ print(f"incomplete_files: {len(incomplete_files)}")
150
+
151
+ # Break the loop when there are no incomplete files
152
+ if len(incomplete_files) == 0:
153
+ break
154
+ if len(incomplete_files) <= num_tasks:
155
+ num_tasks = 1
156
+
157
+ # Split tasks into parts.
158
+ part_len = len(incomplete_files) // num_tasks
159
+ all_parts = [incomplete_files[i:i + part_len] for i in range(0, len(incomplete_files), part_len)]
160
+ task_args = [(prediction_set, part, args.output_dir) for part in all_parts]
161
+
162
+ # Use a pool of workers to process the files in parallel.
163
+ with Pool() as pool:
164
+ pool.starmap(annotate, task_args)
165
+
166
+ except Exception as e:
167
+ print(f"Error: {e}")
168
+
169
+ # Combine all the processed files into one
170
+ combined_contents = {}
171
+ json_path = args.output_json
172
+
173
+ # Iterate through json files
174
+ for file_name in os.listdir(output_dir):
175
+ if file_name.endswith(".json"):
176
+ file_path = os.path.join(output_dir, file_name)
177
+ with open(file_path, "r") as json_file:
178
+ content = json.load(json_file)
179
+ combined_contents[file_name[:-5]] = content
180
+
181
+ # Write combined content to a json file
182
+ with open(json_path, "w") as json_file:
183
+ json.dump(combined_contents, json_file)
184
+ print("All evaluation completed!")
185
+
186
+ # Calculate average score
187
+ score_sum = 0
188
+ count = 0
189
+ for key, result in combined_contents.items():
190
+ count += 1
191
+ score_match = result[0]['score']
192
+ score = int(score_match)
193
+ score_sum += score
194
+ average_score = score_sum / count
195
+
196
+ print("Average score for detailed orientation:", average_score * 20)
197
+
198
+
199
+ if __name__ == "__main__":
200
+ main()
201
+
ChatUniVi/eval/evaluate/evaluate_benchmark_3_context.py ADDED
@@ -0,0 +1,199 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import openai
2
+ import os
3
+ import argparse
4
+ import json
5
+ import jsonlines
6
+ import ast
7
+ from multiprocessing.pool import Pool
8
+
9
+
10
+ def read_jsonl(file):
11
+ results = []
12
+ with open(file, encoding='utf-8') as f:
13
+ for item in jsonlines.Reader(f):
14
+ results.append(item)
15
+ return results
16
+
17
+
18
+ def parse_args():
19
+ parser = argparse.ArgumentParser(description="question-answer-generation-using-gpt-3")
20
+ parser.add_argument("--pred_path", required=True, help="The path to file containing prediction.")
21
+ parser.add_argument("--output_dir", required=True, help="The path to save annotation json files.")
22
+ parser.add_argument("--output_json", required=True, help="The path to save annotation final combined json file.")
23
+ parser.add_argument("--api_key", required=True, help="OpenAI API key.")
24
+ parser.add_argument("--num_tasks", required=True, type=int, help="Number of splits.")
25
+ args = parser.parse_args()
26
+ return args
27
+
28
+
29
+ def annotate(prediction_set, caption_files, output_dir):
30
+ """
31
+ Evaluates question and answer pairs using GPT-3 and
32
+ returns a score for contextual understanding.
33
+ """
34
+ for file in caption_files:
35
+ key = file[:-5] # Strip file extension
36
+ qa_set = prediction_set[key]
37
+ question = qa_set['q']
38
+ answer = qa_set['a']
39
+ pred = qa_set['pred']
40
+ try:
41
+ # Compute the contextual understanding score
42
+ completion = openai.ChatCompletion.create(
43
+ model="gpt-3.5-turbo",
44
+ messages=[
45
+ {
46
+ "role": "system",
47
+ "content":
48
+ "You are an intelligent chatbot designed for evaluating the contextual understanding of generative outputs for video-based question-answer pairs. "
49
+ "Your task is to compare the predicted answer with the correct answer and determine if the generated response aligns with the overall context of the video content. Here's how you can accomplish the task:"
50
+ "------"
51
+ "##INSTRUCTIONS: "
52
+ "- Evaluate whether the predicted answer aligns with the overall context of the video content. It should not provide information that is out of context or misaligned.\n"
53
+ "- The predicted answer must capture the main themes and sentiments of the video.\n"
54
+ "- Consider synonyms or paraphrases as valid matches.\n"
55
+ "- Provide your evaluation of the contextual understanding of the prediction compared to the answer."
56
+ },
57
+ {
58
+ "role": "user",
59
+ "content":
60
+ "Please evaluate the following video-based question-answer pair:\n\n"
61
+ f"Question: {question}\n"
62
+ f"Correct Answer: {answer}\n"
63
+ f"Predicted Answer: {pred}\n\n"
64
+ "Provide your evaluation only as a contextual understanding score where the contextual understanding score is an integer value between 0 and 5, with 5 indicating the highest level of contextual understanding. "
65
+ "Please generate the response in the form of a Python dictionary string with keys 'score', where its value is contextual understanding score in INTEGER, not STRING."
66
+ "DO NOT PROVIDE ANY OTHER OUTPUT TEXT OR EXPLANATION. Only provide the Python dictionary string. "
67
+ "For example, your response should look like this: {''score': 4.8}."
68
+ }
69
+ ]
70
+ )
71
+ # Convert response to a Python dictionary.
72
+ response_message = completion["choices"][0]["message"]["content"]
73
+ response_dict = ast.literal_eval(response_message)
74
+ result_qa_pair = [response_dict, qa_set]
75
+
76
+ # Save the question-answer pairs to a json file.
77
+ with open(f"{output_dir}/{key}.json", "w") as f:
78
+ json.dump(result_qa_pair, f)
79
+
80
+ except Exception as e:
81
+ print(f"Error processing file '{key}': {e}")
82
+
83
+
84
+ def main():
85
+ """
86
+ Main function to control the flow of the program.
87
+ """
88
+ # Parse arguments.
89
+ args = parse_args()
90
+
91
+ file = args.pred_path
92
+ try:
93
+ pred_contents = json.load(file)
94
+ except:
95
+ pred_contents = read_jsonl(file)
96
+
97
+ # Dictionary to store the count of occurrences for each video_id
98
+ video_id_counts = {}
99
+ new_pred_contents = []
100
+
101
+ # Iterate through each sample in pred_contents
102
+ for sample in pred_contents:
103
+ sample['video_name'] = 1
104
+ video_id = sample['video_name']
105
+ if video_id in video_id_counts:
106
+ video_id_counts[video_id] += 1
107
+ else:
108
+ video_id_counts[video_id] = 0
109
+
110
+ # Create a new sample with the modified key
111
+ new_sample = sample
112
+ new_sample['video_name'] = f"{video_id}_{video_id_counts[video_id]}"
113
+ new_pred_contents.append(new_sample)
114
+
115
+ # Generating list of id's and corresponding files
116
+ id_list = [x['video_name'] for x in new_pred_contents]
117
+ caption_files = [f"{id}.json" for id in id_list]
118
+
119
+ output_dir = args.output_dir
120
+ # Generate output directory if not exists.
121
+ if not os.path.exists(output_dir):
122
+ os.makedirs(output_dir)
123
+
124
+ # Preparing dictionary of question-answer sets
125
+ prediction_set = {}
126
+ for sample in new_pred_contents:
127
+ id = sample['video_name']
128
+ question = sample['prompt']
129
+ answer = sample['answer']
130
+ pred = sample['text']
131
+ qa_set = {"q": question, "a": answer, "pred": pred}
132
+ prediction_set[id] = qa_set
133
+
134
+ # Set the OpenAI API key.
135
+ openai.api_key = args.api_key
136
+ num_tasks = args.num_tasks
137
+
138
+ # While loop to ensure that all captions are processed.
139
+ while True:
140
+ try:
141
+ # Files that have not been processed yet.
142
+ completed_files = os.listdir(output_dir)
143
+ print(f"completed_files: {len(completed_files)}")
144
+
145
+ # Files that have not been processed yet.
146
+ incomplete_files = [f for f in caption_files if f not in completed_files]
147
+ print(f"incomplete_files: {len(incomplete_files)}")
148
+
149
+ # Break the loop when there are no incomplete files
150
+ if len(incomplete_files) == 0:
151
+ break
152
+ if len(incomplete_files) <= num_tasks:
153
+ num_tasks = 1
154
+
155
+ # Split tasks into parts.
156
+ part_len = len(incomplete_files) // num_tasks
157
+ all_parts = [incomplete_files[i:i + part_len] for i in range(0, len(incomplete_files), part_len)]
158
+ task_args = [(prediction_set, part, args.output_dir) for part in all_parts]
159
+
160
+ # Use a pool of workers to process the files in parallel.
161
+ with Pool() as pool:
162
+ pool.starmap(annotate, task_args)
163
+
164
+ except Exception as e:
165
+ print(f"Error: {e}")
166
+
167
+ # Combine all the processed files into one
168
+ combined_contents = {}
169
+ json_path = args.output_json
170
+
171
+ # Iterate through json files
172
+ for file_name in os.listdir(output_dir):
173
+ if file_name.endswith(".json"):
174
+ file_path = os.path.join(output_dir, file_name)
175
+ with open(file_path, "r") as json_file:
176
+ content = json.load(json_file)
177
+ combined_contents[file_name[:-5]] = content
178
+
179
+ # Write combined content to a json file
180
+ with open(json_path, "w") as json_file:
181
+ json.dump(combined_contents, json_file)
182
+ print("All evaluation completed!")
183
+
184
+ # Calculate average score
185
+ score_sum = 0
186
+ count = 0
187
+ for key, result in combined_contents.items():
188
+ count += 1
189
+ score_match = result[0]['score']
190
+ score = int(score_match)
191
+ score_sum += score
192
+ average_score = score_sum / count
193
+
194
+ print("Average score for contextual understanding:", average_score * 20)
195
+
196
+
197
+ if __name__ == "__main__":
198
+ main()
199
+
ChatUniVi/eval/evaluate/evaluate_benchmark_3_context_mi.py ADDED
@@ -0,0 +1,201 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import openai
2
+ import os
3
+ import argparse
4
+ import json
5
+ import jsonlines
6
+ import ast
7
+ from multiprocessing.pool import Pool
8
+
9
+
10
+ def read_jsonl(file):
11
+ results = []
12
+ with open(file, encoding='utf-8') as f:
13
+ for item in jsonlines.Reader(f):
14
+ results.append(item)
15
+ return results
16
+
17
+
18
+ def parse_args():
19
+ parser = argparse.ArgumentParser(description="question-answer-generation-using-gpt-3")
20
+ parser.add_argument("--pred_path", required=True, help="The path to file containing prediction.")
21
+ parser.add_argument("--output_dir", required=True, help="The path to save annotation json files.")
22
+ parser.add_argument("--output_json", required=True, help="The path to save annotation final combined json file.")
23
+ parser.add_argument("--api_key", required=True, help="OpenAI API key.")
24
+ parser.add_argument("--num_tasks", required=True, type=int, help="Number of splits.")
25
+ args = parser.parse_args()
26
+ return args
27
+
28
+
29
+ def annotate(prediction_set, caption_files, output_dir):
30
+ """
31
+ Evaluates question and answer pairs using GPT-3 and
32
+ returns a score for contextual understanding.
33
+ """
34
+ for file in caption_files:
35
+ key = file[:-5] # Strip file extension
36
+ qa_set = prediction_set[key]
37
+ question = qa_set['q']
38
+ answer = qa_set['a']
39
+ pred = qa_set['pred']
40
+ try:
41
+ # Compute the contextual understanding score
42
+ completion = openai.ChatCompletion.create(
43
+ model="gpt-3.5-turbo",
44
+ messages=[
45
+ {
46
+ "role": "system",
47
+ "content":
48
+ "You are an intelligent chatbot designed for evaluating the contextual understanding of generative outputs for video-based question-answer pairs. "
49
+ "Your task is to compare the predicted answer with the correct answer and determine if the generated response aligns with the overall context of the video content. Here's how you can accomplish the task:"
50
+ "------"
51
+ "##INSTRUCTIONS: "
52
+ "- Evaluate whether the predicted answer aligns with the overall context of the video content. It should not provide information that is out of context or misaligned.\n"
53
+ "- The predicted answer must capture the main themes and sentiments of the video.\n"
54
+ "- Consider synonyms or paraphrases as valid matches.\n"
55
+ "- Provide your evaluation of the contextual understanding of the prediction compared to the answer."
56
+ },
57
+ {
58
+ "role": "user",
59
+ "content":
60
+ "Please evaluate the following video-based question-answer pair:\n\n"
61
+ f"Question: {question}\n"
62
+ f"Correct Answer: {answer}\n"
63
+ f"Predicted Answer: {pred}\n\n"
64
+ "Provide your evaluation only as a contextual understanding score where the contextual understanding score is an integer value between 0 and 5, with 5 indicating the highest level of contextual understanding. "
65
+ "Please generate the response in the form of a Python dictionary string with keys 'score', where its value is contextual understanding score in INTEGER, not STRING."
66
+ "DO NOT PROVIDE ANY OTHER OUTPUT TEXT OR EXPLANATION. Only provide the Python dictionary string. "
67
+ "For example, your response should look like this: {''score': 4.8}."
68
+ }
69
+ ]
70
+ )
71
+ # Convert response to a Python dictionary.
72
+ response_message = completion["choices"][0]["message"]["content"]
73
+ response_dict = ast.literal_eval(response_message)
74
+ result_qa_pair = [response_dict, qa_set]
75
+
76
+ # Save the question-answer pairs to a json file.
77
+ with open(f"{output_dir}/{key}.json", "w") as f:
78
+ json.dump(result_qa_pair, f)
79
+
80
+ except Exception as e:
81
+ print(f"Error processing file '{key}': {e}")
82
+
83
+
84
+ def main():
85
+ """
86
+ Main function to control the flow of the program.
87
+ """
88
+ # Parse arguments.
89
+ args = parse_args()
90
+
91
+ file = args.pred_path
92
+ try:
93
+ pred_contents = json.load(file)
94
+ except:
95
+ pred_contents = read_jsonl(file)
96
+
97
+ # Dictionary to store the count of occurrences for each video_id
98
+ video_id_counts = {}
99
+ new_pred_contents = []
100
+
101
+ # Iterate through each sample in pred_contents
102
+ for sample in pred_contents:
103
+ sample['video_name'] = 1
104
+ video_id = sample['video_name']
105
+ if video_id in video_id_counts:
106
+ video_id_counts[video_id] += 1
107
+ else:
108
+ video_id_counts[video_id] = 0
109
+
110
+ # Create a new sample with the modified key
111
+ new_sample = sample
112
+ new_sample['video_name'] = f"{video_id}_{video_id_counts[video_id]}"
113
+ new_pred_contents.append(new_sample)
114
+
115
+ # Generating list of id's and corresponding files
116
+ id_list = [x['video_name'] for x in new_pred_contents]
117
+ caption_files = [f"{id}.json" for id in id_list]
118
+
119
+ output_dir = args.output_dir
120
+ # Generate output directory if not exists.
121
+ if not os.path.exists(output_dir):
122
+ os.makedirs(output_dir)
123
+
124
+ # Preparing dictionary of question-answer sets
125
+ prediction_set = {}
126
+ for sample in new_pred_contents:
127
+ id = sample['video_name']
128
+ question = sample['prompt']
129
+ answer = sample['answer']
130
+ pred = sample['text']
131
+ qa_set = {"q": question, "a": answer, "pred": pred}
132
+ prediction_set[id] = qa_set
133
+
134
+ # Set the OpenAI API key.
135
+ openai.api_key = args.api_key
136
+ openai.api_base = 'http://10.234.32.86:8000/lumi-proxy'
137
+ openai.api_key = "Don't Panic"
138
+ num_tasks = args.num_tasks
139
+
140
+ # While loop to ensure that all captions are processed.
141
+ while True:
142
+ try:
143
+ # Files that have not been processed yet.
144
+ completed_files = os.listdir(output_dir)
145
+ print(f"completed_files: {len(completed_files)}")
146
+
147
+ # Files that have not been processed yet.
148
+ incomplete_files = [f for f in caption_files if f not in completed_files]
149
+ print(f"incomplete_files: {len(incomplete_files)}")
150
+
151
+ # Break the loop when there are no incomplete files
152
+ if len(incomplete_files) == 0:
153
+ break
154
+ if len(incomplete_files) <= num_tasks:
155
+ num_tasks = 1
156
+
157
+ # Split tasks into parts.
158
+ part_len = len(incomplete_files) // num_tasks
159
+ all_parts = [incomplete_files[i:i + part_len] for i in range(0, len(incomplete_files), part_len)]
160
+ task_args = [(prediction_set, part, args.output_dir) for part in all_parts]
161
+
162
+ # Use a pool of workers to process the files in parallel.
163
+ with Pool() as pool:
164
+ pool.starmap(annotate, task_args)
165
+
166
+ except Exception as e:
167
+ print(f"Error: {e}")
168
+
169
+ # Combine all the processed files into one
170
+ combined_contents = {}
171
+ json_path = args.output_json
172
+
173
+ # Iterate through json files
174
+ for file_name in os.listdir(output_dir):
175
+ if file_name.endswith(".json"):
176
+ file_path = os.path.join(output_dir, file_name)
177
+ with open(file_path, "r") as json_file:
178
+ content = json.load(json_file)
179
+ combined_contents[file_name[:-5]] = content
180
+
181
+ # Write combined content to a json file
182
+ with open(json_path, "w") as json_file:
183
+ json.dump(combined_contents, json_file)
184
+ print("All evaluation completed!")
185
+
186
+ # Calculate average score
187
+ score_sum = 0
188
+ count = 0
189
+ for key, result in combined_contents.items():
190
+ count += 1
191
+ score_match = result[0]['score']
192
+ score = int(score_match)
193
+ score_sum += score
194
+ average_score = score_sum / count
195
+
196
+ print("Average score for contextual understanding:", average_score * 20)
197
+
198
+
199
+ if __name__ == "__main__":
200
+ main()
201
+
ChatUniVi/eval/evaluate/evaluate_benchmark_4_temporal.py ADDED
@@ -0,0 +1,198 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import openai
2
+ import os
3
+ import argparse
4
+ import json
5
+ import jsonlines
6
+ import ast
7
+ from multiprocessing.pool import Pool
8
+
9
+
10
+ def read_jsonl(file):
11
+ results = []
12
+ with open(file, encoding='utf-8') as f:
13
+ for item in jsonlines.Reader(f):
14
+ results.append(item)
15
+ return results
16
+
17
+
18
+ def parse_args():
19
+ parser = argparse.ArgumentParser(description="question-answer-generation-using-gpt-3")
20
+ parser.add_argument("--pred_path", required=True, help="The path to file containing prediction.")
21
+ parser.add_argument("--output_dir", required=True, help="The path to save annotation json files.")
22
+ parser.add_argument("--output_json", required=True, help="The path to save annotation final combined json file.")
23
+ parser.add_argument("--api_key", required=True, help="OpenAI API key.")
24
+ parser.add_argument("--num_tasks", required=True, type=int, help="Number of splits.")
25
+ args = parser.parse_args()
26
+ return args
27
+
28
+
29
+ def annotate(prediction_set, caption_files, output_dir):
30
+ """
31
+ Evaluates question and answer pairs using GPT-3 and
32
+ returns a score for temporal understanding.
33
+ """
34
+ for file in caption_files:
35
+ key = file[:-5] # Strip file extension
36
+ qa_set = prediction_set[key]
37
+ question = qa_set['q']
38
+ answer = qa_set['a']
39
+ pred = qa_set['pred']
40
+ try:
41
+ # Compute the temporal understanding score
42
+ completion = openai.ChatCompletion.create(
43
+ model="gpt-3.5-turbo",
44
+ messages=[
45
+ {
46
+ "role": "system",
47
+ "content":
48
+ "You are an intelligent chatbot designed for evaluating the temporal understanding of generative outputs for video-based question-answer pairs. "
49
+ "Your task is to compare the predicted answer with the correct answer and determine if they correctly reflect the temporal sequence of events in the video content. Here's how you can accomplish the task:"
50
+ "------"
51
+ "##INSTRUCTIONS: "
52
+ "- Focus on the temporal consistency between the predicted answer and the correct answer. The predicted answer should correctly reflect the sequence of events or details as they are presented in the video content.\n"
53
+ "- Consider synonyms or paraphrases as valid matches, but only if the temporal order is maintained.\n"
54
+ "- Evaluate the temporal accuracy of the prediction compared to the answer."
55
+ },
56
+ {
57
+ "role": "user",
58
+ "content":
59
+ "Please evaluate the following video-based question-answer pair:\n\n"
60
+ f"Question: {question}\n"
61
+ f"Correct Answer: {answer}\n"
62
+ f"Predicted Answer: {pred}\n\n"
63
+ "Provide your evaluation only as a temporal accuracy score where the temporal accuracy score is an integer value between 0 and 5, with 5 indicating the highest level of temporal consistency. "
64
+ "Please generate the response in the form of a Python dictionary string with keys 'score', where its value is the temporal accuracy score in INTEGER, not STRING."
65
+ "DO NOT PROVIDE ANY OTHER OUTPUT TEXT OR EXPLANATION. Only provide the Python dictionary string. "
66
+ "For example, your response should look like this: {''score': 4.8}."
67
+ }
68
+ ]
69
+ )
70
+ # Convert response to a Python dictionary.
71
+ response_message = completion["choices"][0]["message"]["content"]
72
+ response_dict = ast.literal_eval(response_message)
73
+ result_qa_pair = [response_dict, qa_set]
74
+
75
+ # Save the question-answer pairs to a json file.
76
+ with open(f"{output_dir}/{key}.json", "w") as f:
77
+ json.dump(result_qa_pair, f)
78
+
79
+ except Exception as e:
80
+ print(f"Error processing file '{key}': {e}")
81
+
82
+
83
+ def main():
84
+ """
85
+ Main function to control the flow of the program.
86
+ """
87
+ # Parse arguments.
88
+ args = parse_args()
89
+
90
+ file = args.pred_path
91
+ try:
92
+ pred_contents = json.load(file)
93
+ except:
94
+ pred_contents = read_jsonl(file)
95
+
96
+ # Dictionary to store the count of occurrences for each video_id
97
+ video_id_counts = {}
98
+ new_pred_contents = []
99
+
100
+ # Iterate through each sample in pred_contents
101
+ for sample in pred_contents:
102
+ sample['video_name'] = 1
103
+ video_id = sample['video_name']
104
+ if video_id in video_id_counts:
105
+ video_id_counts[video_id] += 1
106
+ else:
107
+ video_id_counts[video_id] = 0
108
+
109
+ # Create a new sample with the modified key
110
+ new_sample = sample
111
+ new_sample['video_name'] = f"{video_id}_{video_id_counts[video_id]}"
112
+ new_pred_contents.append(new_sample)
113
+
114
+ # Generating list of id's and corresponding files
115
+ id_list = [x['video_name'] for x in new_pred_contents]
116
+ caption_files = [f"{id}.json" for id in id_list]
117
+
118
+ output_dir = args.output_dir
119
+ # Generate output directory if not exists.
120
+ if not os.path.exists(output_dir):
121
+ os.makedirs(output_dir)
122
+
123
+ # Preparing dictionary of question-answer sets
124
+ prediction_set = {}
125
+ for sample in new_pred_contents:
126
+ id = sample['video_name']
127
+ question = sample['prompt']
128
+ answer = sample['answer']
129
+ pred = sample['text']
130
+ qa_set = {"q": question, "a": answer, "pred": pred}
131
+ prediction_set[id] = qa_set
132
+
133
+ # Set the OpenAI API key.
134
+ openai.api_key = args.api_key
135
+ num_tasks = args.num_tasks
136
+
137
+ # While loop to ensure that all captions are processed.
138
+ while True:
139
+ try:
140
+ # Files that have not been processed yet.
141
+ completed_files = os.listdir(output_dir)
142
+ print(f"completed_files: {len(completed_files)}")
143
+
144
+ # Files that have not been processed yet.
145
+ incomplete_files = [f for f in caption_files if f not in completed_files]
146
+ print(f"incomplete_files: {len(incomplete_files)}")
147
+
148
+ # Break the loop when there are no incomplete files
149
+ if len(incomplete_files) == 0:
150
+ break
151
+ if len(incomplete_files) <= num_tasks:
152
+ num_tasks = 1
153
+
154
+ # Split tasks into parts.
155
+ part_len = len(incomplete_files) // num_tasks
156
+ all_parts = [incomplete_files[i:i + part_len] for i in range(0, len(incomplete_files), part_len)]
157
+ task_args = [(prediction_set, part, args.output_dir) for part in all_parts]
158
+
159
+ # Use a pool of workers to process the files in parallel.
160
+ with Pool() as pool:
161
+ pool.starmap(annotate, task_args)
162
+
163
+ except Exception as e:
164
+ print(f"Error: {e}")
165
+
166
+ # Combine all the processed files into one
167
+ combined_contents = {}
168
+ json_path = args.output_json
169
+
170
+ # Iterate through json files
171
+ for file_name in os.listdir(output_dir):
172
+ if file_name.endswith(".json"):
173
+ file_path = os.path.join(output_dir, file_name)
174
+ with open(file_path, "r") as json_file:
175
+ content = json.load(json_file)
176
+ combined_contents[file_name[:-5]] = content
177
+
178
+ # Write combined content to a json file
179
+ with open(json_path, "w") as json_file:
180
+ json.dump(combined_contents, json_file)
181
+ print("All evaluation completed!")
182
+
183
+ # Calculate average score
184
+ score_sum = 0
185
+ count = 0
186
+ for key, result in combined_contents.items():
187
+ count += 1
188
+ score_match = result[0]['score']
189
+ score = int(score_match)
190
+ score_sum += score
191
+ average_score = score_sum / count
192
+
193
+ print("Average score temporal understanding:", average_score * 20)
194
+
195
+
196
+ if __name__ == "__main__":
197
+ main()
198
+
ChatUniVi/eval/evaluate/evaluate_benchmark_4_temporal_mi.py ADDED
@@ -0,0 +1,200 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import openai
2
+ import os
3
+ import argparse
4
+ import json
5
+ import jsonlines
6
+ import ast
7
+ from multiprocessing.pool import Pool
8
+
9
+
10
+ def read_jsonl(file):
11
+ results = []
12
+ with open(file, encoding='utf-8') as f:
13
+ for item in jsonlines.Reader(f):
14
+ results.append(item)
15
+ return results
16
+
17
+
18
+ def parse_args():
19
+ parser = argparse.ArgumentParser(description="question-answer-generation-using-gpt-3")
20
+ parser.add_argument("--pred_path", required=True, help="The path to file containing prediction.")
21
+ parser.add_argument("--output_dir", required=True, help="The path to save annotation json files.")
22
+ parser.add_argument("--output_json", required=True, help="The path to save annotation final combined json file.")
23
+ parser.add_argument("--api_key", required=True, help="OpenAI API key.")
24
+ parser.add_argument("--num_tasks", required=True, type=int, help="Number of splits.")
25
+ args = parser.parse_args()
26
+ return args
27
+
28
+
29
+ def annotate(prediction_set, caption_files, output_dir):
30
+ """
31
+ Evaluates question and answer pairs using GPT-3 and
32
+ returns a score for temporal understanding.
33
+ """
34
+ for file in caption_files:
35
+ key = file[:-5] # Strip file extension
36
+ qa_set = prediction_set[key]
37
+ question = qa_set['q']
38
+ answer = qa_set['a']
39
+ pred = qa_set['pred']
40
+ try:
41
+ # Compute the temporal understanding score
42
+ completion = openai.ChatCompletion.create(
43
+ model="gpt-3.5-turbo",
44
+ messages=[
45
+ {
46
+ "role": "system",
47
+ "content":
48
+ "You are an intelligent chatbot designed for evaluating the temporal understanding of generative outputs for video-based question-answer pairs. "
49
+ "Your task is to compare the predicted answer with the correct answer and determine if they correctly reflect the temporal sequence of events in the video content. Here's how you can accomplish the task:"
50
+ "------"
51
+ "##INSTRUCTIONS: "
52
+ "- Focus on the temporal consistency between the predicted answer and the correct answer. The predicted answer should correctly reflect the sequence of events or details as they are presented in the video content.\n"
53
+ "- Consider synonyms or paraphrases as valid matches, but only if the temporal order is maintained.\n"
54
+ "- Evaluate the temporal accuracy of the prediction compared to the answer."
55
+ },
56
+ {
57
+ "role": "user",
58
+ "content":
59
+ "Please evaluate the following video-based question-answer pair:\n\n"
60
+ f"Question: {question}\n"
61
+ f"Correct Answer: {answer}\n"
62
+ f"Predicted Answer: {pred}\n\n"
63
+ "Provide your evaluation only as a temporal accuracy score where the temporal accuracy score is an integer value between 0 and 5, with 5 indicating the highest level of temporal consistency. "
64
+ "Please generate the response in the form of a Python dictionary string with keys 'score', where its value is the temporal accuracy score in INTEGER, not STRING."
65
+ "DO NOT PROVIDE ANY OTHER OUTPUT TEXT OR EXPLANATION. Only provide the Python dictionary string. "
66
+ "For example, your response should look like this: {''score': 4.8}."
67
+ }
68
+ ]
69
+ )
70
+ # Convert response to a Python dictionary.
71
+ response_message = completion["choices"][0]["message"]["content"]
72
+ response_dict = ast.literal_eval(response_message)
73
+ result_qa_pair = [response_dict, qa_set]
74
+
75
+ # Save the question-answer pairs to a json file.
76
+ with open(f"{output_dir}/{key}.json", "w") as f:
77
+ json.dump(result_qa_pair, f)
78
+
79
+ except Exception as e:
80
+ print(f"Error processing file '{key}': {e}")
81
+
82
+
83
+ def main():
84
+ """
85
+ Main function to control the flow of the program.
86
+ """
87
+ # Parse arguments.
88
+ args = parse_args()
89
+
90
+ file = args.pred_path
91
+ try:
92
+ pred_contents = json.load(file)
93
+ except:
94
+ pred_contents = read_jsonl(file)
95
+
96
+ # Dictionary to store the count of occurrences for each video_id
97
+ video_id_counts = {}
98
+ new_pred_contents = []
99
+
100
+ # Iterate through each sample in pred_contents
101
+ for sample in pred_contents:
102
+ sample['video_name'] = 1
103
+ video_id = sample['video_name']
104
+ if video_id in video_id_counts:
105
+ video_id_counts[video_id] += 1
106
+ else:
107
+ video_id_counts[video_id] = 0
108
+
109
+ # Create a new sample with the modified key
110
+ new_sample = sample
111
+ new_sample['video_name'] = f"{video_id}_{video_id_counts[video_id]}"
112
+ new_pred_contents.append(new_sample)
113
+
114
+ # Generating list of id's and corresponding files
115
+ id_list = [x['video_name'] for x in new_pred_contents]
116
+ caption_files = [f"{id}.json" for id in id_list]
117
+
118
+ output_dir = args.output_dir
119
+ # Generate output directory if not exists.
120
+ if not os.path.exists(output_dir):
121
+ os.makedirs(output_dir)
122
+
123
+ # Preparing dictionary of question-answer sets
124
+ prediction_set = {}
125
+ for sample in new_pred_contents:
126
+ id = sample['video_name']
127
+ question = sample['prompt']
128
+ answer = sample['answer']
129
+ pred = sample['text']
130
+ qa_set = {"q": question, "a": answer, "pred": pred}
131
+ prediction_set[id] = qa_set
132
+
133
+ # Set the OpenAI API key.
134
+ openai.api_key = args.api_key
135
+ openai.api_base = 'http://10.234.32.86:8000/lumi-proxy'
136
+ openai.api_key = "Don't Panic"
137
+ num_tasks = args.num_tasks
138
+
139
+ # While loop to ensure that all captions are processed.
140
+ while True:
141
+ try:
142
+ # Files that have not been processed yet.
143
+ completed_files = os.listdir(output_dir)
144
+ print(f"completed_files: {len(completed_files)}")
145
+
146
+ # Files that have not been processed yet.
147
+ incomplete_files = [f for f in caption_files if f not in completed_files]
148
+ print(f"incomplete_files: {len(incomplete_files)}")
149
+
150
+ # Break the loop when there are no incomplete files
151
+ if len(incomplete_files) == 0:
152
+ break
153
+ if len(incomplete_files) <= num_tasks:
154
+ num_tasks = 1
155
+
156
+ # Split tasks into parts.
157
+ part_len = len(incomplete_files) // num_tasks
158
+ all_parts = [incomplete_files[i:i + part_len] for i in range(0, len(incomplete_files), part_len)]
159
+ task_args = [(prediction_set, part, args.output_dir) for part in all_parts]
160
+
161
+ # Use a pool of workers to process the files in parallel.
162
+ with Pool() as pool:
163
+ pool.starmap(annotate, task_args)
164
+
165
+ except Exception as e:
166
+ print(f"Error: {e}")
167
+
168
+ # Combine all the processed files into one
169
+ combined_contents = {}
170
+ json_path = args.output_json
171
+
172
+ # Iterate through json files
173
+ for file_name in os.listdir(output_dir):
174
+ if file_name.endswith(".json"):
175
+ file_path = os.path.join(output_dir, file_name)
176
+ with open(file_path, "r") as json_file:
177
+ content = json.load(json_file)
178
+ combined_contents[file_name[:-5]] = content
179
+
180
+ # Write combined content to a json file
181
+ with open(json_path, "w") as json_file:
182
+ json.dump(combined_contents, json_file)
183
+ print("All evaluation completed!")
184
+
185
+ # Calculate average score
186
+ score_sum = 0
187
+ count = 0
188
+ for key, result in combined_contents.items():
189
+ count += 1
190
+ score_match = result[0]['score']
191
+ score = int(score_match)
192
+ score_sum += score
193
+ average_score = score_sum / count
194
+
195
+ print("Average score temporal understanding:", average_score * 20)
196
+
197
+
198
+ if __name__ == "__main__":
199
+ main()
200
+
ChatUniVi/eval/evaluate/evaluate_benchmark_5_consistency.py ADDED
@@ -0,0 +1,207 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import openai
2
+ import os
3
+ import argparse
4
+ import json
5
+ import jsonlines
6
+ import ast
7
+ from multiprocessing.pool import Pool
8
+
9
+
10
+ def read_jsonl(file):
11
+ results = []
12
+ with open(file, encoding='utf-8') as f:
13
+ for item in jsonlines.Reader(f):
14
+ results.append(item)
15
+ return results
16
+
17
+
18
+ def parse_args():
19
+ parser = argparse.ArgumentParser(description="question-answer-generation-using-gpt-3")
20
+ parser.add_argument("--pred_path", required=True, help="The path to file containing prediction.")
21
+ parser.add_argument("--output_dir", required=True, help="The path to save annotation json files.")
22
+ parser.add_argument("--output_json", required=True, help="The path to save annotation final combined json file.")
23
+ parser.add_argument("--api_key", required=True, help="OpenAI API key.")
24
+ parser.add_argument("--num_tasks", required=True, type=int, help="Number of splits.")
25
+ args = parser.parse_args()
26
+ return args
27
+
28
+
29
+ def annotate(prediction_set, caption_files, output_dir):
30
+ """
31
+ Evaluates question and answer pairs using GPT-3 and
32
+ returns a score for consistency.
33
+ """
34
+ for file in caption_files:
35
+ key = file[:-5] # Strip file extension
36
+ qa_set = prediction_set[key]
37
+ question1 = qa_set['q1']
38
+ question2 = qa_set['q2']
39
+ answer = qa_set['a']
40
+ pred1 = qa_set['pred1']
41
+ pred2 = qa_set['pred2']
42
+ try:
43
+ # Compute the consistency score
44
+ completion = openai.ChatCompletion.create(
45
+ model="gpt-3.5-turbo",
46
+ messages=[
47
+ {
48
+ "role": "system",
49
+ "content":
50
+ "You are an intelligent chatbot designed for evaluating the consistency of generative outputs for similar video-based question-answer pairs. "
51
+ "You will be given two very similar questions, a common answer common to both the questions and predicted answers for the two questions ."
52
+ "Your task is to compare the predicted answers for two very similar question, with a common correct answer and determine if they are consistent. Here's how you can accomplish the task:"
53
+ "------"
54
+ "##INSTRUCTIONS: "
55
+ "- Focus on the consistency between the two predicted answers and the correct answer. Both predicted answers should correspond to the correct answer and to each other, and should not contain any contradictions or significant differences in the conveyed information.\n"
56
+ "- Both predicted answers must be consistent with each other and the correct answer, in terms of the information they provide about the video content.\n"
57
+ "- Consider synonyms or paraphrases as valid matches, but only if they maintain the consistency in the conveyed information.\n"
58
+ "- Evaluate the consistency of the two predicted answers compared to the correct answer."
59
+ },
60
+ {
61
+ "role": "user",
62
+ "content":
63
+ "Please evaluate the following video-based question-answer pair:\n\n"
64
+ f"Question 1: {question1}\n"
65
+ f"Question 2: {question2}\n"
66
+ f"Correct Answer: {answer}\n"
67
+ f"Predicted Answer to Question 1: {pred1}\n"
68
+ f"Predicted Answer to Question 2: {pred2}\n\n"
69
+ "Provide your evaluation only as a consistency score where the consistency score is an integer value between 0 and 5, with 5 indicating the highest level of consistency. "
70
+ "Please generate the response in the form of a Python dictionary string with keys 'score', where its value is the consistency score in INTEGER, not STRING."
71
+ "DO NOT PROVIDE ANY OTHER OUTPUT TEXT OR EXPLANATION. Only provide the Python dictionary string. "
72
+ "For example, your response should look like this: {''score': 4.8}."
73
+ }
74
+ ],
75
+ )
76
+ # Convert response to a Python dictionary.
77
+ response_message = completion["choices"][0]["message"]["content"]
78
+ response_dict = ast.literal_eval(response_message)
79
+ result_qa_pair = [response_dict, qa_set]
80
+
81
+ # Save the question-answer pairs to a json file.
82
+ with open(f"{output_dir}/{key}.json", "w") as f:
83
+ json.dump(result_qa_pair, f)
84
+
85
+ except Exception as e:
86
+ print(f"Error processing file '{key}': {e}")
87
+
88
+
89
+ def main():
90
+ """
91
+ Main function to control the flow of the program.
92
+ """
93
+ # Parse arguments.
94
+ args = parse_args()
95
+
96
+ file = args.pred_path
97
+ try:
98
+ pred_contents = json.load(file)
99
+ except:
100
+ pred_contents = read_jsonl(file)
101
+
102
+ # Dictionary to store the count of occurrences for each video_id
103
+ video_id_counts = {}
104
+ new_pred_contents = []
105
+
106
+ # Iterate through each sample in pred_contents
107
+ for sample in pred_contents:
108
+ # video_id = sample['video_name']
109
+ video_id = 1
110
+ if video_id in video_id_counts:
111
+ video_id_counts[video_id] += 1
112
+ else:
113
+ video_id_counts[video_id] = 0
114
+
115
+ # Create a new sample with the modified key
116
+ new_sample = sample
117
+ new_sample['video_name'] = f"{video_id}_{video_id_counts[video_id]}"
118
+ new_pred_contents.append(new_sample)
119
+
120
+ # Generating list of id's and corresponding files
121
+ id_list = [x['video_name'] for x in new_pred_contents]
122
+ caption_files = [f"{id}.json" for id in id_list]
123
+
124
+ output_dir = args.output_dir
125
+ # Generate output directory if not exists.
126
+ if not os.path.exists(output_dir):
127
+ os.makedirs(output_dir)
128
+
129
+ # Preparing dictionary of question-answer sets
130
+ prediction_set = {}
131
+ for sample in new_pred_contents:
132
+ id = sample['video_name']
133
+ question1 = sample['prompt_1']
134
+ question2 = sample['prompt_2']
135
+ answer = sample['answer']
136
+ pred1 = sample['text_1']
137
+ pred2 = sample['text_2']
138
+ qa_set = {"q1": question1, "q2": question2, "a": answer, "pred1": pred1, "pred2": pred2}
139
+ prediction_set[id] = qa_set
140
+
141
+ # Set the OpenAI API key.
142
+ openai.api_key = args.api_key
143
+
144
+ num_tasks = args.num_tasks
145
+
146
+ # While loop to ensure that all captions are processed.
147
+ while True:
148
+ try:
149
+ # Files that have not been processed yet.
150
+ completed_files = os.listdir(output_dir)
151
+ print(f"completed_files: {len(completed_files)}")
152
+
153
+ # Files that have not been processed yet.
154
+ incomplete_files = [f for f in caption_files if f not in completed_files]
155
+ print(f"incomplete_files: {len(incomplete_files)}")
156
+
157
+ # Break the loop when there are no incomplete files
158
+ if len(incomplete_files) == 0:
159
+ break
160
+ if len(incomplete_files) <= num_tasks:
161
+ num_tasks = 1
162
+
163
+ # Split tasks into parts.
164
+ part_len = len(incomplete_files) // num_tasks
165
+ all_parts = [incomplete_files[i:i + part_len] for i in range(0, len(incomplete_files), part_len)]
166
+ task_args = [(prediction_set, part, args.output_dir) for part in all_parts]
167
+
168
+ # Use a pool of workers to process the files in parallel.
169
+ with Pool() as pool:
170
+ pool.starmap(annotate, task_args)
171
+
172
+ except Exception as e:
173
+ print(f"Error: {e}")
174
+
175
+ # Combine all the processed files into one
176
+ combined_contents = {}
177
+ json_path = args.output_json
178
+
179
+ # Iterate through json files
180
+ for file_name in os.listdir(output_dir):
181
+ if file_name.endswith(".json"):
182
+ file_path = os.path.join(output_dir, file_name)
183
+ with open(file_path, "r") as json_file:
184
+ content = json.load(json_file)
185
+ combined_contents[file_name[:-5]] = content
186
+
187
+ # Write combined content to a json file
188
+ with open(json_path, "w") as json_file:
189
+ json.dump(combined_contents, json_file)
190
+ print("All evaluation completed!")
191
+
192
+ # Calculate average score
193
+ score_sum = 0
194
+ count = 0
195
+ for key, result in combined_contents.items():
196
+ count += 1
197
+ score_match = result[0]['score']
198
+ score = int(score_match)
199
+ score_sum += score
200
+ average_score = score_sum / count
201
+
202
+ print("Average score for consistency:", average_score * 20)
203
+
204
+
205
+ if __name__ == "__main__":
206
+ main()
207
+
ChatUniVi/eval/evaluate/evaluate_benchmark_5_consistency_mi.py ADDED
@@ -0,0 +1,208 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import openai
2
+ import os
3
+ import argparse
4
+ import json
5
+ import jsonlines
6
+ import ast
7
+ from multiprocessing.pool import Pool
8
+
9
+
10
+ def read_jsonl(file):
11
+ results = []
12
+ with open(file, encoding='utf-8') as f:
13
+ for item in jsonlines.Reader(f):
14
+ results.append(item)
15
+ return results
16
+
17
+
18
+ def parse_args():
19
+ parser = argparse.ArgumentParser(description="question-answer-generation-using-gpt-3")
20
+ parser.add_argument("--pred_path", required=True, help="The path to file containing prediction.")
21
+ parser.add_argument("--output_dir", required=True, help="The path to save annotation json files.")
22
+ parser.add_argument("--output_json", required=True, help="The path to save annotation final combined json file.")
23
+ parser.add_argument("--api_key", required=True, help="OpenAI API key.")
24
+ parser.add_argument("--num_tasks", required=True, type=int, help="Number of splits.")
25
+ args = parser.parse_args()
26
+ return args
27
+
28
+
29
+ def annotate(prediction_set, caption_files, output_dir):
30
+ """
31
+ Evaluates question and answer pairs using GPT-3 and
32
+ returns a score for consistency.
33
+ """
34
+ for file in caption_files:
35
+ key = file[:-5] # Strip file extension
36
+ qa_set = prediction_set[key]
37
+ question1 = qa_set['q1']
38
+ question2 = qa_set['q2']
39
+ answer = qa_set['a']
40
+ pred1 = qa_set['pred1']
41
+ pred2 = qa_set['pred2']
42
+ try:
43
+ # Compute the consistency score
44
+ completion = openai.ChatCompletion.create(
45
+ model="gpt-3.5-turbo",
46
+ messages=[
47
+ {
48
+ "role": "system",
49
+ "content":
50
+ "You are an intelligent chatbot designed for evaluating the consistency of generative outputs for similar video-based question-answer pairs. "
51
+ "You will be given two very similar questions, a common answer common to both the questions and predicted answers for the two questions ."
52
+ "Your task is to compare the predicted answers for two very similar question, with a common correct answer and determine if they are consistent. Here's how you can accomplish the task:"
53
+ "------"
54
+ "##INSTRUCTIONS: "
55
+ "- Focus on the consistency between the two predicted answers and the correct answer. Both predicted answers should correspond to the correct answer and to each other, and should not contain any contradictions or significant differences in the conveyed information.\n"
56
+ "- Both predicted answers must be consistent with each other and the correct answer, in terms of the information they provide about the video content.\n"
57
+ "- Consider synonyms or paraphrases as valid matches, but only if they maintain the consistency in the conveyed information.\n"
58
+ "- Evaluate the consistency of the two predicted answers compared to the correct answer."
59
+ },
60
+ {
61
+ "role": "user",
62
+ "content":
63
+ "Please evaluate the following video-based question-answer pair:\n\n"
64
+ f"Question 1: {question1}\n"
65
+ f"Question 2: {question2}\n"
66
+ f"Correct Answer: {answer}\n"
67
+ f"Predicted Answer to Question 1: {pred1}\n"
68
+ f"Predicted Answer to Question 2: {pred2}\n\n"
69
+ "Provide your evaluation only as a consistency score where the consistency score is an integer value between 0 and 5, with 5 indicating the highest level of consistency. "
70
+ "Please generate the response in the form of a Python dictionary string with keys 'score', where its value is the consistency score in INTEGER, not STRING."
71
+ "DO NOT PROVIDE ANY OTHER OUTPUT TEXT OR EXPLANATION. Only provide the Python dictionary string. "
72
+ "For example, your response should look like this: {''score': 4.8}."
73
+ }
74
+ ],
75
+ )
76
+ # Convert response to a Python dictionary.
77
+ response_message = completion["choices"][0]["message"]["content"]
78
+ response_dict = ast.literal_eval(response_message)
79
+ result_qa_pair = [response_dict, qa_set]
80
+
81
+ # Save the question-answer pairs to a json file.
82
+ with open(f"{output_dir}/{key}.json", "w") as f:
83
+ json.dump(result_qa_pair, f)
84
+
85
+ except Exception as e:
86
+ print(f"Error processing file '{key}': {e}")
87
+
88
+
89
+ def main():
90
+ """
91
+ Main function to control the flow of the program.
92
+ """
93
+ # Parse arguments.
94
+ args = parse_args()
95
+
96
+ file = args.pred_path
97
+ try:
98
+ pred_contents = json.load(file)
99
+ except:
100
+ pred_contents = read_jsonl(file)
101
+
102
+ # Dictionary to store the count of occurrences for each video_id
103
+ video_id_counts = {}
104
+ new_pred_contents = []
105
+
106
+ # Iterate through each sample in pred_contents
107
+ for sample in pred_contents:
108
+ # video_id = sample['video_name']
109
+ video_id = 1
110
+ if video_id in video_id_counts:
111
+ video_id_counts[video_id] += 1
112
+ else:
113
+ video_id_counts[video_id] = 0
114
+
115
+ # Create a new sample with the modified key
116
+ new_sample = sample
117
+ new_sample['video_name'] = f"{video_id}_{video_id_counts[video_id]}"
118
+ new_pred_contents.append(new_sample)
119
+
120
+ # Generating list of id's and corresponding files
121
+ id_list = [x['video_name'] for x in new_pred_contents]
122
+ caption_files = [f"{id}.json" for id in id_list]
123
+
124
+ output_dir = args.output_dir
125
+ # Generate output directory if not exists.
126
+ if not os.path.exists(output_dir):
127
+ os.makedirs(output_dir)
128
+
129
+ # Preparing dictionary of question-answer sets
130
+ prediction_set = {}
131
+ for sample in new_pred_contents:
132
+ id = sample['video_name']
133
+ question1 = sample['prompt_1']
134
+ question2 = sample['prompt_2']
135
+ answer = sample['answer']
136
+ pred1 = sample['text_1']
137
+ pred2 = sample['text_2']
138
+ qa_set = {"q1": question1, "q2": question2, "a": answer, "pred1": pred1, "pred2": pred2}
139
+ prediction_set[id] = qa_set
140
+
141
+ # Set the OpenAI API key.
142
+ openai.api_key = args.api_key
143
+ openai.api_base = 'http://10.234.32.86:8000/lumi-proxy'
144
+ openai.api_key = "Don't Panic"
145
+ num_tasks = args.num_tasks
146
+
147
+ # While loop to ensure that all captions are processed.
148
+ while True:
149
+ try:
150
+ # Files that have not been processed yet.
151
+ completed_files = os.listdir(output_dir)
152
+ print(f"completed_files: {len(completed_files)}")
153
+
154
+ # Files that have not been processed yet.
155
+ incomplete_files = [f for f in caption_files if f not in completed_files]
156
+ print(f"incomplete_files: {len(incomplete_files)}")
157
+
158
+ # Break the loop when there are no incomplete files
159
+ if len(incomplete_files) == 0:
160
+ break
161
+ if len(incomplete_files) <= num_tasks:
162
+ num_tasks = 1
163
+
164
+ # Split tasks into parts.
165
+ part_len = len(incomplete_files) // num_tasks
166
+ all_parts = [incomplete_files[i:i + part_len] for i in range(0, len(incomplete_files), part_len)]
167
+ task_args = [(prediction_set, part, args.output_dir) for part in all_parts]
168
+
169
+ # Use a pool of workers to process the files in parallel.
170
+ with Pool() as pool:
171
+ pool.starmap(annotate, task_args)
172
+
173
+ except Exception as e:
174
+ print(f"Error: {e}")
175
+
176
+ # Combine all the processed files into one
177
+ combined_contents = {}
178
+ json_path = args.output_json
179
+
180
+ # Iterate through json files
181
+ for file_name in os.listdir(output_dir):
182
+ if file_name.endswith(".json"):
183
+ file_path = os.path.join(output_dir, file_name)
184
+ with open(file_path, "r") as json_file:
185
+ content = json.load(json_file)
186
+ combined_contents[file_name[:-5]] = content
187
+
188
+ # Write combined content to a json file
189
+ with open(json_path, "w") as json_file:
190
+ json.dump(combined_contents, json_file)
191
+ print("All evaluation completed!")
192
+
193
+ # Calculate average score
194
+ score_sum = 0
195
+ count = 0
196
+ for key, result in combined_contents.items():
197
+ count += 1
198
+ score_match = result[0]['score']
199
+ score = int(score_match)
200
+ score_sum += score
201
+ average_score = score_sum / count
202
+
203
+ print("Average score for consistency:", average_score * 20)
204
+
205
+
206
+ if __name__ == "__main__":
207
+ main()
208
+
ChatUniVi/eval/evaluate/evaluate_gpt_review_visual.py ADDED
@@ -0,0 +1,118 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import argparse
2
+ import json
3
+ import os
4
+ import requests
5
+ import openai
6
+ import time
7
+
8
+ NUM_SECONDS_TO_SLEEP = 0.5
9
+
10
+
11
+ def get_eval(content: str, max_tokens: int):
12
+ while True:
13
+ try:
14
+ response = openai.ChatCompletion.create(
15
+ model='gpt-4-0314', # gpt-4-0314
16
+ messages=[{
17
+ 'role': 'system',
18
+ 'content': 'You are a helpful and precise assistant for checking the quality of the answer.'
19
+ }, {
20
+ 'role': 'user',
21
+ 'content': content,
22
+ }],
23
+ temperature=0.2, # TODO: figure out which temperature is best for evaluation
24
+ max_tokens=max_tokens,
25
+ )
26
+ break
27
+ except openai.error.RateLimitError:
28
+ pass
29
+ except Exception as e:
30
+ print(e)
31
+ time.sleep(NUM_SECONDS_TO_SLEEP)
32
+
33
+ return response['choices'][0]['message']['content']
34
+
35
+
36
+ def parse_score(review):
37
+ try:
38
+ score_pair = review.split('\n')[0]
39
+ score_pair = score_pair.replace(',', ' ')
40
+ sp = score_pair.split(' ')
41
+ if len(sp) == 2:
42
+ return [float(sp[0]), float(sp[1])]
43
+ else:
44
+ print('error', review)
45
+ return [-1, -1]
46
+ except Exception as e:
47
+ print(e)
48
+ print('error', review)
49
+ return [-1, -1]
50
+
51
+
52
+ if __name__ == '__main__':
53
+ parser = argparse.ArgumentParser(description='ChatGPT-based QA evaluation.')
54
+ parser.add_argument('-q', '--question')
55
+ parser.add_argument('-c', '--context')
56
+ parser.add_argument('-a', '--answer-list', nargs='+', default=[])
57
+ parser.add_argument('-r', '--rule')
58
+ parser.add_argument('-o', '--output')
59
+ parser.add_argument('--max-tokens', type=int, default=1024, help='maximum number of tokens produced in the output')
60
+ args = parser.parse_args()
61
+
62
+ f_q = open(os.path.expanduser(args.question))
63
+ f_ans1 = open(os.path.expanduser(args.answer_list[0]))
64
+ f_ans2 = open(os.path.expanduser(args.answer_list[1]))
65
+ rule_dict = json.load(open(os.path.expanduser(args.rule), 'r'))
66
+
67
+ if os.path.isfile(os.path.expanduser(args.output)):
68
+ cur_reviews = [json.loads(line) for line in open(os.path.expanduser(args.output))]
69
+ else:
70
+ cur_reviews = []
71
+
72
+ review_file = open(f'{args.output}', 'a')
73
+
74
+ context_list = [json.loads(line) for line in open(os.path.expanduser(args.context))]
75
+ image_to_context = {context['image']: context for context in context_list}
76
+
77
+ handles = []
78
+ idx = 0
79
+ for ques_js, ans1_js, ans2_js in zip(f_q, f_ans1, f_ans2):
80
+ ques = json.loads(ques_js)
81
+ ans1 = json.loads(ans1_js)
82
+ ans2 = json.loads(ans2_js)
83
+
84
+ inst = image_to_context[ques['image']]
85
+ cap_str = '\n'.join(inst['captions'])
86
+ box_str = '\n'.join([f'{instance["category"]}: {instance["bbox"]}' for instance in inst['instances']])
87
+
88
+ category = json.loads(ques_js)['category']
89
+ if category in rule_dict:
90
+ rule = rule_dict[category]
91
+ else:
92
+ assert False, f"Visual QA category not found in rule file: {category}."
93
+ prompt = rule['prompt']
94
+ role = rule['role']
95
+ content = (f'[Context]\n{cap_str}\n\n{box_str}\n\n'
96
+ f'[Question]\n{ques["text"]}\n\n'
97
+ f'[{role} 1]\n{ans1["text"]}\n\n[End of {role} 1]\n\n'
98
+ f'[{role} 2]\n{ans2["text"]}\n\n[End of {role} 2]\n\n'
99
+ f'[System]\n{prompt}\n\n')
100
+ cur_js = {
101
+ 'id': idx+1,
102
+ 'question_id': ques['question_id'],
103
+ 'answer1_id': ans1.get('answer_id', ans1['question_id']),
104
+ 'answer2_id': ans2.get('answer_id', ans2['answer_id']),
105
+ 'category': category
106
+ }
107
+ if idx >= len(cur_reviews):
108
+ review = get_eval(content, args.max_tokens)
109
+ scores = parse_score(review)
110
+ cur_js['content'] = review
111
+ cur_js['tuple'] = scores
112
+ review_file.write(json.dumps(cur_js) + '\n')
113
+ review_file.flush()
114
+ else:
115
+ print(f'Skipping {idx} as we already have it.')
116
+ idx += 1
117
+ print(idx)
118
+ review_file.close()
ChatUniVi/eval/evaluate/evaluate_science_qa.py ADDED
@@ -0,0 +1,142 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import argparse
2
+ import json
3
+ import os
4
+ import re
5
+ import random
6
+ import numpy as np
7
+
8
+
9
+ def get_args():
10
+ parser = argparse.ArgumentParser()
11
+ parser.add_argument('--base-dir', type=str)
12
+ parser.add_argument('--result-file', type=str)
13
+ parser.add_argument('--output-file', type=str)
14
+ parser.add_argument('--output-result', type=str)
15
+ parser.add_argument('--split', type=str, default='test')
16
+ parser.add_argument('--options', type=list, default=["A", "B", "C", "D", "E"])
17
+ return parser.parse_args()
18
+
19
+
20
+ def convert_caps(results):
21
+ fakecaps = []
22
+ for result in results:
23
+ image_id = result['question_id']
24
+ caption = result['text']
25
+ fakecaps.append({"image_id": int(image_id), "caption": caption})
26
+ return fakecaps
27
+
28
+
29
+ def get_pred_idx(prediction, choices, options):
30
+ """
31
+ Get the index (e.g. 2) from the prediction (e.g. 'C')
32
+ """
33
+ if prediction in options[:len(choices)]:
34
+ return options.index(prediction)
35
+ else:
36
+ return random.choice(range(len(choices)))
37
+
38
+
39
+ if __name__ == "__main__":
40
+ args = get_args()
41
+
42
+ base_dir = args.base_dir
43
+ split_indices = json.load(open(os.path.join(base_dir, "pid_splits.json")))[args.split]
44
+ problems = json.load(open(os.path.join(base_dir, "problems.json")))
45
+ predictions = [json.loads(line) for line in open(args.result_file)]
46
+ predictions = {pred['question_id']: pred for pred in predictions}
47
+ split_problems = {idx: problems[idx] for idx in split_indices}
48
+
49
+ results = {'correct': [], 'incorrect': []}
50
+ sqa_results = {}
51
+ sqa_results['acc'] = None
52
+ sqa_results['correct'] = None
53
+ sqa_results['count'] = None
54
+ sqa_results['results'] = {}
55
+ sqa_results['outputs'] = {}
56
+
57
+ sqa_results['NAT'] = []
58
+ sqa_results['SOC'] = []
59
+ sqa_results['LAN'] = []
60
+ sqa_results['TXT'] = []
61
+ sqa_results['IMG'] = []
62
+ sqa_results['NO'] = []
63
+ sqa_results['G1-6'] = []
64
+ sqa_results['G7-12'] = []
65
+
66
+ for prob_id, prob in split_problems.items():
67
+ if prob_id not in predictions:
68
+ continue
69
+ pred = predictions[prob_id]
70
+ pred_text = pred['text']
71
+
72
+ pattern = re.compile(r'The answer is ([A-Z]).')
73
+ res = pattern.findall(pred_text)
74
+ if len(res) == 1:
75
+ answer = res[0] # 'A', 'B', ...
76
+ else:
77
+ answer = pred['pred']
78
+
79
+ pred_idx = get_pred_idx(answer, prob['choices'], args.options)
80
+
81
+ analysis = {
82
+ 'question_id': prob_id,
83
+ 'parsed_ans': answer,
84
+ 'ground_truth': args.options[prob['answer']],
85
+ 'question': pred['prompt'],
86
+ 'pred': pred_text,
87
+ 'is_multimodal': '<image>' in pred['prompt'],
88
+ }
89
+
90
+ sqa_results['results'][prob_id] = get_pred_idx(answer, prob['choices'], args.options)
91
+ sqa_results['outputs'][prob_id] = pred_text
92
+
93
+ if pred_idx == prob['answer']:
94
+ results['correct'].append(analysis)
95
+ cur_result = 1
96
+ else:
97
+ results['incorrect'].append(analysis)
98
+ cur_result = 0
99
+
100
+ if prob['subject'] == 'natural science':
101
+ sqa_results['NAT'].append(cur_result)
102
+ elif prob['subject'] == 'social science':
103
+ sqa_results['SOC'].append(cur_result)
104
+ elif prob['subject'] == 'language science':
105
+ sqa_results['LAN'].append(cur_result)
106
+
107
+ if prob['hint']:
108
+ sqa_results['TXT'].append(cur_result)
109
+ if prob['image']:
110
+ sqa_results['IMG'].append(cur_result)
111
+ if not prob['hint'] and not prob['image']:
112
+ sqa_results['NO'].append(cur_result)
113
+
114
+ if prob['grade'] in ['grade1', 'grade2', 'grade3', 'grade4', 'grade5', 'grade6']:
115
+ sqa_results['G1-6'].append(cur_result)
116
+ elif prob['grade'] in ['grade7', 'grade8', 'grade9', 'grade10', 'grade11', 'grade12']:
117
+ sqa_results['G7-12'].append(cur_result)
118
+
119
+
120
+ correct = len(results['correct'])
121
+ total = len(results['correct']) + len(results['incorrect'])
122
+ print(f'Total: {total}, Correct: {correct}, Accuracy: {correct / total * 100:.2f}%')
123
+
124
+ print(f'Subject NAT: {len(sqa_results["NAT"])}, Correct: {sum(sqa_results["NAT"])}, Accuracy: {np.mean(sqa_results["NAT"]) * 100:.2f}%')
125
+ print(f'Subject SOC: {len(sqa_results["SOC"])}, Correct: {sum(sqa_results["SOC"])}, Accuracy: {np.mean(sqa_results["SOC"]) * 100:.2f}%')
126
+ print(f'Subject LAN: {len(sqa_results["LAN"])}, Correct: {sum(sqa_results["LAN"])}, Accuracy: {np.mean(sqa_results["LAN"]) * 100:.2f}%')
127
+
128
+ print(f'Context Modality TXT: {len(sqa_results["TXT"])}, Correct: {sum(sqa_results["TXT"])}, Accuracy: {np.mean(sqa_results["TXT"]) * 100:.2f}%')
129
+ print(f'Context Modality IMG: {len(sqa_results["IMG"])}, Correct: {sum(sqa_results["IMG"])}, Accuracy: {np.mean(sqa_results["IMG"]) * 100:.2f}%')
130
+ print(f'Context Modality NO: {len(sqa_results["NO"])}, Correct: {sum(sqa_results["NO"])}, Accuracy: {np.mean(sqa_results["NO"]) * 100:.2f}%')
131
+
132
+ print(f'Grade G1-6: {len(sqa_results["G1-6"])}, Correct: {sum(sqa_results["G1-6"])}, Accuracy: {np.mean(sqa_results["G1-6"]) * 100:.2f}%')
133
+ print(f'Grade G7-12: {len(sqa_results["G7-12"])}, Correct: {sum(sqa_results["G7-12"])}, Accuracy: {np.mean(sqa_results["G7-12"]) * 100:.2f}%')
134
+
135
+ sqa_results['acc'] = correct / total * 100
136
+ sqa_results['correct'] = correct
137
+ sqa_results['count'] = total
138
+
139
+ with open(args.output_file, 'w') as f:
140
+ json.dump(results, f, indent=2)
141
+ with open(args.output_result, 'w') as f:
142
+ json.dump(sqa_results, f, indent=2)
ChatUniVi/eval/evaluate/evaluate_video_qa.py ADDED
@@ -0,0 +1,212 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import openai
2
+ import os
3
+ import argparse
4
+ import json
5
+ import jsonlines
6
+ import ast
7
+ from multiprocessing.pool import Pool
8
+
9
+
10
+ def read_jsonl(file):
11
+ results = []
12
+ with open(file, encoding='utf-8') as f:
13
+ for item in jsonlines.Reader(f):
14
+ results.append(item)
15
+ return results
16
+
17
+
18
+ def parse_args():
19
+ parser = argparse.ArgumentParser(description="question-answer-generation-using-gpt-3")
20
+ parser.add_argument("--pred_path", required=True, help="The path to file containing prediction.")
21
+ parser.add_argument("--output_dir", required=True, help="The path to save annotation json files.")
22
+ parser.add_argument("--output_json", required=True, help="The path to save annotation final combined json file.")
23
+ parser.add_argument("--api_key", required=True, help="OpenAI API key.")
24
+ parser.add_argument("--num_tasks", required=True, type=int, help="Number of splits.")
25
+ args = parser.parse_args()
26
+ return args
27
+
28
+
29
+ def annotate(prediction_set, caption_files, output_dir):
30
+ """
31
+ Evaluates question and answer pairs using GPT-3
32
+ Returns a score for correctness.
33
+ """
34
+ for file in caption_files:
35
+ key = file[:-5] # Strip file extension
36
+ qa_set = prediction_set[key]
37
+ question = qa_set['q']
38
+ answer = qa_set['a']
39
+ pred = qa_set['pred']
40
+ try:
41
+ # Compute the correctness score
42
+ completion = openai.ChatCompletion.create(
43
+ model="gpt-3.5-turbo",
44
+ messages=[
45
+ {
46
+ "role": "system",
47
+ "content":
48
+ "You are an intelligent chatbot designed for evaluating the correctness of generative outputs for question-answer pairs. "
49
+ "Your task is to compare the predicted answer with the correct answer and determine if they match meaningfully. Here's how you can accomplish the task:"
50
+ "------"
51
+ "##INSTRUCTIONS: "
52
+ "- Focus on the meaningful match between the predicted answer and the correct answer.\n"
53
+ "- Consider synonyms or paraphrases as valid matches.\n"
54
+ "- Evaluate the correctness of the prediction compared to the answer."
55
+ },
56
+ {
57
+ "role": "user",
58
+ "content":
59
+ "Please evaluate the following video-based question-answer pair:\n\n"
60
+ f"Question: {question}\n"
61
+ f"Correct Answer: {answer}\n"
62
+ f"Predicted Answer: {pred}\n\n"
63
+ "Provide your evaluation only as a yes/no and score where the score is an integer value between 0 and 5, with 5 indicating the highest meaningful match. "
64
+ "Please generate the response in the form of a Python dictionary string with keys 'pred' and 'score', where value of 'pred' is a string of 'yes' or 'no' and value of 'score' is in INTEGER, not STRING."
65
+ "DO NOT PROVIDE ANY OTHER OUTPUT TEXT OR EXPLANATION. Only provide the Python dictionary string. "
66
+ "For example, your response should look like this: {'pred': 'yes', 'score': 4.8}."
67
+ }
68
+ ]
69
+ )
70
+ # Convert response to a Python dictionary.
71
+ response_message = completion["choices"][0]["message"]["content"]
72
+ response_dict = ast.literal_eval(response_message)
73
+ result_qa_pair = [response_dict, qa_set]
74
+
75
+ # Save the question-answer pairs to a json file.
76
+ with open(f"{output_dir}/{key}.json", "w") as f:
77
+ json.dump(result_qa_pair, f)
78
+
79
+ except Exception as e:
80
+ print(f"Error processing file '{key}': {e}")
81
+
82
+
83
+ def main():
84
+ """
85
+ Main function to control the flow of the program.
86
+ """
87
+ # Parse arguments.
88
+ args = parse_args()
89
+
90
+ file = args.pred_path
91
+ try:
92
+ pred_contents = json.load(file)
93
+ except:
94
+ pred_contents = read_jsonl(file)
95
+
96
+ # Dictionary to store the count of occurrences for each video_id
97
+ video_id_counts = {}
98
+ new_pred_contents = []
99
+
100
+ # Iterate through each sample in pred_contents
101
+ for sample in pred_contents:
102
+ sample['video_name'] = 1
103
+ video_id = sample['video_name']
104
+ if video_id in video_id_counts:
105
+ video_id_counts[video_id] += 1
106
+ else:
107
+ video_id_counts[video_id] = 0
108
+
109
+ # Create a new sample with the modified key
110
+ new_sample = sample
111
+ new_sample['video_name'] = f"{video_id}_{video_id_counts[video_id]}"
112
+ new_pred_contents.append(new_sample)
113
+
114
+ # Generating list of id's and corresponding files
115
+ id_list = [x['video_name'] for x in new_pred_contents]
116
+ caption_files = [f"{id}.json" for id in id_list]
117
+
118
+ output_dir = args.output_dir
119
+ # Generate output directory if not exists.
120
+ if not os.path.exists(output_dir):
121
+ os.makedirs(output_dir)
122
+
123
+ # Preparing dictionary of question-answer sets
124
+ prediction_set = {}
125
+ for sample in new_pred_contents:
126
+ id = sample['video_name']
127
+ question = sample['prompt']
128
+ answer = sample['answer']
129
+ pred = sample['text']
130
+ qa_set = {"q": question, "a": answer, "pred": pred}
131
+ prediction_set[id] = qa_set
132
+
133
+ # Set the OpenAI API key.
134
+ openai.api_key = args.api_key
135
+ num_tasks = args.num_tasks
136
+
137
+ # While loop to ensure that all captions are processed.
138
+ while True:
139
+ try:
140
+ # Files that have not been processed yet.
141
+ completed_files = os.listdir(output_dir)
142
+ print(f"completed_files: {len(completed_files)}")
143
+
144
+ # Files that have not been processed yet.
145
+ incomplete_files = [f for f in caption_files if f not in completed_files]
146
+ print(f"incomplete_files: {len(incomplete_files)}")
147
+
148
+ # Break the loop when there are no incomplete files
149
+ if len(incomplete_files) == 0:
150
+ break
151
+ if len(incomplete_files) <= num_tasks:
152
+ num_tasks = 1
153
+
154
+ # Split tasks into parts.
155
+ part_len = len(incomplete_files) // num_tasks
156
+ all_parts = [incomplete_files[i:i + part_len] for i in range(0, len(incomplete_files), part_len)]
157
+ task_args = [(prediction_set, part, args.output_dir) for part in all_parts]
158
+
159
+ # Use a pool of workers to process the files in parallel.
160
+ with Pool() as pool:
161
+ pool.starmap(annotate, task_args)
162
+
163
+ except Exception as e:
164
+ print(f"Error: {e}")
165
+
166
+ # Combine all the processed files into one
167
+ combined_contents = {}
168
+ json_path = args.output_json
169
+
170
+ # Iterate through json files
171
+ for file_name in os.listdir(output_dir):
172
+ if file_name.endswith(".json"):
173
+ file_path = os.path.join(output_dir, file_name)
174
+ with open(file_path, "r") as json_file:
175
+ content = json.load(json_file)
176
+ combined_contents[file_name[:-5]] = content
177
+
178
+ # Write combined content to a json file
179
+ with open(json_path, "w") as json_file:
180
+ json.dump(combined_contents, json_file)
181
+ print("All evaluation completed!")
182
+
183
+ # Calculate average score and accuracy
184
+ score_sum = 0
185
+ count = 0
186
+ yes_count = 0
187
+ no_count = 0
188
+ for key, result in combined_contents.items():
189
+ # Computing score
190
+ count += 1
191
+ score_match = result[0]['score']
192
+ score = int(score_match)
193
+ score_sum += score
194
+
195
+ # Computing accuracy
196
+ pred = result[0]['pred']
197
+ if "yes" in pred.lower():
198
+ yes_count += 1
199
+ elif "no" in pred.lower():
200
+ no_count += 1
201
+
202
+ average_score = score_sum / count
203
+ accuracy = yes_count / (yes_count + no_count)
204
+ print("Yes count:", yes_count)
205
+ print("No count:", no_count)
206
+ print("Accuracy:", accuracy)
207
+ print("Average score:", average_score)
208
+
209
+
210
+ if __name__ == "__main__":
211
+ main()
212
+
ChatUniVi/eval/evaluate/evaluate_video_qa_mi.py ADDED
@@ -0,0 +1,214 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import openai
2
+ import os
3
+ import argparse
4
+ import json
5
+ import jsonlines
6
+ import ast
7
+ from multiprocessing.pool import Pool
8
+
9
+
10
+ def read_jsonl(file):
11
+ results = []
12
+ with open(file, encoding='utf-8') as f:
13
+ for item in jsonlines.Reader(f):
14
+ results.append(item)
15
+ return results
16
+
17
+
18
+ def parse_args():
19
+ parser = argparse.ArgumentParser(description="question-answer-generation-using-gpt-3")
20
+ parser.add_argument("--pred_path", required=True, help="The path to file containing prediction.")
21
+ parser.add_argument("--output_dir", required=True, help="The path to save annotation json files.")
22
+ parser.add_argument("--output_json", required=True, help="The path to save annotation final combined json file.")
23
+ parser.add_argument("--api_key", required=True, help="OpenAI API key.")
24
+ parser.add_argument("--num_tasks", required=True, type=int, help="Number of splits.")
25
+ args = parser.parse_args()
26
+ return args
27
+
28
+
29
+ def annotate(prediction_set, caption_files, output_dir):
30
+ """
31
+ Evaluates question and answer pairs using GPT-3
32
+ Returns a score for correctness.
33
+ """
34
+ for file in caption_files:
35
+ key = file[:-5] # Strip file extension
36
+ qa_set = prediction_set[key]
37
+ question = qa_set['q']
38
+ answer = qa_set['a']
39
+ pred = qa_set['pred']
40
+ try:
41
+ # Compute the correctness score
42
+ completion = openai.ChatCompletion.create(
43
+ model="gpt-3.5-turbo",
44
+ messages=[
45
+ {
46
+ "role": "system",
47
+ "content":
48
+ "You are an intelligent chatbot designed for evaluating the correctness of generative outputs for question-answer pairs. "
49
+ "Your task is to compare the predicted answer with the correct answer and determine if they match meaningfully. Here's how you can accomplish the task:"
50
+ "------"
51
+ "##INSTRUCTIONS: "
52
+ "- Focus on the meaningful match between the predicted answer and the correct answer.\n"
53
+ "- Consider synonyms or paraphrases as valid matches.\n"
54
+ "- Evaluate the correctness of the prediction compared to the answer."
55
+ },
56
+ {
57
+ "role": "user",
58
+ "content":
59
+ "Please evaluate the following video-based question-answer pair:\n\n"
60
+ f"Question: {question}\n"
61
+ f"Correct Answer: {answer}\n"
62
+ f"Predicted Answer: {pred}\n\n"
63
+ "Provide your evaluation only as a yes/no and score where the score is an integer value between 0 and 5, with 5 indicating the highest meaningful match. "
64
+ "Please generate the response in the form of a Python dictionary string with keys 'pred' and 'score', where value of 'pred' is a string of 'yes' or 'no' and value of 'score' is in INTEGER, not STRING."
65
+ "DO NOT PROVIDE ANY OTHER OUTPUT TEXT OR EXPLANATION. Only provide the Python dictionary string. "
66
+ "For example, your response should look like this: {'pred': 'yes', 'score': 4.8}."
67
+ }
68
+ ]
69
+ )
70
+ # Convert response to a Python dictionary.
71
+ response_message = completion["choices"][0]["message"]["content"]
72
+ response_dict = ast.literal_eval(response_message)
73
+ result_qa_pair = [response_dict, qa_set]
74
+
75
+ # Save the question-answer pairs to a json file.
76
+ with open(f"{output_dir}/{key}.json", "w") as f:
77
+ json.dump(result_qa_pair, f)
78
+
79
+ except Exception as e:
80
+ print(f"Error processing file '{key}': {e}")
81
+
82
+
83
+ def main():
84
+ """
85
+ Main function to control the flow of the program.
86
+ """
87
+ # Parse arguments.
88
+ args = parse_args()
89
+
90
+ file = args.pred_path
91
+ try:
92
+ pred_contents = json.load(file)
93
+ except:
94
+ pred_contents = read_jsonl(file)
95
+
96
+ # Dictionary to store the count of occurrences for each video_id
97
+ video_id_counts = {}
98
+ new_pred_contents = []
99
+
100
+ # Iterate through each sample in pred_contents
101
+ for sample in pred_contents:
102
+ sample['video_name'] = 1
103
+ video_id = sample['video_name']
104
+ if video_id in video_id_counts:
105
+ video_id_counts[video_id] += 1
106
+ else:
107
+ video_id_counts[video_id] = 0
108
+
109
+ # Create a new sample with the modified key
110
+ new_sample = sample
111
+ new_sample['video_name'] = f"{video_id}_{video_id_counts[video_id]}"
112
+ new_pred_contents.append(new_sample)
113
+
114
+ # Generating list of id's and corresponding files
115
+ id_list = [x['video_name'] for x in new_pred_contents]
116
+ caption_files = [f"{id}.json" for id in id_list]
117
+
118
+ output_dir = args.output_dir
119
+ # Generate output directory if not exists.
120
+ if not os.path.exists(output_dir):
121
+ os.makedirs(output_dir)
122
+
123
+ # Preparing dictionary of question-answer sets
124
+ prediction_set = {}
125
+ for sample in new_pred_contents:
126
+ id = sample['video_name']
127
+ question = sample['prompt']
128
+ answer = sample['answer']
129
+ pred = sample['text']
130
+ qa_set = {"q": question, "a": answer, "pred": pred}
131
+ prediction_set[id] = qa_set
132
+
133
+ # Set the OpenAI API key.
134
+ openai.api_key = args.api_key
135
+ openai.api_base = 'http://10.234.32.86:8000/lumi-proxy'
136
+ openai.api_key = "Don't Panic"
137
+ num_tasks = args.num_tasks
138
+
139
+ # While loop to ensure that all captions are processed.
140
+ while True:
141
+ try:
142
+ # Files that have not been processed yet.
143
+ completed_files = os.listdir(output_dir)
144
+ print(f"completed_files: {len(completed_files)}")
145
+
146
+ # Files that have not been processed yet.
147
+ incomplete_files = [f for f in caption_files if f not in completed_files]
148
+ print(f"incomplete_files: {len(incomplete_files)}")
149
+
150
+ # Break the loop when there are no incomplete files
151
+ if len(incomplete_files) == 0:
152
+ break
153
+ if len(incomplete_files) <= num_tasks:
154
+ num_tasks = 1
155
+
156
+ # Split tasks into parts.
157
+ part_len = len(incomplete_files) // num_tasks
158
+ all_parts = [incomplete_files[i:i + part_len] for i in range(0, len(incomplete_files), part_len)]
159
+ task_args = [(prediction_set, part, args.output_dir) for part in all_parts]
160
+
161
+ # Use a pool of workers to process the files in parallel.
162
+ with Pool() as pool:
163
+ pool.starmap(annotate, task_args)
164
+
165
+ except Exception as e:
166
+ print(f"Error: {e}")
167
+
168
+ # Combine all the processed files into one
169
+ combined_contents = {}
170
+ json_path = args.output_json
171
+
172
+ # Iterate through json files
173
+ for file_name in os.listdir(output_dir):
174
+ if file_name.endswith(".json"):
175
+ file_path = os.path.join(output_dir, file_name)
176
+ with open(file_path, "r") as json_file:
177
+ content = json.load(json_file)
178
+ combined_contents[file_name[:-5]] = content
179
+
180
+ # Write combined content to a json file
181
+ with open(json_path, "w") as json_file:
182
+ json.dump(combined_contents, json_file)
183
+ print("All evaluation completed!")
184
+
185
+ # Calculate average score and accuracy
186
+ score_sum = 0
187
+ count = 0
188
+ yes_count = 0
189
+ no_count = 0
190
+ for key, result in combined_contents.items():
191
+ # Computing score
192
+ count += 1
193
+ score_match = result[0]['score']
194
+ score = int(score_match)
195
+ score_sum += score
196
+
197
+ # Computing accuracy
198
+ pred = result[0]['pred']
199
+ if "yes" in pred.lower():
200
+ yes_count += 1
201
+ elif "no" in pred.lower():
202
+ no_count += 1
203
+
204
+ average_score = score_sum / count
205
+ accuracy = yes_count / (yes_count + no_count)
206
+ print("Yes count:", yes_count)
207
+ print("No count:", no_count)
208
+ print("Accuracy:", accuracy)
209
+ print("Average score:", average_score)
210
+
211
+
212
+ if __name__ == "__main__":
213
+ main()
214
+
ChatUniVi/eval/evaluate/summarize_gpt_review.py ADDED
@@ -0,0 +1,67 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import json
2
+ import os
3
+ from collections import defaultdict
4
+ import numpy as np
5
+ import argparse
6
+
7
+
8
+ def parse_args():
9
+ parser = argparse.ArgumentParser(description='ChatGPT-based QA evaluation.')
10
+ parser.add_argument('-d', '--dir', default=None)
11
+ parser.add_argument('-f', '--files', nargs='*', default=None)
12
+ parser.add_argument('-i', '--ignore', nargs='*', default=None)
13
+ return parser.parse_args()
14
+
15
+
16
+ if __name__ == '__main__0':
17
+ args = parse_args()
18
+
19
+ if args.ignore is not None:
20
+ args.ignore = [int(x) for x in args.ignore]
21
+
22
+ if args.files is not None and len(args.files) > 0:
23
+ review_files = args.files
24
+ else:
25
+ review_files = [x for x in os.listdir(args.dir) if x.endswith('.jsonl') and (x.startswith('gpt4_text') or x.startswith('reviews_') or x.startswith('review_'))]
26
+
27
+ for review_file in sorted(review_files):
28
+ config = os.path.basename(review_file).replace('gpt4_text_', '').replace('.jsonl', '')
29
+ scores = defaultdict(list)
30
+ print(config)
31
+ with open(os.path.join(args.dir, review_file) if args.dir is not None else review_file) as f:
32
+ for review_str in f:
33
+ review = json.loads(review_str)
34
+ if args.ignore is not None and review['question_id'] in args.ignore:
35
+ continue
36
+ if 'category' in review:
37
+ scores[review['category']].append(review['tuple'])
38
+ scores['all'].append(review['tuple'])
39
+ else:
40
+ if 'tuple' in review:
41
+ scores['all'].append(review['tuple'])
42
+ else:
43
+ scores['all'].append(review['score'])
44
+ for k, v in sorted(scores.items()):
45
+ stats = np.asarray(v).mean(0).tolist()
46
+ stats = [round(x, 3) for x in stats]
47
+ # print(k, stats, round(stats[1]/stats[0]*100, 1))
48
+ print(k, round(stats[1]/stats[0]*100, 1))
49
+ print('=================================')
50
+
51
+
52
+ if __name__ == '__main__':
53
+ args = parse_args()
54
+
55
+ scores = defaultdict(list)
56
+ print(f'GPT-4 vs. {args.dir}')
57
+
58
+ with open(args.dir) as f:
59
+ for review_str in f:
60
+ review = json.loads(review_str)
61
+ scores[review['category']].append(review['tuple'])
62
+ scores['all'].append(review['tuple'])
63
+ for k, v in scores.items():
64
+ stats = np.asarray(v).mean(0).tolist()
65
+ stats = [round(x, 3) for x in stats]
66
+ print(k, stats, round(stats[1]/stats[0]*100, 1))
67
+ print('=================================')
ChatUniVi/eval/model_coco_vqa.py ADDED
@@ -0,0 +1,220 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import argparse
2
+ import torch
3
+ import os
4
+ import json
5
+ from tqdm import tqdm
6
+ import shortuuid
7
+ from ChatUniVi.constants import *
8
+ from ChatUniVi.conversation import conv_templates, SeparatorStyle
9
+ from ChatUniVi.model.builder import load_pretrained_model
10
+ from ChatUniVi.utils import disable_torch_init
11
+ from ChatUniVi.mm_utils import tokenizer_image_token, get_model_name_from_path, KeywordsStoppingCriteria
12
+ from PIL import Image
13
+ import math
14
+ from abc import ABC
15
+ import numpy as np
16
+ import jsonlines
17
+
18
+
19
+ def get_acc(file):
20
+ acc, num = 0, 0
21
+ yes, no, fail = 0, 0, 0
22
+ tp, fp, fn, tn = 0, 0, 0, 0
23
+
24
+ with open(file, "r", encoding="utf8") as f:
25
+ for item in jsonlines.Reader(f):
26
+ num += 1
27
+ if "Yes" in item["text"] or "yes" in item["text"]:
28
+ yes += 1
29
+ if "Yes" in item["label"] or "yes" in item["label"]:
30
+ acc += 1
31
+ tp += 1
32
+ else:
33
+ fp += 1
34
+
35
+ elif "No" in item["text"] or "no" in item["text"]:
36
+ no += 1
37
+ if "No" in item["label"] or "no" in item["label"]:
38
+ acc += 1
39
+ tn += 1
40
+ else:
41
+ fn += 1
42
+ else:
43
+ fail += 1
44
+
45
+ result = {
46
+ "acc": acc / num,
47
+ "yes": yes / num,
48
+ "no": no / num,
49
+ "fail": fail / num,
50
+ "precision": tp / (tp + fp),
51
+ "recall": tp / (tp + fn),
52
+ }
53
+ result["F1-score"] = 2 * result["precision"] * result["recall"] / (result["precision"] + result["recall"])
54
+ print("\n========================================================================")
55
+ print(file)
56
+ print(result)
57
+ print("========================================================================\n")
58
+ return result
59
+
60
+
61
+ def split_list(lst, n):
62
+ """Split a list into n (roughly) equal-sized chunks"""
63
+ chunk_size = math.ceil(len(lst) / n) # integer division
64
+ return [lst[i:i+chunk_size] for i in range(0, len(lst), chunk_size)]
65
+
66
+
67
+ def get_chunk(lst, n, k):
68
+ chunks = split_list(lst, n)
69
+ return chunks[k]
70
+
71
+
72
+ class LogitsProcessor(ABC):
73
+ """Abstract base class for all logit processors that can be applied during generation."""
74
+ def __call__(self, input_ids: torch.LongTensor, scores: torch.FloatTensor) -> torch.FloatTensor:
75
+ """Torch method for processing logits."""
76
+ raise NotImplementedError(
77
+ f"{self.__class__} is an abstract class. Only classes inheriting this class can be called."
78
+ )
79
+
80
+
81
+ def eval_model(args):
82
+ # Model
83
+ disable_torch_init()
84
+ model_path = os.path.expanduser(args.model_path)
85
+ model_name = "ChatUniVi"
86
+ tokenizer, model, image_processor, context_len = load_pretrained_model(model_path, args.model_base, model_name)
87
+
88
+ mm_use_im_start_end = getattr(model.config, "mm_use_im_start_end", False)
89
+ mm_use_im_patch_token = getattr(model.config, "mm_use_im_patch_token", True)
90
+ if mm_use_im_patch_token:
91
+ tokenizer.add_tokens([DEFAULT_IMAGE_PATCH_TOKEN], special_tokens=True)
92
+ if mm_use_im_start_end:
93
+ tokenizer.add_tokens([DEFAULT_IM_START_TOKEN, DEFAULT_IM_END_TOKEN], special_tokens=True)
94
+ model.resize_token_embeddings(len(tokenizer))
95
+
96
+ vision_tower = model.get_vision_tower()
97
+ if not vision_tower.is_loaded:
98
+ vision_tower.load_model()
99
+ image_processor = vision_tower.image_processor
100
+
101
+ questions = [json.loads(q) for q in open(os.path.expanduser(args.question_file), "r")]
102
+ questions = get_chunk(questions, args.num_chunks, args.chunk_idx)
103
+ answers_file = os.path.expanduser(args.answers_file)
104
+ os.makedirs(os.path.dirname(answers_file), exist_ok=True)
105
+ ans_file = open(answers_file, "w")
106
+ for line in tqdm(questions):
107
+ try:
108
+ idx = line["question_id"]
109
+ image_file = line["image"]
110
+ qs = line["text"]
111
+ label = line["label"]
112
+
113
+ cur_prompt = qs
114
+ if model.config.mm_use_im_start_end:
115
+ qs = DEFAULT_IM_START_TOKEN + DEFAULT_IMAGE_TOKEN + DEFAULT_IM_END_TOKEN + '\n' + qs
116
+ else:
117
+ qs = DEFAULT_IMAGE_TOKEN + '\n' + qs
118
+
119
+ conv = conv_templates[args.conv_mode].copy()
120
+ conv.append_message(conv.roles[0], qs)
121
+ conv.append_message(conv.roles[1], None)
122
+ prompt = conv.get_prompt()
123
+
124
+ input_ids = tokenizer_image_token(prompt, tokenizer, IMAGE_TOKEN_INDEX, return_tensors='pt').unsqueeze(0).cuda()
125
+
126
+ image = Image.open(os.path.join(args.image_folder, image_file))
127
+
128
+ image_tensor = image_processor.preprocess(image, return_tensors='pt')['pixel_values'][0]
129
+
130
+ stop_str = conv.sep if conv.sep_style != SeparatorStyle.TWO else conv.sep2
131
+ keywords = [stop_str]
132
+ stopping_criteria = KeywordsStoppingCriteria(keywords, tokenizer, input_ids)
133
+
134
+ if args.answer_prompter:
135
+ with torch.inference_mode():
136
+ output_ids = model.generate(
137
+ input_ids,
138
+ images=image_tensor.unsqueeze(0).half().cuda(),
139
+ do_sample=True,
140
+ temperature=args.temperature,
141
+ top_p=args.top_p,
142
+ num_beams=args.num_beams,
143
+ max_new_tokens=1024,
144
+ use_cache=True,
145
+ stopping_criteria=[stopping_criteria]
146
+ )
147
+
148
+ input_token_len = input_ids.shape[1]
149
+ n_diff_input_output = (input_ids != output_ids[:, :input_token_len]).sum().item()
150
+ if n_diff_input_output > 0:
151
+ print(f'[Warning] {n_diff_input_output} output_ids are not the same as the input_ids')
152
+ outputs = tokenizer.batch_decode(output_ids[:, input_token_len:], skip_special_tokens=True)[0]
153
+ outputs = outputs.strip()
154
+ if outputs.endswith(stop_str):
155
+ outputs = outputs[:-len(stop_str)]
156
+ outputs = outputs.strip()
157
+
158
+ outputs_reasoning = outputs
159
+ input_ids = tokenizer_image_token(prompt + outputs_reasoning + ' The answer is ', tokenizer, IMAGE_TOKEN_INDEX, return_tensors='pt').unsqueeze(0).cuda()
160
+
161
+ else:
162
+ outputs_reasoning = ""
163
+
164
+ with torch.inference_mode():
165
+ output_ids = model.generate(
166
+ input_ids,
167
+ images=image_tensor.unsqueeze(0).half().cuda(),
168
+ do_sample=True,
169
+ temperature=args.temperature,
170
+ top_p=args.top_p,
171
+ num_beams=args.num_beams,
172
+ output_scores=True,
173
+ return_dict_in_generate=True,
174
+ max_new_tokens=1024,
175
+ use_cache=True,
176
+ stopping_criteria=[stopping_criteria]
177
+ )
178
+
179
+ scores = output_ids.scores[0][0].to(torch.float32)
180
+ label_score = []
181
+ candidates = ["yes", "Yes", "no", "No"]
182
+ for can in candidates:
183
+ can_id = tokenizer.encode(can)[-1]
184
+ label_score.append(scores[can_id].item())
185
+ outputs = candidates[np.argmax(label_score)]
186
+
187
+ ans_id = shortuuid.uuid()
188
+ ans_file.write(json.dumps({"question_id": idx,
189
+ "prompt": cur_prompt,
190
+ "outputs_reasoning": outputs_reasoning + ' The answer is ' + outputs,
191
+ "text": outputs,
192
+ "label": label,
193
+ "answer_id": ans_id,
194
+ "model_id": model_name,
195
+ "metadata": {}}) + "\n")
196
+ ans_file.flush()
197
+ except Exception as e:
198
+ print(f"Error processing image file '{image_file}': {e}")
199
+ ans_file.close()
200
+ get_acc(answers_file)
201
+
202
+
203
+ if __name__ == "__main__":
204
+ parser = argparse.ArgumentParser()
205
+ parser.add_argument("--model-path", type=str, default="facebook/opt-350m")
206
+ parser.add_argument("--model-base", type=str, default=None)
207
+ parser.add_argument("--image-folder", type=str, default="")
208
+ parser.add_argument("--question-file", type=str, default="tables/question.jsonl")
209
+ parser.add_argument("--answers-file", type=str, default="answer.jsonl")
210
+ parser.add_argument("--conv-mode", type=str, default="simpleqa")
211
+ parser.add_argument("--num-chunks", type=int, default=1)
212
+ parser.add_argument("--chunk-idx", type=int, default=0)
213
+ parser.add_argument("--temperature", type=float, default=0.2)
214
+ parser.add_argument("--top_p", type=float, default=None)
215
+ parser.add_argument("--num_beams", type=int, default=1)
216
+ parser.add_argument("--model_use", type=str, default="BASE")
217
+ parser.add_argument("--answer-prompter", action="store_true")
218
+ args = parser.parse_args()
219
+
220
+ eval_model(args)
ChatUniVi/eval/model_video_consistency.py ADDED
@@ -0,0 +1,252 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import argparse
2
+ import torch
3
+ import os
4
+ import json
5
+ from tqdm import tqdm
6
+ import shortuuid
7
+ from ChatUniVi.constants import *
8
+ from ChatUniVi.conversation import conv_templates, SeparatorStyle
9
+ from ChatUniVi.model.builder import load_pretrained_model
10
+ from ChatUniVi.utils import disable_torch_init
11
+ from ChatUniVi.mm_utils import tokenizer_image_token, get_model_name_from_path, KeywordsStoppingCriteria
12
+ from PIL import Image
13
+ import math
14
+ from decord import VideoReader, cpu
15
+ import numpy as np
16
+
17
+
18
+ def split_list(lst, n):
19
+ """Split a list into n (roughly) equal-sized chunks"""
20
+ chunk_size = math.ceil(len(lst) / n) # integer division
21
+ return [lst[i:i+chunk_size] for i in range(0, len(lst), chunk_size)]
22
+
23
+
24
+ def get_chunk(lst, n, k):
25
+ chunks = split_list(lst, n)
26
+ return chunks[k]
27
+
28
+
29
+ def _get_rawvideo_dec(video_path, image_processor, max_frames=MAX_IMAGE_LENGTH, image_resolution=224, video_framerate=1, s=None, e=None):
30
+ # speed up video decode via decord.
31
+ video_mask = np.zeros(max_frames, dtype=np.int64)
32
+ max_video_length = 0
33
+
34
+ # T x 3 x H x W
35
+ video = np.zeros((max_frames, 3, image_resolution, image_resolution), dtype=np.float64)
36
+
37
+ if s is None:
38
+ start_time, end_time = None, None
39
+ else:
40
+ start_time = int(s)
41
+ end_time = int(e)
42
+ start_time = start_time if start_time >= 0. else 0.
43
+ end_time = end_time if end_time >= 0. else 0.
44
+ if start_time > end_time:
45
+ start_time, end_time = end_time, start_time
46
+ elif start_time == end_time:
47
+ end_time = start_time + 1
48
+
49
+ if os.path.exists(video_path):
50
+ vreader = VideoReader(video_path, ctx=cpu(0))
51
+ else:
52
+ print(video_path)
53
+ raise FileNotFoundError
54
+
55
+ fps = vreader.get_avg_fps()
56
+ f_start = 0 if start_time is None else int(start_time * fps)
57
+ f_end = int(min(1000000000 if end_time is None else end_time * fps, len(vreader) - 1))
58
+ num_frames = f_end - f_start + 1
59
+ if num_frames > 0:
60
+ # T x 3 x H x W
61
+ sample_fps = int(video_framerate)
62
+ t_stride = int(round(float(fps) / sample_fps))
63
+
64
+ all_pos = list(range(f_start, f_end + 1, t_stride))
65
+ if len(all_pos) > max_frames:
66
+ sample_pos = [all_pos[_] for _ in np.linspace(0, len(all_pos) - 1, num=max_frames, dtype=int)]
67
+ else:
68
+ sample_pos = all_pos
69
+
70
+ patch_images = [Image.fromarray(f) for f in vreader.get_batch(sample_pos).asnumpy()]
71
+
72
+ patch_images = torch.stack([image_processor.preprocess(img, return_tensors='pt')['pixel_values'][0] for img in patch_images])
73
+ slice_len = patch_images.shape[0]
74
+
75
+ max_video_length = max_video_length if max_video_length > slice_len else slice_len
76
+ if slice_len < 1:
77
+ pass
78
+ else:
79
+ video[:slice_len, ...] = patch_images
80
+
81
+ return patch_images, video_mask
82
+ else:
83
+ print("video path: {} error.".format(video_path))
84
+
85
+ video_mask[:max_video_length] = [1] * max_video_length
86
+
87
+ return torch.from_numpy(video), video_mask
88
+
89
+
90
+ def eval_model(args):
91
+ # Model
92
+ disable_torch_init()
93
+ model_path = os.path.expanduser(args.model_path)
94
+ model_name = "ChatUniVi"
95
+ tokenizer, model, image_processor, context_len = load_pretrained_model(model_path, args.model_base, model_name)
96
+
97
+ mm_use_im_start_end = getattr(model.config, "mm_use_im_start_end", False)
98
+ mm_use_im_patch_token = getattr(model.config, "mm_use_im_patch_token", True)
99
+ if mm_use_im_patch_token:
100
+ tokenizer.add_tokens([DEFAULT_IMAGE_PATCH_TOKEN], special_tokens=True)
101
+ if mm_use_im_start_end:
102
+ tokenizer.add_tokens([DEFAULT_IM_START_TOKEN, DEFAULT_IM_END_TOKEN], special_tokens=True)
103
+ model.resize_token_embeddings(len(tokenizer))
104
+
105
+ vision_tower = model.get_vision_tower()
106
+ if not vision_tower.is_loaded:
107
+ vision_tower.load_model()
108
+ image_processor = vision_tower.image_processor
109
+
110
+ if model.config.config["use_cluster"]:
111
+ for n, m in model.named_modules():
112
+ m = m.to(dtype=torch.bfloat16)
113
+
114
+ # Load the ground truth file
115
+ with open(args.question_file) as file:
116
+ gt_contents = json.load(file)
117
+
118
+ answers_file = os.path.expanduser(args.answers_file)
119
+ os.makedirs(os.path.dirname(answers_file), exist_ok=True)
120
+ ans_file = open(answers_file, "w")
121
+
122
+ video_formats = ['.mp4', '.avi', '.mov', '.mkv']
123
+
124
+ # Iterate over each sample in the ground truth file
125
+ for sample in tqdm(gt_contents):
126
+ video_name = sample['video_name']
127
+ question_1 = sample['Q1']
128
+ question_2 = sample['Q2']
129
+
130
+ # Load the video file
131
+ for fmt in video_formats: # Added this line
132
+ temp_path = os.path.join(args.video_folder, f"{video_name}{fmt}")
133
+ if os.path.exists(temp_path):
134
+ video_path = temp_path
135
+ break
136
+
137
+ # Check if the video exists
138
+ if video_path is not None: # Modified this line
139
+ video_frames, _ = _get_rawvideo_dec(video_path, image_processor, max_frames=MAX_IMAGE_LENGTH)
140
+
141
+ qs = question_1
142
+ if model.config.mm_use_im_start_end:
143
+ qs = DEFAULT_IM_START_TOKEN + DEFAULT_IMAGE_TOKEN * MAX_IMAGE_LENGTH + DEFAULT_IM_END_TOKEN + '\n' + qs
144
+ else:
145
+ qs = DEFAULT_IMAGE_TOKEN * MAX_IMAGE_LENGTH + '\n' + qs
146
+
147
+ conv = conv_templates[args.conv_mode].copy()
148
+ conv.append_message(conv.roles[0], qs)
149
+ conv.append_message(conv.roles[1], None)
150
+ prompt = conv.get_prompt()
151
+
152
+ input_ids = tokenizer_image_token(prompt, tokenizer, IMAGE_TOKEN_INDEX, return_tensors='pt').unsqueeze(
153
+ 0).cuda()
154
+
155
+ stop_str = conv.sep if conv.sep_style != SeparatorStyle.TWO else conv.sep2
156
+ keywords = [stop_str]
157
+ stopping_criteria = KeywordsStoppingCriteria(keywords, tokenizer, input_ids)
158
+
159
+ with torch.inference_mode():
160
+ output_ids = model.generate(
161
+ input_ids,
162
+ images=video_frames.half().cuda(),
163
+ do_sample=True,
164
+ temperature=args.temperature,
165
+ top_p=args.top_p,
166
+ num_beams=args.num_beams,
167
+ max_new_tokens=1024,
168
+ use_cache=True,
169
+ stopping_criteria=[stopping_criteria])
170
+
171
+ input_token_len = input_ids.shape[1]
172
+ n_diff_input_output = (input_ids != output_ids[:, :input_token_len]).sum().item()
173
+ if n_diff_input_output > 0:
174
+ print(f'[Warning] {n_diff_input_output} output_ids are not the same as the input_ids')
175
+ outputs = tokenizer.batch_decode(output_ids[:, input_token_len:], skip_special_tokens=True)[0]
176
+ outputs = outputs.strip()
177
+ if outputs.endswith(stop_str):
178
+ outputs = outputs[:-len(stop_str)]
179
+ outputs_1 = outputs.strip()
180
+
181
+ qs = question_2
182
+ if model.config.mm_use_im_start_end:
183
+ qs = DEFAULT_IM_START_TOKEN + DEFAULT_IMAGE_TOKEN * MAX_IMAGE_LENGTH + DEFAULT_IM_END_TOKEN + '\n' + qs
184
+ else:
185
+ qs = DEFAULT_IMAGE_TOKEN * MAX_IMAGE_LENGTH + '\n' + qs
186
+
187
+ conv = conv_templates[args.conv_mode].copy()
188
+ conv.append_message(conv.roles[0], qs)
189
+ conv.append_message(conv.roles[1], None)
190
+ prompt = conv.get_prompt()
191
+
192
+ input_ids = tokenizer_image_token(prompt, tokenizer, IMAGE_TOKEN_INDEX, return_tensors='pt').unsqueeze(
193
+ 0).cuda()
194
+
195
+ stop_str = conv.sep if conv.sep_style != SeparatorStyle.TWO else conv.sep2
196
+ keywords = [stop_str]
197
+ stopping_criteria = KeywordsStoppingCriteria(keywords, tokenizer, input_ids)
198
+
199
+ with torch.inference_mode():
200
+ output_ids = model.generate(
201
+ input_ids,
202
+ images=torch.from_numpy(video_frames).half().cuda(),
203
+ do_sample=True,
204
+ temperature=args.temperature,
205
+ top_p=args.top_p,
206
+ num_beams=args.num_beams,
207
+ max_new_tokens=1024,
208
+ use_cache=True,
209
+ stopping_criteria=[stopping_criteria])
210
+
211
+ input_token_len = input_ids.shape[1]
212
+ n_diff_input_output = (input_ids != output_ids[:, :input_token_len]).sum().item()
213
+ if n_diff_input_output > 0:
214
+ print(f'[Warning] {n_diff_input_output} output_ids are not the same as the input_ids')
215
+ outputs = tokenizer.batch_decode(output_ids[:, input_token_len:], skip_special_tokens=True)[0]
216
+ outputs = outputs.strip()
217
+ if outputs.endswith(stop_str):
218
+ outputs = outputs[:-len(stop_str)]
219
+ outputs_2 = outputs.strip()
220
+
221
+ ans_id = shortuuid.uuid()
222
+ ans_file.write(json.dumps({"video_name": sample['video_name'],
223
+ "prompt_1": question_1,
224
+ "text_1": outputs_1,
225
+ "prompt_2": question_2,
226
+ "text_2": outputs_2,
227
+ "answer_id": ans_id,
228
+ "model_id": model_name,
229
+ "answer": sample['A'],
230
+ "metadata": {}}) + "\n")
231
+ ans_file.flush()
232
+
233
+ ans_file.close()
234
+
235
+
236
+ if __name__ == "__main__":
237
+ parser = argparse.ArgumentParser()
238
+ parser.add_argument("--model-path", type=str, default="facebook/opt-350m")
239
+ parser.add_argument("--model-base", type=str, default=None)
240
+ parser.add_argument("--video-folder", type=str, default="")
241
+ parser.add_argument("--question-file", type=str, default="tables/question.jsonl")
242
+ parser.add_argument("--answers-file", type=str, default="answer.jsonl")
243
+ parser.add_argument("--conv-mode", type=str, default="v1")
244
+ parser.add_argument("--num-chunks", type=int, default=1)
245
+ parser.add_argument("--chunk-idx", type=int, default=0)
246
+ parser.add_argument("--temperature", type=float, default=0.2)
247
+ parser.add_argument("--top_p", type=float, default=None)
248
+ parser.add_argument("--num_beams", type=int, default=1)
249
+ parser.add_argument("--model_use", type=str, default="BASE")
250
+ args = parser.parse_args()
251
+
252
+ eval_model(args)
ChatUniVi/eval/model_video_general.py ADDED
@@ -0,0 +1,213 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import argparse
2
+ import torch
3
+ import os
4
+ import json
5
+ from tqdm import tqdm
6
+ import shortuuid
7
+ from ChatUniVi.constants import *
8
+ from ChatUniVi.conversation import conv_templates, SeparatorStyle
9
+ from ChatUniVi.model.builder import load_pretrained_model
10
+ from ChatUniVi.utils import disable_torch_init
11
+ from ChatUniVi.mm_utils import tokenizer_image_token, get_model_name_from_path, KeywordsStoppingCriteria
12
+ from PIL import Image
13
+ import math
14
+ from decord import VideoReader, cpu
15
+ import numpy as np
16
+
17
+
18
+ def split_list(lst, n):
19
+ """Split a list into n (roughly) equal-sized chunks"""
20
+ chunk_size = math.ceil(len(lst) / n) # integer division
21
+ return [lst[i:i+chunk_size] for i in range(0, len(lst), chunk_size)]
22
+
23
+
24
+ def get_chunk(lst, n, k):
25
+ chunks = split_list(lst, n)
26
+ return chunks[k]
27
+
28
+
29
+ def _get_rawvideo_dec(video_path, image_processor, max_frames=MAX_IMAGE_LENGTH, image_resolution=224, video_framerate=1, s=None, e=None):
30
+ # speed up video decode via decord.
31
+ video_mask = np.zeros(max_frames, dtype=np.int64)
32
+ max_video_length = 0
33
+
34
+ # T x 3 x H x W
35
+ video = np.zeros((max_frames, 3, image_resolution, image_resolution), dtype=np.float64)
36
+
37
+ if s is None:
38
+ start_time, end_time = None, None
39
+ else:
40
+ start_time = int(s)
41
+ end_time = int(e)
42
+ start_time = start_time if start_time >= 0. else 0.
43
+ end_time = end_time if end_time >= 0. else 0.
44
+ if start_time > end_time:
45
+ start_time, end_time = end_time, start_time
46
+ elif start_time == end_time:
47
+ end_time = start_time + 1
48
+
49
+ if os.path.exists(video_path):
50
+ vreader = VideoReader(video_path, ctx=cpu(0))
51
+ else:
52
+ print(video_path)
53
+ raise FileNotFoundError
54
+
55
+ fps = vreader.get_avg_fps()
56
+ f_start = 0 if start_time is None else int(start_time * fps)
57
+ f_end = int(min(1000000000 if end_time is None else end_time * fps, len(vreader) - 1))
58
+ num_frames = f_end - f_start + 1
59
+ if num_frames > 0:
60
+ # T x 3 x H x W
61
+ sample_fps = int(video_framerate)
62
+ t_stride = int(round(float(fps) / sample_fps))
63
+
64
+ all_pos = list(range(f_start, f_end + 1, t_stride))
65
+ if len(all_pos) > max_frames:
66
+ sample_pos = [all_pos[_] for _ in np.linspace(0, len(all_pos) - 1, num=max_frames, dtype=int)]
67
+ else:
68
+ sample_pos = all_pos
69
+
70
+ patch_images = [Image.fromarray(f) for f in vreader.get_batch(sample_pos).asnumpy()]
71
+
72
+ patch_images = torch.stack([image_processor.preprocess(img, return_tensors='pt')['pixel_values'][0] for img in patch_images])
73
+ slice_len = patch_images.shape[0]
74
+
75
+ max_video_length = max_video_length if max_video_length > slice_len else slice_len
76
+ if slice_len < 1:
77
+ pass
78
+ else:
79
+ video[:slice_len, ...] = patch_images
80
+
81
+ return patch_images, video_mask
82
+ else:
83
+ print("video path: {} error.".format(video_path))
84
+
85
+ video_mask[:max_video_length] = [1] * max_video_length
86
+
87
+ return torch.from_numpy(video), video_mask
88
+
89
+
90
+ def eval_model(args):
91
+ # Model
92
+ disable_torch_init()
93
+ model_path = os.path.expanduser(args.model_path)
94
+ model_name = "ChatUniVi"
95
+ tokenizer, model, image_processor, context_len = load_pretrained_model(model_path, args.model_base, model_name)
96
+
97
+ mm_use_im_start_end = getattr(model.config, "mm_use_im_start_end", False)
98
+ mm_use_im_patch_token = getattr(model.config, "mm_use_im_patch_token", True)
99
+ if mm_use_im_patch_token:
100
+ tokenizer.add_tokens([DEFAULT_IMAGE_PATCH_TOKEN], special_tokens=True)
101
+ if mm_use_im_start_end:
102
+ tokenizer.add_tokens([DEFAULT_IM_START_TOKEN, DEFAULT_IM_END_TOKEN], special_tokens=True)
103
+ model.resize_token_embeddings(len(tokenizer))
104
+
105
+ vision_tower = model.get_vision_tower()
106
+ if not vision_tower.is_loaded:
107
+ vision_tower.load_model()
108
+ image_processor = vision_tower.image_processor
109
+
110
+ if model.config.config["use_cluster"]:
111
+ for n, m in model.named_modules():
112
+ m = m.to(dtype=torch.bfloat16)
113
+
114
+ # Load the ground truth file
115
+ with open(args.question_file) as file:
116
+ gt_contents = json.load(file)
117
+
118
+ answers_file = os.path.expanduser(args.answers_file)
119
+ os.makedirs(os.path.dirname(answers_file), exist_ok=True)
120
+ ans_file = open(answers_file, "w")
121
+
122
+ video_formats = ['.mp4', '.avi', '.mov', '.mkv']
123
+
124
+ # Iterate over each sample in the ground truth file
125
+ for sample in tqdm(gt_contents):
126
+ video_name = sample['video_name']
127
+ sample_set = sample
128
+ qs = sample['Q']
129
+
130
+ # Load the video file
131
+ for fmt in video_formats: # Added this line
132
+ temp_path = os.path.join(args.video_folder, f"{video_name}{fmt}")
133
+ if os.path.exists(temp_path):
134
+ video_path = temp_path
135
+ break
136
+
137
+ # Check if the video exists
138
+ if video_path is not None: # Modified this line
139
+ video_frames, _ = _get_rawvideo_dec(video_path, image_processor, max_frames=MAX_IMAGE_LENGTH)
140
+
141
+ try:
142
+ cur_prompt = qs
143
+ if model.config.mm_use_im_start_end:
144
+ qs = DEFAULT_IM_START_TOKEN + DEFAULT_IMAGE_TOKEN * MAX_IMAGE_LENGTH + DEFAULT_IM_END_TOKEN + '\n' + qs
145
+ else:
146
+ qs = DEFAULT_IMAGE_TOKEN * MAX_IMAGE_LENGTH + '\n' + qs
147
+
148
+ conv = conv_templates[args.conv_mode].copy()
149
+ conv.append_message(conv.roles[0], qs)
150
+ conv.append_message(conv.roles[1], None)
151
+ prompt = conv.get_prompt()
152
+
153
+ input_ids = tokenizer_image_token(prompt, tokenizer, IMAGE_TOKEN_INDEX, return_tensors='pt').unsqueeze(
154
+ 0).cuda()
155
+
156
+ stop_str = conv.sep if conv.sep_style != SeparatorStyle.TWO else conv.sep2
157
+ keywords = [stop_str]
158
+ stopping_criteria = KeywordsStoppingCriteria(keywords, tokenizer, input_ids)
159
+
160
+ with torch.inference_mode():
161
+ output_ids = model.generate(
162
+ input_ids,
163
+ images=video_frames.half().cuda(),
164
+ do_sample=True,
165
+ temperature=args.temperature,
166
+ top_p=args.top_p,
167
+ num_beams=args.num_beams,
168
+ max_new_tokens=1024,
169
+ use_cache=True,
170
+ stopping_criteria=[stopping_criteria])
171
+
172
+ input_token_len = input_ids.shape[1]
173
+ n_diff_input_output = (input_ids != output_ids[:, :input_token_len]).sum().item()
174
+ if n_diff_input_output > 0:
175
+ print(f'[Warning] {n_diff_input_output} output_ids are not the same as the input_ids')
176
+ outputs = tokenizer.batch_decode(output_ids[:, input_token_len:], skip_special_tokens=True)[0]
177
+ outputs = outputs.strip()
178
+ if outputs.endswith(stop_str):
179
+ outputs = outputs[:-len(stop_str)]
180
+ outputs = outputs.strip()
181
+
182
+ ans_id = shortuuid.uuid()
183
+ ans_file.write(json.dumps({'video_name': sample['video_name'],
184
+ "prompt": cur_prompt,
185
+ "text": outputs,
186
+ "answer_id": ans_id,
187
+ "model_id": model_name,
188
+ "answer": sample['A'],
189
+ "metadata": {}}) + "\n")
190
+ ans_file.flush()
191
+ except Exception as e:
192
+ print(f"Error processing video file '{video_name}': {e}")
193
+
194
+ ans_file.close()
195
+
196
+
197
+ if __name__ == "__main__":
198
+ parser = argparse.ArgumentParser()
199
+ parser.add_argument("--model-path", type=str, default="facebook/opt-350m")
200
+ parser.add_argument("--model-base", type=str, default=None)
201
+ parser.add_argument("--video-folder", type=str, default="")
202
+ parser.add_argument("--question-file", type=str, default="tables/question.jsonl")
203
+ parser.add_argument("--answers-file", type=str, default="answer.jsonl")
204
+ parser.add_argument("--conv-mode", type=str, default="v1")
205
+ parser.add_argument("--num-chunks", type=int, default=1)
206
+ parser.add_argument("--chunk-idx", type=int, default=0)
207
+ parser.add_argument("--temperature", type=float, default=0.2)
208
+ parser.add_argument("--top_p", type=float, default=None)
209
+ parser.add_argument("--num_beams", type=int, default=1)
210
+ parser.add_argument("--model_use", type=str, default="BASE")
211
+ args = parser.parse_args()
212
+
213
+ eval_model(args)
ChatUniVi/eval/model_video_qa.py ADDED
@@ -0,0 +1,232 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import argparse
2
+ import torch
3
+ import os
4
+ import json
5
+ from tqdm import tqdm
6
+ import shortuuid
7
+ from ChatUniVi.constants import *
8
+ from ChatUniVi.conversation import conv_templates, SeparatorStyle
9
+ from ChatUniVi.model.builder import load_pretrained_model
10
+ from ChatUniVi.utils import disable_torch_init
11
+ from ChatUniVi.mm_utils import tokenizer_image_token, get_model_name_from_path, KeywordsStoppingCriteria
12
+ from PIL import Image
13
+ import math
14
+ from decord import VideoReader, cpu
15
+ import numpy as np
16
+
17
+
18
+ def read_json(file):
19
+ with open(file, "r", encoding='utf-8') as f:
20
+ data = json.load(f)
21
+ return data
22
+
23
+ def split_list(lst, n):
24
+ """Split a list into n (roughly) equal-sized chunks"""
25
+ chunk_size = math.ceil(len(lst) / n) # integer division
26
+ return [lst[i:i+chunk_size] for i in range(0, len(lst), chunk_size)]
27
+
28
+
29
+ def get_chunk(lst, n, k):
30
+ chunks = split_list(lst, n)
31
+ return chunks[k]
32
+
33
+
34
+ def _get_rawvideo_dec(video_path, image_processor, max_frames=MAX_IMAGE_LENGTH, image_resolution=224, video_framerate=1, s=None, e=None):
35
+ # speed up video decode via decord.
36
+ video_mask = np.zeros(max_frames, dtype=np.int64)
37
+ max_video_length = 0
38
+
39
+ # T x 3 x H x W
40
+ video = np.zeros((max_frames, 3, image_resolution, image_resolution), dtype=np.float64)
41
+
42
+ if s is None:
43
+ start_time, end_time = None, None
44
+ else:
45
+ start_time = int(s)
46
+ end_time = int(e)
47
+ start_time = start_time if start_time >= 0. else 0.
48
+ end_time = end_time if end_time >= 0. else 0.
49
+ if start_time > end_time:
50
+ start_time, end_time = end_time, start_time
51
+ elif start_time == end_time:
52
+ end_time = start_time + 1
53
+
54
+ if os.path.exists(video_path):
55
+ vreader = VideoReader(video_path, ctx=cpu(0))
56
+ else:
57
+ print(video_path)
58
+ raise FileNotFoundError
59
+
60
+ fps = vreader.get_avg_fps()
61
+ f_start = 0 if start_time is None else int(start_time * fps)
62
+ f_end = int(min(1000000000 if end_time is None else end_time * fps, len(vreader) - 1))
63
+ num_frames = f_end - f_start + 1
64
+ if num_frames > 0:
65
+ # T x 3 x H x W
66
+ sample_fps = int(video_framerate)
67
+ t_stride = int(round(float(fps) / sample_fps))
68
+
69
+ all_pos = list(range(f_start, f_end + 1, t_stride))
70
+ if len(all_pos) > max_frames:
71
+ sample_pos = [all_pos[_] for _ in np.linspace(0, len(all_pos) - 1, num=max_frames, dtype=int)]
72
+ else:
73
+ sample_pos = all_pos
74
+
75
+ patch_images = [Image.fromarray(f) for f in vreader.get_batch(sample_pos).asnumpy()]
76
+
77
+ patch_images = torch.stack([image_processor.preprocess(img, return_tensors='pt')['pixel_values'][0] for img in patch_images])
78
+ slice_len = patch_images.shape[0]
79
+
80
+ max_video_length = max_video_length if max_video_length > slice_len else slice_len
81
+ if slice_len < 1:
82
+ pass
83
+ else:
84
+ video[:slice_len, ...] = patch_images
85
+
86
+ return patch_images, video_mask
87
+ else:
88
+ print("video path: {} error.".format(video_path))
89
+
90
+ video_mask[:max_video_length] = [1] * max_video_length
91
+
92
+ return torch.from_numpy(video), video_mask
93
+
94
+
95
+ def eval_model(args):
96
+ # Model
97
+ disable_torch_init()
98
+ model_path = os.path.expanduser(args.model_path)
99
+ model_name = "ChatUniVi"
100
+ tokenizer, model, image_processor, context_len = load_pretrained_model(model_path, args.model_base, model_name)
101
+
102
+ mm_use_im_start_end = getattr(model.config, "mm_use_im_start_end", False)
103
+ mm_use_im_patch_token = getattr(model.config, "mm_use_im_patch_token", True)
104
+ if mm_use_im_patch_token:
105
+ tokenizer.add_tokens([DEFAULT_IMAGE_PATCH_TOKEN], special_tokens=True)
106
+ if mm_use_im_start_end:
107
+ tokenizer.add_tokens([DEFAULT_IM_START_TOKEN, DEFAULT_IM_END_TOKEN], special_tokens=True)
108
+ model.resize_token_embeddings(len(tokenizer))
109
+
110
+ vision_tower = model.get_vision_tower()
111
+ if not vision_tower.is_loaded:
112
+ vision_tower.load_model()
113
+ image_processor = vision_tower.image_processor
114
+
115
+ if model.config.config["use_cluster"]:
116
+ for n, m in model.named_modules():
117
+ m = m.to(dtype=torch.bfloat16)
118
+
119
+ # Load the ground truth file
120
+ with open(args.question_file) as file:
121
+ gt_contents = json.load(file)
122
+ answers_list = read_json(args.answers_list)
123
+
124
+ answers_file = os.path.expanduser(args.answers_file)
125
+ os.makedirs(os.path.dirname(answers_file), exist_ok=True)
126
+ ans_file = open(answers_file, "w")
127
+
128
+ video_formats = ['.mp4', '.avi', '.mov', '.mkv']
129
+
130
+ # Iterate over each sample in the ground truth file
131
+ for sample in tqdm(gt_contents):
132
+ sample_set = sample
133
+ qs = sample['question']
134
+
135
+ # Load the video file
136
+ for fmt in video_formats: # Added this line
137
+ video_name = sample['video_name']
138
+ temp_path = os.path.join(args.video_folder, f"{video_name}{fmt}")
139
+ if os.path.exists(temp_path):
140
+ video_path = temp_path
141
+ break
142
+
143
+ video_name = "v_" + sample['video_name']
144
+ temp_path = os.path.join(args.video_folder, f"{video_name}{fmt}")
145
+ if os.path.exists(temp_path):
146
+ video_path = temp_path
147
+ break
148
+
149
+ # Check if the video exists
150
+ if video_path is not None: # Modified this line
151
+ if args.max_frames:
152
+ video_frames, _ = _get_rawvideo_dec(video_path, image_processor, max_frames=args.max_frames)
153
+ else:
154
+ video_frames, _ = _get_rawvideo_dec(video_path, image_processor, max_frames=MAX_IMAGE_LENGTH)
155
+
156
+ try:
157
+ cur_prompt = qs
158
+ if model.config.mm_use_im_start_end:
159
+ qs = DEFAULT_IM_START_TOKEN + DEFAULT_IMAGE_TOKEN * MAX_IMAGE_LENGTH + DEFAULT_IM_END_TOKEN + '\n' + qs
160
+ else:
161
+ qs = DEFAULT_IMAGE_TOKEN * MAX_IMAGE_LENGTH + '\n' + qs
162
+
163
+ conv = conv_templates[args.conv_mode].copy()
164
+ conv.append_message(conv.roles[0], qs)
165
+ conv.append_message(conv.roles[1], None)
166
+ prompt = conv.get_prompt()
167
+
168
+ input_ids = tokenizer_image_token(prompt, tokenizer, IMAGE_TOKEN_INDEX, return_tensors='pt').unsqueeze(
169
+ 0).cuda()
170
+
171
+ stop_str = conv.sep if conv.sep_style != SeparatorStyle.TWO else conv.sep2
172
+ keywords = [stop_str]
173
+ stopping_criteria = KeywordsStoppingCriteria(keywords, tokenizer, input_ids)
174
+
175
+ with torch.inference_mode():
176
+ output_ids = model.generate(
177
+ input_ids,
178
+ images=video_frames.half().cuda(),
179
+ do_sample=True,
180
+ temperature=args.temperature,
181
+ top_p=args.top_p,
182
+ num_beams=args.num_beams,
183
+ output_scores=True,
184
+ return_dict_in_generate=True,
185
+ max_new_tokens=1024,
186
+ use_cache=True,
187
+ stopping_criteria=[stopping_criteria])
188
+
189
+ output_ids = output_ids.sequences
190
+ input_token_len = input_ids.shape[1]
191
+ n_diff_input_output = (input_ids != output_ids[:, :input_token_len]).sum().item()
192
+ if n_diff_input_output > 0:
193
+ print(f'[Warning] {n_diff_input_output} output_ids are not the same as the input_ids')
194
+ outputs = tokenizer.batch_decode(output_ids[:, input_token_len:], skip_special_tokens=True)[0]
195
+ outputs = outputs.strip()
196
+ if outputs.endswith(stop_str):
197
+ outputs = outputs[:-len(stop_str)]
198
+ outputs = outputs.strip()
199
+
200
+ ans_id = shortuuid.uuid()
201
+ ans_file.write(json.dumps({"video_name": sample['video_name'],
202
+ "prompt": cur_prompt,
203
+ "text": outputs,
204
+ "answer_id": ans_id,
205
+ "model_id": model_name,
206
+ "answer": sample['answer'],
207
+ "metadata": {}}) + "\n")
208
+ ans_file.flush()
209
+ except Exception as e:
210
+ print(f"Error processing video file '{video_name}': {e}")
211
+
212
+ ans_file.close()
213
+
214
+
215
+ if __name__ == "__main__":
216
+ parser = argparse.ArgumentParser()
217
+ parser.add_argument("--model-path", type=str, default="facebook/opt-350m")
218
+ parser.add_argument("--model-base", type=str, default=None)
219
+ parser.add_argument("--video-folder", type=str, default="")
220
+ parser.add_argument("--question-file", type=str, default="tables/question.jsonl")
221
+ parser.add_argument("--answers-list", type=str, default="tables/answers_list.json")
222
+ parser.add_argument("--answers-file", type=str, default="answer.jsonl")
223
+ parser.add_argument("--conv-mode", type=str, default="v1")
224
+ parser.add_argument("--num-chunks", type=int, default=1)
225
+ parser.add_argument("--chunk-idx", type=int, default=0)
226
+ parser.add_argument("--temperature", type=float, default=0.2)
227
+ parser.add_argument("--top_p", type=float, default=None)
228
+ parser.add_argument("--num_beams", type=int, default=1)
229
+ parser.add_argument("--max_frames", type=int, default=None)
230
+ args = parser.parse_args()
231
+
232
+ eval_model(args)
ChatUniVi/eval/model_vqa.py ADDED
@@ -0,0 +1,125 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import argparse
2
+ import torch
3
+ import os
4
+ import json
5
+ from tqdm import tqdm
6
+ import shortuuid
7
+ from ChatUniVi.constants import *
8
+ from ChatUniVi.conversation import conv_templates, SeparatorStyle
9
+ from ChatUniVi.model.builder import load_pretrained_model
10
+ from ChatUniVi.utils import disable_torch_init
11
+ from ChatUniVi.mm_utils import tokenizer_image_token, get_model_name_from_path, KeywordsStoppingCriteria
12
+ from PIL import Image
13
+ import math
14
+
15
+
16
+ def split_list(lst, n):
17
+ """Split a list into n (roughly) equal-sized chunks"""
18
+ chunk_size = math.ceil(len(lst) / n) # integer division
19
+ return [lst[i:i+chunk_size] for i in range(0, len(lst), chunk_size)]
20
+
21
+
22
+ def get_chunk(lst, n, k):
23
+ chunks = split_list(lst, n)
24
+ return chunks[k]
25
+
26
+
27
+ def eval_model(args):
28
+ # Model
29
+ disable_torch_init()
30
+ model_path = os.path.expanduser(args.model_path)
31
+ model_name = "ChatUniVi"
32
+ tokenizer, model, image_processor, context_len = load_pretrained_model(model_path, args.model_base, model_name)
33
+
34
+ mm_use_im_start_end = getattr(model.config, "mm_use_im_start_end", False)
35
+ mm_use_im_patch_token = getattr(model.config, "mm_use_im_patch_token", True)
36
+ if mm_use_im_patch_token:
37
+ tokenizer.add_tokens([DEFAULT_IMAGE_PATCH_TOKEN], special_tokens=True)
38
+ if mm_use_im_start_end:
39
+ tokenizer.add_tokens([DEFAULT_IM_START_TOKEN, DEFAULT_IM_END_TOKEN], special_tokens=True)
40
+ model.resize_token_embeddings(len(tokenizer))
41
+
42
+ vision_tower = model.get_vision_tower()
43
+ if not vision_tower.is_loaded:
44
+ vision_tower.load_model()
45
+ image_processor = vision_tower.image_processor
46
+
47
+ questions = [json.loads(q) for q in open(os.path.expanduser(args.question_file), "r")]
48
+ questions = get_chunk(questions, args.num_chunks, args.chunk_idx)
49
+ answers_file = os.path.expanduser(args.answers_file)
50
+ os.makedirs(os.path.dirname(answers_file), exist_ok=True)
51
+ ans_file = open(answers_file, "w")
52
+ for line in tqdm(questions):
53
+ idx = line["question_id"]
54
+ image_file = line["image"]
55
+ qs = line["text"]
56
+ cur_prompt = qs
57
+ if model.config.mm_use_im_start_end:
58
+ qs = DEFAULT_IM_START_TOKEN + DEFAULT_IMAGE_TOKEN + DEFAULT_IM_END_TOKEN + '\n' + qs
59
+ else:
60
+ qs = DEFAULT_IMAGE_TOKEN + '\n' + qs
61
+
62
+ conv = conv_templates[args.conv_mode].copy()
63
+ conv.append_message(conv.roles[0], qs)
64
+ conv.append_message(conv.roles[1], None)
65
+ prompt = conv.get_prompt()
66
+
67
+ input_ids = tokenizer_image_token(prompt, tokenizer, IMAGE_TOKEN_INDEX, return_tensors='pt').unsqueeze(0).cuda()
68
+
69
+ image = Image.open(os.path.join(args.image_folder, image_file))
70
+ image_tensor = image_processor.preprocess(image, return_tensors='pt')['pixel_values'][0]
71
+
72
+ stop_str = conv.sep if conv.sep_style != SeparatorStyle.TWO else conv.sep2
73
+ keywords = [stop_str]
74
+ stopping_criteria = KeywordsStoppingCriteria(keywords, tokenizer, input_ids)
75
+
76
+ with torch.inference_mode():
77
+ output_ids = model.generate(
78
+ input_ids,
79
+ images=image_tensor.unsqueeze(0).half().cuda(),
80
+ do_sample=True,
81
+ temperature=args.temperature,
82
+ top_p=args.top_p,
83
+ num_beams=args.num_beams,
84
+ max_new_tokens=args.max_new_tokens,
85
+ use_cache=True,
86
+ stopping_criteria=[stopping_criteria])
87
+
88
+ input_token_len = input_ids.shape[1]
89
+ n_diff_input_output = (input_ids != output_ids[:, :input_token_len]).sum().item()
90
+ if n_diff_input_output > 0:
91
+ print(f'[Warning] {n_diff_input_output} output_ids are not the same as the input_ids')
92
+ outputs = tokenizer.batch_decode(output_ids[:, input_token_len:], skip_special_tokens=True)[0]
93
+ outputs = outputs.strip()
94
+ if outputs.endswith(stop_str):
95
+ outputs = outputs[:-len(stop_str)]
96
+ outputs = outputs.strip()
97
+
98
+ ans_id = shortuuid.uuid()
99
+ ans_file.write(json.dumps({"question_id": idx,
100
+ "prompt": cur_prompt,
101
+ "text": outputs,
102
+ "answer_id": ans_id,
103
+ "model_id": model_name,
104
+ "metadata": {}}) + "\n")
105
+ ans_file.flush()
106
+ ans_file.close()
107
+
108
+ if __name__ == "__main__":
109
+ parser = argparse.ArgumentParser()
110
+ parser.add_argument("--model-path", type=str, default="facebook/opt-350m")
111
+ parser.add_argument("--model-base", type=str, default=None)
112
+ parser.add_argument("--image-folder", type=str, default="")
113
+ parser.add_argument("--question-file", type=str, default="tables/question.jsonl")
114
+ parser.add_argument("--answers-file", type=str, default="answer.jsonl")
115
+ parser.add_argument("--conv-mode", type=str, default="simple")
116
+ parser.add_argument("--num-chunks", type=int, default=1)
117
+ parser.add_argument("--chunk-idx", type=int, default=0)
118
+ parser.add_argument("--temperature", type=float, default=0.2)
119
+ parser.add_argument("--top_p", type=float, default=None)
120
+ parser.add_argument("--num_beams", type=int, default=1)
121
+ parser.add_argument("--model_use", type=str, default="BASE")
122
+ parser.add_argument("--max_new_tokens", type=int, default=1024)
123
+ args = parser.parse_args()
124
+
125
+ eval_model(args)
ChatUniVi/eval/model_vqa_scienceqa.py ADDED
@@ -0,0 +1,164 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import argparse
2
+ import torch
3
+ import os
4
+ import json
5
+ from tqdm import tqdm
6
+ import shortuuid
7
+
8
+ from ChatUniVi.constants import IMAGE_TOKEN_INDEX, DEFAULT_IMAGE_TOKEN, DEFAULT_IM_START_TOKEN, DEFAULT_IM_END_TOKEN
9
+ from ChatUniVi.conversation import conv_templates, SeparatorStyle
10
+ from ChatUniVi.model.builder import load_pretrained_model
11
+ from ChatUniVi.utils import disable_torch_init
12
+ from ChatUniVi.mm_utils import tokenizer_image_token, get_model_name_from_path, KeywordsStoppingCriteria
13
+
14
+ from PIL import Image
15
+ import math
16
+ import numpy as np
17
+
18
+
19
+ def split_list(lst, n):
20
+ """Split a list into n (roughly) equal-sized chunks"""
21
+ chunk_size = math.ceil(len(lst) / n) # integer division
22
+ return [lst[i:i+chunk_size] for i in range(0, len(lst), chunk_size)]
23
+
24
+
25
+ def get_chunk(lst, n, k):
26
+ chunks = split_list(lst, n)
27
+ return chunks[k]
28
+
29
+
30
+ def eval_model(args):
31
+ # Model
32
+ disable_torch_init()
33
+ model_path = os.path.expanduser(args.model_path)
34
+ model_name = "ChatUniVi"
35
+ tokenizer, model, image_processor, context_len = load_pretrained_model(model_path, args.model_base, model_name)
36
+
37
+ vision_tower = model.get_vision_tower()
38
+ if not vision_tower.is_loaded:
39
+ vision_tower.load_model()
40
+ image_processor = vision_tower.image_processor
41
+
42
+ questions = json.load(open(os.path.expanduser(args.question_file), "r"))
43
+ questions = get_chunk(questions, args.num_chunks, args.chunk_idx)
44
+ answers_file = os.path.expanduser(args.answers_file)
45
+ os.makedirs(os.path.dirname(answers_file), exist_ok=True)
46
+ ans_file = open(answers_file, "w")
47
+ for i, line in enumerate(tqdm(questions)):
48
+ idx = line["id"]
49
+ question = line['conversations'][0]
50
+ gt_ans = line["conversations"][1]
51
+ qs = question['value'].replace('<image>', '').strip()
52
+ cur_prompt = qs
53
+
54
+ if 'image' in line:
55
+ image_file = line["image"].replace("\\", "/")
56
+ image = Image.open(os.path.join(args.image_folder, image_file))
57
+ image_tensor = image_processor.preprocess(image, return_tensors='pt')['pixel_values'][0]
58
+ images = image_tensor.unsqueeze(0).half().cuda()
59
+ if getattr(model.config, 'mm_use_im_start_end', False):
60
+ qs = DEFAULT_IM_START_TOKEN + DEFAULT_IMAGE_TOKEN + DEFAULT_IM_END_TOKEN + '\n' + qs
61
+ else:
62
+ qs = DEFAULT_IMAGE_TOKEN + '\n' + qs
63
+ cur_prompt = '<image>' + '\n' + cur_prompt
64
+ else:
65
+ images = None
66
+
67
+ conv = conv_templates[args.conv_mode].copy()
68
+ conv.append_message(conv.roles[0], qs)
69
+ conv.append_message(conv.roles[1], None)
70
+ prompt = conv.get_prompt()
71
+
72
+ input_ids = tokenizer_image_token(prompt, tokenizer, IMAGE_TOKEN_INDEX, return_tensors='pt').unsqueeze(0).cuda()
73
+
74
+ stop_str = conv.sep if conv.sep_style != SeparatorStyle.TWO else conv.sep2
75
+ keywords = [stop_str]
76
+ stopping_criteria = KeywordsStoppingCriteria(keywords, tokenizer, input_ids)
77
+
78
+ with torch.inference_mode():
79
+ output_ids = model.generate(
80
+ input_ids,
81
+ images=images,
82
+ do_sample=True,
83
+ temperature=0.2,
84
+ max_new_tokens=1024,
85
+ use_cache=True,
86
+ stopping_criteria=[stopping_criteria])
87
+
88
+ input_token_len = input_ids.shape[1]
89
+ n_diff_input_output = (input_ids != output_ids[:, :input_token_len]).sum().item()
90
+ if n_diff_input_output > 0:
91
+ print(f'[Warning] {n_diff_input_output} output_ids are not the same as the input_ids')
92
+ outputs = tokenizer.batch_decode(output_ids[:, input_token_len:], skip_special_tokens=True)[0]
93
+ outputs = outputs.strip()
94
+ if outputs.endswith(stop_str):
95
+ outputs = outputs[:-len(stop_str)]
96
+ outputs = outputs.strip()
97
+
98
+ outputs_reasoning = outputs
99
+ input_ids = tokenizer_image_token(prompt + outputs_reasoning + ' ###\nANSWER:', tokenizer, IMAGE_TOKEN_INDEX, return_tensors='pt').unsqueeze(0).cuda()
100
+
101
+ with torch.inference_mode():
102
+ output_ids = model.generate(
103
+ input_ids,
104
+ images=images,
105
+ do_sample=True,
106
+ temperature=0.2,
107
+ max_new_tokens=64,
108
+ use_cache=True,
109
+ output_scores=True,
110
+ return_dict_in_generate=True,
111
+ stopping_criteria=[stopping_criteria])
112
+
113
+ scores = output_ids.scores[0][0].to(torch.float32)
114
+ label_score = []
115
+
116
+ candidates = []
117
+ answers_list = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]
118
+ for i in answers_list:
119
+ if "(" + i + ")" in cur_prompt:
120
+ candidates.append(i)
121
+
122
+ for can in candidates:
123
+ can_id = tokenizer.encode(can)[-1]
124
+ label_score.append(scores[can_id].item())
125
+ outputs_answer = candidates[np.argmax(label_score)]
126
+
127
+ output_ids = output_ids.sequences
128
+
129
+ input_token_len = input_ids.shape[1]
130
+ n_diff_input_output = (input_ids != output_ids[:, :input_token_len]).sum().item()
131
+ if n_diff_input_output > 0:
132
+ print(f'[Warning] {n_diff_input_output} output_ids are not the same as the input_ids')
133
+ outputs = tokenizer.batch_decode(output_ids[:, input_token_len:], skip_special_tokens=True)[0]
134
+ outputs = outputs.strip()
135
+ if outputs.endswith(stop_str):
136
+ outputs = outputs[:-len(stop_str)]
137
+ outputs = outputs.strip()
138
+ outputs = outputs_reasoning + '\n The answer is ' + outputs
139
+
140
+ ans_id = shortuuid.uuid()
141
+ ans_file.write(json.dumps({"question_id": idx,
142
+ "prompt": cur_prompt,
143
+ "text": outputs,
144
+ "answer_id": ans_id,
145
+ "model_id": model_name,
146
+ "pred": outputs_answer,
147
+ "metadata": {}}) + "\n")
148
+ ans_file.flush()
149
+ ans_file.close()
150
+
151
+
152
+ if __name__ == "__main__":
153
+ parser = argparse.ArgumentParser()
154
+ parser.add_argument("--model-path", type=str, default="facebook/opt-350m")
155
+ parser.add_argument("--model-base", type=str, default=None)
156
+ parser.add_argument("--image-folder", type=str, default="")
157
+ parser.add_argument("--question-file", type=str, default="tables/question.json")
158
+ parser.add_argument("--answers-file", type=str, default="answer.jsonl")
159
+ parser.add_argument("--conv-mode", type=str, default="simple")
160
+ parser.add_argument("--num-chunks", type=int, default=1)
161
+ parser.add_argument("--chunk-idx", type=int, default=0)
162
+ args = parser.parse_args()
163
+
164
+ eval_model(args)
ChatUniVi/eval/questions/coco2014_val_qa_eval/qa90_gpt4_answer.jsonl ADDED
@@ -0,0 +1,90 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {"question_id": 0, "text": "The colors of the two suitcases in the image are black and brown with yellow details.", "category": "conv"}
2
+ {"question_id": 1, "text": "The image features two antique suitcases made of leather, stacked one on top of the other. The top suitcase is black, while the bottom one has a combination of brown and yellow colors. Both suitcases are prominently displayed side by side, taking up a large portion of the image. They appear to be vintage luggage, possibly available for purchase with price tags attached, showcasing their classic design and craftsmanship.", "category": "detail"}
3
+ {"question_id": 2, "text": "Several factors could make the two stacked suitcases valuable. In the image, they are described as antique, which suggests that they are potentially rare or have some historical significance. Their age and rarity could contribute to their value. Additionally, they are made of leather, which is a material known for its durability and, in some cases, luxury. The suitcases also differ in color, featuring black, brown, and yellow tones, which may attract buyers due to their aesthetic appeal or the desire to own a unique piece of luggage. Furthermore, the presence of price tags on the luggage indicates that they are being sold, drawing attention to their perceived value in the market. Collectors or enthusiasts of vintage items may find these suitcases valuable due to their material, design, age, and distinct appearance.", "category": "complex"}
4
+ {"question_id": 3, "text": "The main objects on the table in the image are plates, glasses, eating utensils, and possibly a bottle of something.", "category": "conv"}
5
+ {"question_id": 4, "text": "The image showcases a dining table filled with various dirty dishes, eating utensils, and a bottle. The table has plates and glasses scattered across it. There are at least two cups on the table, with one positioned on the left and another on the right side. \n\nTwo forks can be seen, one resting on a small white plate and the other located towards the left side of the table. A spoon is also present, placed near the left corner of the table. Additionally, there is a bottle located in the upper central area of the table.", "category": "detail"}
6
+ {"question_id": 5, "text": "A meal or gathering might have recently taken place around this table, as evidenced by the variety of dirty dishes, utensils, and drinkware present on it. The aftermath of this meal or event could involve the need to clean up and wash the dirty dishes, glasses, and eating utensils. Items on the table include plates, forks, spoons, cups, and a bottle, which are typically used during such occasions. Participants might have engaged in conversation, shared food and beverages, and enjoyed each other's company at this table. Once the gathering is complete, disposing of any leftovers and cleaning the table area would be necessary to prepare it for the next use.", "category": "complex"}
7
+ {"question_id": 6, "text": "The main focus of the image is a cat or kitten sitting on or next to a laptop computer.", "category": "conv"}
8
+ {"question_id": 7, "text": "The image features a cat sitting on a wooden desk, intently staring at a black laptop computer that is open in front of it. The desk is quite organized, with several books spread around, both on the left and right sides of the laptop. Some books are neatly piled and others are laid out individually. The scene could be interpreted as the cat appearing to use the laptop or showing interest in what's on the screen.", "category": "detail"}
9
+ {"question_id": 8, "text": "The cat may be interested in the laptop due to the light coming from the screen, the movement of the cursor, or the sounds produced by the laptop, such as keystrokes or notifications. Cats are known to be naturally curious creatures and are often attracted to objects that stimulate their senses. The visual display, warmth emanating from the device, and interactive nature of the laptop could be appealing to the cat, prompting it to sit on the desk and face the open laptop. Additionally, the cat may simply be seeking its owner's attention or wanting to be close to them while they use the laptop.", "category": "complex"}
10
+ {"question_id": 9, "text": "The dog in the image is black.", "category": "conv"}
11
+ {"question_id": 10, "text": "The image features a large black dog with a red collar laying down on a kitchen floor. The tiled floor provides a comfortable space for the dog to relax. The dog is positioned towards the middle of the scene. Next to the dog, there are two bowls placed on the floor, one around the top-left side and the other slightly further to the right. These could be the dog's food and water bowls. The scene depicts a cozy domestic environment for the dog.", "category": "detail"}
12
+ {"question_id": 11, "text": "The dog may have chosen to lay down on the kitchen floor in this location for several reasons. First, the tiled floor can provide a cool surface, which could be comforting compared to a warm or soft surface. This is particularly true if the dog has a thick coat or if the temperature in the room is high. Second, the dog is positioned next to its bowls and a toy, which suggests that the location is familiar and associated with food, water, and playtime. The dog could be resting near these resources for convenience and ease of access. Lastly, the location could be a central spot in the home, and dogs often prefer to stay near their owners or members of the household. By laying on the kitchen floor, the dog might be able to keep an eye on the activities happening around it and remain close to its family.", "category": "complex"}
13
+ {"question_id": 12, "text": "The cart with luggage bags is located in a lobby.", "category": "conv"}
14
+ {"question_id": 13, "text": "The scene is set in a lobby at a commercial business, where a wheeled luggage cart is filled with various suitcases and bags. There are a number of luggage bags, including two backpacks, one near the front of the cart and another near the back, as well as multiple suitcases placed on different sections of the cart. \n\nA handbag is also visible, placed near the front of the cart. Two people are present in the scene: one person standing near the left side and another person on the right side, possibly engaging in conversation or waiting to transport their luggage to their rooms.", "category": "detail"}
15
+ {"question_id": 14, "text": "In the image, a cart is filled with numerous pieces of luggage, including suitcases, bags, and backpacks, in the lobby of a commercial business. The staff responsible for handling the luggage might face several challenges such as:\n\n1. Efficiently organizing and placing the luggage on the cart to prevent any damages or items from falling off during transportation.\n2. Identifying and keeping track of each guest's belongings to avoid misplacement or mixing up the luggage.\n3. Maneuvering the heavily loaded cart without causing hindrances to other guests in the lobby while ensuring their safety.\n4. Carrying or transporting the luggage to the guests' rooms in a timely manner to maintain customer satisfaction and efficient use of staff resources.\n\nTo overcome these challenges, staff might need proper training in luggage handling, organization, and customer service skills. Maintaining clear luggage tags and taking note of each item could help them ensure accurate delivery to the corresponding guests' rooms.", "category": "complex"}
16
+ {"question_id": 15, "text": "The image features a large, placid lake.", "category": "conv"}
17
+ {"question_id": 16, "text": "The image depicts a serene and picturesque landscape with a large, placid lake surrounded by beautiful tree-covered mountains. Cliffs rise majestically on the edge of the lake, showcasing the grandeur of nature. \n\nIn the distance, near the waterfront, a train can be seen traveling on a track. The train adds a touch of human presence to the otherwise untouched landscape and further enhances the scenic view.", "category": "detail"}
18
+ {"question_id": 17, "text": "There could be several reasons for the train to be traveling on this scenic route surrounded by mountains, water, and trees. First, the train route might have been built to provide transportation services to local communities or businesses located in this remote or picturesque area. It may facilitate travel, trade, or tourism in the region. Second, the scenic route could be intentionally designed to attract tourists who seek leisure train journeys that showcase natural beauty and captivating landscapes. These types of train rides offer a unique and immersive experience for people who enjoy exploring breathtaking scenery and discovering new destinations while traveling comfortably. Ultimately, the train route could serve both practical and recreational purposes, fostering connectivity and promoting tourism for the area.", "category": "complex"}
19
+ {"question_id": 18, "text": "The main object in the image is a colorful striped umbrella standing on the beach.", "category": "conv"}
20
+ {"question_id": 19, "text": "The image features a colorful striped umbrella on the beach, with its vibrant appearance attracting attention. The umbrella is firmly positioned in the sand, providing shade and comfort for visitors. The umbrella sits near the ocean, offering a lovely view of the water and contributing to the pleasant beach atmosphere.", "category": "detail"}
21
+ {"question_id": 20, "text": "The colorful umbrella set up on the beach serves several purposes. First, it provides shade from the sun, which helps protect people from direct sunlight and the associated harmful UV rays, reducing the risk of sunburn and heatstroke. Second, it offers a comfortable spot to relax, rest, and enjoy the beach ambiance without being exposed to the intense sun or heat. Finally, the umbrella creates a designated area for beach-goers to keep their belongings and have a visible landmark to locate their spot quickly when in the crowded beach environment.", "category": "complex"}
22
+ {"question_id": 21, "text": "The house is in the beginning stages of its construction, with the wooden structure, studs, and staircase partially built but not yet completed.", "category": "conv"}
23
+ {"question_id": 22, "text": "The image shows the beginning stages of a house under construction. The wooden structure is still being built, and there are lots of wooden studs visible throughout the scene, indicating work in progress. Additionally, a partially-built staircase can be seen within the house, giving an idea of the floor plan layout.\n\nDespite the house still being under construction, a bed and a TV are already present in the area. The bed is located near the center of the image, with the TV placed to its left. This shows that some household items have been brought in, probably in anticipation of the house's completion.", "category": "detail"}
24
+ {"question_id": 23, "text": "In the current state of the house construction with wooden studs and a partially-built staircase, a potential obstacle that might occur is the incomplete structure being exposed to external elements like rain, snow, or strong winds. These conditions can potentially damage the building materials, delay construction work, and cause additional unexpected costs for repairing or replacing materials. It is essential for the builders to properly cover the construction site and store materials accordingly to protect them from potential damage when not in use.", "category": "complex"}
25
+ {"question_id": 24, "text": "There are three pizzas in the image.", "category": "conv"}
26
+ {"question_id": 25, "text": "The image displays three open pizza boxes with pizzas inside. The first pizza box, situated to the left, contains a smaller pizza. The second pizza box, positioned in the middle, features a larger pizza topped with tortilla chips. The third pizza box, located to the right, contains another smaller pizza. \n\nBeside the large pizza, there are two side orders of sauce in bowls, accompanying the delicious meal. The arrangement showcases a delicious spread of pizzas, inviting everyone to enjoy their different flavors and sizes.", "category": "detail"}
27
+ {"question_id": 26, "text": "When dividing these pizzas equitably among a group of people, one might face several challenges due to the different sizes and potential toppings on the pizzas. In the image, there are three pizzas sitting in their delivery boxes, with one pizza being larger than the other two. This size difference may complicate equal distribution of pizza slices among the group, as some people might want more of the larger pizza, while others may prefer the smaller ones.\n\nFurthermore, one of the pizzas is topped with tortilla chips, which could lead to preference differences among the group, as some people might like this topping while others may not. Lastly, alongside one of the pizzas, there are two side orders of sauce, which may need to be shared among those who enjoy sauce with their pizza. All these factors make it a challenge to ensure that everyone in the group has an equal and satisfying share of the pizzas and accompanying sauces. One possible solution is to have a group discussion and decide on rules or a plan for dividing the pizzas, taking into account individual preferences and dietary restrictions if any.", "category": "complex"}
28
+ {"question_id": 27, "text": "There are four doughnuts in the box.", "category": "conv"}
29
+ {"question_id": 28, "text": "The image features a box filled with four different kinds of doughnuts sitting on a table. Each doughnut appears to have a unique design or topping. One of the doughnuts is a cake-style doughnut, while another has nuts and coconut on top. The third doughnut appears to be a glazed one, and the last doughnut also has various toppings. The doughnuts are positioned inside the box in close proximity to one another, showcasing their delicious variety.", "category": "detail"}
30
+ {"question_id": 29, "text": "The box contains a variety of doughnuts with unique taste combinations. Among the four doughnuts, there are cake doughnuts, a glazed doughnut, and one with a mix of nuts and coconut as toppings. These different toppings and textures provide a diverse selection for those who want to try various flavors and types of doughnuts. Combining the flavors of nuts and coconut on one doughnut, in particular, offers a unique taste experience that blends the richness of nuts with the tropical sweetness of coconut. Thus, the box offers a selection that caters to different preferences and invites people to discover new taste combinations.", "category": "complex"}
31
+ {"question_id": 30, "text": "In the image, the man is holding up clothes on hangers, possibly in some hanger bags, and appears to be preparing for travel, as a suitcase is also in front of him.", "category": "conv"}
32
+ {"question_id": 31, "text": "The image depicts a man standing near a window, holding two clothing hangers with garments in both hands, one red and one white. In front of him, there is a suitcase, possibly indicating that he is preparing for travel or organizing his belongings. The man appears to be showing or comparing these clothes while packing his luggage.", "category": "detail"}
33
+ {"question_id": 32, "text": "The man might be holding the clothes on hangers because he is preparing to pack his suitcase for a trip or has just arrived at his destination and is unpacking his belongings. By holding the clothes on hangers, he can avoid wrinkles and ensure that the garments remain in good condition for wearing during his journey or at his destination. The presence of a suitcase in front of him supports this idea, as it is commonly used for transportation and storage of personal belongings when traveling.", "category": "complex"}
34
+ {"question_id": 33, "text": "There are four giraffes in the image.", "category": "conv"}
35
+ {"question_id": 34, "text": "The image showcases a group of four giraffes standing in their natural habitat, a grassy field with some dry brush. They are dispersed across the field, with one giraffe positioned more towards the left, and the other three clustered closer together on the right side. The giraffes appear to be grazing peacefully or engaging in social interactions. A tree can be seen in the scene, providing shade and a point of interest for the giraffes to gather around.", "category": "detail"}
36
+ {"question_id": 35, "text": "In the image, there are four giraffes gathered near the same tree in their natural habitat, a grass field with dry brush. Giraffes may gather near the same tree for various reasons. One common reason is to feed, as their long necks enable them to reach high branches for fresh leaves and foliage, which is a primary part of their diet. Giraffes are also social animals, so they may gather around the same tree to interact with each other and maintain their social bonds. Furthermore, the tree can provide shade in the hot African sun, offering a place for the giraffes to rest and regulate their body temperature.", "category": "complex"}
37
+ {"question_id": 36, "text": "The main focus of the image is the head of a giraffe, shown in a close-up headshot.", "category": "conv"}
38
+ {"question_id": 37, "text": "The image is a clear and colorful close up of a giraffe's head, showcasing its beautiful features. The giraffe is standing tall among several bright green trees, likely in its natural habitat. It appears to be chewing on some leaves, while its face is turned to the side, providing a detailed view of its profile.", "category": "detail"}
39
+ {"question_id": 38, "text": "From the image, it can be inferred that the giraffe's habitat is likely a natural environment with an abundance of greenery. The giraffe is standing tall among several bright green trees, which suggests that the area is rich in vegetation and provides plenty of food sources for the giraffe, such as leaves. This natural habitat is likely suitable for giraffes to thrive and maintain their unique characteristics, such as their long necks, which are adapted for reaching leaves on tall trees.", "category": "complex"}
40
+ {"question_id": 39, "text": "The art installation includes a display of large artworks, such as an oversized bench, painted feline heads, and potentially other artistic sculptures or images.", "category": "conv"}
41
+ {"question_id": 40, "text": "The image features an art installation placed on a city street. The display consists of a large, oversized wooden bench and two massive animal art sculptures, which appear to be painted feline heads. \n\nThere are several people in the scene, with two people sitting near the art display, one person standing nearby, and another person further to the left. A parked car is visible behind the bench, close to the edge of the street. Additionally, a backpack can be seen on the ground, closer to the left side of the bench.", "category": "detail"}
42
+ {"question_id": 41, "text": "The art installation, featuring an oversized wooden bench and two massive animal art sculptures, encourages interaction among people by providing a visually intriguing and inviting space to sit or gather. People are naturally drawn to the unique and whimsical nature of these installations, sparking curiosity and conversation among those who encounter them. The oversized bench provides seating for multiple individuals, prompting people to sit down, rest, or socialize while admiring the giant painted feline heads and other artworks on display. Additionally, the installations capture the attention of passersby, creating a shared experience and a sense of community among those who visit the area. The artistic environment stimulates discussion and appreciation of the art, facilitating social interactions and connections among those who gather near the sculptures and oversized bench.", "category": "complex"}
43
+ {"question_id": 42, "text": "The main focus of the image is a car parked on the side of the road, next to a parking meter.", "category": "conv"}
44
+ {"question_id": 43, "text": "The scene features a black car parked on the side of the road next to a parking meter. There is another parking meter slightly further ahead of the car. The car is parked in front of a building, which seems to be the destination for the driver. \n\nAdditionally, there are other vehicles in the image. A gray car is situated further behind the black car, and a truck can be seen in the background on the right side. Moreover, there is another vehicle barely visible on the left side of the scene.", "category": "detail"}
45
+ {"question_id": 44, "text": "The most plausible reason for the car to be parked on the side of the road is that it is utilizing the available parking spot with parking meters. In the image, the car is parked next to two parking meters, which indicates that the driver has parked the car to follow parking regulations and likely paid for their parking session. The car might be parked there so the driver or passengers can go to a nearby building, shop, or participate in any other activities in the area. Parking meters are commonly used in urban and commercial areas to manage and regulate limited street parking spaces, and it's reasonable to assume the driver is abiding by these parking rules.", "category": "complex"}
46
+ {"question_id": 45, "text": "The unusual aspect of the elderly man's facial appearance in the image is that he has the head of a toothbrush under his nose, which mimics a mustache, specifically a toothbrush mustache.", "category": "conv"}
47
+ {"question_id": 46, "text": "The image features an elderly man humorously wearing the head of a toothbrush under his nose, creating the illusion of a toothbrush mustache. Since the toothbrush head is positioned like a mustache, it is reminiscent of a toothbrush mustache caricature often associated with Hitler. The man takes up most of the frame, appearing front and center in the scene.", "category": "detail"}
48
+ {"question_id": 47, "text": "The elderly man wearing the head of a toothbrush under his nose as a moustache could be conveying a satirical or humorous message. By mimicking a toothbrush mustache, he may be making light of or criticizing a specific historical figure or style associated with the toothbrush mustache, such as Adolf Hitler. Using a toothbrush instead of an actual mustache allows him to dramatically emphasize the point and create a lighthearted or comical effect. However, it's essential to consider cultural and social contexts when interpreting such unconventional expressions, as the message may not always be clear or universally accepted.", "category": "complex"}
49
+ {"question_id": 48, "text": "There are two large passenger airplanes visible in the image.", "category": "conv"}
50
+ {"question_id": 49, "text": "The scene captures a picturesque view of two large passenger jets, one in the air and one on the ground. They are flying over a beautiful beach filled with various birds. Many birds can be seen scattered across the scene, both near the water and around the area. The blue water in the background adds a calming touch to the image.", "category": "detail"}
51
+ {"question_id": 50, "text": "The presence of two large passenger jets flying in close proximity to the beach filled with birds can have a negative impact on the avian population. The noise generated by the engines can be stressful and disruptive for the birds, potentially resulting in altered behaviors, flight patterns, or even relocation from the area. In addition, the airplanes could pose a risk of bird strikes, in which birds collide with the planes, leading to injuries or fatalities for the birds and damage to the aircraft. This highlights the importance of maintaining safe distances between airplanes and wildlife habitats in order to minimize the risk of adverse effects on both the environment and aviation.", "category": "complex"}
52
+ {"question_id": 51, "text": "The cat is curled up and sleeping on the red couch.", "category": "conv"}
53
+ {"question_id": 52, "text": "A tan and black cat is curled up and comfortably asleep on a vibrant red couch. The cat is situated towards the center of the plush seat. The red couch itself is prominent in the image, occupying a large portion of the frame. The peaceful sleeping cat adds a sense of warmth and coziness to the scene.", "category": "detail"}
54
+ {"question_id": 53, "text": "The cat may have chosen to sleep on the red couch for several reasons. The couch appears to be plush and comfortable, providing a soft surface for the cat to curl up and maintain its body heat. Cats also prefer quiet and low-traffic areas to rest. The couch may be located in such an area, providing a sense of security for the cat while sleeping. Furthermore, felines are known to be attracted to soft and warm materials, making the red velvet seat an appealing spot for relaxation. It's also common for cats to sleep in locations familiar to them or near their human companions, so the couch might be a place where the cat often spends time or feels safe.", "category": "complex"}
55
+ {"question_id": 54, "text": "An old Volkswagen Bug is parked next to the stop sign in the image.", "category": "conv"}
56
+ {"question_id": 55, "text": "In the scene, a woman is standing in front of a window, observing the street outside. On the street, a vintage Volkswagen Bug is parked near a stop sign, which is located towards the center of the image. Several other cars occupy the street, including one positioned to the left of the Volkswagen and two others in the background. On the far left and far right sides of the image, there are additional cars partially visible. The street also features a tree growing near the stop sign, adding a touch of greenery to the urban setting.", "category": "detail"}
57
+ {"question_id": 56, "text": "From the image, it can be inferred that the traffic situation in the area is relatively light or calm. There is an old VW Bug parked near a stop sign, and a few other cars are also visible on the street. However, there doesn't seem to be any congestion or significant traffic. The presence of the stop sign indicates that there is some traffic regulation and order in place to manage vehicle movement, contributing to the overall calmness of the area. Moreover, no people are seen near the stop sign, which further suggests that there might be low pedestrian activity at the time the picture was taken.", "category": "complex"}
58
+ {"question_id": 57, "text": "The man in the image is using his cell phone and giving a thumbs up, possibly posing for a picture.", "category": "conv"}
59
+ {"question_id": 58, "text": "The image depicts a group of people gathered inside a room, creating a lively social atmosphere. A man is prominently featured in the scene, holding a cell phone to his ear and smiling with a thumbs-up gesture, possibly posing for a picture or simply enjoying the conversation.\n\nThere are multiple other people in the room, adding to the gathering and engaging in various conversations. The scene also has two cups visible, one on the left side of the room and another on the right side, indicating that the gathering may be a casual social event.", "category": "detail"}
60
+ {"question_id": 59, "text": "It is likely that the man is giving a thumbs-up gesture while talking on the phone to express a positive emotion or to signal agreement, approval, or satisfaction with the conversation he is having. This non-verbal communication can be conveyed to the people around him or to the person taking the picture of him while on the phone call. The man might be receiving good news, agreeing with the person on the phone, or sharing his excitement with the group of people surrounding him in the room. The specific reason cannot be precisely determined from the image alone, but it does indicate a positive sentiment associated with the phone call.", "category": "complex"}
61
+ {"question_id": 60, "text": "The dog in the image is a husky.", "category": "conv"}
62
+ {"question_id": 61, "text": "The image shows a large, adorable husky dog sleeping peacefully on a dog bed in a room. The room has a somewhat dark ambiance, making the scene feel cozy and comfortable. \n\nIn the same room, there are two chairs, one positioned towards the center and another one closer to the right side. Additionally, there are two potted plants, one situated slightly behind and to the right of the dog and the other placed further to the right in the room. The presence of these elements gives the room a warm, inviting atmosphere.", "category": "detail"}
63
+ {"question_id": 62, "text": "The dog owner seems to have taken several measures to make their dog feel comfortable in the room. Based on the image, an adorable husky dog has a designated dog bed to sleep in, providing cushioning and a cozy space for rest. The room is also dimly lit or dark, which contributes to a calmer atmosphere that promotes sleep and relaxation. There might be other considerations, such as room temperature or air circulation, that aid in creating a comfortable environment for the dog. It's essential for pet owners to ensure that their pets have a secure and comfortable space to rest in order to maintain their well-being and happiness.", "category": "complex"}
64
+ {"question_id": 63, "text": "The color of the elephant in the image is grey.", "category": "conv"}
65
+ {"question_id": 64, "text": "The image depicts a baby elephant standing alone inside an enclosure. The elephant is positioned towards the center of the pen with a large sand dune, or dirt mount, nearby. In the background, there is a brick building that serves as part of the exhibit. The grey elephant stands calmly, occupying the majority of the scene in this pen.", "category": "detail"}
66
+ {"question_id": 65, "text": "A potential concern for the baby elephant standing alone inside the pen could be the lack of social interaction with other elephants. Elephants are highly social creatures and form strong bonds within their family units. The absence of other elephants in the enclosure might lead to feelings of loneliness, stress, and anxiety for the baby elephant. It is crucial for the mental and emotional well-being of elephants, especially young ones, to have regular opportunities to interact with their peers and family members in a naturalistic, supportive environment. By addressing this concern, the caretakers of the baby elephant can help ensure its psychological well-being and overall health.", "category": "complex"}
67
+ {"question_id": 66, "text": "On the orange plate, there are a burger or sandwich, a bowl of broccoli, and a pickle.", "category": "conv"}
68
+ {"question_id": 67, "text": "The image features a dining table with an orange plate in the center. On the plate, there is a half of a sandwich, a pickle, and a bowl of broccoli, creating a visually appealing and mouth-watering combination. A fork is also placed alongside the plate, ready to be used for enjoying the meal. Several individual pieces of broccoli can be seen around the bowl, adding variety and color to the scene.", "category": "detail"}
69
+ {"question_id": 68, "text": "Based on the image, it can be inferred that the individual has a balanced approach to their dietary choices. The meal on the table consists of a sandwich, a bowl of broccoli, and a pickle on an orange plate. The sandwich likely provides carbohydrates and proteins, while the broccoli offers essential vitamins, minerals, and fiber. The pickle adds some flavor and tanginess to the meal. This combination of foods illustrates that the person is interested in having a diverse and nutritious diet, incorporating both proteins and vegetables in their meal. Additionally, the presence of a fork suggests that they prefer using cutlery while eating, which can be seen as a more cultured and organized approach to dining.", "category": "complex"}
70
+ {"question_id": 69, "text": "A white duck is pictured in the image.", "category": "conv"}
71
+ {"question_id": 70, "text": "The image features a single white bird, likely a duck or a goose, walking along a paved road. The bird appears to be closely examining the ground as it walks. The road runs adjacent to a patch of grass, providing a contrasting backdrop for the scene. The bird occupies a predominant part of the image, offering a close-up view of its action.", "category": "detail"}
72
+ {"question_id": 71, "text": "While walking along the paved road, the duck may face various challenges. Firstly, the duck could be at risk of encountering vehicles, which might not notice or expect to see wildlife on the road. This could put the duck in danger of being hit or injured by passing traffic. Secondly, the duck might struggle to find appropriate food sources on or near the paved road, as opposed to its natural habitat, such as a body of water or a grassy area, where it would have easier access to its regular diet.\n\nFurthermore, the duck might be exposed to potential predators, like domestic pets or other animals that live in urban environments, increasing the risk of harm for the duck. Lastly, walking on the paved concrete surface could be less comfortable for the duck than walking on softer natural ground, causing discomfort over time. Overall, the duck's safety and well-being may be compromised by navigating this environment that is not adapted to its natural behaviors and needs.", "category": "complex"}
73
+ {"question_id": 72, "text": "Yes, the little boy is wearing a helmet to ensure his safety while riding his bike.", "category": "conv"}
74
+ {"question_id": 73, "text": "The image depicts a little boy riding his bike on a road. He is practicing safety by wearing a yellow helmet while cycling. The boy is visible from a side angle, capturing both him and his bicycle in motion.", "category": "detail"}
75
+ {"question_id": 74, "text": "The little boy's precaution of wearing a helmet is noteworthy because it shows that the child or their guardian is aware of and strictly adhering to safety precautions. Wearing a helmet while riding a bicycle is crucial for reducing the risk of severe head injuries in the event of a crash, fall, or any other unforeseen incident. It is especially important for children, who are often more prone to accidents due to their limited experience with balancing and negotiating obstacles. By wearing a helmet, the boy is demonstrating responsible behavior and setting a positive example for others to follow, promoting a culture of safety awareness.", "category": "complex"}
76
+ {"question_id": 75, "text": "There are three people visible in the image - two women and one man.", "category": "conv"}
77
+ {"question_id": 76, "text": "The image shows a group of people at a celebration, likely participating in a wine tasting event. There are a total of six people, with three young adults prominently in the foreground. A man wearing glasses stands in the middle, flanked by a couple of women on either side. They are all holding wine glasses, enjoying the event and smiling.\n\nAt the table, there are several wine bottles dispersed along its surface, showing the variety of options available for tasting. Additionally, there is a handbag placed on the table, possibly belonging to one of the women attending the event. \n\nTwo more people are visible in the background. They are smiling and making conversation while engaging in the celebration with the others.", "category": "detail"}
78
+ {"question_id": 77, "text": "It appears that the group of people are gathered for a wine tasting or celebration in which they are enjoying various types of wine. They are seen standing and sitting around a table with several wine bottles and holding wine glasses. Their smiles and the friendly atmosphere indicate that it's a social event where they have gathered to indulge in sampling different wines, engage in conversations, and enjoy each other's company.", "category": "complex"}
79
+ {"question_id": 78, "text": "The main object featured in the image is the clock mounted on a pole or a short tower, standing on the sidewalk next to a building.", "category": "conv"}
80
+ {"question_id": 79, "text": "The image features a quiet street with a tall clock mounted on a pole at the side of the pavement, near a building. The pole stands prominently on the empty sidewalk, offering a convenient time-keeping source for pedestrians.\n\nThere are a few potted plants along the sidewalk, adding a touch of greenery to the scene. Bicycles can also be seen parked nearby, and a couple of cars are parked further down the street. A person is walking in the background, adding some life to the otherwise calm environment.", "category": "detail"}
81
+ {"question_id": 80, "text": "As you walk down this quiet street, you can easily tell the time by looking at the tall clock that is mounted on a pole along the sidewalk. This clock stands out significantly, making it easily noticeable. Regarding the direction of the sidewalk, the presence of potted plants, bicycles, and cars suggest that this is a well-maintained and organized street. As you follow the sidewalk further, you will see that it is lined with trees, potted plants, and parked bicycles and cars, guiding you in the direction it leads. Additionally, the building next to the clock also gives you context for the orientation and direction of the street.", "category": "complex"}
82
+ {"question_id": 81, "text": "The person is riding a motorbike, which can also be referred to as a motorcycle or a moped. In this case, the terms motorcycle, scooter, and moped are used interchangeably to describe the same vehicle the woman is riding.", "category": "conv"}
83
+ {"question_id": 82, "text": "The scene showcases a dirt road, with a woman riding a motorcycle in the middle of the road. She is accompanied by a man walking alongside her, with another man further down the road. Various animals, including three cows, are also present in the scene, suggesting a rural setting. The main cow is positioned to the right of the motorcycle while two smaller cows can be seen on the left side of the road. The people and animals all appear to be going in the same direction down the dirt road.", "category": "detail"}
84
+ {"question_id": 83, "text": "The woman on the motorcycle might face challenges navigating the dirt road, especially because of the presence of multiple objects and living beings on the road. In the image, a cow is nearby, along with two other smaller cows, two men, and a dog. Dirt roads can be uneven, dusty, and unpredictable, making it important for the woman to maneuver cautiously to avoid any potential accidents. Additionally, she needs to be aware of the animals and people around her to ensure both her safety and the safety of others. This situation requires her to be vigilant, slow down when necessary, and carefully navigate through the environment.", "category": "complex"}
85
+ {"question_id": 84, "text": "The skateboard in the image is in an upside-down position, with its wheels pointing up and laying on the ground.", "category": "conv"}
86
+ {"question_id": 85, "text": "In the image, a person wearing camo shorts is standing on a cement surface next to an overturned skateboard. The skateboard is laying upside down with its wheels pointing up, giving a sense of it having been flipped or potentially used for a trick. The boy appears to be standing in front of the skateboard, engaging with it or possibly preparing for his next move.", "category": "detail"}
87
+ {"question_id": 86, "text": "It's plausible that prior to this moment, the person standing next to the overturned skateboard might have attempted a trick or maneuver on the skateboard, which resulted in either a failed attempt or a wipeout. As a consequence, the skateboard ended up upside down on the ground, with its wheels pointed upward. The person, possibly the skateboarder, is standing next to it, possibly pondering their next move, contemplating a retry or assessing any potential damage to the skateboard.", "category": "complex"}
88
+ {"question_id": 87, "text": "The man and woman are wearing umbrella hats, which are designed to provide protection from the rain.", "category": "conv"}
89
+ {"question_id": 88, "text": "The image depicts a man and a woman sitting on top of a bridge, both wearing umbrella hats. The quirky umbrella hats provide them with some cover from the rainy weather. A dog is accompanying the couple, taking a break with them on the bridge. \n\nThe surrounding area has a view of the ocean, and there are boats visible in the water. One boat can be found close to the right edge of the scene, while two other boats are in the middle and the far left side of the frame. Additional umbrellas can be spotted in the area, signifying that other pedestrians have also sought shelter from the rain.", "category": "detail"}
90
+ {"question_id": 89, "text": "On this rainy day, the umbrella hats provide the couple several benefits as they sit on top of a bridge near the ocean with their dog. First, the umbrella hats enable them to keep their hands free, allowing them to hold their dog's leash, interact with each other, and perform other tasks without holding a traditional umbrella. Second, the umbrella hats protect their heads and upper bodies from getting wet due to rain, making their outdoor experience more comfortable. Additionally, the novel and fun nature of the umbrella hats can be a conversation starter and bring some humor to their day despite the gloomy weather.", "category": "complex"}
ChatUniVi/eval/questions/coco2014_val_qa_eval/qa90_questions.jsonl ADDED
@@ -0,0 +1,90 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {"question_id": 0, "image": "COCO_val2014_000000441147.jpg", "text": "What is the color of the two suitcases in the image?", "category": "conv"}
2
+ {"question_id": 1, "image": "COCO_val2014_000000441147.jpg", "text": "Analyze the image in a comprehensive and detailed manner.", "category": "detail"}
3
+ {"question_id": 2, "image": "COCO_val2014_000000441147.jpg", "text": "What potential factors could make these suitcases valuable?", "category": "complex"}
4
+ {"question_id": 3, "image": "COCO_val2014_000000353536.jpg", "text": "What are the main objects on the table in the image?", "category": "conv"}
5
+ {"question_id": 4, "image": "COCO_val2014_000000353536.jpg", "text": "Describe the following image.", "category": "detail"}
6
+ {"question_id": 5, "image": "COCO_val2014_000000353536.jpg", "text": "What activity might have recently taken place around this table and what could be its aftermath?", "category": "complex"}
7
+ {"question_id": 6, "image": "COCO_val2014_000000506095.jpg", "text": "What is the main focus of the image?", "category": "conv"}
8
+ {"question_id": 7, "image": "COCO_val2014_000000506095.jpg", "text": "What is this photo about'?", "category": "detail"}
9
+ {"question_id": 8, "image": "COCO_val2014_000000506095.jpg", "text": "What could be a reason for the cat's interest in the laptop?", "category": "complex"}
10
+ {"question_id": 9, "image": "COCO_val2014_000000514915.jpg", "text": "What color is the dog in the image?", "category": "conv"}
11
+ {"question_id": 10, "image": "COCO_val2014_000000514915.jpg", "text": "Describe the following image.", "category": "detail"}
12
+ {"question_id": 11, "image": "COCO_val2014_000000514915.jpg", "text": "Why might the dog have chosen to lay down on the floor in this location?", "category": "complex"}
13
+ {"question_id": 12, "image": "COCO_val2014_000000056013.jpg", "text": "Where is the cart with luggage bags located?", "category": "conv"}
14
+ {"question_id": 13, "image": "COCO_val2014_000000056013.jpg", "text": "Describe the following image.", "category": "detail"}
15
+ {"question_id": 14, "image": "COCO_val2014_000000056013.jpg", "text": "What challenges might the staff encounter with handling luggage in the lobby?", "category": "complex"}
16
+ {"question_id": 15, "image": "COCO_val2014_000000408439.jpg", "text": "What is the body of water seen in the image?", "category": "conv"}
17
+ {"question_id": 16, "image": "COCO_val2014_000000408439.jpg", "text": "Can you elaborate on the elements of the picture provided?", "category": "detail"}
18
+ {"question_id": 17, "image": "COCO_val2014_000000408439.jpg", "text": "What are potential reasons for the train to be traveling in such a scenic route?", "category": "complex"}
19
+ {"question_id": 18, "image": "COCO_val2014_000000164255.jpg", "text": "What is the main object in the image?", "category": "conv"}
20
+ {"question_id": 19, "image": "COCO_val2014_000000164255.jpg", "text": "What do you think is going on in this snapshot?", "category": "detail"}
21
+ {"question_id": 20, "image": "COCO_val2014_000000164255.jpg", "text": "What purpose does the umbrella serve on the beach?", "category": "complex"}
22
+ {"question_id": 21, "image": "COCO_val2014_000000034096.jpg", "text": "What stage is the house in regarding its construction?", "category": "conv"}
23
+ {"question_id": 22, "image": "COCO_val2014_000000034096.jpg", "text": "What is this photo about'?", "category": "detail"}
24
+ {"question_id": 23, "image": "COCO_val2014_000000034096.jpg", "text": "What may be a potential obstacle for the house construction in its current state?", "category": "complex"}
25
+ {"question_id": 24, "image": "COCO_val2014_000000385873.jpg", "text": "How many pizzas are there in the image?", "category": "conv"}
26
+ {"question_id": 25, "image": "COCO_val2014_000000385873.jpg", "text": "Explain the visual content of the image in great detail.", "category": "detail"}
27
+ {"question_id": 26, "image": "COCO_val2014_000000385873.jpg", "text": "What are the possible challenges one might face when dividing these pizzas equitably among a group of people?", "category": "complex"}
28
+ {"question_id": 27, "image": "COCO_val2014_000000367571.jpg", "text": "How many doughnuts are in the box?", "category": "conv"}
29
+ {"question_id": 28, "image": "COCO_val2014_000000367571.jpg", "text": "Write a detailed description of the given image.", "category": "detail"}
30
+ {"question_id": 29, "image": "COCO_val2014_000000367571.jpg", "text": "What unique taste combinations can be found in this box of doughnuts?", "category": "complex"}
31
+ {"question_id": 30, "image": "COCO_val2014_000000319432.jpg", "text": "What is the man doing in the image?", "category": "conv"}
32
+ {"question_id": 31, "image": "COCO_val2014_000000319432.jpg", "text": "Can you describe the main features of this image for me?", "category": "detail"}
33
+ {"question_id": 32, "image": "COCO_val2014_000000319432.jpg", "text": "Why might the man be holding the clothes on hangers?", "category": "complex"}
34
+ {"question_id": 33, "image": "COCO_val2014_000000225738.jpg", "text": "How many giraffes are depicted in the image?", "category": "conv"}
35
+ {"question_id": 34, "image": "COCO_val2014_000000225738.jpg", "text": "Write a detailed description of the given image.", "category": "detail"}
36
+ {"question_id": 35, "image": "COCO_val2014_000000225738.jpg", "text": "Why might these giraffes be gathering near the same tree?", "category": "complex"}
37
+ {"question_id": 36, "image": "COCO_val2014_000000092109.jpg", "text": "What is the main focus of the image?", "category": "conv"}
38
+ {"question_id": 37, "image": "COCO_val2014_000000092109.jpg", "text": "What is this photo about'?", "category": "detail"}
39
+ {"question_id": 38, "image": "COCO_val2014_000000092109.jpg", "text": "What can be inferred about the giraffe's habitat from this image?", "category": "complex"}
40
+ {"question_id": 39, "image": "COCO_val2014_000000506483.jpg", "text": "What kind of objects are included in the art installation?", "category": "conv"}
41
+ {"question_id": 40, "image": "COCO_val2014_000000506483.jpg", "text": "Explain the visual content of the image in great detail.", "category": "detail"}
42
+ {"question_id": 41, "image": "COCO_val2014_000000506483.jpg", "text": "How might the art installation encourage interaction among people?", "category": "complex"}
43
+ {"question_id": 42, "image": "COCO_val2014_000000097131.jpg", "text": "What is the main focus of the image?", "category": "conv"}
44
+ {"question_id": 43, "image": "COCO_val2014_000000097131.jpg", "text": "Can you elaborate on the elements of the picture provided?", "category": "detail"}
45
+ {"question_id": 44, "image": "COCO_val2014_000000097131.jpg", "text": "What might be the reason for the car to be parked on the side of the road?", "category": "complex"}
46
+ {"question_id": 45, "image": "COCO_val2014_000000052312.jpg", "text": "What is unusual about the elderly man's facial appearance in the image?", "category": "conv"}
47
+ {"question_id": 46, "image": "COCO_val2014_000000052312.jpg", "text": "What's happening in the scene?", "category": "detail"}
48
+ {"question_id": 47, "image": "COCO_val2014_000000052312.jpg", "text": "What message could be conveyed by the man's unusual facial adornment?", "category": "complex"}
49
+ {"question_id": 48, "image": "COCO_val2014_000000258285.jpg", "text": "How many airplanes are visible in the image?", "category": "conv"}
50
+ {"question_id": 49, "image": "COCO_val2014_000000258285.jpg", "text": "What do you see happening in this image?", "category": "detail"}
51
+ {"question_id": 50, "image": "COCO_val2014_000000258285.jpg", "text": "What environmental impact might these planes' activity have on the birds?", "category": "complex"}
52
+ {"question_id": 51, "image": "COCO_val2014_000000081552.jpg", "text": "What is the cat doing on the red couch?", "category": "conv"}
53
+ {"question_id": 52, "image": "COCO_val2014_000000081552.jpg", "text": "Write a detailed description of the given image.", "category": "detail"}
54
+ {"question_id": 53, "image": "COCO_val2014_000000081552.jpg", "text": "What factors may have led the cat to choose this location for sleep?", "category": "complex"}
55
+ {"question_id": 54, "image": "COCO_val2014_000000066144.jpg", "text": "What type of car is parked next to the stop sign in the image?", "category": "conv"}
56
+ {"question_id": 55, "image": "COCO_val2014_000000066144.jpg", "text": "Explain the visual content of the image in great detail.", "category": "detail"}
57
+ {"question_id": 56, "image": "COCO_val2014_000000066144.jpg", "text": "What can be inferred about the traffic situation in the area?", "category": "complex"}
58
+ {"question_id": 57, "image": "COCO_val2014_000000203629.jpg", "text": "What is the man doing in the image?", "category": "conv"}
59
+ {"question_id": 58, "image": "COCO_val2014_000000203629.jpg", "text": "Can you describe the main features of this image for me?", "category": "detail"}
60
+ {"question_id": 59, "image": "COCO_val2014_000000203629.jpg", "text": "What might be the reason behind the man's thumbs-up gesture while on the phone?", "category": "complex"}
61
+ {"question_id": 60, "image": "COCO_val2014_000000109532.jpg", "text": "What breed is the dog in the image?", "category": "conv"}
62
+ {"question_id": 61, "image": "COCO_val2014_000000109532.jpg", "text": "What are the key elements in this picture?", "category": "detail"}
63
+ {"question_id": 62, "image": "COCO_val2014_000000109532.jpg", "text": "What measures may be taken by the dog's owner to make the dog feel comfortable in the room?", "category": "complex"}
64
+ {"question_id": 63, "image": "COCO_val2014_000000431165.jpg", "text": "What is the color of the elephant in the image?", "category": "conv"}
65
+ {"question_id": 64, "image": "COCO_val2014_000000431165.jpg", "text": "What do you think is going on in this snapshot?", "category": "detail"}
66
+ {"question_id": 65, "image": "COCO_val2014_000000431165.jpg", "text": "What could be a potential concern for the baby elephant in this setting?", "category": "complex"}
67
+ {"question_id": 66, "image": "COCO_val2014_000000020650.jpg", "text": "What type of food items are present on the orange plate?", "category": "conv"}
68
+ {"question_id": 67, "image": "COCO_val2014_000000020650.jpg", "text": "What are the key elements in this picture?", "category": "detail"}
69
+ {"question_id": 68, "image": "COCO_val2014_000000020650.jpg", "text": "What can be inferred about the individual's dietary choices?", "category": "complex"}
70
+ {"question_id": 69, "image": "COCO_val2014_000000205183.jpg", "text": "What type of bird is pictured in the image?", "category": "conv"}
71
+ {"question_id": 70, "image": "COCO_val2014_000000205183.jpg", "text": "What do you see happening in this image?", "category": "detail"}
72
+ {"question_id": 71, "image": "COCO_val2014_000000205183.jpg", "text": "What challenges could the duck face while walking along the paved road?", "category": "complex"}
73
+ {"question_id": 72, "image": "COCO_val2014_000000210299.jpg", "text": "Is the little boy wearing any safety gear while riding his bike?", "category": "conv"}
74
+ {"question_id": 73, "image": "COCO_val2014_000000210299.jpg", "text": "Can you elaborate on the elements of the picture provided?", "category": "detail"}
75
+ {"question_id": 74, "image": "COCO_val2014_000000210299.jpg", "text": "Why is the little boy's precaution noteworthy?", "category": "complex"}
76
+ {"question_id": 75, "image": "COCO_val2014_000000515716.jpg", "text": "How many people are visible in the image?", "category": "conv"}
77
+ {"question_id": 76, "image": "COCO_val2014_000000515716.jpg", "text": "What do you see happening in this image?", "category": "detail"}
78
+ {"question_id": 77, "image": "COCO_val2014_000000515716.jpg", "text": "What might be the reason behind this gathering?", "category": "complex"}
79
+ {"question_id": 78, "image": "COCO_val2014_000000460149.jpg", "text": "What is the main object featured in the image?", "category": "conv"}
80
+ {"question_id": 79, "image": "COCO_val2014_000000460149.jpg", "text": "Describe the following image.", "category": "detail"}
81
+ {"question_id": 80, "image": "COCO_val2014_000000460149.jpg", "text": "Imagine you are walking down this street; how would you know the time or which direction the sidewalk leads?", "category": "complex"}
82
+ {"question_id": 81, "image": "COCO_val2014_000000293505.jpg", "text": "Is the person riding a motorbike or scooter?", "category": "conv"}
83
+ {"question_id": 82, "image": "COCO_val2014_000000293505.jpg", "text": "Explain the visual content of the image in great detail.", "category": "detail"}
84
+ {"question_id": 83, "image": "COCO_val2014_000000293505.jpg", "text": "What challenges might the woman on the motorcycle face in this situation?", "category": "complex"}
85
+ {"question_id": 84, "image": "COCO_val2014_000000525439.jpg", "text": "What is the position of the skateboard in the image?", "category": "conv"}
86
+ {"question_id": 85, "image": "COCO_val2014_000000525439.jpg", "text": "Can you elaborate on the elements of the picture provided?", "category": "detail"}
87
+ {"question_id": 86, "image": "COCO_val2014_000000525439.jpg", "text": "What might have happened prior to this moment?", "category": "complex"}
88
+ {"question_id": 87, "image": "COCO_val2014_000000534270.jpg", "text": "What type of hats are the man and woman wearing?", "category": "conv"}
89
+ {"question_id": 88, "image": "COCO_val2014_000000534270.jpg", "text": "Can you describe the main features of this image for me?", "category": "detail"}
90
+ {"question_id": 89, "image": "COCO_val2014_000000534270.jpg", "text": "What benefits do umbrella hats provide to the couple on this rainy day?", "category": "complex"}
ChatUniVi/eval/questions/coco_pope/coco_pope_adversarial.jsonl ADDED
The diff for this file is too large to render. See raw diff
 
ChatUniVi/eval/questions/coco_pope/coco_pope_popular.jsonl ADDED
The diff for this file is too large to render. See raw diff
 
ChatUniVi/eval/questions/coco_pope/coco_pope_random.jsonl ADDED
The diff for this file is too large to render. See raw diff
 
ChatUniVi/eval/questions/scienceqa/pid_splits.json ADDED
The diff for this file is too large to render. See raw diff
 
ChatUniVi/eval/questions/scienceqa/problems.json ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:4d9b598da966d9736dd79e430a97da861a2216aeb7483a5092350e823ab20ce7
3
+ size 31529211
ChatUniVi/eval/questions/scienceqa/test_QCM-LEA.json ADDED
The diff for this file is too large to render. See raw diff
 
ChatUniVi/eval/questions/video_qa/activitynet_a_list.json ADDED
@@ -0,0 +1,2105 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ "no",
3
+ "yes",
4
+ "day",
5
+ "outdoor",
6
+ "good looking",
7
+ "bit dangerous",
8
+ "secondary",
9
+ "simple",
10
+ "much simpler",
11
+ "more difficult",
12
+ "difficulty",
13
+ "low",
14
+ "unsafe",
15
+ "sunny",
16
+ "cloudy",
17
+ "2",
18
+ "1",
19
+ "5",
20
+ "3",
21
+ "4",
22
+ "6",
23
+ "11",
24
+ "7",
25
+ "8",
26
+ "female",
27
+ "male",
28
+ "indoor",
29
+ "shopkeepers and customers",
30
+ "friend",
31
+ "brother",
32
+ "bath towel",
33
+ "tie rope",
34
+ "combat training",
35
+ "play football on table",
36
+ "chipping potatoes",
37
+ "dishwashing",
38
+ "skateboard with water",
39
+ "defoliation",
40
+ "brush ones teeth",
41
+ "baton tennis",
42
+ "play ball",
43
+ "performing martial arts",
44
+ "play",
45
+ "dance",
46
+ "gargle",
47
+ "slider",
48
+ "wine dressing",
49
+ "rowing",
50
+ "pacify horse",
51
+ "drum",
52
+ "cook dish",
53
+ "do floor exercises",
54
+ "match",
55
+ "gymnastics in parallel bars",
56
+ "be referee",
57
+ "dishware",
58
+ "skin care",
59
+ "train",
60
+ "hammer throw",
61
+ "draw eyes shadow",
62
+ "wash horse",
63
+ "car wash",
64
+ "play musical instrument",
65
+ "kayaking",
66
+ "skiing",
67
+ "make cake",
68
+ "sweep snow for cars",
69
+ "paracentesis",
70
+ "drink",
71
+ "practice martial arts",
72
+ "make cold dishes",
73
+ "contain water",
74
+ "put shot",
75
+ "bathe horse",
76
+ "making cocktails",
77
+ "clean room",
78
+ "wipe glass",
79
+ "shovel snow",
80
+ "make spaghetti",
81
+ "dig up soil",
82
+ "cut tomato",
83
+ "tattoo",
84
+ "boxing",
85
+ "bodybuilding",
86
+ "sailing competition",
87
+ "hopping hula hoop",
88
+ "somersault",
89
+ "paint fingernails",
90
+ "make sandwich",
91
+ "introduce tool",
92
+ "walk dog",
93
+ "make ice cream",
94
+ "manicure",
95
+ "make hair",
96
+ "brushing horse",
97
+ "wrapping paper",
98
+ "play game",
99
+ "wear shoe",
100
+ "play with sand",
101
+ "chopping wood",
102
+ "smear sunscreen",
103
+ "weightlifting",
104
+ "do some washing",
105
+ "assemble bicycle",
106
+ "bathe dog",
107
+ "shoe polish",
108
+ "fire",
109
+ "sharpening",
110
+ "wear contact lenses",
111
+ "parade",
112
+ "brush shoes",
113
+ "cleaning deciduous leaves",
114
+ "wash clothes",
115
+ "play tennis",
116
+ "clink with dog",
117
+ "tires dismantling",
118
+ "snow removal",
119
+ "squeezed juice",
120
+ "play table tennis",
121
+ "run",
122
+ "diving",
123
+ "decorating christmas tree",
124
+ "shooting",
125
+ "pruning branches",
126
+ "javelin throw",
127
+ "shuttlecock",
128
+ "wallpaper",
129
+ "practice stick method",
130
+ "control remote control ship",
131
+ "assembling tires",
132
+ "sweeping snow",
133
+ "sailing",
134
+ "cut nails for cat",
135
+ "assembly slate",
136
+ "push ice pot",
137
+ "physical exercise",
138
+ "assemble christmas tree",
139
+ "hair removal",
140
+ "surfing",
141
+ "making lollipops",
142
+ "bungee jumping",
143
+ "weed",
144
+ "handcraft",
145
+ "clean glass",
146
+ "loading chain",
147
+ "play magic cube",
148
+ "landscaping",
149
+ "play volleyball",
150
+ "play harmonica",
151
+ "cooking",
152
+ "shave legs",
153
+ "taking something",
154
+ "perform",
155
+ "drinking",
156
+ "play weeding machine",
157
+ "clean desk",
158
+ "make drink",
159
+ "peeling sweet potatoes",
160
+ "licensing",
161
+ "pole vault",
162
+ "bowling",
163
+ "skip lattices",
164
+ "introduction of lawn mower",
165
+ "hula hoop",
166
+ "play bounce shoes",
167
+ "yoga teaching",
168
+ "throwing discus",
169
+ "balance beam",
170
+ "flute",
171
+ "fly kite",
172
+ "leaping",
173
+ "finger guessing game",
174
+ "blow sax",
175
+ "comb ones hair",
176
+ "make face",
177
+ "weave hair",
178
+ "chat",
179
+ "sunscreen",
180
+ "photograph",
181
+ "trailing ground",
182
+ "iron clothes",
183
+ "chipping",
184
+ "ride camel",
185
+ "demonstrating",
186
+ "riding",
187
+ "make light",
188
+ "paint fence",
189
+ "making sandwiches",
190
+ "discus throwing",
191
+ "gymnastics on horizontal bar",
192
+ "water gliding",
193
+ "shot put",
194
+ "kicking sand",
195
+ "fertilizer application",
196
+ "strap rope skipping",
197
+ "play baseball",
198
+ "interview",
199
+ "sit on ground",
200
+ "be pulled forward",
201
+ "shave",
202
+ "teaching",
203
+ "play computer games",
204
+ "play football",
205
+ "teaching martial arts",
206
+ "play jumper",
207
+ "help to cut hair",
208
+ "table tennis",
209
+ "play bumper car",
210
+ "skateboard",
211
+ "bike ride",
212
+ "paddle",
213
+ "tire repair",
214
+ "long jump",
215
+ "swimming",
216
+ "shine shoes",
217
+ "broadcast news",
218
+ "scavenging leaves",
219
+ "sail",
220
+ "training dog",
221
+ "use of vacuum cleaner",
222
+ "wrist wrestling",
223
+ "blow ones hair",
224
+ "field shooting",
225
+ "ride on bicycle",
226
+ "rock climbing",
227
+ "play slide",
228
+ "high jump",
229
+ "drive car",
230
+ "brush wall",
231
+ "skateboarding",
232
+ "slippery pulley",
233
+ "playing harmonica",
234
+ "cook",
235
+ "play beach volleyball",
236
+ "explain ice hockey",
237
+ "pray",
238
+ "play basketball",
239
+ "tug of war",
240
+ "dismantling gifts",
241
+ "football match",
242
+ "laying tile",
243
+ "explain",
244
+ "play with smarthphone",
245
+ "hair care",
246
+ "spruce up",
247
+ "gift of gift",
248
+ "throwing darts",
249
+ "play tai chi",
250
+ "play parallel bars",
251
+ "turn magic cube",
252
+ "draw",
253
+ "watch tv",
254
+ "dog",
255
+ "dog and cat",
256
+ "competition archery",
257
+ "throwing javelin",
258
+ "bicycle race",
259
+ "throw hammer",
260
+ "throwing discuses",
261
+ "training",
262
+ "mountain bike ride",
263
+ "ice curling",
264
+ "exercise gymnastics",
265
+ "water polo",
266
+ "turn somersault",
267
+ "gymnastics",
268
+ "throw ball",
269
+ "wrestling",
270
+ "enhanced collaboration",
271
+ "black",
272
+ "yellow",
273
+ "dodgeball",
274
+ "eat ice cream",
275
+ "haystack",
276
+ "kindling wood",
277
+ "smoking",
278
+ "tree planting",
279
+ "curly",
280
+ "make skis",
281
+ "play violin",
282
+ "grooming",
283
+ "shoes polish",
284
+ "cut persons head",
285
+ "by cable car",
286
+ "wire walking",
287
+ "do yoga",
288
+ "masonry wall",
289
+ "clean dog",
290
+ "push car",
291
+ "rope skipping",
292
+ "leather shoes",
293
+ "measurement length",
294
+ "car repair tires",
295
+ "pruning trees",
296
+ "tread on stilts",
297
+ "paint chair",
298
+ "tilling",
299
+ "dance hip hop",
300
+ "drink beer",
301
+ "dive to feed fish",
302
+ "windsurfing",
303
+ "boxing practice",
304
+ "haircut",
305
+ "ride bicycle",
306
+ "do shape packing",
307
+ "play piano",
308
+ "play hockey",
309
+ "eat something",
310
+ "rubbing feet",
311
+ "sleep",
312
+ "play with phone",
313
+ "light roof",
314
+ "ride bike",
315
+ "wash hands",
316
+ "play guitar",
317
+ "shoe rope",
318
+ "throw spear",
319
+ "fight",
320
+ "play music",
321
+ "prepare for dive",
322
+ "singing",
323
+ "tread",
324
+ "face",
325
+ "hockey game",
326
+ "helmet",
327
+ "hat",
328
+ "play billiards",
329
+ "knit sweater",
330
+ "make salad",
331
+ "use stick",
332
+ "skiing leather ring",
333
+ "light cigarette",
334
+ "tree pruning",
335
+ "tire change",
336
+ "performing gymnastics",
337
+ "play roller skating",
338
+ "wheel change",
339
+ "dance tai chi sword",
340
+ "wrists",
341
+ "be manicure",
342
+ "make sandwich biscuits",
343
+ "reaction capacity",
344
+ "gray",
345
+ "blue",
346
+ "green",
347
+ "red",
348
+ "white",
349
+ "black and white",
350
+ "orange",
351
+ "pink",
352
+ "purple",
353
+ "brown",
354
+ "golden",
355
+ "dynamic bicycle",
356
+ "white glove",
357
+ "glove",
358
+ "rest",
359
+ "lying on ground",
360
+ "introduce people",
361
+ "motorcycle jump",
362
+ "jump up",
363
+ "take cell phone",
364
+ "play with mud",
365
+ "and then drums",
366
+ "audience left",
367
+ "audience came to court",
368
+ "raise hand to celebrate",
369
+ "cheer",
370
+ "throw snowball",
371
+ "to ground",
372
+ "video end",
373
+ "audience applauded",
374
+ "then shovel snow",
375
+ "jump into sand pit",
376
+ "talk to passer by",
377
+ "run up",
378
+ "serve",
379
+ "take ball",
380
+ "go on court",
381
+ "introduction of products",
382
+ "drink drink",
383
+ "clean horse",
384
+ "lens shaky",
385
+ "end of demonstration",
386
+ "wash hair",
387
+ "start",
388
+ "add ice",
389
+ "prepare for start",
390
+ "shedding rope",
391
+ "check rope",
392
+ "take skates",
393
+ "get ready",
394
+ "coach guidance",
395
+ "referee throws the ball",
396
+ "cat peppermint",
397
+ "prepare starting",
398
+ "shoulder shoulder",
399
+ "showcase wine",
400
+ "blower",
401
+ "blow up drum",
402
+ "squat",
403
+ "almost hit by car",
404
+ "production process",
405
+ "button button",
406
+ "be interviewed",
407
+ "go out",
408
+ "down",
409
+ "all down",
410
+ "christmas tree fell down",
411
+ "hole",
412
+ "diver",
413
+ "plain white cloth",
414
+ "national flag",
415
+ "hair drier",
416
+ "white woman",
417
+ "wall column",
418
+ "visual acuity chart",
419
+ "shovel",
420
+ "wall",
421
+ "sofa",
422
+ "living room",
423
+ "tree",
424
+ "grassland",
425
+ "iron block",
426
+ "house",
427
+ "automobile",
428
+ "mirror",
429
+ "ground",
430
+ "billboard",
431
+ "enclosure",
432
+ "television",
433
+ "window",
434
+ "blue plastic film",
435
+ "hair stylist",
436
+ "wooden doors",
437
+ "small house",
438
+ "table",
439
+ "shelf",
440
+ "coloured lights",
441
+ "small window",
442
+ "fountain",
443
+ "audience",
444
+ "glass",
445
+ "blue screen",
446
+ "spectator seats",
447
+ "guardrail net",
448
+ "screen",
449
+ "cabinet",
450
+ "kitchen",
451
+ "wood",
452
+ "door",
453
+ "vehicle",
454
+ "christmas tree",
455
+ "chair",
456
+ "yellow bag",
457
+ "glass cabinet",
458
+ "two pieces of exhibition board",
459
+ "fish",
460
+ "goods shelves",
461
+ "treadmill",
462
+ "window curtains",
463
+ "snow mountain",
464
+ "mountain",
465
+ "car",
466
+ "stand",
467
+ "practice basketball",
468
+ "experimentalize",
469
+ "guitar",
470
+ "table football",
471
+ "bread",
472
+ "rope",
473
+ "men in white",
474
+ "microphone",
475
+ "poker",
476
+ "computer",
477
+ "disk",
478
+ "judges",
479
+ "ball net",
480
+ "drum kit",
481
+ "cobra",
482
+ "ball table",
483
+ "stone",
484
+ "sand",
485
+ "shoal of fish",
486
+ "white coat man",
487
+ "pool",
488
+ "road",
489
+ "water",
490
+ "tennis table",
491
+ "railing",
492
+ "tea table",
493
+ "cat",
494
+ "flower receptacle",
495
+ "fire pile",
496
+ "men in blue",
497
+ "cake",
498
+ "bowling pin",
499
+ "floor",
500
+ "hillside",
501
+ "white man",
502
+ "ironing table",
503
+ "basketball box",
504
+ "man in blue",
505
+ "table tennis table",
506
+ "food",
507
+ "network",
508
+ "red clothes",
509
+ "cruise",
510
+ "light pole",
511
+ "sound",
512
+ "agitation machine",
513
+ "man in camouflage",
514
+ "kitchen sink",
515
+ "two cattles",
516
+ "court",
517
+ "football field",
518
+ "man in white",
519
+ "wine bottle",
520
+ "basket",
521
+ "piano",
522
+ "beer",
523
+ "timer",
524
+ "counter",
525
+ "wash basin",
526
+ "bottle",
527
+ "ball",
528
+ "wrist watch",
529
+ "trash",
530
+ "steel pipe",
531
+ "model",
532
+ "row of tires",
533
+ "bunker",
534
+ "switch",
535
+ "stool",
536
+ "swimming pool",
537
+ "bracelet",
538
+ "spoon",
539
+ "milk",
540
+ "knife",
541
+ "surround masses",
542
+ "auditorium",
543
+ "silverware cadets",
544
+ "piano frame",
545
+ "fence",
546
+ "man in a suit",
547
+ "table and chair",
548
+ "horse",
549
+ "guardrail",
550
+ "referee",
551
+ "glass table",
552
+ "sea",
553
+ "wine glass",
554
+ "material science",
555
+ "seasoning",
556
+ "card",
557
+ "ice cream",
558
+ "tool",
559
+ "bowl",
560
+ "down by sally gardens",
561
+ "spray painting",
562
+ "club signs",
563
+ "help man shave",
564
+ "relax",
565
+ "decompression",
566
+ "physical fitness",
567
+ "exercise muscles",
568
+ "relieve stress",
569
+ "laugh",
570
+ "put on shoes",
571
+ "lingual nail",
572
+ "cut roof tin",
573
+ "gymnastic mat",
574
+ "siberian husky",
575
+ "poodle",
576
+ "cooking noodles",
577
+ "make egg roll",
578
+ "collar exercises",
579
+ "transparent",
580
+ "much much safer",
581
+ "much higher",
582
+ "christmas",
583
+ "s",
584
+ "e",
585
+ "exercise bike",
586
+ "skate",
587
+ "lawn",
588
+ "cement floor",
589
+ "horizontal bar",
590
+ "surf board",
591
+ "circular site",
592
+ "woman in white",
593
+ "water basin",
594
+ "trampoline",
595
+ "rim",
596
+ "volleyball court",
597
+ "blue dress man",
598
+ "garden",
599
+ "carrot",
600
+ "pads",
601
+ "vacuum cleaner",
602
+ "cooking bench",
603
+ "notes",
604
+ "juicer",
605
+ "blanket",
606
+ "bathing pool",
607
+ "curling runway",
608
+ "wheel",
609
+ "bar counter",
610
+ "protective net",
611
+ "opponent",
612
+ "contestant",
613
+ "hopping viaduct",
614
+ "pool table",
615
+ "curly hair",
616
+ "pet dog",
617
+ "hairstylist",
618
+ "coach",
619
+ "nail polish",
620
+ "make up",
621
+ "take exercise",
622
+ "play darts",
623
+ "water spray",
624
+ "tell about",
625
+ "phone",
626
+ "gymnastics competition",
627
+ "show turns eye",
628
+ "guard net",
629
+ "ski",
630
+ "drawing board",
631
+ "welding",
632
+ "buoy",
633
+ "watch",
634
+ "hair hoop",
635
+ "headset",
636
+ "flying discses",
637
+ "gambling",
638
+ "explain games rule",
639
+ "high",
640
+ "security",
641
+ "danger",
642
+ "volleyball",
643
+ "long distance run",
644
+ "twenty one points",
645
+ "tennis sports",
646
+ "ice hockey movement",
647
+ "parallel bars movement",
648
+ "three step jump",
649
+ "ice hockey",
650
+ "705",
651
+ "mouthpiece",
652
+ "budweiser",
653
+ "wrench",
654
+ "ceiling",
655
+ "sky",
656
+ "parallel bars exercise",
657
+ "boxing match",
658
+ "wiping cupboard",
659
+ "seal carpets",
660
+ "poweriser",
661
+ "hair rope",
662
+ "wash socks",
663
+ "toilet paper",
664
+ "braided hair",
665
+ "pastry master",
666
+ "charlie adams",
667
+ "decorator",
668
+ "colleague",
669
+ "partner",
670
+ "master and servant",
671
+ "mother and daughter",
672
+ "teammate",
673
+ "whole family",
674
+ "family",
675
+ "spouse",
676
+ "smoke friend",
677
+ "doctor patient relationship",
678
+ "teaching relationship",
679
+ "father and son",
680
+ "father and daughter",
681
+ "lovers",
682
+ "classmate",
683
+ "dancing partner",
684
+ "video player",
685
+ "row of fences",
686
+ "lower",
687
+ "low grade",
688
+ "higher",
689
+ "much more dangerous",
690
+ "bit safe",
691
+ "protect head",
692
+ "commonly",
693
+ "winter",
694
+ "circular",
695
+ "cylinder",
696
+ "trapezoid",
697
+ "square",
698
+ "rectangle",
699
+ "t shirt",
700
+ "long",
701
+ "snow",
702
+ "roof",
703
+ "runway",
704
+ "introduction equipment",
705
+ "clear",
706
+ "preside over program",
707
+ "hand drums",
708
+ "fitness equipment",
709
+ "archery",
710
+ "relatives",
711
+ "in repair",
712
+ "practice ball",
713
+ "make biscuits",
714
+ "how to wear contact lenses",
715
+ "introduction of cutting tools",
716
+ "how to set up cars",
717
+ "billiard game",
718
+ "rules of playing cards",
719
+ "food program",
720
+ "yoga mat",
721
+ "coaster",
722
+ "board",
723
+ "paper",
724
+ "lake",
725
+ "stage",
726
+ "inverted reflection in water",
727
+ "rubber runway",
728
+ "hovercraft",
729
+ "necklace",
730
+ "labrador",
731
+ "short",
732
+ "blue jeans",
733
+ "jeans",
734
+ "jump",
735
+ "jumping project",
736
+ "gym shoes",
737
+ "boots",
738
+ "artistic gymnastics",
739
+ "night",
740
+ "bar",
741
+ "home",
742
+ "basketball court",
743
+ "gym",
744
+ "hockey field",
745
+ "suburb",
746
+ "barber shop",
747
+ "beach",
748
+ "natatorium",
749
+ "casino",
750
+ "in street",
751
+ "snow land",
752
+ "bedroom",
753
+ "grass",
754
+ "parking lot",
755
+ "toilet",
756
+ "studio",
757
+ "park",
758
+ "hall",
759
+ "dancing room",
760
+ "playground",
761
+ "street",
762
+ "hotel",
763
+ "tattoo shop",
764
+ "shower room",
765
+ "sandy beach",
766
+ "room",
767
+ "rooftop",
768
+ "cave",
769
+ "stadium",
770
+ "plain",
771
+ "desk",
772
+ "ski field",
773
+ "tennis court",
774
+ "baseball field",
775
+ "lakeside",
776
+ "laboratory",
777
+ "church",
778
+ "amusement park",
779
+ "racetrack",
780
+ "horse yard",
781
+ "training ground",
782
+ "supermarket",
783
+ "office",
784
+ "market",
785
+ "tennis room",
786
+ "bowling room",
787
+ "manicure shop",
788
+ "game place",
789
+ "seaside",
790
+ "aquatic",
791
+ "chess and card room",
792
+ "left",
793
+ "left hand",
794
+ "black man",
795
+ "stimulate",
796
+ "reduce drag",
797
+ "give yourself inertia",
798
+ "increase jump distance",
799
+ "poor balance",
800
+ "for beauty",
801
+ "avoid injury",
802
+ "for sake of beauty",
803
+ "beautiful",
804
+ "anti damage",
805
+ "avoid hurt somenon",
806
+ "beauty",
807
+ "keep health",
808
+ "entertainment",
809
+ "convenient",
810
+ "wonderful performance",
811
+ "prevent drowning",
812
+ "woman",
813
+ "cylindrical",
814
+ "triangle",
815
+ "ellipse",
816
+ "round",
817
+ "dragon boat",
818
+ "hard to catch fire",
819
+ "2 people",
820
+ "skiing air cushion",
821
+ "sedan",
822
+ "good",
823
+ "wooden house",
824
+ "scuba diving",
825
+ "sunglasses",
826
+ "drifting",
827
+ "braid of double twist",
828
+ "out of flatness",
829
+ "slipper",
830
+ "stripe",
831
+ "suit",
832
+ "lattice",
833
+ "cleanser",
834
+ "cutting machine",
835
+ "air conditioner",
836
+ "two little funny birds",
837
+ "sapling",
838
+ "blonde",
839
+ "spider man toy",
840
+ "vest",
841
+ "tango",
842
+ "villa",
843
+ "wooden boat",
844
+ "springboard",
845
+ "slide",
846
+ "cardboard",
847
+ "protective pad",
848
+ "tigers head",
849
+ "plastic bag",
850
+ "onion",
851
+ "introduction of bullfighting",
852
+ "painting",
853
+ "game",
854
+ "take step",
855
+ "do aerobics",
856
+ "learn diving",
857
+ "soup spoon",
858
+ "english",
859
+ "banana",
860
+ "sax",
861
+ "workbench",
862
+ "drifting air cushion",
863
+ "pedal",
864
+ "bridge frame",
865
+ "sponge pad",
866
+ "child seat",
867
+ "bicycle",
868
+ "earth",
869
+ "seaweed",
870
+ "sealing layer",
871
+ "marble",
872
+ "bed",
873
+ "lifting jack",
874
+ "brand",
875
+ "sailboat",
876
+ "ponytail",
877
+ "dress",
878
+ "take deep breath",
879
+ "pommeled horse",
880
+ "shoulder hair",
881
+ "butterfly",
882
+ "peaked cap",
883
+ "sweet canister",
884
+ "new type lawn mower",
885
+ "fixator",
886
+ "scientific research ship",
887
+ "sandals",
888
+ "leather boots",
889
+ "blue shorts",
890
+ "funny video",
891
+ "b",
892
+ "pvc material",
893
+ "roast fish",
894
+ "basketball match",
895
+ "sitting",
896
+ "summer",
897
+ "cheerleading",
898
+ "spider",
899
+ "evening",
900
+ "afternoon",
901
+ "axe",
902
+ "movement type",
903
+ "racing moto",
904
+ "remote control boat",
905
+ "2012",
906
+ "halloween",
907
+ "casinos",
908
+ "carpet",
909
+ "track",
910
+ "field",
911
+ "park path",
912
+ "bread machine",
913
+ "yard",
914
+ "workshop",
915
+ "meadow",
916
+ "circle",
917
+ "railway bridge",
918
+ "river",
919
+ "restaurant",
920
+ "doorway",
921
+ "opera",
922
+ "track and field ground",
923
+ "sports meeting",
924
+ "subway",
925
+ "bullring",
926
+ "head",
927
+ "cudgel court",
928
+ "bathroom",
929
+ "bicycle shop",
930
+ "guide room",
931
+ "prairie track",
932
+ "snowfield",
933
+ "camel",
934
+ "seabed",
935
+ "aged",
936
+ "tropic",
937
+ "japan",
938
+ "srb",
939
+ "left eye",
940
+ "right eye",
941
+ "thumb",
942
+ "ones right hand",
943
+ "right",
944
+ "right hand",
945
+ "ger",
946
+ "leather gloves",
947
+ "second dives",
948
+ "left foot",
949
+ "her father",
950
+ "india",
951
+ "silverware",
952
+ "red jersey",
953
+ "blonde man",
954
+ "ring finger",
955
+ "catch fish",
956
+ "dive",
957
+ "pregnant",
958
+ "to throw far away",
959
+ "motion",
960
+ "sparring",
961
+ "to throw shot",
962
+ "be happy with drum",
963
+ "happy",
964
+ "get rid of blues",
965
+ "in washing up",
966
+ "some water on hands",
967
+ "wear jump shoes",
968
+ "in fight",
969
+ "someones good at skipping rope",
970
+ "for entertainment",
971
+ "win",
972
+ "easy to shave",
973
+ "make darts",
974
+ "labor saving",
975
+ "darts are easy to targets",
976
+ "express happiness",
977
+ "score",
978
+ "win in gambling",
979
+ "be covered by people",
980
+ "blindfolded eyes",
981
+ "to challenge themselves",
982
+ "prevent skidding",
983
+ "express joy",
984
+ "speed up javelin",
985
+ "more beautiful",
986
+ "give discus inertia",
987
+ "to express courtesy",
988
+ "guide children",
989
+ "blower is too heavy",
990
+ "greeting",
991
+ "cold prevention",
992
+ "end",
993
+ "be more beautiful",
994
+ "decorating house",
995
+ "trees are not neat",
996
+ "protect",
997
+ "protect eye",
998
+ "hungry",
999
+ "avoid messing",
1000
+ "thanks to audience",
1001
+ "easy eat",
1002
+ "arm force",
1003
+ "take part",
1004
+ "do public welfare",
1005
+ "reduce friction",
1006
+ "increase difficulty",
1007
+ "keep healthy",
1008
+ "burning fire",
1009
+ "convenient weeding",
1010
+ "express victory",
1011
+ "to dive",
1012
+ "scoop water",
1013
+ "record results",
1014
+ "speed up",
1015
+ "jump far",
1016
+ "unsteadiness of gravity",
1017
+ "curettage",
1018
+ "protect waist",
1019
+ "eatting",
1020
+ "make car light",
1021
+ "make manicure easier",
1022
+ "squeezing apple",
1023
+ "test light bulb",
1024
+ "car dirty",
1025
+ "mouth leaking",
1026
+ "clothing leveling",
1027
+ "be attacked",
1028
+ "interest",
1029
+ "easy blow",
1030
+ "fixed thread",
1031
+ "farther of the jump",
1032
+ "angry",
1033
+ "have personality",
1034
+ "avoid freezing hands",
1035
+ "protect teeth",
1036
+ "pick up speed",
1037
+ "safety guarantee",
1038
+ "you can jump farther",
1039
+ "others car broke down",
1040
+ "because long jump",
1041
+ "to blow sax",
1042
+ "put on hat",
1043
+ "reduce center of gravity",
1044
+ "hamper ball",
1045
+ "decorate",
1046
+ "acne treatment",
1047
+ "encouragement",
1048
+ "balance",
1049
+ "challenging",
1050
+ "bullet dodging",
1051
+ "interesting",
1052
+ "cheerful mood",
1053
+ "bring eggs together",
1054
+ "imbalance of body",
1055
+ "satisfy greed",
1056
+ "thank",
1057
+ "put child down",
1058
+ "drink green liquid",
1059
+ "let people pass through",
1060
+ "pursuit of stimulation",
1061
+ "better growth",
1062
+ "excitement",
1063
+ "to win",
1064
+ "ball inertia",
1065
+ "halloween decoration",
1066
+ "active atmosphere",
1067
+ "keep clean",
1068
+ "protect their heads",
1069
+ "good growth of plants",
1070
+ "almost power",
1071
+ "maintain level",
1072
+ "dinner",
1073
+ "encourage each other",
1074
+ "increase speed of shot",
1075
+ "irritation",
1076
+ "tire broken",
1077
+ "work",
1078
+ "art of display",
1079
+ "healthy",
1080
+ "prevent cramps",
1081
+ "fear tree be frozen",
1082
+ "convenient engraving",
1083
+ "clean",
1084
+ "ranking",
1085
+ "teaching video",
1086
+ "dress up",
1087
+ "test",
1088
+ "record video",
1089
+ "video recording",
1090
+ "improve skills",
1091
+ "recording time",
1092
+ "stick wallpaper",
1093
+ "accident prevention",
1094
+ "clean and beautiful",
1095
+ "convenient imitation",
1096
+ "convenient viewing",
1097
+ "greeting new year",
1098
+ "beautify environment",
1099
+ "well done",
1100
+ "art",
1101
+ "keep weight",
1102
+ "prevent being injury",
1103
+ "to be beautiful",
1104
+ "sport project",
1105
+ "competition",
1106
+ "make cake tasty",
1107
+ "bowl is dirty",
1108
+ "for sunscreen",
1109
+ "for safety",
1110
+ "dirty",
1111
+ "filter out water",
1112
+ "grass is too high",
1113
+ "anger",
1114
+ "to express comfort",
1115
+ "game lost",
1116
+ "strengthen proficiency",
1117
+ "record performance",
1118
+ "fear of hindering people",
1119
+ "curling",
1120
+ "challenge stimulus",
1121
+ "tired out",
1122
+ "more practice",
1123
+ "inertia",
1124
+ "end performance",
1125
+ "brain is damaged",
1126
+ "guessing victory",
1127
+ "escape",
1128
+ "because of smoking",
1129
+ "because of tattoo pain",
1130
+ "large density",
1131
+ "strong body",
1132
+ "because its done",
1133
+ "experience",
1134
+ "goal",
1135
+ "celebrate victory",
1136
+ "express excitement",
1137
+ "because you want to dive",
1138
+ "fixed ceramic tile",
1139
+ "easy understand",
1140
+ "avoid enzyme change",
1141
+ "for eatting",
1142
+ "convenient for walking",
1143
+ "prevent fall",
1144
+ "accelerate",
1145
+ "air rotation",
1146
+ "back somersault",
1147
+ "take oil",
1148
+ "table collapsed",
1149
+ "assembled rear tire",
1150
+ "tie up hair",
1151
+ "open your hands",
1152
+ "shave sideburns",
1153
+ "upside up",
1154
+ "turn head",
1155
+ "step back",
1156
+ "chilli powder",
1157
+ "stride left foot",
1158
+ "straighten back",
1159
+ "cut off",
1160
+ "anjali mudra",
1161
+ "look at effect",
1162
+ "active wrist",
1163
+ "toys have been raised",
1164
+ "waving",
1165
+ "teaching by step",
1166
+ "pulp",
1167
+ "grasp rope",
1168
+ "be pulled down",
1169
+ "nearly fall",
1170
+ "hand in hand",
1171
+ "stand up",
1172
+ "wave",
1173
+ "pine",
1174
+ "return to place",
1175
+ "fell to ground",
1176
+ "wear sunglasses",
1177
+ "skiing down hill",
1178
+ "wash dishes",
1179
+ "and put it back again",
1180
+ "fall on air cushion",
1181
+ "lose ball",
1182
+ "close scissors",
1183
+ "changing right hand",
1184
+ "rotary handlebar",
1185
+ "turn on light",
1186
+ "put sweet potato in bowls",
1187
+ "electrified",
1188
+ "vomit",
1189
+ "fall",
1190
+ "help him cut his hair",
1191
+ "fall into water",
1192
+ "bend",
1193
+ "stretch leg",
1194
+ "take off gloves",
1195
+ "put into water tank",
1196
+ "start dancing",
1197
+ "well cooked",
1198
+ "unable to stand firmly",
1199
+ "slide down slope",
1200
+ "put on leg",
1201
+ "black pants swimmers",
1202
+ "go on running",
1203
+ "kicking doll",
1204
+ "be cuddle",
1205
+ "go out of room",
1206
+ "puff out smoke",
1207
+ "start of the game",
1208
+ "control by foot",
1209
+ "celebrate",
1210
+ "pick up",
1211
+ "stir",
1212
+ "tissue",
1213
+ "bartender",
1214
+ "automative lighting",
1215
+ "audiences stand",
1216
+ "star shaped toy",
1217
+ "water sled",
1218
+ "red cloth",
1219
+ "curtain",
1220
+ "safety net",
1221
+ "pumpkin shed",
1222
+ "oxygen bottle",
1223
+ "big bottle",
1224
+ "spider man",
1225
+ "desert",
1226
+ "personal information",
1227
+ "painted wall",
1228
+ "red curtain",
1229
+ "both hands",
1230
+ "lot of boxes",
1231
+ "steps",
1232
+ "bookcase",
1233
+ "oven",
1234
+ "shed",
1235
+ "telegraph pole",
1236
+ "ornament",
1237
+ "white walls",
1238
+ "performers",
1239
+ "dresser",
1240
+ "water tap",
1241
+ "magic cube",
1242
+ "pot",
1243
+ "toaster oven",
1244
+ "tennis",
1245
+ "bullfighting field",
1246
+ "bet",
1247
+ "grinder machine",
1248
+ "scoreboard",
1249
+ "machine",
1250
+ "pull rope",
1251
+ "launch",
1252
+ "boiler",
1253
+ "potted plant",
1254
+ "photo",
1255
+ "minions",
1256
+ "ring",
1257
+ "blue sneakers",
1258
+ "big tree",
1259
+ "refrigerator",
1260
+ "line",
1261
+ "yellow paint",
1262
+ "iron chain",
1263
+ "patch",
1264
+ "glasses",
1265
+ "dolly",
1266
+ "hu la hoop",
1267
+ "safety hat",
1268
+ "plastic flowers",
1269
+ "lamp",
1270
+ "curling brush",
1271
+ "bushes",
1272
+ "long hair man",
1273
+ "child",
1274
+ "saw",
1275
+ "plate",
1276
+ "yellow basin",
1277
+ "men in black",
1278
+ "street lamp",
1279
+ "spare tire",
1280
+ "tattoo artist",
1281
+ "dry powder plate",
1282
+ "black hair woman",
1283
+ "barbell",
1284
+ "earring",
1285
+ "parallel bar",
1286
+ "large building",
1287
+ "ceramic tile",
1288
+ "person wearing a hat",
1289
+ "pond",
1290
+ "row of clothes",
1291
+ "iron",
1292
+ "masonry",
1293
+ "ladder",
1294
+ "cameraman",
1295
+ "canvas",
1296
+ "shrimp meat",
1297
+ "hand washing box",
1298
+ "awning",
1299
+ "stairs",
1300
+ "american flag",
1301
+ "socket",
1302
+ "cosmetics",
1303
+ "clothes",
1304
+ "romaine lettuce",
1305
+ "make body pliable",
1306
+ "rabbit",
1307
+ "red baffle",
1308
+ "horse running yard",
1309
+ "personnel",
1310
+ "banana tree",
1311
+ "british flag",
1312
+ "very excited",
1313
+ "red ball",
1314
+ "shore",
1315
+ "release pressure",
1316
+ "purify air",
1317
+ "exercise balance",
1318
+ "9",
1319
+ "exercise",
1320
+ "make report",
1321
+ "yelling",
1322
+ "eradicator",
1323
+ "mat cloth",
1324
+ "chopping block",
1325
+ "stone and water grass",
1326
+ "seawater",
1327
+ "crew cut",
1328
+ "cold",
1329
+ "red and black",
1330
+ "wash milk",
1331
+ "height",
1332
+ "clockwise",
1333
+ "anti clockwise",
1334
+ "forward",
1335
+ "up and down",
1336
+ "front",
1337
+ "5000 meters",
1338
+ "oxygen mask",
1339
+ "blue shirt",
1340
+ "very good",
1341
+ "supply lemon juice",
1342
+ "clean and tidy",
1343
+ "fixed hairstyle",
1344
+ "straw",
1345
+ "front rollover",
1346
+ "cry sadly",
1347
+ "very angry",
1348
+ "smile",
1349
+ "more fair",
1350
+ "its pretty",
1351
+ "eager",
1352
+ "fat",
1353
+ "a",
1354
+ "w",
1355
+ "t",
1356
+ "c",
1357
+ "cucumber",
1358
+ "woodiness",
1359
+ "mustache",
1360
+ "chopped wood",
1361
+ "ball frame",
1362
+ "target",
1363
+ "gambling table",
1364
+ "bag",
1365
+ "cross bar",
1366
+ "equip them with modern machines",
1367
+ "rock",
1368
+ "craft",
1369
+ "wood pile",
1370
+ "protective effect",
1371
+ "do horizontal bar gymnastics",
1372
+ "do homework",
1373
+ "main committee",
1374
+ "origami",
1375
+ "asymmetrical bars",
1376
+ "bob",
1377
+ "shoulder length hair",
1378
+ "single cauda",
1379
+ "short hair",
1380
+ "lime",
1381
+ "electromagnetic furnace",
1382
+ "clerk",
1383
+ "athletes",
1384
+ "reporter",
1385
+ "p",
1386
+ "pumpkin",
1387
+ "matador",
1388
+ "barber",
1389
+ "cooker",
1390
+ "fitness coach",
1391
+ "decorating umbrella",
1392
+ "basin",
1393
+ "group of children",
1394
+ "twinkle",
1395
+ "gymnastic performance",
1396
+ "beautiful arched eyebrows",
1397
+ "hosting news",
1398
+ "variety of wine",
1399
+ "sandwich",
1400
+ "skateboard of water skiing",
1401
+ "sing",
1402
+ "hold girl",
1403
+ "exercise weight lifting",
1404
+ "mowing lawn",
1405
+ "drift",
1406
+ "shoeshine",
1407
+ "cross country race",
1408
+ "women in red clothes",
1409
+ "rag",
1410
+ "ride cross country motorcycle",
1411
+ "bullfight",
1412
+ "broadcast",
1413
+ "black hair girl",
1414
+ "1154",
1415
+ "female host",
1416
+ "how to cut potatoes",
1417
+ "very pleased",
1418
+ "ballet dancer",
1419
+ "long rod",
1420
+ "four thousand and six hundred",
1421
+ "first",
1422
+ "korea",
1423
+ "walk",
1424
+ "recreational machines",
1425
+ "29",
1426
+ "1951",
1427
+ "330",
1428
+ "1144",
1429
+ "knock toy",
1430
+ "spinning",
1431
+ "mans head",
1432
+ "cut tree",
1433
+ "standing",
1434
+ "party",
1435
+ "brush",
1436
+ "practice water sled",
1437
+ "package book",
1438
+ "ski slope",
1439
+ "teach hair",
1440
+ "camera",
1441
+ "apple juice",
1442
+ "short hair baby",
1443
+ "half squat",
1444
+ "hold right leg",
1445
+ "squatting",
1446
+ "lead singer",
1447
+ "doctor",
1448
+ "trainer",
1449
+ "safe of car",
1450
+ "life buoy",
1451
+ "sandbag",
1452
+ "woven goods",
1453
+ "pepper",
1454
+ "companion",
1455
+ "partnership",
1456
+ "stranger",
1457
+ "competitor",
1458
+ "shopkeepers and shopkeepers",
1459
+ "brother and sister",
1460
+ "shopkeeper and customer",
1461
+ "masses and journalists",
1462
+ "boss and the customer",
1463
+ "referee and player",
1464
+ "row of cars",
1465
+ "hemp rope",
1466
+ "forest",
1467
+ "green brush",
1468
+ "casement window",
1469
+ "black hat man",
1470
+ "poisoning",
1471
+ "much much higher",
1472
+ "much safer",
1473
+ "removal of bubbles",
1474
+ "fixed hair",
1475
+ "natural lashes",
1476
+ "control direction",
1477
+ "10",
1478
+ "floating ice",
1479
+ "colorful",
1480
+ "red and white",
1481
+ "silver",
1482
+ "ballet",
1483
+ "take off shoes",
1484
+ "lift her up",
1485
+ "shaving cutter head",
1486
+ "scissors",
1487
+ "carding",
1488
+ "take off long rope",
1489
+ "round to other side",
1490
+ "stop",
1491
+ "hand ring",
1492
+ "photo display",
1493
+ "pull dog down",
1494
+ "two circles of rotation",
1495
+ "rolling skin",
1496
+ "feed bread",
1497
+ "drumstick",
1498
+ "pocket knife",
1499
+ "take off your shirt",
1500
+ "appearance of name",
1501
+ "press ceramic tile",
1502
+ "flexibility",
1503
+ "team consciousness",
1504
+ "throw away tissue",
1505
+ "scarf",
1506
+ "basketball",
1507
+ "hairpin",
1508
+ "branches and leaves fell",
1509
+ "release white smoke",
1510
+ "rugby",
1511
+ "prayers",
1512
+ "make phone",
1513
+ "gymnastics suit",
1514
+ "right handed rod",
1515
+ "lift truck",
1516
+ "unload barbell",
1517
+ "feathered pat",
1518
+ "physical energy",
1519
+ "plug igniter",
1520
+ "pen",
1521
+ "straw hat",
1522
+ "training skills",
1523
+ "harmonica",
1524
+ "plastic track",
1525
+ "flat shovel",
1526
+ "enjoy",
1527
+ "life jacket",
1528
+ "pine soil",
1529
+ "movement of hand",
1530
+ "wristwatch",
1531
+ "hands on ability",
1532
+ "needle",
1533
+ "obstacle",
1534
+ "vaulting horse",
1535
+ "podium",
1536
+ "yellow ironing cloth",
1537
+ "achievement is effective",
1538
+ "coordination",
1539
+ "man in green",
1540
+ "avoid opponents ball",
1541
+ "wear ballet shoes",
1542
+ "clap hands",
1543
+ "hold together",
1544
+ "continue down",
1545
+ "embrace",
1546
+ "shoeshine surface",
1547
+ "black container",
1548
+ "put cup down",
1549
+ "vertical thumb",
1550
+ "dog catches the plate",
1551
+ "then training",
1552
+ "running",
1553
+ "clapping",
1554
+ "listen to coach",
1555
+ "twist and a smile",
1556
+ "pinch with perturbed",
1557
+ "fixed with adhesive paper",
1558
+ "boy comes down",
1559
+ "snow fall",
1560
+ "do bike ride",
1561
+ "mans hand",
1562
+ "ball goal net",
1563
+ "need some help to correct",
1564
+ "cup was removed",
1565
+ "ball is bounced back",
1566
+ "camel came over",
1567
+ "pulverized people lead",
1568
+ "fly back to roof",
1569
+ "stop timing",
1570
+ "blow dry",
1571
+ "play with toys",
1572
+ "change tire",
1573
+ "fixed tire",
1574
+ "remove rubber ring",
1575
+ "drink milk tea",
1576
+ "go to black dog",
1577
+ "bow",
1578
+ "shoelace",
1579
+ "powdery base",
1580
+ "cup fell into water",
1581
+ "blue team serve",
1582
+ "get home",
1583
+ "blood flow",
1584
+ "car scrubbing",
1585
+ "take out chips",
1586
+ "smooth and smooth",
1587
+ "treatment of chili",
1588
+ "start training",
1589
+ "discus collision",
1590
+ "perm hand",
1591
+ "tutoring cadets",
1592
+ "eat ball",
1593
+ "dog planer",
1594
+ "wine precipitation",
1595
+ "start skiing",
1596
+ "wash ones face",
1597
+ "clenching fist",
1598
+ "assemble cake",
1599
+ "clip eyelash",
1600
+ "push people",
1601
+ "brace with feet",
1602
+ "take off faucet",
1603
+ "grab ball",
1604
+ "lay by small tree",
1605
+ "stop roller skating",
1606
+ "do edge decoration",
1607
+ "nail clipper",
1608
+ "look at blade",
1609
+ "evade automatically",
1610
+ "snowball",
1611
+ "slide out of site",
1612
+ "punching",
1613
+ "open ones eyes",
1614
+ "go down table",
1615
+ "blonde womens car wash",
1616
+ "splash",
1617
+ "look computer desktop",
1618
+ "board stands up",
1619
+ "inserting needle",
1620
+ "keep shaving",
1621
+ "leave",
1622
+ "take out gun",
1623
+ "turn around",
1624
+ "be pulled by ship",
1625
+ "tapping bucket",
1626
+ "cilping some lemon slices",
1627
+ "bow to lens",
1628
+ "eat up",
1629
+ "tie shoelaces",
1630
+ "throw ball out",
1631
+ "shoes getting clean",
1632
+ "throw it to wall",
1633
+ "regulating nozzle",
1634
+ "start tug of war",
1635
+ "frying eggs",
1636
+ "adhesive tape",
1637
+ "blow up",
1638
+ "go back to walk",
1639
+ "shot switching",
1640
+ "continue to grind knife",
1641
+ "hit each other",
1642
+ "hand down",
1643
+ "grey team celebrates",
1644
+ "draw rubber rafts",
1645
+ "push left dolls",
1646
+ "dog ran away",
1647
+ "wait for",
1648
+ "speak",
1649
+ "block gliding",
1650
+ "walk away",
1651
+ "put slice of lemon",
1652
+ "look javelin distance",
1653
+ "cooling",
1654
+ "eliminated",
1655
+ "smoothly",
1656
+ "water is flooded",
1657
+ "get up to pay",
1658
+ "change pair of shoes",
1659
+ "go ashore",
1660
+ "flushing razor",
1661
+ "emotional excitement",
1662
+ "throw snow on edge",
1663
+ "pour out washing powder",
1664
+ "start bungee jumping",
1665
+ "takeoff",
1666
+ "packing",
1667
+ "got third",
1668
+ "darkened",
1669
+ "drink water",
1670
+ "caterpillar wallpaper",
1671
+ "lose match",
1672
+ "cow fell down",
1673
+ "inside car",
1674
+ "lid pressure",
1675
+ "throw barbell",
1676
+ "screwing nut",
1677
+ "fabric line",
1678
+ "hold child",
1679
+ "cook noodles",
1680
+ "continue to split wood",
1681
+ "clean horses hind leg",
1682
+ "very happy",
1683
+ "man jump down",
1684
+ "cutting wallpaper",
1685
+ "wear good left eye",
1686
+ "start jumping",
1687
+ "punches",
1688
+ "speech",
1689
+ "exhibition",
1690
+ "garden cart",
1691
+ "dismantling light bulb",
1692
+ "go to diver",
1693
+ "step by step",
1694
+ "sit down on your knees",
1695
+ "preparation materials",
1696
+ "get off car",
1697
+ "let curling round legs",
1698
+ "wear gloves",
1699
+ "fermation",
1700
+ "shaving cutter",
1701
+ "put down saw",
1702
+ "pony fell down",
1703
+ "raise ones hands",
1704
+ "turn two laps",
1705
+ "open ones mouth",
1706
+ "explanation usage",
1707
+ "pull hand brake",
1708
+ "floating on water",
1709
+ "open sound",
1710
+ "cut cake",
1711
+ "air pressure",
1712
+ "go to woman",
1713
+ "introduce",
1714
+ "prepare weapon",
1715
+ "sweep floor",
1716
+ "prepare bar",
1717
+ "dipping pigment",
1718
+ "count",
1719
+ "pull hands back",
1720
+ "tidy wire",
1721
+ "hold harmonica",
1722
+ "floating in water",
1723
+ "bet on",
1724
+ "introduction of pang ball",
1725
+ "display ornaments",
1726
+ "explanation skills",
1727
+ "stand straight",
1728
+ "erect canvas",
1729
+ "dipping shoe oil",
1730
+ "fooling around",
1731
+ "measuring distance",
1732
+ "display tools",
1733
+ "nail nail",
1734
+ "rotate",
1735
+ "pre match preparation",
1736
+ "wearing frog shoe",
1737
+ "pose",
1738
+ "smear shaving blister",
1739
+ "send message",
1740
+ "select curler",
1741
+ "stake",
1742
+ "prepare tools",
1743
+ "cement",
1744
+ "become biscuit",
1745
+ "display product",
1746
+ "display front door",
1747
+ "showcase",
1748
+ "water preparation",
1749
+ "open mouth and sing",
1750
+ "fall down",
1751
+ "go fishing",
1752
+ "gargle with fat man",
1753
+ "spray liquid",
1754
+ "on tree",
1755
+ "cobra attack",
1756
+ "feet shaking",
1757
+ "bubble",
1758
+ "use long stick",
1759
+ "with boat overhead",
1760
+ "camel stopped",
1761
+ "replacement",
1762
+ "prepare pigments",
1763
+ "raise your right hand",
1764
+ "blow out cigarette smoke",
1765
+ "hand clenched fist",
1766
+ "support body with two hands",
1767
+ "frictional runway",
1768
+ "scraping",
1769
+ "clap with your teammates",
1770
+ "talk to others",
1771
+ "dry it",
1772
+ "hand over nose",
1773
+ "turn to landscape",
1774
+ "horst hula hoop",
1775
+ "ball hit the knee",
1776
+ "steady and steady",
1777
+ "swing",
1778
+ "release pole",
1779
+ "press button",
1780
+ "wear glasses",
1781
+ "start pruning trees",
1782
+ "roll forward",
1783
+ "spray cleaning solution",
1784
+ "middle of tyres",
1785
+ "selfie",
1786
+ "tease hair",
1787
+ "talk to screen",
1788
+ "standing bow",
1789
+ "climb up",
1790
+ "stalemate",
1791
+ "take down darts",
1792
+ "high five",
1793
+ "tidy",
1794
+ "put down magic cube",
1795
+ "scratching nose",
1796
+ "dispel crowd",
1797
+ "toothpaste",
1798
+ "waving hand",
1799
+ "bright smile",
1800
+ "dogs before him",
1801
+ "fixed toy",
1802
+ "low down barycenter",
1803
+ "warm up exercise",
1804
+ "run forward",
1805
+ "group photo",
1806
+ "throw drumbeat",
1807
+ "land on ground",
1808
+ "lens conversion",
1809
+ "satisfactory smile",
1810
+ "erect violin",
1811
+ "handshake",
1812
+ "orange clothes male clenched fist",
1813
+ "open",
1814
+ "add two kites",
1815
+ "weigh it down",
1816
+ "kite flew high",
1817
+ "pull off tires",
1818
+ "black clothes people waved",
1819
+ "test ball",
1820
+ "rush to red cloth",
1821
+ "hit himself",
1822
+ "get blow out",
1823
+ "kick off cushion",
1824
+ "fish bite",
1825
+ "bite frisbee",
1826
+ "lift dog",
1827
+ "applause",
1828
+ "children shook hands",
1829
+ "handstand",
1830
+ "shake hand",
1831
+ "picture change",
1832
+ "try again",
1833
+ "clap hand to celebrate",
1834
+ "role pause",
1835
+ "do somersault",
1836
+ "pirouette",
1837
+ "raise hand",
1838
+ "carry out performance",
1839
+ "pendulum poss",
1840
+ "eat noodles",
1841
+ "dry powder",
1842
+ "drive to right",
1843
+ "pick up phone",
1844
+ "weeds are gone",
1845
+ "right man stands up",
1846
+ "stop recording",
1847
+ "amuse dog",
1848
+ "adults chipping potatoes",
1849
+ "loose soil",
1850
+ "trot",
1851
+ "ship opened",
1852
+ "put in plate",
1853
+ "jump into pool",
1854
+ "string string",
1855
+ "draw on pumpkin",
1856
+ "white male nodding",
1857
+ "height of grass",
1858
+ "pass ball",
1859
+ "stop rowing",
1860
+ "single hand support",
1861
+ "hold down",
1862
+ "go to machine",
1863
+ "set up shelf",
1864
+ "start weeding",
1865
+ "wear hoop",
1866
+ "tune stringed instrument",
1867
+ "tape",
1868
+ "be blocked",
1869
+ "assembly of steel",
1870
+ "relax with mobile phone",
1871
+ "horse is moving",
1872
+ "swivel",
1873
+ "big mother",
1874
+ "turn and half squat down",
1875
+ "piled to corner",
1876
+ "audience cheered",
1877
+ "others come on field",
1878
+ "lens deflection",
1879
+ "put ball",
1880
+ "in dialogue",
1881
+ "aim",
1882
+ "go through last",
1883
+ "fist",
1884
+ "putting camera",
1885
+ "wiping car with foam",
1886
+ "dance together",
1887
+ "grasp parallel bars",
1888
+ "squat down",
1889
+ "shut down machine",
1890
+ "climb stairs",
1891
+ "washing spoon",
1892
+ "dive preparation",
1893
+ "touch lens",
1894
+ "shake table",
1895
+ "be smashed in drum",
1896
+ "anchor jump rope",
1897
+ "hit masses",
1898
+ "see undersea biology",
1899
+ "fall into river",
1900
+ "cut sandwiches",
1901
+ "horse nodding",
1902
+ "put down flute",
1903
+ "wash face",
1904
+ "put on bread",
1905
+ "display shoes",
1906
+ "touch liquid",
1907
+ "immerse in it",
1908
+ "sit on sofa",
1909
+ "leave court",
1910
+ "to everyone ju gong",
1911
+ "display finger",
1912
+ "throw out again",
1913
+ "turn picture back",
1914
+ "middle finger",
1915
+ "pressing on player",
1916
+ "pick up racket",
1917
+ "get up slowly",
1918
+ "pick up cup",
1919
+ "lose to opponent",
1920
+ "backward dodge",
1921
+ "concealed cards",
1922
+ "get first",
1923
+ "roll in sky",
1924
+ "start car wash",
1925
+ "grab railing",
1926
+ "twist butt",
1927
+ "demo bicycles",
1928
+ "throw long pole",
1929
+ "lift barbell",
1930
+ "cross leg",
1931
+ "wear socks",
1932
+ "wipe hands",
1933
+ "site",
1934
+ "hold black clothes man",
1935
+ "hit ball",
1936
+ "kick ball out",
1937
+ "skater surfers",
1938
+ "continue to weave sweater",
1939
+ "put cards in box",
1940
+ "fiddle with hair",
1941
+ "go away",
1942
+ "refresh",
1943
+ "psychological adjustment",
1944
+ "join noodles",
1945
+ "fall off stage",
1946
+ "skidding",
1947
+ "stir by spatula",
1948
+ "someone is parachuting",
1949
+ "fall off air cushion",
1950
+ "finish up job",
1951
+ "chasing people",
1952
+ "spaghetti",
1953
+ "bump into pot",
1954
+ "continue knocking",
1955
+ "ask for note",
1956
+ "bow hairstyle",
1957
+ "two people dance",
1958
+ "cross hand",
1959
+ "ball landed",
1960
+ "dog chases plate",
1961
+ "dog came back with something",
1962
+ "be gone",
1963
+ "attack",
1964
+ "swing rod",
1965
+ "raise your left hand",
1966
+ "plaything",
1967
+ "touch ones head",
1968
+ "stand on bench",
1969
+ "rouge lips",
1970
+ "original takeoff",
1971
+ "rinse",
1972
+ "straighten rod",
1973
+ "ironing sleeves",
1974
+ "squating",
1975
+ "start riding",
1976
+ "open mouth ventilation",
1977
+ "support yourself",
1978
+ "dark bigger",
1979
+ "light",
1980
+ "mice",
1981
+ "smear oil",
1982
+ "lacquer",
1983
+ "coated hair cream",
1984
+ "throw away",
1985
+ "dog jumped up",
1986
+ "counterclockwise running",
1987
+ "back to lens",
1988
+ "push leaves off",
1989
+ "shallow sea",
1990
+ "long hair",
1991
+ "straight",
1992
+ "short sleeve",
1993
+ "double fold eyelids",
1994
+ "trousers",
1995
+ "ripe",
1996
+ "older",
1997
+ "long sleeves",
1998
+ "take off skirt",
1999
+ "white men fall in water",
2000
+ "marvellous",
2001
+ "leg clip",
2002
+ "tortoise",
2003
+ "vigny",
2004
+ "play drifting air cushion",
2005
+ "parade in desert",
2006
+ "wood brush",
2007
+ "pulley slippery",
2008
+ "musical instrument",
2009
+ "noodle",
2010
+ "skating canoe",
2011
+ "diving in sea",
2012
+ "street performance",
2013
+ "street dance",
2014
+ "tackle rubber rafts",
2015
+ "dunk",
2016
+ "on toilet",
2017
+ "prepare for skiing",
2018
+ "climb escalator",
2019
+ "polo",
2020
+ "uneven bars",
2021
+ "play lacrosse",
2022
+ "pruning shrubs",
2023
+ "clean up garbage",
2024
+ "sports competition",
2025
+ "sliding skateboard",
2026
+ "good afforested environment",
2027
+ "displacement pressure",
2028
+ "braid",
2029
+ "play toy",
2030
+ "chips",
2031
+ "discus",
2032
+ "air cushion",
2033
+ "operation guidance",
2034
+ "riding unicycle",
2035
+ "rt",
2036
+ "bids gun",
2037
+ "gatekeepers",
2038
+ "fork",
2039
+ "paring knife",
2040
+ "touch back of brain",
2041
+ "shave dog",
2042
+ "practice fencing",
2043
+ "fencing training",
2044
+ "press media",
2045
+ "fencing",
2046
+ "play bungee jumping",
2047
+ "need to connect wire",
2048
+ "hair of bun",
2049
+ "sports boat",
2050
+ "shoe polisher",
2051
+ "white person",
2052
+ "decorate some boxes",
2053
+ "pet beauty",
2054
+ "practice ballet",
2055
+ "apple",
2056
+ "many people are looking",
2057
+ "shower",
2058
+ "body coordination",
2059
+ "advertisement",
2060
+ "blue and green",
2061
+ "blue and red",
2062
+ "small stool",
2063
+ "motorcycle",
2064
+ "big",
2065
+ "shirt",
2066
+ "tourism advertisement",
2067
+ "kelp",
2068
+ "sea anemone",
2069
+ "autumn",
2070
+ "harmful",
2071
+ "clever",
2072
+ "very nice",
2073
+ "jump down",
2074
+ "narrow",
2075
+ "shadow",
2076
+ "much more difficult",
2077
+ "ten meters",
2078
+ "6 centimeters",
2079
+ "more proficient",
2080
+ "pretty good",
2081
+ "adept",
2082
+ "13",
2083
+ "two",
2084
+ "sixth",
2085
+ "9.75",
2086
+ "350",
2087
+ "walking",
2088
+ "standard",
2089
+ "superb",
2090
+ "torrential",
2091
+ "skilled",
2092
+ "wear exposure",
2093
+ "sing in earnest",
2094
+ "strong",
2095
+ "cool",
2096
+ "high and low",
2097
+ "lovely",
2098
+ "concise and clear",
2099
+ "they hurt",
2100
+ "skating rink",
2101
+ "2011",
2102
+ "usa",
2103
+ "tie",
2104
+ "small scale"
2105
+ ]
ChatUniVi/eval/questions/video_qa/activitynet_qa.json ADDED
The diff for this file is too large to render. See raw diff
 
ChatUniVi/eval/questions/video_qa/consistency_qa.json ADDED
The diff for this file is too large to render. See raw diff
 
ChatUniVi/eval/questions/video_qa/generic_qa.json ADDED
The diff for this file is too large to render. See raw diff
 
ChatUniVi/eval/questions/video_qa/msrvtt_a_list.json ADDED
@@ -0,0 +1,4175 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ "regard",
3
+ "show",
4
+ "explain",
5
+ "search",
6
+ "provide",
7
+ "computer",
8
+ "guy",
9
+ "something",
10
+ "someone",
11
+ "person",
12
+ "teach",
13
+ "exclaim",
14
+ "stand",
15
+ "learn",
16
+ "pose",
17
+ "move",
18
+ "pain",
19
+ "video",
20
+ "color",
21
+ "paint",
22
+ "animation",
23
+ "cartoon",
24
+ "talk",
25
+ "sit",
26
+ "wear",
27
+ "discus",
28
+ "man",
29
+ "room",
30
+ "health",
31
+ "suit",
32
+ "chair",
33
+ "fun",
34
+ "studio",
35
+ "write",
36
+ "teacher",
37
+ "chalkboard",
38
+ "problem",
39
+ "math",
40
+ "whiteboard",
41
+ "lesson",
42
+ "board",
43
+ "stage",
44
+ "girl",
45
+ "gameshow",
46
+ "judge",
47
+ "perform",
48
+ "female",
49
+ "laugh",
50
+ "entertain",
51
+ "dance",
52
+ "shout",
53
+ "friend",
54
+ "woman",
55
+ "demonstration",
56
+ "boy",
57
+ "song",
58
+ "male",
59
+ "sister",
60
+ "marble",
61
+ "play",
62
+ "put",
63
+ "mix",
64
+ "decorate",
65
+ "help",
66
+ "easter",
67
+ "egg",
68
+ "table",
69
+ "water",
70
+ "holder",
71
+ "polish",
72
+ "game",
73
+ "earth",
74
+ "minecraft",
75
+ "gamer",
76
+ "nether",
77
+ "break",
78
+ "mine",
79
+ "hammer",
80
+ "commentate",
81
+ "peson",
82
+ "rap",
83
+ "picture",
84
+ "voiceover",
85
+ "flash",
86
+ "rapper",
87
+ "two",
88
+ "change",
89
+ "throw",
90
+ "system",
91
+ "wall",
92
+ "office",
93
+ "camera",
94
+ "create",
95
+ "prepare",
96
+ "construct",
97
+ "craft",
98
+ "look",
99
+ "place",
100
+ "wrap",
101
+ "art",
102
+ "project",
103
+ "clay",
104
+ "leaf",
105
+ "dough",
106
+ "cake",
107
+ "player",
108
+ "baseball",
109
+ "ball",
110
+ "announcer",
111
+ "hit",
112
+ "call",
113
+ "team",
114
+ "outfielder",
115
+ "fashion",
116
+ "walk",
117
+ "fasion",
118
+ "ailse",
119
+ "runway",
120
+ "catwalk",
121
+ "clothing",
122
+ "display",
123
+ "pat",
124
+ "use",
125
+ "make",
126
+ "foundation",
127
+ "lady",
128
+ "face",
129
+ "clean",
130
+ "bath",
131
+ "tub",
132
+ "toy",
133
+ "brush",
134
+ "cat",
135
+ "orange",
136
+ "scrubber",
137
+ "child",
138
+ "relax",
139
+ "swim",
140
+ "lake",
141
+ "field",
142
+ "dres",
143
+ "beach",
144
+ "gras",
145
+ "car",
146
+ "vehicle",
147
+ "introduce",
148
+ "drive",
149
+ "describe",
150
+ "review",
151
+ "movie",
152
+ "load",
153
+ "speak",
154
+ "watch",
155
+ "begin",
156
+ "tap",
157
+ "space",
158
+ "bench",
159
+ "glimpse",
160
+ "screen",
161
+ "globe",
162
+ "planet",
163
+ "world",
164
+ "explore",
165
+ "backstreet",
166
+ "restaurant",
167
+ "divider",
168
+ "asium",
169
+ "china",
170
+ "city",
171
+ "band",
172
+ "road",
173
+ "singer",
174
+ "pick",
175
+ "phone",
176
+ "telephone",
177
+ "taunt",
178
+ "squidward",
179
+ "spongebob",
180
+ "character",
181
+ "scene",
182
+ "half",
183
+ "group",
184
+ "instructor",
185
+ "floor",
186
+ "instruction",
187
+ "ballroom",
188
+ "clas",
189
+ "jog",
190
+ "tell",
191
+ "exercise",
192
+ "three",
193
+ "circle",
194
+ "mother",
195
+ "mom",
196
+ "family",
197
+ "jogging",
198
+ "skill",
199
+ "hardware",
200
+ "piece",
201
+ "detail",
202
+ "mechanic",
203
+ "item",
204
+ "demonstrate",
205
+ "work",
206
+ "repair",
207
+ "side",
208
+ "way",
209
+ "front",
210
+ "body",
211
+ "coach",
212
+ "athlete",
213
+ "angle",
214
+ "activity",
215
+ "present",
216
+ "include",
217
+ "tos",
218
+ "baby",
219
+ "hold",
220
+ "transition",
221
+ "youtuber",
222
+ "segment",
223
+ "individual",
224
+ "news",
225
+ "doll",
226
+ "subject",
227
+ "selfie",
228
+ "leg",
229
+ "shake",
230
+ "spread",
231
+ "blue",
232
+ "lighting",
233
+ "beam",
234
+ "warcraft",
235
+ "garden",
236
+ "house",
237
+ "island",
238
+ "roof",
239
+ "record",
240
+ "building",
241
+ "football",
242
+ "glas",
243
+ "spin",
244
+ "basket",
245
+ "music",
246
+ "program",
247
+ "basketball",
248
+ "sport",
249
+ "food",
250
+ "kitchenthere",
251
+ "liquid",
252
+ "fry",
253
+ "chef",
254
+ "crab",
255
+ "kitchen",
256
+ "boil",
257
+ "melt",
258
+ "stir",
259
+ "model",
260
+ "diagram",
261
+ "draw",
262
+ "party",
263
+ "bedroom",
264
+ "eye",
265
+ "bos",
266
+ "bigg",
267
+ "advertisement",
268
+ "hug",
269
+ "blink",
270
+ "google",
271
+ "narrator",
272
+ "classy",
273
+ "driving",
274
+ "lean",
275
+ "newsreporter",
276
+ "cameraman",
277
+ "photographer",
278
+ "shoot",
279
+ "photography",
280
+ "burn",
281
+ "alternate",
282
+ "fire",
283
+ "pink",
284
+ "hang",
285
+ "blow",
286
+ "visit",
287
+ "handbag",
288
+ "horn",
289
+ "shopping",
290
+ "market",
291
+ "bed",
292
+ "telecast",
293
+ "conversation",
294
+ "wife",
295
+ "lay",
296
+ "lie",
297
+ "scold",
298
+ "shirtles",
299
+ "lounge",
300
+ "saurkraut",
301
+ "sauerkraut",
302
+ "dish",
303
+ "plate",
304
+ "eat",
305
+ "serve",
306
+ "stroller",
307
+ "fold",
308
+ "push",
309
+ "sidewalk",
310
+ "demo",
311
+ "trolley",
312
+ "boner",
313
+ "narrate",
314
+ "argue",
315
+ "startle",
316
+ "princes",
317
+ "voice",
318
+ "leah",
319
+ "confirm",
320
+ "animalist",
321
+ "mirror",
322
+ "test",
323
+ "experience",
324
+ "drag",
325
+ "embrace",
326
+ "lion",
327
+ "react",
328
+ "enjoy",
329
+ "fly",
330
+ "nyancat",
331
+ "rainbow",
332
+ "machine",
333
+ "robot",
334
+ "issue",
335
+ "equipment",
336
+ "astronaut",
337
+ "try",
338
+ "attempt",
339
+ "intercept",
340
+ "pilot",
341
+ "observe",
342
+ "negotiate",
343
+ "operate",
344
+ "ask",
345
+ "landing",
346
+ "eachother",
347
+ "matthew",
348
+ "procedure",
349
+ "spaceship",
350
+ "cook",
351
+ "vest",
352
+ "stove",
353
+ "distres",
354
+ "ground",
355
+ "emergency",
356
+ "shoplift",
357
+ "mob",
358
+ "crowd",
359
+ "panic",
360
+ "wolf",
361
+ "scream",
362
+ "bear",
363
+ "interact",
364
+ "joke",
365
+ "animal",
366
+ "monkey",
367
+ "shirt",
368
+ "sign",
369
+ "bird",
370
+ "hand",
371
+ "carry",
372
+ "rest",
373
+ "meow",
374
+ "lift",
375
+ "parrotlove",
376
+ "parrot",
377
+ "top",
378
+ "film",
379
+ "cage",
380
+ "rescue",
381
+ "introduction",
382
+ "extinguisher",
383
+ "flame",
384
+ "float",
385
+ "aquarium",
386
+ "tank",
387
+ "gold",
388
+ "plant",
389
+ "fish",
390
+ "merchandise",
391
+ "purse",
392
+ "wallet",
393
+ "merchandising",
394
+ "stephen",
395
+ "london",
396
+ "reminisce",
397
+ "advertise",
398
+ "product",
399
+ "sale",
400
+ "desk",
401
+ "country",
402
+ "violin",
403
+ "childhood",
404
+ "soccer",
405
+ "involve",
406
+ "drift",
407
+ "preform",
408
+ "applause",
409
+ "language",
410
+ "star",
411
+ "comment",
412
+ "paper",
413
+ "pencil",
414
+ "drawl",
415
+ "lap",
416
+ "mouse",
417
+ "rugby",
418
+ "rant",
419
+ "contract",
420
+ "quarterback",
421
+ "webcamera",
422
+ "professor",
423
+ "college",
424
+ "cloth",
425
+ "microphone",
426
+ "balance",
427
+ "bounce",
428
+ "gym",
429
+ "dvd",
430
+ "leaflet",
431
+ "kid",
432
+ "pamphlet",
433
+ "event",
434
+ "sync",
435
+ "night",
436
+ "carriage",
437
+ "adjust",
438
+ "carrier",
439
+ "act",
440
+ "audience",
441
+ "concert",
442
+ "sin",
443
+ "performance",
444
+ "rock",
445
+ "webcam",
446
+ "trailer",
447
+ "browse",
448
+ "download",
449
+ "youtube",
450
+ "internet",
451
+ "page",
452
+ "mp3",
453
+ "war",
454
+ "guitar",
455
+ "tie",
456
+ "cheer",
457
+ "coil",
458
+ "loop",
459
+ "fishing",
460
+ "wire",
461
+ "turkey",
462
+ "drink",
463
+ "grill",
464
+ "meat",
465
+ "cooking",
466
+ "sizzle",
467
+ "tawa",
468
+ "pot",
469
+ "rice",
470
+ "sequence",
471
+ "stone",
472
+ "answer",
473
+ "incident",
474
+ "cam",
475
+ "store",
476
+ "supermarket",
477
+ "set",
478
+ "sail",
479
+ "cruise",
480
+ "vacation",
481
+ "sea",
482
+ "boat",
483
+ "ship",
484
+ "sand",
485
+ "ocean",
486
+ "landscape",
487
+ "mountain",
488
+ "dog",
489
+ "deputy",
490
+ "community",
491
+ "polouse",
492
+ "contestant",
493
+ "idol",
494
+ "panel",
495
+ "performer",
496
+ "reality",
497
+ "advice",
498
+ "crossbow",
499
+ "bow",
500
+ "arrow",
501
+ "practice",
502
+ "patrol",
503
+ "report",
504
+ "rail",
505
+ "mention",
506
+ "read",
507
+ "swat",
508
+ "newscaster",
509
+ "security",
510
+ "protection",
511
+ "crimea",
512
+ "guard",
513
+ "area",
514
+ "polymer",
515
+ "knife",
516
+ "bit",
517
+ "hobby",
518
+ "point",
519
+ "touch",
520
+ "design",
521
+ "artist",
522
+ "shape",
523
+ "poke",
524
+ "matt",
525
+ "briefly",
526
+ "damon",
527
+ "keyboard",
528
+ "animator",
529
+ "history",
530
+ "type",
531
+ "clipping",
532
+ "celebrity",
533
+ "birthday",
534
+ "smile",
535
+ "thor",
536
+ "shooting",
537
+ "rain",
538
+ "outdoor",
539
+ "pull",
540
+ "lego",
541
+ "pajama",
542
+ "clip",
543
+ "amna",
544
+ "interview",
545
+ "conduct",
546
+ "feature",
547
+ "choice",
548
+ "award",
549
+ "function",
550
+ "announce",
551
+ "seat",
552
+ "roadway",
553
+ "travel",
554
+ "window",
555
+ "sleep",
556
+ "whistle",
557
+ "doghouse",
558
+ "spawn",
559
+ "setting",
560
+ "random",
561
+ "fence",
562
+ "skating",
563
+ "teenager",
564
+ "skateboard",
565
+ "skate",
566
+ "text",
567
+ "spiral",
568
+ "shoe",
569
+ "turn",
570
+ "rotate",
571
+ "dna",
572
+ "information",
573
+ "strand",
574
+ "junk",
575
+ "helix",
576
+ "explanation",
577
+ "suv",
578
+ "fur",
579
+ "horse",
580
+ "shanium",
581
+ "head",
582
+ "rush",
583
+ "town",
584
+ "disney",
585
+ "four",
586
+ "barbie",
587
+ "dancing",
588
+ "diagnose",
589
+ "share",
590
+ "industry",
591
+ "air",
592
+ "racer",
593
+ "monitor",
594
+ "race",
595
+ "hood",
596
+ "patrick",
597
+ "sponge",
598
+ "snail",
599
+ "driveway",
600
+ "street",
601
+ "hoop",
602
+ "practise",
603
+ "sparrow",
604
+ "box",
605
+ "contraption",
606
+ "chirp",
607
+ "scratch",
608
+ "climb",
609
+ "peck",
610
+ "plot",
611
+ "mystery",
612
+ "detective",
613
+ "investigate",
614
+ "doorway",
615
+ "line",
616
+ "giggle",
617
+ "culture",
618
+ "cover",
619
+ "send",
620
+ "knock",
621
+ "broadcast",
622
+ "neck",
623
+ "hide",
624
+ "father",
625
+ "cliff",
626
+ "stewie",
627
+ "griffen",
628
+ "feel",
629
+ "stay",
630
+ "kis",
631
+ "breast",
632
+ "chest",
633
+ "porch",
634
+ "door",
635
+ "walkway",
636
+ "factory",
637
+ "development",
638
+ "span",
639
+ "logo",
640
+ "vision",
641
+ "ryanvision",
642
+ "motion",
643
+ "newsanchor",
644
+ "celebrate",
645
+ "commentator",
646
+ "steer",
647
+ "speed",
648
+ "driver",
649
+ "traffic",
650
+ "commentary",
651
+ "thing",
652
+ "extension",
653
+ "cellphone",
654
+ "mobile",
655
+ "chat",
656
+ "message",
657
+ "creature",
658
+ "whale",
659
+ "giant",
660
+ "surface",
661
+ "jump",
662
+ "approach",
663
+ "emerge",
664
+ "breach",
665
+ "dive",
666
+ "track",
667
+ "shot",
668
+ "starting",
669
+ "start",
670
+ "runner",
671
+ "compare",
672
+ "busines",
673
+ "campu",
674
+ "fist",
675
+ "school",
676
+ "book",
677
+ "reading",
678
+ "classroom",
679
+ "amazon",
680
+ "atmosphere",
681
+ "cave",
682
+ "farm",
683
+ "ice",
684
+ "frost",
685
+ "wed",
686
+ "cream",
687
+ "murray",
688
+ "bill",
689
+ "substance",
690
+ "park",
691
+ "salesman",
692
+ "aman",
693
+ "sell",
694
+ "lenin",
695
+ "education",
696
+ "bowl",
697
+ "recipe",
698
+ "pmy",
699
+ "time",
700
+ "nobody",
701
+ "pretty",
702
+ "hair",
703
+ "blonde",
704
+ "stuffed",
705
+ "femal",
706
+ "figure",
707
+ "goat",
708
+ "stream",
709
+ "mod",
710
+ "spa",
711
+ "rub",
712
+ "massage",
713
+ "wash",
714
+ "milk",
715
+ "economy",
716
+ "leader",
717
+ "money",
718
+ "raise",
719
+ "crawl",
720
+ "slide",
721
+ "fall",
722
+ "stair",
723
+ "cowboy",
724
+ "bacon",
725
+ "barbecue",
726
+ "flower",
727
+ "cheif",
728
+ "meal",
729
+ "kithen",
730
+ "treat",
731
+ "preview",
732
+ "dubstep",
733
+ "wave",
734
+ "view",
735
+ "background",
736
+ "batting",
737
+ "batsman",
738
+ "tsunami",
739
+ "bat",
740
+ "photo",
741
+ "one",
742
+ "pirate",
743
+ "sword",
744
+ "transportation",
745
+ "river",
746
+ "waterfall",
747
+ "gush",
748
+ "wrestle",
749
+ "wrestling",
750
+ "match",
751
+ "competition",
752
+ "fight",
753
+ "microwave",
754
+ "oven",
755
+ "inhome",
756
+ "heat",
757
+ "wooden",
758
+ "mud",
759
+ "exit",
760
+ "compete",
761
+ "moody",
762
+ "tom",
763
+ "pokeman",
764
+ "adventure",
765
+ "togepus",
766
+ "pokemon",
767
+ "hat",
768
+ "television",
769
+ "ash",
770
+ "debate",
771
+ "podium",
772
+ "cnn",
773
+ "speaker",
774
+ "speechles",
775
+ "cruz",
776
+ "recap",
777
+ "somethimg",
778
+ "letterman",
779
+ "leterman",
780
+ "actor",
781
+ "host",
782
+ "couch",
783
+ "doze",
784
+ "airplane",
785
+ "plane",
786
+ "gray",
787
+ "beauty",
788
+ "love",
789
+ "volleyball",
790
+ "interest",
791
+ "cry",
792
+ "haras",
793
+ "crow",
794
+ "attack",
795
+ "knight",
796
+ "sky",
797
+ "catch",
798
+ "maiden",
799
+ "soldier",
800
+ "warrior",
801
+ "oil",
802
+ "origami",
803
+ "cheese",
804
+ "silver",
805
+ "home",
806
+ "software",
807
+ "application",
808
+ "discussion",
809
+ "ring",
810
+ "sink",
811
+ "nurse",
812
+ "wipe",
813
+ "dip",
814
+ "deal",
815
+ "target",
816
+ "britney",
817
+ "conference",
818
+ "metal",
819
+ "medal",
820
+ "chi",
821
+ "die",
822
+ "daughter",
823
+ "rinse",
824
+ "build",
825
+ "ride",
826
+ "gondola",
827
+ "snow",
828
+ "hill",
829
+ "rope",
830
+ "lft",
831
+ "monorail",
832
+ "chairlift",
833
+ "peeple",
834
+ "member",
835
+ "harry",
836
+ "flight",
837
+ "moon",
838
+ "mission",
839
+ "parody",
840
+ "gangnam",
841
+ "gun",
842
+ "cortona",
843
+ "outline",
844
+ "pack",
845
+ "bod",
846
+ "charachter",
847
+ "heckle",
848
+ "tenni",
849
+ "pong",
850
+ "end",
851
+ "cardio",
852
+ "attend",
853
+ "rear",
854
+ "win",
855
+ "jockey",
856
+ "macdonald",
857
+ "wish",
858
+ "greet",
859
+ "meet",
860
+ "shuttle",
861
+ "iss",
862
+ "science",
863
+ "dusk",
864
+ "couple",
865
+ "doctor",
866
+ "tardi",
867
+ "cape",
868
+ "salad",
869
+ "chop",
870
+ "cut",
871
+ "gear",
872
+ "machinery",
873
+ "court",
874
+ "pace",
875
+ "cort",
876
+ "cool",
877
+ "bald",
878
+ "trick",
879
+ "spec",
880
+ "communist",
881
+ "museum",
882
+ "hangar",
883
+ "laptop",
884
+ "lab",
885
+ "cup",
886
+ "spuid",
887
+ "octopu",
888
+ "bottle",
889
+ "jellyfish",
890
+ "squid",
891
+ "dirge",
892
+ "lessen",
893
+ "anthem",
894
+ "shift",
895
+ "superhero",
896
+ "foam",
897
+ "fit",
898
+ "instal",
899
+ "fix",
900
+ "mat",
901
+ "cusion",
902
+ "construction",
903
+ "cushion",
904
+ "material",
905
+ "celeberatey",
906
+ "trophy",
907
+ "appreciate",
908
+ "cute",
909
+ "pas",
910
+ "lead",
911
+ "gameplay",
912
+ "user",
913
+ "choose",
914
+ "enter",
915
+ "name",
916
+ "cop",
917
+ "brittany",
918
+ "life",
919
+ "peek",
920
+ "dark",
921
+ "strum",
922
+ "guitarist",
923
+ "gunfire",
924
+ "syrium",
925
+ "firefight",
926
+ "helicopter",
927
+ "isi",
928
+ "army",
929
+ "smoke",
930
+ "terror",
931
+ "bombing",
932
+ "reporter",
933
+ "bomb",
934
+ "engine",
935
+ "garry",
936
+ "lightyear",
937
+ "receipe",
938
+ "flmy",
939
+ "tutorial",
940
+ "smell",
941
+ "taste",
942
+ "eubank",
943
+ "fighter",
944
+ "recall",
945
+ "spinach",
946
+ "lasagna",
947
+ "object",
948
+ "ply",
949
+ "skin",
950
+ "juice",
951
+ "tiki",
952
+ "ferrai",
953
+ "formula",
954
+ "racing",
955
+ "comantery",
956
+ "boyfriend",
957
+ "threee",
958
+ "talent",
959
+ "hear",
960
+ "confront",
961
+ "rubber",
962
+ "layout",
963
+ "instruct",
964
+ "pop",
965
+ "dinner",
966
+ "date",
967
+ "clock",
968
+ "tick",
969
+ "round",
970
+ "earthquake",
971
+ "scientist",
972
+ "talkshow",
973
+ "boob",
974
+ "drop",
975
+ "dirt",
976
+ "mes",
977
+ "instrument",
978
+ "service",
979
+ "foot",
980
+ "opening",
981
+ "article",
982
+ "guest",
983
+ "homer",
984
+ "light",
985
+ "technology",
986
+ "partner",
987
+ "ches",
988
+ "consume",
989
+ "bankruptcy",
990
+ "nick",
991
+ "treehouse",
992
+ "bike",
993
+ "anime",
994
+ "sponngebob",
995
+ "annoy",
996
+ "tease",
997
+ "taxi",
998
+ "method",
999
+ "gadget",
1000
+ "gentleman",
1001
+ "customize",
1002
+ "proces",
1003
+ "terrify",
1004
+ "creep",
1005
+ "reach",
1006
+ "claw",
1007
+ "ceiling",
1008
+ "flow",
1009
+ "scroll",
1010
+ "invade",
1011
+ "newspaper",
1012
+ "writer",
1013
+ "document",
1014
+ "gambling",
1015
+ "gamble",
1016
+ "punch",
1017
+ "alert",
1018
+ "letter",
1019
+ "fiskal",
1020
+ "magentum",
1021
+ "block",
1022
+ "pig",
1023
+ "concern",
1024
+ "hilary",
1025
+ "hillary",
1026
+ "clinton",
1027
+ "confederate",
1028
+ "speech",
1029
+ "politician",
1030
+ "struggle",
1031
+ "standing",
1032
+ "vocalist",
1033
+ "playground",
1034
+ "stadium",
1035
+ "scrum",
1036
+ "result",
1037
+ "handle",
1038
+ "goal",
1039
+ "lasso",
1040
+ "mansion",
1041
+ "benson",
1042
+ "operation",
1043
+ "kick",
1044
+ "vlog",
1045
+ "lecture",
1046
+ "lecturer",
1047
+ "biology",
1048
+ "deliver",
1049
+ "meeting",
1050
+ "newsman",
1051
+ "hospital",
1052
+ "package",
1053
+ "patient",
1054
+ "recovery",
1055
+ "recipiesaresimple",
1056
+ "gravy",
1057
+ "soup",
1058
+ "appeal",
1059
+ "scoop",
1060
+ "fill",
1061
+ "conclude",
1062
+ "desert",
1063
+ "smash",
1064
+ "demolish",
1065
+ "truck",
1066
+ "crash",
1067
+ "coat",
1068
+ "homeles",
1069
+ "happiness",
1070
+ "luggage",
1071
+ "think",
1072
+ "part",
1073
+ "tool",
1074
+ "pool",
1075
+ "july",
1076
+ "base",
1077
+ "run",
1078
+ "kneel",
1079
+ "score",
1080
+ "mis",
1081
+ "diamond",
1082
+ "bag",
1083
+ "root",
1084
+ "magnify",
1085
+ "jewel",
1086
+ "heroin",
1087
+ "longingly",
1088
+ "hero",
1089
+ "chapter",
1090
+ "peer",
1091
+ "tshirt",
1092
+ "paperwork",
1093
+ "booty",
1094
+ "comb",
1095
+ "hose",
1096
+ "educate",
1097
+ "pitcher",
1098
+ "gravity",
1099
+ "experiment",
1100
+ "bucket",
1101
+ "freezing",
1102
+ "tray",
1103
+ "sweet",
1104
+ "storage",
1105
+ "pureed",
1106
+ "container",
1107
+ "potaato",
1108
+ "freeze",
1109
+ "brother",
1110
+ "coddle",
1111
+ "pet",
1112
+ "ldy",
1113
+ "yard",
1114
+ "calm",
1115
+ "fortres",
1116
+ "till",
1117
+ "thief",
1118
+ "viewer",
1119
+ "feedback",
1120
+ "contestent",
1121
+ "competitor",
1122
+ "hiliary",
1123
+ "cspan",
1124
+ "hatdoll",
1125
+ "lavigne",
1126
+ "advertiesment",
1127
+ "glouse",
1128
+ "crown",
1129
+ "government",
1130
+ "peformance",
1131
+ "photograph",
1132
+ "towel",
1133
+ "buffalo",
1134
+ "universe",
1135
+ "lense",
1136
+ "cell",
1137
+ "fetu",
1138
+ "nyc",
1139
+ "ramp",
1140
+ "goldfish",
1141
+ "destroy",
1142
+ "videogame",
1143
+ "dig",
1144
+ "hell",
1145
+ "bake",
1146
+ "vinegar",
1147
+ "ambulance",
1148
+ "highway",
1149
+ "beat",
1150
+ "kill",
1151
+ "semolina",
1152
+ "thee",
1153
+ "fart",
1154
+ "phrase",
1155
+ "challenge",
1156
+ "herself",
1157
+ "profanity",
1158
+ "obama",
1159
+ "president",
1160
+ "steve",
1161
+ "depict",
1162
+ "researcher",
1163
+ "horror",
1164
+ "barber",
1165
+ "converse",
1166
+ "sweeny",
1167
+ "chemistry",
1168
+ "state",
1169
+ "reader",
1170
+ "medicine",
1171
+ "lamma",
1172
+ "gress",
1173
+ "alpaca",
1174
+ "enclosure",
1175
+ "pin",
1176
+ "lama",
1177
+ "pen",
1178
+ "pram",
1179
+ "device",
1180
+ "smartphone",
1181
+ "app",
1182
+ "troop",
1183
+ "goop",
1184
+ "offer",
1185
+ "channel",
1186
+ "makeup",
1187
+ "montage",
1188
+ "pole",
1189
+ "slideshow",
1190
+ "designer",
1191
+ "candy",
1192
+ "prank",
1193
+ "finger",
1194
+ "swear",
1195
+ "tmz",
1196
+ "topic",
1197
+ "navigate",
1198
+ "yellow",
1199
+ "garbage",
1200
+ "carpet",
1201
+ "roll",
1202
+ "maintenance",
1203
+ "janitor",
1204
+ "lunchroom",
1205
+ "apple",
1206
+ "cafeterium",
1207
+ "bite",
1208
+ "mop",
1209
+ "stuff",
1210
+ "parade",
1211
+ "scooter",
1212
+ "orchestra",
1213
+ "carnival",
1214
+ "standstill",
1215
+ "vintage",
1216
+ "control",
1217
+ "playing",
1218
+ "backround",
1219
+ "roar",
1220
+ "pretend",
1221
+ "cpr",
1222
+ "wedding",
1223
+ "tangle",
1224
+ "earbud",
1225
+ "lid",
1226
+ "sandhole",
1227
+ "train",
1228
+ "crime",
1229
+ "denial",
1230
+ "restrain",
1231
+ "file",
1232
+ "canal",
1233
+ "applaud",
1234
+ "clap",
1235
+ "dad",
1236
+ "story",
1237
+ "vigil",
1238
+ "newscastor",
1239
+ "newswoman",
1240
+ "volley",
1241
+ "neon",
1242
+ "muppet",
1243
+ "king",
1244
+ "theater",
1245
+ "pan",
1246
+ "form",
1247
+ "mold",
1248
+ "mini",
1249
+ "spoon",
1250
+ "motorcycle",
1251
+ "motorbike",
1252
+ "freeway",
1253
+ "picnic",
1254
+ "finn",
1255
+ "range",
1256
+ "engineering",
1257
+ "encourage",
1258
+ "slam",
1259
+ "gate",
1260
+ "tale",
1261
+ "skier",
1262
+ "represent",
1263
+ "surf",
1264
+ "surfboard",
1265
+ "snowboard",
1266
+ "cloud",
1267
+ "arrange",
1268
+ "boo",
1269
+ "disco",
1270
+ "singing",
1271
+ "correspond",
1272
+ "gogh",
1273
+ "screnn",
1274
+ "bernard",
1275
+ "premiere",
1276
+ "care",
1277
+ "salon",
1278
+ "saloon",
1279
+ "forest",
1280
+ "arm",
1281
+ "treatment",
1282
+ "van",
1283
+ "vanwhile",
1284
+ "msn",
1285
+ "dalmation",
1286
+ "pub",
1287
+ "rumor",
1288
+ "explode",
1289
+ "yell",
1290
+ "firework",
1291
+ "dashboard",
1292
+ "stereo",
1293
+ "honda",
1294
+ "robbie",
1295
+ "advocate",
1296
+ "birth",
1297
+ "rat",
1298
+ "hamster",
1299
+ "rodent",
1300
+ "owner",
1301
+ "sniff",
1302
+ "comfort",
1303
+ "attach",
1304
+ "remodel",
1305
+ "glue",
1306
+ "interior",
1307
+ "umpire",
1308
+ "tumble",
1309
+ "become",
1310
+ "collage",
1311
+ "ipod",
1312
+ "comedy",
1313
+ "snake",
1314
+ "shadow",
1315
+ "collar",
1316
+ "frame",
1317
+ "master",
1318
+ "dinosaur",
1319
+ "dinosor",
1320
+ "print",
1321
+ "carfax",
1322
+ "ralley",
1323
+ "tournament",
1324
+ "kium",
1325
+ "teni",
1326
+ "amaze",
1327
+ "compilation",
1328
+ "spar",
1329
+ "marshal",
1330
+ "order",
1331
+ "camel",
1332
+ "auburn",
1333
+ "mustard",
1334
+ "murrey",
1335
+ "jar",
1336
+ "festival",
1337
+ "firearm",
1338
+ "handgun",
1339
+ "magazine",
1340
+ "insert",
1341
+ "surround",
1342
+ "flirt",
1343
+ "cafe",
1344
+ "cupid",
1345
+ "contain",
1346
+ "footage",
1347
+ "wait",
1348
+ "structure",
1349
+ "left",
1350
+ "portrait",
1351
+ "sun",
1352
+ "revolve",
1353
+ "hallway",
1354
+ "glitter",
1355
+ "command",
1356
+ "officer",
1357
+ "solider",
1358
+ "formation",
1359
+ "computergame",
1360
+ "strategy",
1361
+ "puzzle",
1362
+ "memorize",
1363
+ "broth",
1364
+ "bowel",
1365
+ "chicken",
1366
+ "leveler",
1367
+ "journalist",
1368
+ "pitch",
1369
+ "occur",
1370
+ "routine",
1371
+ "oatmeal",
1372
+ "ballad",
1373
+ "listen",
1374
+ "audition",
1375
+ "toilet",
1376
+ "flush",
1377
+ "commode",
1378
+ "fainting",
1379
+ "needle",
1380
+ "faint",
1381
+ "spell",
1382
+ "chase",
1383
+ "pit",
1384
+ "hole",
1385
+ "scooby",
1386
+ "asteroid",
1387
+ "lunar",
1388
+ "impact",
1389
+ "streamer",
1390
+ "growth",
1391
+ "antelope",
1392
+ "technique",
1393
+ "churro",
1394
+ "countertop",
1395
+ "counter",
1396
+ "steam",
1397
+ "mood",
1398
+ "breakfast",
1399
+ "scowl",
1400
+ "facebook",
1401
+ "research",
1402
+ "examine",
1403
+ "paleontologist",
1404
+ "mascara",
1405
+ "hottie",
1406
+ "camouflage",
1407
+ "atv",
1408
+ "smokey",
1409
+ "zombie",
1410
+ "teenage",
1411
+ "aim",
1412
+ "masala",
1413
+ "frying",
1414
+ "village",
1415
+ "crocodile",
1416
+ "aligator",
1417
+ "alligator",
1418
+ "paste",
1419
+ "screw",
1420
+ "gum",
1421
+ "pipe",
1422
+ "gel",
1423
+ "gumbo",
1424
+ "hop",
1425
+ "complain",
1426
+ "tan",
1427
+ "lotion",
1428
+ "toples",
1429
+ "taboo",
1430
+ "day",
1431
+ "bikini",
1432
+ "skillet",
1433
+ "pancake",
1434
+ "zoom",
1435
+ "destination",
1436
+ "option",
1437
+ "capture",
1438
+ "zooming",
1439
+ "execise",
1440
+ "gymanasium",
1441
+ "integrate",
1442
+ "guide",
1443
+ "ryan",
1444
+ "progress",
1445
+ "crazy",
1446
+ "mike",
1447
+ "russium",
1448
+ "vladmir",
1449
+ "vladimir",
1450
+ "addres",
1451
+ "policy",
1452
+ "gown",
1453
+ "spirit",
1454
+ "shop",
1455
+ "journey",
1456
+ "fog",
1457
+ "hunt",
1458
+ "peak",
1459
+ "checkerd",
1460
+ "fault",
1461
+ "alien",
1462
+ "thank",
1463
+ "bal",
1464
+ "iphone",
1465
+ "guinea",
1466
+ "bathroom",
1467
+ "dry",
1468
+ "button",
1469
+ "chilli",
1470
+ "infusion",
1471
+ "slouse",
1472
+ "fanlala",
1473
+ "airport",
1474
+ "hindu",
1475
+ "marriage",
1476
+ "piccolo",
1477
+ "dragonball",
1478
+ "dome",
1479
+ "landmark",
1480
+ "suggest",
1481
+ "tunisium",
1482
+ "danger",
1483
+ "obstacle",
1484
+ "lot",
1485
+ "simple",
1486
+ "earring",
1487
+ "ear",
1488
+ "nasa",
1489
+ "graph",
1490
+ "microsoft",
1491
+ "spreadsheet",
1492
+ "somebody",
1493
+ "parker",
1494
+ "girlfriend",
1495
+ "focu",
1496
+ "indium",
1497
+ "netrus",
1498
+ "ladle",
1499
+ "aid",
1500
+ "university",
1501
+ "rifle",
1502
+ "flatter",
1503
+ "bulldozer",
1504
+ "excavator",
1505
+ "vampire",
1506
+ "fiddle",
1507
+ "israeli",
1508
+ "isreal",
1509
+ "infiltrate",
1510
+ "amusement",
1511
+ "sketch",
1512
+ "seasoning",
1513
+ "salt",
1514
+ "pepper",
1515
+ "steak",
1516
+ "season",
1517
+ "course",
1518
+ "return",
1519
+ "collect",
1520
+ "superb",
1521
+ "wisconsin",
1522
+ "nature",
1523
+ "valley",
1524
+ "hike",
1525
+ "trouble",
1526
+ "failure",
1527
+ "excise",
1528
+ "vertacle",
1529
+ "basketballer",
1530
+ "volcano",
1531
+ "map",
1532
+ "satellite",
1533
+ "sprinkle",
1534
+ "verde",
1535
+ "braid",
1536
+ "africa",
1537
+ "kenya",
1538
+ "interviewer",
1539
+ "gymnasium",
1540
+ "dodge",
1541
+ "automobile",
1542
+ "beard",
1543
+ "title",
1544
+ "beneath",
1545
+ "circket",
1546
+ "rockstar",
1547
+ "joan",
1548
+ "dave",
1549
+ "jam",
1550
+ "interface",
1551
+ "screencast",
1552
+ "coversation",
1553
+ "five-ing",
1554
+ "mltiple",
1555
+ "smack",
1556
+ "nadium",
1557
+ "stretcher",
1558
+ "overlap",
1559
+ "action",
1560
+ "teaser",
1561
+ "ledge",
1562
+ "overlook",
1563
+ "await",
1564
+ "rooftop",
1565
+ "invite",
1566
+ "bbc",
1567
+ "mall",
1568
+ "arrest",
1569
+ "dhabi",
1570
+ "conflict",
1571
+ "suspect",
1572
+ "critique",
1573
+ "expres",
1574
+ "buy",
1575
+ "diver",
1576
+ "scuba",
1577
+ "trunk",
1578
+ "bolt",
1579
+ "dream",
1580
+ "gymnast",
1581
+ "forward",
1582
+ "bar",
1583
+ "auditorium",
1584
+ "list",
1585
+ "ingredient",
1586
+ "pale",
1587
+ "tackle",
1588
+ "support",
1589
+ "beautiful",
1590
+ "back",
1591
+ "bedsheet",
1592
+ "mincraft",
1593
+ "emerald",
1594
+ "job",
1595
+ "york",
1596
+ "harlow",
1597
+ "tomorrow",
1598
+ "study",
1599
+ "sofa",
1600
+ "furniture",
1601
+ "saleman",
1602
+ "beef",
1603
+ "molecule",
1604
+ "chip",
1605
+ "check",
1606
+ "crew",
1607
+ "director",
1608
+ "warfield",
1609
+ "shaq",
1610
+ "balding",
1611
+ "microstructure",
1612
+ "web",
1613
+ "website",
1614
+ "checkmark",
1615
+ "relevant",
1616
+ "ethopium",
1617
+ "risk",
1618
+ "metallica",
1619
+ "battlefield",
1620
+ "mario",
1621
+ "receive",
1622
+ "anchorwoman",
1623
+ "gay",
1624
+ "hello",
1625
+ "futbol",
1626
+ "hollywood",
1627
+ "gtum",
1628
+ "breakdancing",
1629
+ "unbox",
1630
+ "plastic",
1631
+ "drown",
1632
+ "surfer",
1633
+ "drug",
1634
+ "gain",
1635
+ "flip",
1636
+ "transfer",
1637
+ "reflect",
1638
+ "colorful",
1639
+ "tbale",
1640
+ "bridge",
1641
+ "scenery",
1642
+ "coke",
1643
+ "soda",
1644
+ "cola",
1645
+ "saucepan",
1646
+ "stovetop",
1647
+ "coca",
1648
+ "moras",
1649
+ "dessert",
1650
+ "oniontomato",
1651
+ "materialism",
1652
+ "satan",
1653
+ "televison",
1654
+ "atom",
1655
+ "rectangle",
1656
+ "coupe",
1657
+ "damage",
1658
+ "optimu",
1659
+ "butter",
1660
+ "vegetable",
1661
+ "caramelize",
1662
+ "strut",
1663
+ "stroll",
1664
+ "lingerie",
1665
+ "protrude",
1666
+ "bleed",
1667
+ "bone",
1668
+ "audtioner",
1669
+ "safety",
1670
+ "charge",
1671
+ "sniper",
1672
+ "brunette",
1673
+ "eva",
1674
+ "environment",
1675
+ "thought",
1676
+ "handsom",
1677
+ "foul",
1678
+ "murder",
1679
+ "closet",
1680
+ "wearing",
1681
+ "sticker",
1682
+ "transmit",
1683
+ "tape",
1684
+ "glove",
1685
+ "nose",
1686
+ "stroke",
1687
+ "hairstyle",
1688
+ "actres",
1689
+ "isabella",
1690
+ "underworld",
1691
+ "projector",
1692
+ "shark",
1693
+ "sauce",
1694
+ "executive",
1695
+ "spicy",
1696
+ "plat",
1697
+ "curry",
1698
+ "guidance",
1699
+ "candle",
1700
+ "seance",
1701
+ "hall",
1702
+ "peanut",
1703
+ "chocolate",
1704
+ "toffee",
1705
+ "movement",
1706
+ "wake",
1707
+ "policeman",
1708
+ "investigation",
1709
+ "reel",
1710
+ "fisherman",
1711
+ "skateboarder",
1712
+ "racecar",
1713
+ "racetrack",
1714
+ "banister",
1715
+ "trail",
1716
+ "glider",
1717
+ "sexy",
1718
+ "quest",
1719
+ "captain",
1720
+ "blond",
1721
+ "shampoo",
1722
+ "grooming",
1723
+ "sherrus",
1724
+ "steel",
1725
+ "cros",
1726
+ "tree",
1727
+ "word",
1728
+ "onion",
1729
+ "hairanother",
1730
+ "groom",
1731
+ "eckersley",
1732
+ "magic",
1733
+ "cuisine",
1734
+ "customer",
1735
+ "necklace",
1736
+ "tube",
1737
+ "straighten",
1738
+ "wind",
1739
+ "chain",
1740
+ "benefit",
1741
+ "sentence",
1742
+ "bottom",
1743
+ "chow",
1744
+ "bottl",
1745
+ "juggeling",
1746
+ "juggle",
1747
+ "juggling",
1748
+ "mixer",
1749
+ "processor",
1750
+ "mixture",
1751
+ "whole",
1752
+ "crush",
1753
+ "grind",
1754
+ "melon",
1755
+ "promote",
1756
+ "company",
1757
+ "queen",
1758
+ "mustache",
1759
+ "noise",
1760
+ "goofy",
1761
+ "stomach",
1762
+ "cheek",
1763
+ "blush",
1764
+ "tattooed",
1765
+ "undergarment",
1766
+ "heart",
1767
+ "violent",
1768
+ "strength",
1769
+ "darknes",
1770
+ "creepy",
1771
+ "collision",
1772
+ "jennifer",
1773
+ "converstaion",
1774
+ "nutrition",
1775
+ "sweater",
1776
+ "illustrate",
1777
+ "grapple",
1778
+ "referee",
1779
+ "victory",
1780
+ "expansion",
1781
+ "carpenter",
1782
+ "trancition",
1783
+ "nail",
1784
+ "fisher",
1785
+ "translate",
1786
+ "shoulder",
1787
+ "presentation",
1788
+ "sex",
1789
+ "tea",
1790
+ "sip",
1791
+ "turtle",
1792
+ "corner",
1793
+ "babt",
1794
+ "pond",
1795
+ "modeling",
1796
+ "paddle",
1797
+ "bye",
1798
+ "drench",
1799
+ "cleaning",
1800
+ "ment",
1801
+ "synch",
1802
+ "overhead",
1803
+ "pingpong",
1804
+ "olympic",
1805
+ "exciting",
1806
+ "weekday",
1807
+ "lettering",
1808
+ "harrison",
1809
+ "bay",
1810
+ "flex",
1811
+ "lifting",
1812
+ "weight",
1813
+ "wayne",
1814
+ "aeroplane",
1815
+ "tractor",
1816
+ "rider",
1817
+ "horseback",
1818
+ "lamborghini",
1819
+ "running",
1820
+ "playgrond",
1821
+ "simulate",
1822
+ "otehr",
1823
+ "speach",
1824
+ "barack",
1825
+ "nation",
1826
+ "ohio",
1827
+ "motherand",
1828
+ "affection",
1829
+ "laughing",
1830
+ "ballet",
1831
+ "terrific",
1832
+ "composition",
1833
+ "choreographer",
1834
+ "zipline",
1835
+ "hairdryer",
1836
+ "gelatin",
1837
+ "texture",
1838
+ "dryer",
1839
+ "wrestler",
1840
+ "arena",
1841
+ "fool",
1842
+ "fail",
1843
+ "spaciousnes",
1844
+ "reveal",
1845
+ "corridor",
1846
+ "dermatologist",
1847
+ "charity",
1848
+ "rosacea",
1849
+ "cancer",
1850
+ "teaching",
1851
+ "equation",
1852
+ "factor",
1853
+ "spider",
1854
+ "roleplay",
1855
+ "villain",
1856
+ "blind",
1857
+ "fury",
1858
+ "loki",
1859
+ "patch",
1860
+ "instrumental",
1861
+ "tone",
1862
+ "calender",
1863
+ "alarm",
1864
+ "calendar",
1865
+ "torch",
1866
+ "flashlight",
1867
+ "christmastime",
1868
+ "mannequin",
1869
+ "wander",
1870
+ "brighter",
1871
+ "avatar",
1872
+ "combat",
1873
+ "motionles",
1874
+ "iran",
1875
+ "roam",
1876
+ "steal",
1877
+ "documentary",
1878
+ "hyena",
1879
+ "pester",
1880
+ "anchor",
1881
+ "summer",
1882
+ "jesu",
1883
+ "chant",
1884
+ "mingle",
1885
+ "hotel",
1886
+ "elevator",
1887
+ "joseph",
1888
+ "mic",
1889
+ "widget",
1890
+ "pip",
1891
+ "jeep",
1892
+ "absorber",
1893
+ "staircase",
1894
+ "wood",
1895
+ "improvement",
1896
+ "flooring",
1897
+ "floring",
1898
+ "plywood",
1899
+ "deck",
1900
+ "drool",
1901
+ "toaster",
1902
+ "puree",
1903
+ "simmer",
1904
+ "refer",
1905
+ "tab",
1906
+ "tablet",
1907
+ "library",
1908
+ "youngster",
1909
+ "smart",
1910
+ "six",
1911
+ "purple",
1912
+ "pacify",
1913
+ "motorway",
1914
+ "sedan",
1915
+ "spotlight",
1916
+ "grease",
1917
+ "mosquito",
1918
+ "scope",
1919
+ "announcement",
1920
+ "praise",
1921
+ "sputnik",
1922
+ "degras",
1923
+ "convention",
1924
+ "tyson",
1925
+ "unscrew",
1926
+ "unbolt",
1927
+ "instrunment",
1928
+ "shin",
1929
+ "pony",
1930
+ "choreograph",
1931
+ "fountain",
1932
+ "brown",
1933
+ "harvey",
1934
+ "someine",
1935
+ "drawing",
1936
+ "joy",
1937
+ "matter",
1938
+ "draft",
1939
+ "raft",
1940
+ "pontoon",
1941
+ "reef",
1942
+ "micheal",
1943
+ "cuddle",
1944
+ "vehicale",
1945
+ "latitude",
1946
+ "skincare",
1947
+ "inside",
1948
+ "confession",
1949
+ "youth",
1950
+ "tower",
1951
+ "church",
1952
+ "lover",
1953
+ "step",
1954
+ "rob",
1955
+ "lorry",
1956
+ "firefighter",
1957
+ "firetruck",
1958
+ "webpage",
1959
+ "troubleshoot",
1960
+ "distance",
1961
+ "direction",
1962
+ "maintain",
1963
+ "cube",
1964
+ "rubik",
1965
+ "ruby",
1966
+ "rubix",
1967
+ "solve",
1968
+ "cookery",
1969
+ "guillotine",
1970
+ "mist",
1971
+ "mask",
1972
+ "bing",
1973
+ "position",
1974
+ "tmy",
1975
+ "pastry",
1976
+ "powder",
1977
+ "unicorn",
1978
+ "layup",
1979
+ "middle",
1980
+ "sounding",
1981
+ "sound",
1982
+ "winter",
1983
+ "santum",
1984
+ "christma",
1985
+ "timberlake",
1986
+ "justin",
1987
+ "creek",
1988
+ "tourist",
1989
+ "ram",
1990
+ "ribeye",
1991
+ "foil",
1992
+ "harmonica",
1993
+ "sandwich",
1994
+ "sandwhich",
1995
+ "pregnancy",
1996
+ "brightnes",
1997
+ "fiction",
1998
+ "age",
1999
+ "center",
2000
+ "gathering",
2001
+ "alcohol",
2002
+ "wireles",
2003
+ "radio",
2004
+ "volume",
2005
+ "aguy",
2006
+ "coffee",
2007
+ "buzz",
2008
+ "dial",
2009
+ "ventura",
2010
+ "campaign",
2011
+ "collection",
2012
+ "super",
2013
+ "governor",
2014
+ "christie",
2015
+ "sunday",
2016
+ "meghan",
2017
+ "poll",
2018
+ "chri",
2019
+ "caller",
2020
+ "ski",
2021
+ "snowy",
2022
+ "bull",
2023
+ "clown",
2024
+ "jury",
2025
+ "champion",
2026
+ "programm",
2027
+ "gallery",
2028
+ "booth",
2029
+ "icon",
2030
+ "flowerpot",
2031
+ "bassinet",
2032
+ "krueger",
2033
+ "kruger",
2034
+ "kreuger",
2035
+ "freddy",
2036
+ "fatality",
2037
+ "gladiator",
2038
+ "lipstick",
2039
+ "amore",
2040
+ "brand",
2041
+ "lipglos",
2042
+ "flag",
2043
+ "lawn",
2044
+ "rev",
2045
+ "site",
2046
+ "enemy",
2047
+ "bent",
2048
+ "dash",
2049
+ "riffle",
2050
+ "grow",
2051
+ "cohabit",
2052
+ "tiger",
2053
+ "mouth",
2054
+ "edit",
2055
+ "adobe",
2056
+ "photoshop",
2057
+ "manager",
2058
+ "romanium",
2059
+ "ancient",
2060
+ "vine",
2061
+ "opponent",
2062
+ "dunk",
2063
+ "hipster",
2064
+ "energy",
2065
+ "monster",
2066
+ "tribute",
2067
+ "cabinet",
2068
+ "dresser",
2069
+ "twirl",
2070
+ "sporting",
2071
+ "golf",
2072
+ "golfer",
2073
+ "shine",
2074
+ "choir",
2075
+ "gospel",
2076
+ "partake",
2077
+ "smosh",
2078
+ "timey",
2079
+ "colonial",
2080
+ "multiple",
2081
+ "multiplication",
2082
+ "fruit",
2083
+ "lotu",
2084
+ "potato",
2085
+ "peel",
2086
+ "scrap",
2087
+ "curve",
2088
+ "acceleration",
2089
+ "garage",
2090
+ "cap",
2091
+ "demand",
2092
+ "ghost",
2093
+ "drummer",
2094
+ "breathe",
2095
+ "effect",
2096
+ "image",
2097
+ "frock",
2098
+ "marketing",
2099
+ "hawk",
2100
+ "makeshift",
2101
+ "skeleton",
2102
+ "graveyard",
2103
+ "cemetery",
2104
+ "mulitple",
2105
+ "oeioke",
2106
+ "protest",
2107
+ "reply",
2108
+ "protester",
2109
+ "contest",
2110
+ "cobweb",
2111
+ "dump",
2112
+ "drama",
2113
+ "airliner",
2114
+ "staff",
2115
+ "wing",
2116
+ "wipeout",
2117
+ "toddler",
2118
+ "refresh",
2119
+ "swimming",
2120
+ "ripple",
2121
+ "garlic",
2122
+ "feed",
2123
+ "nuzzle",
2124
+ "swimsuit",
2125
+ "mexico",
2126
+ "succes",
2127
+ "communicate",
2128
+ "asses",
2129
+ "treasure",
2130
+ "stun",
2131
+ "trader",
2132
+ "throat",
2133
+ "perish",
2134
+ "kissing",
2135
+ "revenge",
2136
+ "meatloaf",
2137
+ "stick",
2138
+ "gather",
2139
+ "glistening",
2140
+ "competion",
2141
+ "net",
2142
+ "filter",
2143
+ "spray",
2144
+ "inspect",
2145
+ "gsr",
2146
+ "inclosure",
2147
+ "beside",
2148
+ "mill",
2149
+ "din",
2150
+ "bring",
2151
+ "population",
2152
+ "batter",
2153
+ "midwife",
2154
+ "roadside",
2155
+ "picket",
2156
+ "march",
2157
+ "jacket",
2158
+ "cast",
2159
+ "seleton",
2160
+ "handsome",
2161
+ "force",
2162
+ "abuse",
2163
+ "stomp",
2164
+ "subway",
2165
+ "mimic",
2166
+ "tax",
2167
+ "newscast",
2168
+ "krabby",
2169
+ "plankton",
2170
+ "horizon",
2171
+ "hiker",
2172
+ "downhill",
2173
+ "right",
2174
+ "hoodie",
2175
+ "teen",
2176
+ "style",
2177
+ "goku",
2178
+ "sade",
2179
+ "charger",
2180
+ "carbon",
2181
+ "drain",
2182
+ "kidney",
2183
+ "lettuce",
2184
+ "leafy",
2185
+ "utensil",
2186
+ "punching",
2187
+ "kit",
2188
+ "boxer",
2189
+ "training",
2190
+ "bunching",
2191
+ "deconstruct",
2192
+ "blockchain",
2193
+ "symposium",
2194
+ "jacobson",
2195
+ "resort",
2196
+ "accord",
2197
+ "presenter",
2198
+ "correspondent",
2199
+ "son",
2200
+ "clone",
2201
+ "int",
2202
+ "entertainment",
2203
+ "ordinance",
2204
+ "tha",
2205
+ "audiance",
2206
+ "tennisball",
2207
+ "racket",
2208
+ "snowboarder",
2209
+ "audi",
2210
+ "competation",
2211
+ "ferrarus",
2212
+ "clarkson",
2213
+ "crowbar",
2214
+ "stop",
2215
+ "trainer",
2216
+ "signature",
2217
+ "commando",
2218
+ "riot",
2219
+ "interlace",
2220
+ "swordfight",
2221
+ "butt",
2222
+ "fend",
2223
+ "engage",
2224
+ "battle",
2225
+ "celery",
2226
+ "scavenge",
2227
+ "witch",
2228
+ "motor",
2229
+ "bracket",
2230
+ "wto",
2231
+ "green",
2232
+ "johnny",
2233
+ "sman",
2234
+ "cause",
2235
+ "entail",
2236
+ "potatoe",
2237
+ "careful",
2238
+ "hils",
2239
+ "quaker",
2240
+ "mason",
2241
+ "hostage",
2242
+ "somali",
2243
+ "creation",
2244
+ "execute",
2245
+ "rally",
2246
+ "exchange",
2247
+ "phil",
2248
+ "churchill",
2249
+ "churchiill",
2250
+ "brawl",
2251
+ "scuffle",
2252
+ "cricket",
2253
+ "laksa",
2254
+ "pikachu",
2255
+ "sampling",
2256
+ "vidoe",
2257
+ "glow",
2258
+ "rise",
2259
+ "receptor",
2260
+ "tail",
2261
+ "chid",
2262
+ "babbling",
2263
+ "chew",
2264
+ "paparazzi",
2265
+ "premier",
2266
+ "nothing",
2267
+ "marian",
2268
+ "relationship",
2269
+ "comapny",
2270
+ "donate",
2271
+ "cycle",
2272
+ "bicycle",
2273
+ "bycycling",
2274
+ "sparkling",
2275
+ "ribbon",
2276
+ "suacepan",
2277
+ "peter",
2278
+ "griffin",
2279
+ "connection",
2280
+ "boxing",
2281
+ "beatboxing",
2282
+ "twitter",
2283
+ "macbook",
2284
+ "respond",
2285
+ "watchmojo",
2286
+ "empire",
2287
+ "terrifying",
2288
+ "llama",
2289
+ "sheep",
2290
+ "waterway",
2291
+ "froth",
2292
+ "pie",
2293
+ "aluminum",
2294
+ "alumminum",
2295
+ "roasting",
2296
+ "crust",
2297
+ "aluminium",
2298
+ "rent",
2299
+ "analysi",
2300
+ "professional",
2301
+ "simulation",
2302
+ "land",
2303
+ "descend",
2304
+ "measuring",
2305
+ "measure",
2306
+ "flavor",
2307
+ "inform",
2308
+ "fellow",
2309
+ "gerbil",
2310
+ "tunnel",
2311
+ "wiggle",
2312
+ "peep",
2313
+ "stock",
2314
+ "menu",
2315
+ "divine",
2316
+ "candidate",
2317
+ "trump",
2318
+ "donald",
2319
+ "addiction",
2320
+ "department",
2321
+ "attire",
2322
+ "bread",
2323
+ "grandmother",
2324
+ "fridge",
2325
+ "blood",
2326
+ "brain",
2327
+ "harissa",
2328
+ "compile",
2329
+ "disgust",
2330
+ "cutlet",
2331
+ "prize",
2332
+ "slope",
2333
+ "mountainside",
2334
+ "cannon",
2335
+ "lantern",
2336
+ "jack",
2337
+ "projection",
2338
+ "circulate",
2339
+ "rod",
2340
+ "copper",
2341
+ "flute",
2342
+ "length",
2343
+ "intercourse",
2344
+ "grog",
2345
+ "radicalization",
2346
+ "terrorism",
2347
+ "ticker",
2348
+ "broccoli",
2349
+ "brolic",
2350
+ "ramsey",
2351
+ "gordon",
2352
+ "pres",
2353
+ "gift",
2354
+ "hindi",
2355
+ "rip",
2356
+ "cartoonist",
2357
+ "badminton",
2358
+ "badmitten",
2359
+ "batmanton",
2360
+ "indoor",
2361
+ "excite",
2362
+ "surveillance",
2363
+ "alleyway",
2364
+ "integra",
2365
+ "florida",
2366
+ "backpack",
2367
+ "everything",
2368
+ "bollywood",
2369
+ "acura",
2370
+ "umbrella",
2371
+ "spend",
2372
+ "sausage",
2373
+ "saussage",
2374
+ "straightener",
2375
+ "death",
2376
+ "question",
2377
+ "bagpiper",
2378
+ "muffin",
2379
+ "biscuit",
2380
+ "showroom",
2381
+ "dealer",
2382
+ "glance",
2383
+ "loi",
2384
+ "eyebrow",
2385
+ "reprimand",
2386
+ "release",
2387
+ "trancy",
2388
+ "restaraunt",
2389
+ "hive",
2390
+ "beehive",
2391
+ "woma",
2392
+ "spice",
2393
+ "rack",
2394
+ "sloth",
2395
+ "subscription",
2396
+ "implore",
2397
+ "subscribe",
2398
+ "dominate",
2399
+ "entourage",
2400
+ "randomer",
2401
+ "dollar",
2402
+ "zynga",
2403
+ "sillouette",
2404
+ "rovio",
2405
+ "facility",
2406
+ "kung",
2407
+ "ninja",
2408
+ "karate",
2409
+ "standoff",
2410
+ "square",
2411
+ "sprint",
2412
+ "cart",
2413
+ "aisle",
2414
+ "purchase",
2415
+ "grab",
2416
+ "duck",
2417
+ "refrigerate",
2418
+ "foo",
2419
+ "rowboat",
2420
+ "opeing",
2421
+ "goodbye",
2422
+ "cycling",
2423
+ "harley",
2424
+ "baymax",
2425
+ "mate",
2426
+ "videotape",
2427
+ "skydive",
2428
+ "pluck",
2429
+ "avril",
2430
+ "number",
2431
+ "count",
2432
+ "hummer",
2433
+ "motorcyclist",
2434
+ "pulsate",
2435
+ "sparkle",
2436
+ "past",
2437
+ "trip",
2438
+ "prisoner",
2439
+ "albino",
2440
+ "gage",
2441
+ "example",
2442
+ "while",
2443
+ "piano",
2444
+ "countles",
2445
+ "techno",
2446
+ "cow",
2447
+ "headbutt",
2448
+ "level",
2449
+ "station",
2450
+ "railway",
2451
+ "viewpoint",
2452
+ "courtesy",
2453
+ "george",
2454
+ "receiver",
2455
+ "tuxedo",
2456
+ "stocking",
2457
+ "donkey",
2458
+ "robe",
2459
+ "modify",
2460
+ "cookie",
2461
+ "napkin",
2462
+ "hash",
2463
+ "non",
2464
+ "roast",
2465
+ "tantrum",
2466
+ "pillow",
2467
+ "whine",
2468
+ "freak",
2469
+ "slave",
2470
+ "solomon",
2471
+ "plantation",
2472
+ "northup",
2473
+ "flint",
2474
+ "bane",
2475
+ "batman",
2476
+ "footpath",
2477
+ "kitchena",
2478
+ "laboratory",
2479
+ "gesticulate",
2480
+ "pinnochio",
2481
+ "cheerlead",
2482
+ "self",
2483
+ "cement",
2484
+ "vegetation",
2485
+ "mossy",
2486
+ "sermon",
2487
+ "fear",
2488
+ "pastor",
2489
+ "preach",
2490
+ "notice",
2491
+ "row",
2492
+ "evaluate",
2493
+ "kayak",
2494
+ "competetion",
2495
+ "kaya",
2496
+ "panda",
2497
+ "tend",
2498
+ "inappropriate",
2499
+ "log",
2500
+ "basement",
2501
+ "ladder",
2502
+ "trap",
2503
+ "latter",
2504
+ "motorcyle",
2505
+ "slab",
2506
+ "reallity",
2507
+ "creed",
2508
+ "costume",
2509
+ "handball",
2510
+ "goalie",
2511
+ "colbert",
2512
+ "vacuum",
2513
+ "sort",
2514
+ "launch",
2515
+ "popcorn",
2516
+ "episode",
2517
+ "wop",
2518
+ "wheelchair",
2519
+ "oliver",
2520
+ "steven",
2521
+ "enduro",
2522
+ "unload",
2523
+ "hardcore",
2524
+ "faster",
2525
+ "perfect",
2526
+ "helmet",
2527
+ "skiin",
2528
+ "dirtbike",
2529
+ "admire",
2530
+ "vechile",
2531
+ "expo",
2532
+ "bulb",
2533
+ "holiday",
2534
+ "palace",
2535
+ "crying",
2536
+ "cinderella",
2537
+ "soundtrack",
2538
+ "kind",
2539
+ "godmother",
2540
+ "hitter",
2541
+ "update",
2542
+ "congressman",
2543
+ "angela",
2544
+ "countdown",
2545
+ "leonardo",
2546
+ "bunch",
2547
+ "path",
2548
+ "disease",
2549
+ "battery",
2550
+ "attachment",
2551
+ "iron",
2552
+ "hulk",
2553
+ "drone",
2554
+ "lining",
2555
+ "aircraft",
2556
+ "snack",
2557
+ "household",
2558
+ "establishment",
2559
+ "criticise",
2560
+ "anger",
2561
+ "sunami",
2562
+ "shore",
2563
+ "commissioner",
2564
+ "disagree",
2565
+ "claim",
2566
+ "bia",
2567
+ "republican",
2568
+ "author",
2569
+ "cigarette",
2570
+ "brad",
2571
+ "poster",
2572
+ "escalate",
2573
+ "barn",
2574
+ "crane",
2575
+ "concentration",
2576
+ "ecavator",
2577
+ "selena",
2578
+ "hip",
2579
+ "outfit",
2580
+ "dancehall",
2581
+ "kitten",
2582
+ "diffrerent",
2583
+ "gossip",
2584
+ "taylor",
2585
+ "connect",
2586
+ "concept",
2587
+ "datum",
2588
+ "marker",
2589
+ "rubic",
2590
+ "medieval",
2591
+ "elf",
2592
+ "rocket",
2593
+ "infront",
2594
+ "want",
2595
+ "charlie",
2596
+ "restroom",
2597
+ "bladder",
2598
+ "scatter",
2599
+ "touchdown",
2600
+ "coaster",
2601
+ "fan",
2602
+ "eminem",
2603
+ "sprinter",
2604
+ "tragedy",
2605
+ "awe",
2606
+ "stitch",
2607
+ "sew",
2608
+ "knit",
2609
+ "dock",
2610
+ "harbor",
2611
+ "golfing",
2612
+ "disconnect",
2613
+ "rewire",
2614
+ "cord",
2615
+ "connector",
2616
+ "bob",
2617
+ "bop",
2618
+ "spongue",
2619
+ "spacey",
2620
+ "nod",
2621
+ "pay",
2622
+ "john",
2623
+ "fox",
2624
+ "intolerance",
2625
+ "pile",
2626
+ "speaking",
2627
+ "pant",
2628
+ "yawn",
2629
+ "bark",
2630
+ "mock",
2631
+ "puppy",
2632
+ "argument",
2633
+ "cheetum",
2634
+ "cheetah",
2635
+ "cheetha",
2636
+ "taw",
2637
+ "gee",
2638
+ "duel",
2639
+ "celebraty",
2640
+ "stack",
2641
+ "laundry",
2642
+ "clothe",
2643
+ "sheet",
2644
+ "clothesline",
2645
+ "lil",
2646
+ "biz",
2647
+ "amn",
2648
+ "sample",
2649
+ "hanson",
2650
+ "slip",
2651
+ "deer",
2652
+ "foothold",
2653
+ "raindeer",
2654
+ "nfl",
2655
+ "cello",
2656
+ "living",
2657
+ "forklift",
2658
+ "somone",
2659
+ "clipart",
2660
+ "mobility",
2661
+ "tinker",
2662
+ "click",
2663
+ "weighter",
2664
+ "decoration",
2665
+ "bank",
2666
+ "musician",
2667
+ "recite",
2668
+ "soccerball",
2669
+ "hokey",
2670
+ "hokie",
2671
+ "understand",
2672
+ "eclipse",
2673
+ "moo",
2674
+ "baraka",
2675
+ "actin",
2676
+ "fluid",
2677
+ "takeout",
2678
+ "preparation",
2679
+ "bimbo",
2680
+ "charmander",
2681
+ "osbourne",
2682
+ "ozbourne",
2683
+ "catcher",
2684
+ "anything",
2685
+ "edm",
2686
+ "rop",
2687
+ "swing",
2688
+ "cradle",
2689
+ "flare",
2690
+ "tornado",
2691
+ "solar",
2692
+ "burst",
2693
+ "finish",
2694
+ "cursor",
2695
+ "screenshot",
2696
+ "seafood",
2697
+ "shell",
2698
+ "cleaver",
2699
+ "crap",
2700
+ "highlight",
2701
+ "knead",
2702
+ "masseuse",
2703
+ "palor",
2704
+ "inblue",
2705
+ "column",
2706
+ "miniature",
2707
+ "behavior",
2708
+ "pizza",
2709
+ "pope",
2710
+ "bles",
2711
+ "surge",
2712
+ "rhino",
2713
+ "hippo",
2714
+ "moped",
2715
+ "gasket",
2716
+ "chief",
2717
+ "thaw",
2718
+ "obscure",
2719
+ "port",
2720
+ "visibility",
2721
+ "nemesi",
2722
+ "musc",
2723
+ "backdrop",
2724
+ "bride",
2725
+ "heartbroken",
2726
+ "hakeem",
2727
+ "underwear",
2728
+ "doodlebug",
2729
+ "nolan",
2730
+ "castle",
2731
+ "dungeon",
2732
+ "glassware",
2733
+ "dispener",
2734
+ "avoid",
2735
+ "accessory",
2736
+ "clutch",
2737
+ "steering",
2738
+ "warm",
2739
+ "stretch",
2740
+ "guitor",
2741
+ "ultron",
2742
+ "backflip",
2743
+ "watering",
2744
+ "wise",
2745
+ "lawsuit",
2746
+ "demon",
2747
+ "overdose",
2748
+ "paranormal",
2749
+ "bondage",
2750
+ "veg",
2751
+ "plank",
2752
+ "loading",
2753
+ "buffer",
2754
+ "wildernes",
2755
+ "wwe",
2756
+ "mysterio",
2757
+ "tear",
2758
+ "wool",
2759
+ "fabric",
2760
+ "italy",
2761
+ "volkswagen",
2762
+ "wheel",
2763
+ "passenger",
2764
+ "funnel",
2765
+ "unpack",
2766
+ "carton",
2767
+ "oragami",
2768
+ "advance",
2769
+ "grandfather",
2770
+ "slap",
2771
+ "sir",
2772
+ "student",
2773
+ "classmate",
2774
+ "burger",
2775
+ "stew",
2776
+ "fellowman",
2777
+ "restraunt",
2778
+ "kimchi",
2779
+ "today",
2780
+ "ceremony",
2781
+ "attention",
2782
+ "vistor",
2783
+ "visitor",
2784
+ "mount",
2785
+ "dugout",
2786
+ "mound",
2787
+ "championship",
2788
+ "vedio",
2789
+ "jungle",
2790
+ "statement",
2791
+ "restaurent",
2792
+ "dez",
2793
+ "shield",
2794
+ "eyelid",
2795
+ "shane",
2796
+ "monologue",
2797
+ "oscar",
2798
+ "podcast",
2799
+ "obsitcle",
2800
+ "bin",
2801
+ "donation",
2802
+ "kindnes",
2803
+ "multus",
2804
+ "columbium",
2805
+ "spielberg",
2806
+ "kitty",
2807
+ "emission",
2808
+ "outlet",
2809
+ "coyote",
2810
+ "howl",
2811
+ "pray",
2812
+ "televisoin",
2813
+ "skit",
2814
+ "mifa",
2815
+ "countryside",
2816
+ "belt",
2817
+ "independence",
2818
+ "tuck",
2819
+ "blanket",
2820
+ "blancket",
2821
+ "champagne",
2822
+ "card",
2823
+ "complaining",
2824
+ "albinism",
2825
+ "discvery",
2826
+ "shooter",
2827
+ "sledge",
2828
+ "feminism",
2829
+ "navy",
2830
+ "leak",
2831
+ "sweat",
2832
+ "broccoili",
2833
+ "reciepus",
2834
+ "bakery",
2835
+ "nightime",
2836
+ "commit",
2837
+ "swingset",
2838
+ "suicide",
2839
+ "finishing",
2840
+ "smoking",
2841
+ "tutor",
2842
+ "trance",
2843
+ "grandma",
2844
+ "blast",
2845
+ "punk",
2846
+ "rehearse",
2847
+ "headrest",
2848
+ "showing",
2849
+ "cone",
2850
+ "symbol",
2851
+ "japan",
2852
+ "terrace",
2853
+ "wifi",
2854
+ "bathtub",
2855
+ "straw",
2856
+ "bathwater",
2857
+ "drinking",
2858
+ "suck",
2859
+ "freeman",
2860
+ "morgan",
2861
+ "stork",
2862
+ "poach",
2863
+ "outbreak",
2864
+ "dicing",
2865
+ "dice",
2866
+ "producer",
2867
+ "drum",
2868
+ "percussion",
2869
+ "narration",
2870
+ "inventory",
2871
+ "mushroom",
2872
+ "select",
2873
+ "peephole",
2874
+ "society",
2875
+ "healthcare",
2876
+ "sharpie",
2877
+ "notebook",
2878
+ "packet",
2879
+ "future",
2880
+ "munch",
2881
+ "llamma",
2882
+ "elaborate",
2883
+ "fixing",
2884
+ "description",
2885
+ "giraffe",
2886
+ "mickey",
2887
+ "mousekersize",
2888
+ "walt",
2889
+ "adult",
2890
+ "syringe",
2891
+ "dropper",
2892
+ "condensation",
2893
+ "leash",
2894
+ "dye",
2895
+ "wagon",
2896
+ "camp",
2897
+ "stump",
2898
+ "campsite",
2899
+ "upbeat",
2900
+ "everyone",
2901
+ "limp",
2902
+ "weapon",
2903
+ "idiot",
2904
+ "conductor",
2905
+ "beautician",
2906
+ "colmy",
2907
+ "simplify",
2908
+ "lapse",
2909
+ "trampoline",
2910
+ "jewelry",
2911
+ "muffler",
2912
+ "subframe",
2913
+ "curvy",
2914
+ "celebration",
2915
+ "anniversay",
2916
+ "mariah",
2917
+ "anniversary",
2918
+ "romance",
2919
+ "doorbell",
2920
+ "shrimp",
2921
+ "everest",
2922
+ "five",
2923
+ "seminar",
2924
+ "perry",
2925
+ "solor",
2926
+ "trade",
2927
+ "hogan",
2928
+ "pople",
2929
+ "demontrating",
2930
+ "envy",
2931
+ "groud",
2932
+ "valencium",
2933
+ "womean",
2934
+ "marinate",
2935
+ "comedian",
2936
+ "viral",
2937
+ "spounge",
2938
+ "manipulate",
2939
+ "knot",
2940
+ "helicoptor",
2941
+ "location",
2942
+ "decide",
2943
+ "mountaintop",
2944
+ "skyanother",
2945
+ "2013",
2946
+ "runnig",
2947
+ "winner",
2948
+ "gizmo",
2949
+ "kajak",
2950
+ "extraction",
2951
+ "technician",
2952
+ "tissue",
2953
+ "duggar",
2954
+ "stonehenge",
2955
+ "afar",
2956
+ "branch",
2957
+ "wine",
2958
+ "flub",
2959
+ "mean",
2960
+ "consist",
2961
+ "accapella",
2962
+ "thunder",
2963
+ "lick",
2964
+ "loosen",
2965
+ "blogger",
2966
+ "close",
2967
+ "baking",
2968
+ "curse",
2969
+ "brutality",
2970
+ "weird",
2971
+ "flail",
2972
+ "whip",
2973
+ "manchild",
2974
+ "plunge",
2975
+ "splash",
2976
+ "thrash",
2977
+ "recount",
2978
+ "cheat",
2979
+ "cupboard",
2980
+ "organizer",
2981
+ "refrigerator",
2982
+ "shelf",
2983
+ "accident",
2984
+ "tamato",
2985
+ "scout",
2986
+ "iraq",
2987
+ "surveliance",
2988
+ "engineer",
2989
+ "perfomer",
2990
+ "kenium",
2991
+ "grafitus",
2992
+ "rejuvenate",
2993
+ "moisturizer",
2994
+ "fake",
2995
+ "salada",
2996
+ "series",
2997
+ "tokyo",
2998
+ "weather",
2999
+ "leap",
3000
+ "variety",
3001
+ "watermelon",
3002
+ "pastum",
3003
+ "buffet",
3004
+ "chaser",
3005
+ "recreate",
3006
+ "tire",
3007
+ "bush",
3008
+ "bok",
3009
+ "tibet",
3010
+ "grassland",
3011
+ "beyonce",
3012
+ "laura",
3013
+ "cottage",
3014
+ "strain",
3015
+ "frown",
3016
+ "merry",
3017
+ "broom",
3018
+ "gameboy",
3019
+ "broaden",
3020
+ "content",
3021
+ "knowledge",
3022
+ "trust",
3023
+ "lunch",
3024
+ "atray",
3025
+ "buff",
3026
+ "hitch",
3027
+ "gameone",
3028
+ "daring",
3029
+ "rabbit",
3030
+ "keeper",
3031
+ "ina",
3032
+ "reaper",
3033
+ "killer",
3034
+ "specialist",
3035
+ "psychoanalyst",
3036
+ "counselor",
3037
+ "duet",
3038
+ "melody",
3039
+ "arthur",
3040
+ "emanate",
3041
+ "rpm",
3042
+ "firing",
3043
+ "explosion",
3044
+ "escape",
3045
+ "scenario",
3046
+ "entertainer",
3047
+ "spill",
3048
+ "carve",
3049
+ "casa",
3050
+ "gordan",
3051
+ "btalking",
3052
+ "spectacle",
3053
+ "corn",
3054
+ "mixie",
3055
+ "coloring",
3056
+ "intersection",
3057
+ "gla",
3058
+ "lime",
3059
+ "kapil",
3060
+ "stalk",
3061
+ "handler",
3062
+ "sack",
3063
+ "procol",
3064
+ "puma",
3065
+ "randolph",
3066
+ "peetum",
3067
+ "hunger",
3068
+ "mince",
3069
+ "accros",
3070
+ "therapist",
3071
+ "togethernes",
3072
+ "counciling",
3073
+ "lawyer",
3074
+ "beer",
3075
+ "beverage",
3076
+ "garb",
3077
+ "hoist",
3078
+ "autograph",
3079
+ "possession",
3080
+ "egypt",
3081
+ "engaging",
3082
+ "careear",
3083
+ "proone",
3084
+ "session",
3085
+ "edward",
3086
+ "convince",
3087
+ "pail",
3088
+ "conveyer",
3089
+ "wet",
3090
+ "babality",
3091
+ "defeat",
3092
+ "humiliate",
3093
+ "mortal",
3094
+ "cnbc",
3095
+ "leather",
3096
+ "scarf",
3097
+ "esteban",
3098
+ "ricky",
3099
+ "spmone",
3100
+ "highschool",
3101
+ "extention",
3102
+ "michael",
3103
+ "deandre",
3104
+ "chug",
3105
+ "climbinb",
3106
+ "rating",
3107
+ "tilt",
3108
+ "playstation",
3109
+ "hook",
3110
+ "viedo",
3111
+ "note",
3112
+ "string",
3113
+ "thread",
3114
+ "sense",
3115
+ "orbit",
3116
+ "peruse",
3117
+ "compost",
3118
+ "gardening",
3119
+ "robert",
3120
+ "controller",
3121
+ "theme",
3122
+ "price",
3123
+ "inspector",
3124
+ "friendship",
3125
+ "rolling",
3126
+ "spinning",
3127
+ "mcgeorge",
3128
+ "balcony",
3129
+ "tortoise",
3130
+ "popsicle",
3131
+ "squint",
3132
+ "alongwith",
3133
+ "primate",
3134
+ "expression",
3135
+ "macaque",
3136
+ "wok",
3137
+ "prawn",
3138
+ "resist",
3139
+ "rape",
3140
+ "scale",
3141
+ "gorden",
3142
+ "hiw",
3143
+ "miscarriage",
3144
+ "dealership",
3145
+ "sportsman",
3146
+ "spatula",
3147
+ "gopher",
3148
+ "beaver",
3149
+ "whisk",
3150
+ "moment",
3151
+ "wafer",
3152
+ "complex",
3153
+ "squish",
3154
+ "vollyball",
3155
+ "employee",
3156
+ "dispense",
3157
+ "worker",
3158
+ "icecream",
3159
+ "badmington",
3160
+ "shuttlecock",
3161
+ "tourney",
3162
+ "mistake",
3163
+ "goald",
3164
+ "proficiency",
3165
+ "skip",
3166
+ "ariel",
3167
+ "cupcake",
3168
+ "mermaid",
3169
+ "zipper",
3170
+ "fantasy",
3171
+ "devastate",
3172
+ "compute",
3173
+ "brochure",
3174
+ "booklet",
3175
+ "lobby",
3176
+ "split",
3177
+ "sunda",
3178
+ "terrain",
3179
+ "skiing",
3180
+ "britain",
3181
+ "popularity",
3182
+ "coerce",
3183
+ "coo",
3184
+ "mama",
3185
+ "badmitton",
3186
+ "buttock",
3187
+ "chrissy",
3188
+ "verentum",
3189
+ "railing",
3190
+ "physician",
3191
+ "injection",
3192
+ "inject",
3193
+ "beg",
3194
+ "cock",
3195
+ "victorium",
3196
+ "manufacture",
3197
+ "marburg",
3198
+ "overlaid",
3199
+ "warning",
3200
+ "arch",
3201
+ "entrance",
3202
+ "torque",
3203
+ "faster0",
3204
+ "playlist",
3205
+ "online",
3206
+ "opinion",
3207
+ "marketplace",
3208
+ "goalpost",
3209
+ "proposition",
3210
+ "prostitute",
3211
+ "cctv",
3212
+ "situation",
3213
+ "encounter",
3214
+ "chrocodile",
3215
+ "tempt",
3216
+ "transmission",
3217
+ "temple",
3218
+ "architecture",
3219
+ "travelogue",
3220
+ "demonstrating",
3221
+ "tech",
3222
+ "tes",
3223
+ "starburst",
3224
+ "thailand",
3225
+ "marijuana",
3226
+ "witha",
3227
+ "foreigner",
3228
+ "forehead",
3229
+ "lannister",
3230
+ "dinklage",
3231
+ "lad",
3232
+ "constume",
3233
+ "katty",
3234
+ "katy",
3235
+ "chopter",
3236
+ "hoverbike",
3237
+ "hover",
3238
+ "generation",
3239
+ "apron",
3240
+ "axe",
3241
+ "injury",
3242
+ "safty",
3243
+ "wound",
3244
+ "grande",
3245
+ "ariana",
3246
+ "jason",
3247
+ "honey",
3248
+ "cotton",
3249
+ "stopper",
3250
+ "linu",
3251
+ "intro",
3252
+ "indie",
3253
+ "limit",
3254
+ "personality",
3255
+ "plasticine",
3256
+ "seek",
3257
+ "armor",
3258
+ "controversry",
3259
+ "straddle",
3260
+ "fingernail",
3261
+ "sautee",
3262
+ "patty",
3263
+ "caharacter",
3264
+ "redhead",
3265
+ "alphabet",
3266
+ "christian",
3267
+ "plug",
3268
+ "richkidstv",
3269
+ "resturant",
3270
+ "sweep",
3271
+ "unroll",
3272
+ "dust",
3273
+ "circuit",
3274
+ "jail",
3275
+ "agent",
3276
+ "magician",
3277
+ "interrogate",
3278
+ "tortilla",
3279
+ "hymn",
3280
+ "religion",
3281
+ "miley",
3282
+ "fallon",
3283
+ "jimmy",
3284
+ "decision",
3285
+ "jim",
3286
+ "snoop",
3287
+ "escort",
3288
+ "motocros",
3289
+ "info",
3290
+ "mas",
3291
+ "extract",
3292
+ "multimedium",
3293
+ "scorpion",
3294
+ "furnace",
3295
+ "incinerator",
3296
+ "jackson",
3297
+ "weekend",
3298
+ "cristiano",
3299
+ "suspense",
3300
+ "transform",
3301
+ "vilon",
3302
+ "tamil",
3303
+ "smock",
3304
+ "combine",
3305
+ "ginger",
3306
+ "dhal",
3307
+ "listing",
3308
+ "tomato",
3309
+ "mation",
3310
+ "candlelight",
3311
+ "defend",
3312
+ "doomsday",
3313
+ "malibu",
3314
+ "defending",
3315
+ "power",
3316
+ "mmorpg",
3317
+ "backyard",
3318
+ "illnes",
3319
+ "condition",
3320
+ "papaer",
3321
+ "unwrap",
3322
+ "gameboard",
3323
+ "nutraloaf",
3324
+ "prison",
3325
+ "ease",
3326
+ "feminine",
3327
+ "moar",
3328
+ "solicit",
3329
+ "minion",
3330
+ "auto",
3331
+ "offroad",
3332
+ "dune",
3333
+ "tumbler",
3334
+ "winan",
3335
+ "freezer",
3336
+ "storm",
3337
+ "bbq",
3338
+ "club",
3339
+ "retaurant",
3340
+ "parking",
3341
+ "greg",
3342
+ "paino",
3343
+ "rhyme",
3344
+ "nintendo",
3345
+ "coconut",
3346
+ "catapult",
3347
+ "manufacturing",
3348
+ "warehouse",
3349
+ "pursue",
3350
+ "reassure",
3351
+ "plan",
3352
+ "blouse",
3353
+ "bathrom",
3354
+ "interviewing",
3355
+ "jon",
3356
+ "condolence",
3357
+ "memorial",
3358
+ "homage",
3359
+ "audiomicro",
3360
+ "sugar",
3361
+ "cinnamon",
3362
+ "sponebob",
3363
+ "imitate",
3364
+ "recreation",
3365
+ "pressconference",
3366
+ "antler",
3367
+ "moose",
3368
+ "murry",
3369
+ "headset",
3370
+ "painting",
3371
+ "trench",
3372
+ "globemaster",
3373
+ "stoner",
3374
+ "skyscraper",
3375
+ "cabin",
3376
+ "orient",
3377
+ "stiller",
3378
+ "highdive",
3379
+ "statuesque",
3380
+ "elephant",
3381
+ "bump",
3382
+ "suscribe",
3383
+ "appearance",
3384
+ "limousine",
3385
+ "hovercopter",
3386
+ "hovercraft",
3387
+ "voyage",
3388
+ "jumbping",
3389
+ "surgery",
3390
+ "administer",
3391
+ "nickelodeon",
3392
+ "clicker",
3393
+ "brunnette",
3394
+ "mark",
3395
+ "loarge",
3396
+ "unison",
3397
+ "reverse",
3398
+ "cub",
3399
+ "cartwheel",
3400
+ "saute",
3401
+ "tyga",
3402
+ "heavyset",
3403
+ "puddle",
3404
+ "district",
3405
+ "weigh",
3406
+ "advertising",
3407
+ "promotion",
3408
+ "couh",
3409
+ "charleston",
3410
+ "nidoran",
3411
+ "pokelon",
3412
+ "blend",
3413
+ "drill",
3414
+ "pulp",
3415
+ "watermellon",
3416
+ "vie",
3417
+ "sportscaster",
3418
+ "sunset",
3419
+ "pork",
3420
+ "fair",
3421
+ "tin",
3422
+ "xbox",
3423
+ "jumper",
3424
+ "gol",
3425
+ "spiderman",
3426
+ "batmobile",
3427
+ "coacher",
3428
+ "gymnist",
3429
+ "fastball",
3430
+ "kukumapoo",
3431
+ "saffron",
3432
+ "audio",
3433
+ "idea",
3434
+ "thi",
3435
+ "reason",
3436
+ "isn",
3437
+ "introductory",
3438
+ "planist",
3439
+ "pianist",
3440
+ "anticipation",
3441
+ "legislation",
3442
+ "marijuan",
3443
+ "legalize",
3444
+ "hockey",
3445
+ "morgue",
3446
+ "case",
3447
+ "edge",
3448
+ "kombat",
3449
+ "spew",
3450
+ "workout",
3451
+ "playzone",
3452
+ "wtwo",
3453
+ "flatbread",
3454
+ "vendor",
3455
+ "naan",
3456
+ "pound",
3457
+ "sunlight",
3458
+ "traveller",
3459
+ "capacity",
3460
+ "picturesque",
3461
+ "ropway",
3462
+ "chevy",
3463
+ "balloon",
3464
+ "jet",
3465
+ "dub",
3466
+ "role",
3467
+ "indiana",
3468
+ "quote",
3469
+ "fedora",
3470
+ "paragraph",
3471
+ "trudge",
3472
+ "curtain",
3473
+ "nalepianki",
3474
+ "skrobanki",
3475
+ "desolate",
3476
+ "polo",
3477
+ "badge",
3478
+ "crack",
3479
+ "ineterview",
3480
+ "sneeze",
3481
+ "strobe",
3482
+ "vodka",
3483
+ "burray",
3484
+ "biotechnology",
3485
+ "heal",
3486
+ "criminal",
3487
+ "reenact",
3488
+ "void",
3489
+ "manage",
3490
+ "frog",
3491
+ "kermit",
3492
+ "mazda",
3493
+ "vortex",
3494
+ "liquicd",
3495
+ "elect",
3496
+ "winnie",
3497
+ "writhe",
3498
+ "fact",
3499
+ "tehcno",
3500
+ "fanning",
3501
+ "commentating",
3502
+ "mole",
3503
+ "accept",
3504
+ "loom",
3505
+ "twist",
3506
+ "cadaver",
3507
+ "commuter",
3508
+ "sassy",
3509
+ "makup",
3510
+ "cyber",
3511
+ "restaurand",
3512
+ "doe",
3513
+ "violence",
3514
+ "plumber",
3515
+ "chararacter",
3516
+ "intelligence",
3517
+ "algorithm",
3518
+ "gesture",
3519
+ "sugarflor",
3520
+ "hurdle",
3521
+ "copetision",
3522
+ "iceland",
3523
+ "paraglide",
3524
+ "mustang",
3525
+ "nicki",
3526
+ "nikki",
3527
+ "compliment",
3528
+ "attraction",
3529
+ "pesron",
3530
+ "core",
3531
+ "ghul",
3532
+ "stab",
3533
+ "smith",
3534
+ "moma",
3535
+ "zoo",
3536
+ "calony",
3537
+ "survival",
3538
+ "bee",
3539
+ "minature",
3540
+ "saucer",
3541
+ "iteam",
3542
+ "reviewer",
3543
+ "delevigne",
3544
+ "mountion",
3545
+ "sum",
3546
+ "scooba",
3547
+ "official",
3548
+ "tur",
3549
+ "slash",
3550
+ "racoon",
3551
+ "photgraph",
3552
+ "magnet",
3553
+ "megaphone",
3554
+ "alpasca",
3555
+ "animate",
3556
+ "excitement",
3557
+ "hayatochirus",
3558
+ "shopit",
3559
+ "voilin",
3560
+ "homerun",
3561
+ "puppet",
3562
+ "daycare",
3563
+ "roofer",
3564
+ "adhesive",
3565
+ "behave",
3566
+ "liner",
3567
+ "curly",
3568
+ "headphone",
3569
+ "seduce",
3570
+ "passion",
3571
+ "saree",
3572
+ "mourn",
3573
+ "dismis",
3574
+ "dialysi",
3575
+ "tender",
3576
+ "salmon",
3577
+ "wink",
3578
+ "assessment",
3579
+ "finland",
3580
+ "passi",
3581
+ "avenger",
3582
+ "uniform",
3583
+ "law",
3584
+ "tense",
3585
+ "thrill",
3586
+ "franchise",
3587
+ "laughter",
3588
+ "standup",
3589
+ "paneer",
3590
+ "archor",
3591
+ "newtown",
3592
+ "megan",
3593
+ "faucet",
3594
+ "cus",
3595
+ "eyeshadow",
3596
+ "dragon",
3597
+ "bet",
3598
+ "pattern",
3599
+ "nerf",
3600
+ "fondle",
3601
+ "reckles",
3602
+ "sportscar",
3603
+ "public",
3604
+ "midair",
3605
+ "norton",
3606
+ "soak",
3607
+ "squeeze",
3608
+ "sandra",
3609
+ "crisi",
3610
+ "smashbrother",
3611
+ "supersmash",
3612
+ "wild",
3613
+ "encouragement",
3614
+ "barefoot",
3615
+ "ammunition",
3616
+ "ammo",
3617
+ "workspace",
3618
+ "coma",
3619
+ "scar",
3620
+ "expectancy",
3621
+ "rockband",
3622
+ "sceneary",
3623
+ "glare",
3624
+ "invention",
3625
+ "wardrobe",
3626
+ "antique",
3627
+ "volkswagon",
3628
+ "pair",
3629
+ "huddle",
3630
+ "cold",
3631
+ "putty",
3632
+ "samsung",
3633
+ "muscle",
3634
+ "daytona",
3635
+ "datona",
3636
+ "pocket",
3637
+ "wordgirl",
3638
+ "artillery",
3639
+ "exist",
3640
+ "breathtaking",
3641
+ "cannonball",
3642
+ "beanbag",
3643
+ "pinatum",
3644
+ "boosie",
3645
+ "valence",
3646
+ "nucleu",
3647
+ "electron",
3648
+ "argon",
3649
+ "clarinet",
3650
+ "shiver",
3651
+ "mattres",
3652
+ "moschimo",
3653
+ "togetum",
3654
+ "misty",
3655
+ "impres",
3656
+ "manican",
3657
+ "anaconda",
3658
+ "hoax",
3659
+ "boa",
3660
+ "scorpio",
3661
+ "wheeler",
3662
+ "career",
3663
+ "aldy",
3664
+ "charlotte",
3665
+ "thumb",
3666
+ "trinity",
3667
+ "wag",
3668
+ "shelter",
3669
+ "register",
3670
+ "trapeze",
3671
+ "stopwatch",
3672
+ "trapeeze",
3673
+ "spot",
3674
+ "strike",
3675
+ "maker",
3676
+ "smooth",
3677
+ "hay",
3678
+ "stall",
3679
+ "bang",
3680
+ "emotion",
3681
+ "dragnet",
3682
+ "appoint",
3683
+ "crib",
3684
+ "penguin",
3685
+ "cadillac",
3686
+ "sneak",
3687
+ "classrooom",
3688
+ "pause",
3689
+ "cane",
3690
+ "bbqing",
3691
+ "digging",
3692
+ "com",
3693
+ "graze",
3694
+ "console",
3695
+ "cucumber",
3696
+ "editing",
3697
+ "illustration",
3698
+ "snakeskin",
3699
+ "handmade",
3700
+ "amongst",
3701
+ "locality",
3702
+ "choke",
3703
+ "conception",
3704
+ "custom",
3705
+ "pewd",
3706
+ "pewdiepie",
3707
+ "muck",
3708
+ "monica",
3709
+ "undertake",
3710
+ "voltage",
3711
+ "dehydration",
3712
+ "sponsor",
3713
+ "indicate",
3714
+ "surfing",
3715
+ "cargo",
3716
+ "pimp",
3717
+ "barbeque",
3718
+ "hearthstone",
3719
+ "cherokee",
3720
+ "minnie",
3721
+ "fluffy",
3722
+ "sportswoman",
3723
+ "soul",
3724
+ "curl",
3725
+ "tag",
3726
+ "lure",
3727
+ "gilr",
3728
+ "brazier",
3729
+ "bra",
3730
+ "judgement",
3731
+ "somemovie",
3732
+ "terminator",
3733
+ "extend",
3734
+ "washing",
3735
+ "blank",
3736
+ "athelete",
3737
+ "marshawn",
3738
+ "shove",
3739
+ "fighting",
3740
+ "seal",
3741
+ "sight",
3742
+ "developmet",
3743
+ "ipad",
3744
+ "jerry",
3745
+ "investment",
3746
+ "whitney",
3747
+ "madison",
3748
+ "climate",
3749
+ "aviation",
3750
+ "froot",
3751
+ "hallelujah",
3752
+ "anchorman",
3753
+ "inspection",
3754
+ "switch",
3755
+ "microscope",
3756
+ "hocky",
3757
+ "monopoly",
3758
+ "electricity",
3759
+ "spark",
3760
+ "placement",
3761
+ "sleeping",
3762
+ "rubick",
3763
+ "tattoo",
3764
+ "canva",
3765
+ "snatch",
3766
+ "pitt",
3767
+ "daydream",
3768
+ "disturbing",
3769
+ "hypnotist",
3770
+ "wan",
3771
+ "commander",
3772
+ "jawsome",
3773
+ "forza",
3774
+ "lui",
3775
+ "prey",
3776
+ "burrow",
3777
+ "backside",
3778
+ "saw",
3779
+ "account",
3780
+ "trash",
3781
+ "freeform",
3782
+ "poker",
3783
+ "ochocinco",
3784
+ "espn",
3785
+ "pronounce",
3786
+ "join",
3787
+ "territory",
3788
+ "stunt",
3789
+ "mikey",
3790
+ "tug",
3791
+ "tugowar",
3792
+ "bloom",
3793
+ "breeze",
3794
+ "champaka",
3795
+ "greenery",
3796
+ "cycyle",
3797
+ "goliath",
3798
+ "spit",
3799
+ "cermony",
3800
+ "bestow",
3801
+ "meditate",
3802
+ "alloy",
3803
+ "rim",
3804
+ "wonder",
3805
+ "cihldren",
3806
+ "firehouse",
3807
+ "croquette",
3808
+ "skirt",
3809
+ "sheff",
3810
+ "dungenes",
3811
+ "calico",
3812
+ "mistres",
3813
+ "secssion",
3814
+ "dicaprio",
3815
+ "dhoni",
3816
+ "toyotum",
3817
+ "hope",
3818
+ "unrest",
3819
+ "boyband",
3820
+ "lock",
3821
+ "executioner",
3822
+ "bystander",
3823
+ "execution",
3824
+ "south",
3825
+ "robin",
3826
+ "defense",
3827
+ "protective",
3828
+ "mnay",
3829
+ "chomp",
3830
+ "anatomy",
3831
+ "dissect",
3832
+ "exhibition",
3833
+ "jeremy",
3834
+ "cocktail",
3835
+ "downey",
3836
+ "adjustment",
3837
+ "kickball",
3838
+ "knuckleball",
3839
+ "advise",
3840
+ "server",
3841
+ "entree",
3842
+ "sirector",
3843
+ "amazing",
3844
+ "bonu",
3845
+ "diddy",
3846
+ "tabletop",
3847
+ "sopmeone",
3848
+ "wax",
3849
+ "removal",
3850
+ "forearm",
3851
+ "walkthrough",
3852
+ "biking",
3853
+ "vitamin",
3854
+ "choclate",
3855
+ "refridegerator",
3856
+ "protein",
3857
+ "islamophobium",
3858
+ "pact",
3859
+ "gabriel",
3860
+ "pongal",
3861
+ "downloading",
3862
+ "over-emphasizing",
3863
+ "harmony",
3864
+ "housing",
3865
+ "chubby",
3866
+ "calmly",
3867
+ "oxygen",
3868
+ "underwater",
3869
+ "gorge",
3870
+ "thick",
3871
+ "diner",
3872
+ "suitcase",
3873
+ "breifcase",
3874
+ "submarine",
3875
+ "pressure",
3876
+ "yoga",
3877
+ "carter",
3878
+ "flap",
3879
+ "parkor",
3880
+ "spare",
3881
+ "bowling",
3882
+ "bowler",
3883
+ "comdey",
3884
+ "slopestyle",
3885
+ "section",
3886
+ "promo",
3887
+ "mathew",
3888
+ "spacecraft",
3889
+ "mcconaughy",
3890
+ "bonfire",
3891
+ "bonefire",
3892
+ "brake",
3893
+ "carbreak",
3894
+ "rotor",
3895
+ "recipie",
3896
+ "stimulate",
3897
+ "europe",
3898
+ "groundwater",
3899
+ "outer",
3900
+ "seep",
3901
+ "widow",
3902
+ "johansson",
3903
+ "ten",
3904
+ "vessel",
3905
+ "germany",
3906
+ "labor",
3907
+ "gauge",
3908
+ "garnish",
3909
+ "biker",
3910
+ "pore",
3911
+ "recepie",
3912
+ "mspaint",
3913
+ "furry",
3914
+ "inch",
3915
+ "worm",
3916
+ "caterpillar",
3917
+ "wate",
3918
+ "hula",
3919
+ "footnall",
3920
+ "compose",
3921
+ "saddle",
3922
+ "trot",
3923
+ "backboard",
3924
+ "dwight",
3925
+ "bus",
3926
+ "neighborhood",
3927
+ "schoolbu",
3928
+ "prince",
3929
+ "bambi",
3930
+ "banana",
3931
+ "ulton",
3932
+ "crossbar",
3933
+ "typewriter",
3934
+ "trio",
3935
+ "ufc",
3936
+ "frypan",
3937
+ "consumer",
3938
+ "snuggle",
3939
+ "industrialist",
3940
+ "cramer",
3941
+ "mpv",
3942
+ "spokesman",
3943
+ "toast",
3944
+ "motherboard",
3945
+ "surprise",
3946
+ "improvisation",
3947
+ "perosn",
3948
+ "acrobat",
3949
+ "lobster",
3950
+ "stain",
3951
+ "beige",
3952
+ "year",
3953
+ "blackberry",
3954
+ "storyline",
3955
+ "walking",
3956
+ "beeker",
3957
+ "beaker",
3958
+ "solution",
3959
+ "derrick",
3960
+ "unicycle",
3961
+ "loiter",
3962
+ "bose",
3963
+ "funny",
3964
+ "desktop",
3965
+ "mac",
3966
+ "crossing",
3967
+ "recording",
3968
+ "apology",
3969
+ "bunker",
3970
+ "argentina",
3971
+ "paw",
3972
+ "displaying",
3973
+ "batterie",
3974
+ "propeller",
3975
+ "clockwise",
3976
+ "costar",
3977
+ "decease",
3978
+ "lsd",
3979
+ "mating",
3980
+ "hump",
3981
+ "copulate",
3982
+ "doom",
3983
+ "chemical",
3984
+ "whelm",
3985
+ "proposal",
3986
+ "tabletenni",
3987
+ "breath",
3988
+ "hemsworth",
3989
+ "acting",
3990
+ "helmsworth",
3991
+ "twin",
3992
+ "pertain",
3993
+ "intensity",
3994
+ "fork",
3995
+ "cower",
3996
+ "insect",
3997
+ "nerd",
3998
+ "disappointment",
3999
+ "zip",
4000
+ "network",
4001
+ "collaboration",
4002
+ "anyone",
4003
+ "communication",
4004
+ "hai",
4005
+ "aisain",
4006
+ "raid",
4007
+ "dustbin",
4008
+ "dumpster",
4009
+ "mailbox",
4010
+ "aerobic",
4011
+ "canyon",
4012
+ "cody",
4013
+ "analyze",
4014
+ "vapor",
4015
+ "roacket",
4016
+ "micky",
4017
+ "fairie",
4018
+ "lamb",
4019
+ "nursery",
4020
+ "initiative",
4021
+ "precision",
4022
+ "photoshoot",
4023
+ "genital",
4024
+ "narrarator",
4025
+ "sygornie",
4026
+ "sigourney",
4027
+ "re-enacting",
4028
+ "pikini",
4029
+ "beggar",
4030
+ "lend",
4031
+ "throne",
4032
+ "monarchy",
4033
+ "grace",
4034
+ "daisy",
4035
+ "twain",
4036
+ "produce",
4037
+ "peal",
4038
+ "moto",
4039
+ "wreck",
4040
+ "mcdonald",
4041
+ "roaed",
4042
+ "darken",
4043
+ "dressing",
4044
+ "reno",
4045
+ "len",
4046
+ "groin",
4047
+ "eavesdrop",
4048
+ "eavesdropping",
4049
+ "distraught",
4050
+ "dispenser",
4051
+ "exhilarate",
4052
+ "exhilarating",
4053
+ "designate",
4054
+ "programming",
4055
+ "globalization",
4056
+ "astage",
4057
+ "lip",
4058
+ "foodball",
4059
+ "phrenology",
4060
+ "phremology",
4061
+ "america",
4062
+ "hitler",
4063
+ "discrimination",
4064
+ "racism",
4065
+ "houser",
4066
+ "pragmatism",
4067
+ "swimmer",
4068
+ "hank",
4069
+ "medication",
4070
+ "prescription",
4071
+ "transport",
4072
+ "adulthood",
4073
+ "nightclub",
4074
+ "wig",
4075
+ "overlay",
4076
+ "meter",
4077
+ "800",
4078
+ "footrace",
4079
+ "siphon",
4080
+ "firmware",
4081
+ "seagull",
4082
+ "importance",
4083
+ "accompany",
4084
+ "eight",
4085
+ "husband",
4086
+ "replacement",
4087
+ "machince",
4088
+ "uner",
4089
+ "bronze",
4090
+ "trim",
4091
+ "laser",
4092
+ "restarunt",
4093
+ "stucture",
4094
+ "surgeon",
4095
+ "nanny",
4096
+ "misbehave",
4097
+ "floating",
4098
+ "mule",
4099
+ "hamburger",
4100
+ "iowa",
4101
+ "lowa",
4102
+ "brief",
4103
+ "cleanong",
4104
+ "solo",
4105
+ "tar",
4106
+ "homemade",
4107
+ "winston",
4108
+ "peole",
4109
+ "agreement",
4110
+ "unemployment",
4111
+ "baton",
4112
+ "woody",
4113
+ "costumer",
4114
+ "literature",
4115
+ "campaigning",
4116
+ "presidency",
4117
+ "refuse",
4118
+ "courier",
4119
+ "beat-boxing",
4120
+ "fillet",
4121
+ "relay",
4122
+ "ping",
4123
+ "request",
4124
+ "kircher",
4125
+ "tim",
4126
+ "convulse",
4127
+ "assail",
4128
+ "intrude",
4129
+ "gourmet",
4130
+ "gingerbread",
4131
+ "recode",
4132
+ "foreground",
4133
+ "ditch",
4134
+ "playdoh",
4135
+ "dexter",
4136
+ "char",
4137
+ "daryl",
4138
+ "showcase",
4139
+ "mand",
4140
+ "abot",
4141
+ "cheery",
4142
+ "sunstance",
4143
+ "album",
4144
+ "fireplace",
4145
+ "resistance",
4146
+ "bga",
4147
+ "larry",
4148
+ "tune",
4149
+ "geographic",
4150
+ "spiel",
4151
+ "alternator",
4152
+ "installing",
4153
+ "brag",
4154
+ "berate",
4155
+ "womanb",
4156
+ "bumper",
4157
+ "dent",
4158
+ "prus",
4159
+ "daylight",
4160
+ "natuiralist",
4161
+ "halloween",
4162
+ "sirloin",
4163
+ "pinocchio",
4164
+ "bussaly",
4165
+ "contmy",
4166
+ "foosball",
4167
+ "cocoon",
4168
+ "burqa",
4169
+ "impersonate",
4170
+ "fingure",
4171
+ "primer",
4172
+ "carson",
4173
+ "feeding",
4174
+ "parent"
4175
+ ]
ChatUniVi/eval/questions/video_qa/msrvtt_qa.json ADDED
The diff for this file is too large to render. See raw diff
 
ChatUniVi/eval/questions/video_qa/msvd_a_list.json ADDED
@@ -0,0 +1,1202 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ "someone",
3
+ "rifle",
4
+ "man",
5
+ "box",
6
+ "gun",
7
+ "person",
8
+ "weapon",
9
+ "contain",
10
+ "opine",
11
+ "show",
12
+ "sword",
13
+ "boy",
14
+ "kid",
15
+ "fight",
16
+ "twirl",
17
+ "put",
18
+ "demonstrate",
19
+ "dance",
20
+ "practice",
21
+ "two",
22
+ "gras",
23
+ "demonstration",
24
+ "karate",
25
+ "perform",
26
+ "path",
27
+ "wildernes",
28
+ "trail",
29
+ "road",
30
+ "style",
31
+ "lane",
32
+ "actor",
33
+ "walk",
34
+ "eagle",
35
+ "motion",
36
+ "hare",
37
+ "rabbit",
38
+ "bird",
39
+ "bunny",
40
+ "field",
41
+ "dodge",
42
+ "try",
43
+ "chase",
44
+ "water",
45
+ "cliff",
46
+ "river",
47
+ "ocean",
48
+ "rock",
49
+ "dive",
50
+ "jump",
51
+ "crust",
52
+ "dough",
53
+ "chef",
54
+ "cook",
55
+ "lay",
56
+ "spread",
57
+ "unroll",
58
+ "cut",
59
+ "roll",
60
+ "guitar",
61
+ "play",
62
+ "cat",
63
+ "dog",
64
+ "bite",
65
+ "break",
66
+ "burst",
67
+ "pop",
68
+ "attack",
69
+ "girl",
70
+ "ball",
71
+ "toddler",
72
+ "baby",
73
+ "yard",
74
+ "animal",
75
+ "throw",
76
+ "motorcycle",
77
+ "ground",
78
+ "bike",
79
+ "stunt",
80
+ "wheel",
81
+ "motorcyle",
82
+ "guy",
83
+ "motorbike",
84
+ "minibike",
85
+ "wheelie",
86
+ "dachshund",
87
+ "pool",
88
+ "swim",
89
+ "stage",
90
+ "concert",
91
+ "jeff",
92
+ "pyramid",
93
+ "school",
94
+ "form",
95
+ "kneel",
96
+ "climb",
97
+ "build",
98
+ "target",
99
+ "pistol",
100
+ "machine",
101
+ "glock",
102
+ "fire",
103
+ "shoot",
104
+ "stand",
105
+ "woman",
106
+ "knife",
107
+ "vegetable",
108
+ "lady",
109
+ "leafy",
110
+ "parsley",
111
+ "herb",
112
+ "coriander",
113
+ "chop",
114
+ "garlic",
115
+ "turnip",
116
+ "bowl",
117
+ "root",
118
+ "plant",
119
+ "pull",
120
+ "clean",
121
+ "mushroom",
122
+ "tapioca",
123
+ "cauliflower",
124
+ "food",
125
+ "dice",
126
+ "use",
127
+ "slouse",
128
+ "mall",
129
+ "jean",
130
+ "airport",
131
+ "onion",
132
+ "phone",
133
+ "telephone",
134
+ "hang",
135
+ "speak",
136
+ "talk",
137
+ "hold",
138
+ "hand",
139
+ "arm",
140
+ "star",
141
+ "shin",
142
+ "gaze",
143
+ "reach",
144
+ "stretch",
145
+ "watch",
146
+ "guinea",
147
+ "lettuce",
148
+ "vegetation",
149
+ "eat",
150
+ "tree",
151
+ "rain",
152
+ "polouse",
153
+ "vehicle",
154
+ "car",
155
+ "highway",
156
+ "maneuver",
157
+ "driver",
158
+ "cop",
159
+ "evade",
160
+ "force",
161
+ "pit",
162
+ "shrimp",
163
+ "shell",
164
+ "peel",
165
+ "prepare",
166
+ "prawn",
167
+ "fish",
168
+ "seafood",
169
+ "worm",
170
+ "tail",
171
+ "stuff",
172
+ "seasoning",
173
+ "starch",
174
+ "cover",
175
+ "season",
176
+ "leek",
177
+ "fruit",
178
+ "leak",
179
+ "somoene",
180
+ "batter",
181
+ "substance",
182
+ "flmy",
183
+ "flower",
184
+ "mix",
185
+ "pmy",
186
+ "brush",
187
+ "tempura",
188
+ "coat",
189
+ "spice",
190
+ "butter",
191
+ "fry",
192
+ "meat",
193
+ "dip",
194
+ "place",
195
+ "bread",
196
+ "oil",
197
+ "pot",
198
+ "something",
199
+ "mitsuba",
200
+ "frying",
201
+ "tray",
202
+ "grill",
203
+ "liquid",
204
+ "stir",
205
+ "cilantro",
206
+ "udon",
207
+ "pastum",
208
+ "boil",
209
+ "foodstuff",
210
+ "biscuit",
211
+ "sushi",
212
+ "wrapper",
213
+ "cheese",
214
+ "kamaboko",
215
+ "package",
216
+ "unwrap",
217
+ "wood",
218
+ "pink",
219
+ "cake",
220
+ "purple",
221
+ "kamakodo",
222
+ "lemon",
223
+ "rind",
224
+ "piece",
225
+ "skin",
226
+ "orange",
227
+ "container",
228
+ "hydrate",
229
+ "date",
230
+ "shiitake",
231
+ "fig",
232
+ "cros",
233
+ "somene",
234
+ "thing",
235
+ "score",
236
+ "broth",
237
+ "saute",
238
+ "drive",
239
+ "violin",
240
+ "microphone",
241
+ "instrument",
242
+ "fiddle",
243
+ "pluck",
244
+ "steak",
245
+ "pork",
246
+ "poke",
247
+ "pierce",
248
+ "pepper",
249
+ "sprinkle",
250
+ "plate",
251
+ "egg",
252
+ "dish",
253
+ "drop",
254
+ "street",
255
+ "motocycle",
256
+ "motor",
257
+ "lie",
258
+ "pitcher",
259
+ "soda",
260
+ "juic",
261
+ "juice",
262
+ "mixture",
263
+ "jug",
264
+ "jar",
265
+ "cucumber",
266
+ "glas",
267
+ "drinking",
268
+ "drink",
269
+ "four",
270
+ "explosion",
271
+ "blast",
272
+ "blow",
273
+ "burn",
274
+ "couch",
275
+ "sit",
276
+ "sleeping",
277
+ "groom",
278
+ "lick",
279
+ "superman",
280
+ "superhero",
281
+ "door",
282
+ "superhuman",
283
+ "giant",
284
+ "character",
285
+ "move",
286
+ "push",
287
+ "lift",
288
+ "individual",
289
+ "dirt",
290
+ "biker",
291
+ "bump",
292
+ "air",
293
+ "cycle",
294
+ "fly",
295
+ "bed",
296
+ "nap",
297
+ "sleep",
298
+ "wake",
299
+ "waken",
300
+ "hammer",
301
+ "thumb",
302
+ "finger",
303
+ "hit",
304
+ "smash",
305
+ "rope",
306
+ "walkway",
307
+ "pathway",
308
+ "house",
309
+ "skip",
310
+ "jumproping",
311
+ "jockey",
312
+ "horse",
313
+ "perimeter",
314
+ "stadium",
315
+ "ring",
316
+ "arena",
317
+ "competition",
318
+ "wrestle",
319
+ "cockfight",
320
+ "trumpet",
321
+ "club",
322
+ "song",
323
+ "menacing",
324
+ "clown",
325
+ "band",
326
+ "menace",
327
+ "look",
328
+ "beef",
329
+ "fat",
330
+ "roast",
331
+ "trim",
332
+ "bowler",
333
+ "split",
334
+ "bowling",
335
+ "remain",
336
+ "board",
337
+ "flip",
338
+ "doctor",
339
+ "emergency",
340
+ "chest",
341
+ "patient",
342
+ "gurney",
343
+ "hospital",
344
+ "die",
345
+ "bleed",
346
+ "help",
347
+ "content",
348
+ "chili",
349
+ "tin",
350
+ "dump",
351
+ "mixer",
352
+ "blender",
353
+ "cream",
354
+ "whisk",
355
+ "knead",
356
+ "whip",
357
+ "chimpanzee",
358
+ "cigarette",
359
+ "smoking",
360
+ "monkey",
361
+ "smoke",
362
+ "room",
363
+ "christma",
364
+ "wear",
365
+ "turtle",
366
+ "tortoise",
367
+ "hunt",
368
+ "ice",
369
+ "skate",
370
+ "sandwich",
371
+ "mayonnaise",
372
+ "equipment",
373
+ "mechanic",
374
+ "speaker",
375
+ "loudspeaker",
376
+ "join",
377
+ "portion",
378
+ "outer",
379
+ "clove",
380
+ "peal",
381
+ "mince",
382
+ "capsicum",
383
+ "bell",
384
+ "center",
385
+ "whole",
386
+ "half",
387
+ "apple",
388
+ "wall",
389
+ "building",
390
+ "picture",
391
+ "camera",
392
+ "photograph",
393
+ "milk",
394
+ "sauce",
395
+ "football",
396
+ "soccer",
397
+ "otter",
398
+ "beaver",
399
+ "slide",
400
+ "mango",
401
+ "avocado",
402
+ "lengthwise",
403
+ "squash",
404
+ "chew",
405
+ "mes",
406
+ "tease",
407
+ "gnaw",
408
+ "sniff",
409
+ "grocery",
410
+ "stroller",
411
+ "pram",
412
+ "store",
413
+ "supermarket",
414
+ "cart",
415
+ "bay",
416
+ "pay",
417
+ "forest",
418
+ "deer",
419
+ "pas",
420
+ "roam",
421
+ "head",
422
+ "side",
423
+ "stove",
424
+ "skillet",
425
+ "sizzle",
426
+ "machinthi",
427
+ "kanu",
428
+ "hole",
429
+ "drill",
430
+ "block",
431
+ "rhino",
432
+ "rhinocero",
433
+ "grazing",
434
+ "graze",
435
+ "bush",
436
+ "hide",
437
+ "spy",
438
+ "face",
439
+ "halt",
440
+ "luggage",
441
+ "speed",
442
+ "papaya",
443
+ "carve",
444
+ "track",
445
+ "eight",
446
+ "race",
447
+ "compete",
448
+ "sprint",
449
+ "faucet",
450
+ "bath",
451
+ "sink",
452
+ "splash",
453
+ "shower",
454
+ "playing",
455
+ "trick",
456
+ "deck",
457
+ "card",
458
+ "display",
459
+ "marley",
460
+ "ride",
461
+ "orangatan",
462
+ "orangutan",
463
+ "shirt",
464
+ "strip",
465
+ "undres",
466
+ "banana",
467
+ "bottom",
468
+ "start",
469
+ "snowboarder",
470
+ "snow",
471
+ "hill",
472
+ "slope",
473
+ "mountain",
474
+ "skier",
475
+ "ski",
476
+ "snowboard",
477
+ "potato",
478
+ "potatoe",
479
+ "grate",
480
+ "foot",
481
+ "thumper",
482
+ "cartoon",
483
+ "love",
484
+ "kis",
485
+ "dres",
486
+ "costume",
487
+ "punch",
488
+ "shake",
489
+ "underwood",
490
+ "carrie",
491
+ "carpet",
492
+ "bug",
493
+ "floor",
494
+ "witha",
495
+ "paw",
496
+ "bark",
497
+ "child",
498
+ "right",
499
+ "sofa",
500
+ "crawl",
501
+ "infant",
502
+ "snuggle",
503
+ "nuzzle",
504
+ "rub",
505
+ "cares",
506
+ "kitten",
507
+ "shoestring",
508
+ "pet",
509
+ "touch",
510
+ "shih",
511
+ "settee",
512
+ "rib",
513
+ "spare",
514
+ "bone",
515
+ "rack",
516
+ "bbq",
517
+ "three",
518
+ "spar",
519
+ "helicopter",
520
+ "airplane",
521
+ "act",
522
+ "boxer",
523
+ "audience",
524
+ "routine",
525
+ "presentation",
526
+ "book",
527
+ "call",
528
+ "read",
529
+ "receive",
530
+ "attend",
531
+ "carrot",
532
+ "lori",
533
+ "sloth",
534
+ "lorus",
535
+ "paper",
536
+ "rectangular",
537
+ "tear",
538
+ "bicycle",
539
+ "primate",
540
+ "tricycle",
541
+ "coach",
542
+ "icing",
543
+ "cupcake",
544
+ "five",
545
+ "pom",
546
+ "butt",
547
+ "cheer",
548
+ "motorcyclist",
549
+ "rider",
550
+ "motorcylist",
551
+ "crash",
552
+ "fall",
553
+ "finishing",
554
+ "artist",
555
+ "pencil",
556
+ "sketch",
557
+ "draw",
558
+ "essence",
559
+ "cooking",
560
+ "corn",
561
+ "vanilla",
562
+ "drizzle",
563
+ "thick",
564
+ "loaf",
565
+ "brown",
566
+ "swat",
567
+ "beat",
568
+ "wave",
569
+ "shotgun",
570
+ "running",
571
+ "spoon",
572
+ "table",
573
+ "meal",
574
+ "din",
575
+ "curve",
576
+ "course",
577
+ "motocros",
578
+ "lake",
579
+ "swimming",
580
+ "line",
581
+ "shallot",
582
+ "foam",
583
+ "bathing",
584
+ "bettie",
585
+ "edge",
586
+ "ledge",
587
+ "singing",
588
+ "makeup",
589
+ "eyelid",
590
+ "shadow",
591
+ "liner",
592
+ "indoor",
593
+ "gear",
594
+ "scale",
595
+ "music",
596
+ "group",
597
+ "stamp",
598
+ "tomato",
599
+ "tomatoe",
600
+ "mozzarella",
601
+ "rice",
602
+ "scoop",
603
+ "lasagna",
604
+ "colander",
605
+ "simmer",
606
+ "wrestler",
607
+ "opponent",
608
+ "fighter",
609
+ "reporter",
610
+ "sandcastle",
611
+ "sand",
612
+ "castle",
613
+ "interview",
614
+ "bar",
615
+ "fence",
616
+ "horseback",
617
+ "obstacle",
618
+ "while",
619
+ "beach",
620
+ "singer",
621
+ "hitchhiking",
622
+ "hitchhiker",
623
+ "hitch",
624
+ "ask",
625
+ "hitchhike",
626
+ "eyeliner",
627
+ "outline",
628
+ "goat",
629
+ "bleat",
630
+ "tiger",
631
+ "lion",
632
+ "albino",
633
+ "cub",
634
+ "interact",
635
+ "carriage",
636
+ "family",
637
+ "trot",
638
+ "transport",
639
+ "travel",
640
+ "row",
641
+ "hedge",
642
+ "lemur",
643
+ "furry",
644
+ "weird",
645
+ "hug",
646
+ "gather",
647
+ "huddle",
648
+ "panda",
649
+ "keeper",
650
+ "bottle",
651
+ "veterinarian",
652
+ "feed",
653
+ "balance",
654
+ "scooter",
655
+ "back",
656
+ "stay",
657
+ "instruct",
658
+ "focu",
659
+ "game",
660
+ "goal",
661
+ "kick",
662
+ "shakira",
663
+ "metal",
664
+ "pillar",
665
+ "steel",
666
+ "work",
667
+ "envelope",
668
+ "xbox360",
669
+ "headset",
670
+ "mail",
671
+ "item",
672
+ "write",
673
+ "canoe",
674
+ "oanoe",
675
+ "newscaster",
676
+ "boat",
677
+ "paddle",
678
+ "sail",
679
+ "glove",
680
+ "coffee",
681
+ "cup",
682
+ "peeler",
683
+ "potoatoe",
684
+ "scrap",
685
+ "chair",
686
+ "kitchen",
687
+ "keyboard",
688
+ "synthesizer",
689
+ "piano",
690
+ "cookie",
691
+ "boarding",
692
+ "skateboard",
693
+ "cruise",
694
+ "peddle",
695
+ "flute",
696
+ "lawn",
697
+ "squirrel",
698
+ "hop",
699
+ "teenager",
700
+ "mom",
701
+ "teenage",
702
+ "carry",
703
+ "lounge",
704
+ "couple",
705
+ "video",
706
+ "girlfriend",
707
+ "conversation",
708
+ "crying",
709
+ "cry",
710
+ "mourn",
711
+ "weep",
712
+ "sob",
713
+ "grieve",
714
+ "drip",
715
+ "church",
716
+ "sunset",
717
+ "passenger",
718
+ "bcycle",
719
+ "crossbar",
720
+ "juggle",
721
+ "tos",
722
+ "soccar",
723
+ "sportsman",
724
+ "bat",
725
+ "cricket",
726
+ "error",
727
+ "cricketer",
728
+ "crowd",
729
+ "laugh",
730
+ "smile",
731
+ "dummy",
732
+ "mannequin",
733
+ "run",
734
+ "leader",
735
+ "exercise",
736
+ "chocolate",
737
+ "chocolaty",
738
+ "baker",
739
+ "wind",
740
+ "duck",
741
+ "toy",
742
+ "stream",
743
+ "creek",
744
+ "attention",
745
+ "squirt",
746
+ "lad",
747
+ "paste",
748
+ "salt",
749
+ "powder",
750
+ "dust",
751
+ "cantaloupe",
752
+ "sweet",
753
+ "pumpkin",
754
+ "cantalopue",
755
+ "sidewalk",
756
+ "sledge",
757
+ "sledgehammer",
758
+ "pick",
759
+ "tool",
760
+ "cube",
761
+ "hair",
762
+ "braid",
763
+ "bulldog",
764
+ "wad",
765
+ "fetch",
766
+ "truck",
767
+ "bumper",
768
+ "pickup",
769
+ "gazelle",
770
+ "baboon",
771
+ "antelope",
772
+ "latter",
773
+ "fawn",
774
+ "kidnap",
775
+ "charge",
776
+ "broccoli",
777
+ "rodent",
778
+ "brocoli",
779
+ "hamster",
780
+ "eye",
781
+ "eyeshadow",
782
+ "garden",
783
+ "amongst",
784
+ "stroll",
785
+ "bench",
786
+ "swing",
787
+ "leaf",
788
+ "bak",
789
+ "mouth",
790
+ "bicyclist",
791
+ "train",
792
+ "model",
793
+ "trolley",
794
+ "strike",
795
+ "vase",
796
+ "son",
797
+ "father",
798
+ "busines",
799
+ "mand",
800
+ "cleaning",
801
+ "wash",
802
+ "hoot",
803
+ "trainer",
804
+ "leg",
805
+ "teach",
806
+ "view",
807
+ "shield",
808
+ "necklace",
809
+ "husband",
810
+ "marry",
811
+ "flag",
812
+ "dinner",
813
+ "serve",
814
+ "scene",
815
+ "herself",
816
+ "background",
817
+ "carom",
818
+ "meadow",
819
+ "jungle",
820
+ "bacon",
821
+ "aluminum",
822
+ "foil",
823
+ "square",
824
+ "lamp",
825
+ "attract",
826
+ "mat",
827
+ "doorway",
828
+ "mob",
829
+ "salaryman",
830
+ "alley",
831
+ "cooked",
832
+ "rear",
833
+ "army",
834
+ "parade",
835
+ "formation",
836
+ "march",
837
+ "teacher",
838
+ "whiteboard",
839
+ "equation",
840
+ "math",
841
+ "formula",
842
+ "problem",
843
+ "solve",
844
+ "explain",
845
+ "circle",
846
+ "oven",
847
+ "bake",
848
+ "waterfall",
849
+ "island",
850
+ "creature",
851
+ "control",
852
+ "bullet",
853
+ "yellow",
854
+ "harbor",
855
+ "coast",
856
+ "speeding",
857
+ "policeman",
858
+ "officer",
859
+ "arrest",
860
+ "tie",
861
+ "handcuff",
862
+ "bikini",
863
+ "fold",
864
+ "crocodile",
865
+ "alligator",
866
+ "nose",
867
+ "pat",
868
+ "tap",
869
+ "curl",
870
+ "bodybuilder",
871
+ "weight",
872
+ "builder",
873
+ "barbell",
874
+ "night",
875
+ "dark",
876
+ "beater",
877
+ "spin",
878
+ "cage",
879
+ "zoo",
880
+ "enclosure",
881
+ "pen",
882
+ "pace",
883
+ "mammal",
884
+ "blanket",
885
+ "plastic",
886
+ "inspect",
887
+ "examine",
888
+ "bend",
889
+ "transplant",
890
+ "harvest",
891
+ "tend",
892
+ "station",
893
+ "subway",
894
+ "transit",
895
+ "disembark",
896
+ "exit",
897
+ "desk",
898
+ "rainbow",
899
+ "meow",
900
+ "nitrogen",
901
+ "liguid",
902
+ "vapor",
903
+ "steam",
904
+ "solution",
905
+ "pester",
906
+ "grab",
907
+ "funny",
908
+ "jerboa",
909
+ "chinchilla",
910
+ "mouse",
911
+ "rat",
912
+ "scurry",
913
+ "sergeant",
914
+ "seargeant",
915
+ "soldier",
916
+ "sargent",
917
+ "troop",
918
+ "commander",
919
+ "voice",
920
+ "tapir",
921
+ "branch",
922
+ "aardvark",
923
+ "search",
924
+ "forage",
925
+ "training",
926
+ "puff",
927
+ "squeeze",
928
+ "juicing",
929
+ "extract",
930
+ "strum",
931
+ "pizza",
932
+ "enjoy",
933
+ "ukulele",
934
+ "drunk",
935
+ "post",
936
+ "pavement",
937
+ "sieve",
938
+ "somone",
939
+ "strainer",
940
+ "miniature",
941
+ "coconut",
942
+ "drain",
943
+ "armchair",
944
+ "shirtles",
945
+ "richard",
946
+ "shilpa",
947
+ "wag",
948
+ "beachside",
949
+ "lead",
950
+ "cheff",
951
+ "tower",
952
+ "shape",
953
+ "pile",
954
+ "stack",
955
+ "quadropod",
956
+ "photo",
957
+ "photographer",
958
+ "tripod",
959
+ "spike",
960
+ "lug",
961
+ "mud",
962
+ "bear",
963
+ "digging",
964
+ "dig",
965
+ "scratch",
966
+ "garage",
967
+ "enter",
968
+ "shopping",
969
+ "shop",
970
+ "browse",
971
+ "toad",
972
+ "puddle",
973
+ "town",
974
+ "neighborhood",
975
+ "desert",
976
+ "steer",
977
+ "float",
978
+ "floater",
979
+ "raft",
980
+ "parrot",
981
+ "tabletop",
982
+ "beak",
983
+ "mug",
984
+ "discussion",
985
+ "discus",
986
+ "summersault",
987
+ "axe",
988
+ "bun",
989
+ "hamburger",
990
+ "sweeper",
991
+ "vacuum",
992
+ "chicken",
993
+ "shore",
994
+ "step",
995
+ "dancing",
996
+ "elephant",
997
+ "stick",
998
+ "twig",
999
+ "stem",
1000
+ "bamboo",
1001
+ "rest",
1002
+ "dvd",
1003
+ "disc",
1004
+ "disk",
1005
+ "wipe",
1006
+ "dab",
1007
+ "fix",
1008
+ "synchronization",
1009
+ "bedroom",
1010
+ "noise",
1011
+ "frog",
1012
+ "catch",
1013
+ "handle",
1014
+ "armles",
1015
+ "puppet",
1016
+ "string",
1017
+ "marionette",
1018
+ "seat",
1019
+ "leap",
1020
+ "bounce",
1021
+ "zebra",
1022
+ "nudge",
1023
+ "stroke",
1024
+ "bathroom",
1025
+ "nicholson",
1026
+ "attendant",
1027
+ "jacket",
1028
+ "park",
1029
+ "coaster",
1030
+ "jet",
1031
+ "plane",
1032
+ "runway",
1033
+ "land",
1034
+ "slicer",
1035
+ "mandolin",
1036
+ "ionion",
1037
+ "cowboy",
1038
+ "vampire",
1039
+ "monster",
1040
+ "intruder",
1041
+ "poeple",
1042
+ "submarine",
1043
+ "ship",
1044
+ "missile",
1045
+ "shuttle",
1046
+ "space",
1047
+ "bomb",
1048
+ "glide",
1049
+ "beer",
1050
+ "midget",
1051
+ "somebody",
1052
+ "goblet",
1053
+ "guiter",
1054
+ "pole",
1055
+ "fishing",
1056
+ "shave",
1057
+ "mirror",
1058
+ "image",
1059
+ "reflection",
1060
+ "shark",
1061
+ "dolphin",
1062
+ "fisherman",
1063
+ "bait",
1064
+ "steal",
1065
+ "measure",
1066
+ "surprise",
1067
+ "jut",
1068
+ "defecate",
1069
+ "skateboarder",
1070
+ "ramp",
1071
+ "tunnel",
1072
+ "mower",
1073
+ "mover",
1074
+ "mow",
1075
+ "lawnmower",
1076
+ "booty",
1077
+ "lucy",
1078
+ "animator",
1079
+ "butterfly",
1080
+ "switch",
1081
+ "twist",
1082
+ "treadmill",
1083
+ "twisting",
1084
+ "attempt",
1085
+ "halloween",
1086
+ "jaw",
1087
+ "skull",
1088
+ "mimic",
1089
+ "provide",
1090
+ "gravel",
1091
+ "floyd",
1092
+ "gilmmy",
1093
+ "ban",
1094
+ "tiller",
1095
+ "soil",
1096
+ "auger",
1097
+ "till",
1098
+ "bot",
1099
+ "powerboat",
1100
+ "yacht",
1101
+ "sea",
1102
+ "traverse",
1103
+ "bull",
1104
+ "peach",
1105
+ "avoid",
1106
+ "halve",
1107
+ "combine",
1108
+ "wooden",
1109
+ "concrete",
1110
+ "cement",
1111
+ "brick",
1112
+ "stomach",
1113
+ "bust",
1114
+ "boxing",
1115
+ "yoga",
1116
+ "meditate",
1117
+ "pray",
1118
+ "clay",
1119
+ "piggyback",
1120
+ "platform",
1121
+ "body",
1122
+ "weigt",
1123
+ "weightlift",
1124
+ "stenographer",
1125
+ "stenograph",
1126
+ "stenography",
1127
+ "type",
1128
+ "cleaver",
1129
+ "capuchin",
1130
+ "itch",
1131
+ "way",
1132
+ "moose",
1133
+ "sprinkler",
1134
+ "wet",
1135
+ "fore",
1136
+ "moonwalk",
1137
+ "hiking",
1138
+ "reaper",
1139
+ "skeleton",
1140
+ "hike",
1141
+ "welsh",
1142
+ "scuffle",
1143
+ "frolic",
1144
+ "cab",
1145
+ "taxi",
1146
+ "argue",
1147
+ "front",
1148
+ "jumper",
1149
+ "trampoline",
1150
+ "pounce",
1151
+ "cell",
1152
+ "prisoner",
1153
+ "middle",
1154
+ "prison",
1155
+ "jail",
1156
+ "figure",
1157
+ "intimidate",
1158
+ "belly",
1159
+ "bridge",
1160
+ "hanging",
1161
+ "swinging",
1162
+ "hedgehog",
1163
+ "porcupine",
1164
+ "spinner",
1165
+ "bagel",
1166
+ "recite",
1167
+ "slap",
1168
+ "letter",
1169
+ "range",
1170
+ "spray",
1171
+ "retain",
1172
+ "pilot",
1173
+ "handshake",
1174
+ "offer",
1175
+ "hose",
1176
+ "friend",
1177
+ "instructor",
1178
+ "arrange",
1179
+ "oxiclean",
1180
+ "detergent",
1181
+ "cleaner",
1182
+ "fill",
1183
+ "tea",
1184
+ "basket",
1185
+ "suck",
1186
+ "sip",
1187
+ "suckle",
1188
+ "carnival",
1189
+ "coupon",
1190
+ "ticket",
1191
+ "trunk",
1192
+ "log",
1193
+ "golf",
1194
+ "golfing",
1195
+ "bathtub",
1196
+ "tub",
1197
+ "batting",
1198
+ "knock",
1199
+ "stretcher",
1200
+ "stairmaster",
1201
+ "operate"
1202
+ ]
ChatUniVi/eval/questions/video_qa/msvd_qa.json ADDED
The diff for this file is too large to render. See raw diff