def analyse_questions(video_dicts): counts = {} for video in video_dicts: question_types = video["question_types"] for question in question_types: increment_in_map_(counts, question) num_questions = sum([cnt for _, cnt in counts.items()]) counts = counts.items() counts = sorted(counts, key=lambda pair: pair[0]) print(f"{'Question Type' :<20}{'Occurrences' :<15}Frequency") for question_type, count in counts: print( f"{question_type:<20}{count:<15}{(count / num_questions) * 100:.3}%" ) print(f"Total number of questions: {num_questions}") q_types = [q_cnt[0] + 1 for q_cnt in counts] cnts = [q_cnt[1] for q_cnt in counts] fontsize = 18 plt.figure(figsize=(12, 6)) plt.bar(q_types, cnts) plt.xlabel("Question Type", fontsize=fontsize) plt.ylabel("Number of questions", fontsize=fontsize) plt.xticks(q_types, fontsize=fontsize) plt.yticks([0, 400, 800, 1200, 1600], fontsize=fontsize) plt.show()
def _analyse_q_6(qa_pairs): print("\nAnalysing state transition QA pairs...") action_cnt = {} for question, answer in qa_pairs: increment_in_map_(action_cnt, answer) _print_cnt_dict(action_cnt, "Action")
def _analyse_q_5(qa_pairs): print("\nAnalysing repeating action QA pairs...") event_cnt = {} for question, answer in qa_pairs: increment_in_map_(event_cnt, answer) _print_cnt_dict(event_cnt, "Event")
def _analyse_q_4(qa_pairs): print("\nAnalysing repetition count QA pairs...") event_cnt = {} for question, answer in qa_pairs: event = question.split(" ")[-1][:-1] increment_in_map_(event_cnt, event) _print_cnt_dict(event_cnt, "Event")
def _analyse_q_3(qa_pairs): print("\nAnalysing prop changed QA pairs...") prop_cnt = {} for question, answer in qa_pairs: prop = answer.split(" ")[1] increment_in_map_(prop_cnt, prop) _print_cnt_dict(prop_cnt, "Property")
def _analyse_q_8(qa_pairs): print("\nAnalysing counterfactual QA pairs...") rock_colours = {} answers = {} for question, answer in qa_pairs: splits = question.split(" ") rock_colour = splits[-2] increment_in_map_(rock_colours, rock_colour) increment_in_map_(answers, answer) _print_cnt_dict(rock_colours, "Rock colour") _print_cnt_dict(answers, "Answer")
def _analyse_q_7(qa_pairs): print("\nAnalysing explanation QA pairs...") rot_cnt = {} ans_cnt = {} for question, answer in qa_pairs: splits = question.split(" ") rotation = splits[3] increment_in_map_(rot_cnt, rotation) increment_in_map_(ans_cnt, answer) _print_cnt_dict(rot_cnt, "Rotation") _print_cnt_dict(ans_cnt, "Answer")
def _analyse_q_0(qa_pairs): print("\nAnalysing property QA pairs...") prop_cnt = {} prop_val_cnt = {"colour": {}, "rotation": {}} for question, answer in qa_pairs: prop = question.split(" ")[1] prop_val = answer increment_in_map_(prop_cnt, prop) increment_in_map_(prop_val_cnt[prop], prop_val) _print_cnt_dict(prop_cnt, "Property") _print_cnt_dict(prop_val_cnt["colour"], "Colour Value") _print_cnt_dict(prop_val_cnt["rotation"], "Rotation Value")
def count_rotations(video_dicts): rotations = {} num_frames = 0 for video in video_dicts: frames = video["frames"] for frame in frames: num_frames += 1 objects = frame["objects"] for obj in objects: if obj["class"] == "octopus": increment_in_map_(rotations, obj["rotation"]) print(f"{'Octopus rotations' :<20}{'Occurrences' :<15}Frequency") for rotation, num in rotations.items(): print(f"{rotation:<20}{num:<15}{(num / num_frames) * 100:.3g}%") print(f"\nTotal number of frames: {num_frames}\n")
def count_events(video_dicts): event_list = [] num_frame_changes = 0 for video in video_dicts: events = video["events"] num_frame_changes += len(events) flat_events = [event for subevents in events for event in subevents] events = [extract_event(event) for event in flat_events] event_list.extend(events) event_dict = {} for event in event_list: increment_in_map_(event_dict, event) print(f"{'Event name' :<20}{'Occurrences' :<15}Frequency") for event, num in event_dict.items(): print(f"{event:<20}{num:<15}{(num / num_frame_changes) * 100:.3g}%") print(f"\nTotal number of frame changes: {num_frame_changes}\n")
def count_fish_eaten(video_dicts): fish_eaten = {} num_videos = 0 for video in video_dicts: events = video["events"] num_videos += 1 num_fish_eaten = 0 for event_list in events: if "eat fish" in event_list: num_fish_eaten += 1 increment_in_map_(fish_eaten, num_fish_eaten) fish_eaten = fish_eaten.items() fish_eaten = sorted(fish_eaten, key=lambda eaten: eaten[0]) print(f"{'Fish eaten' :<15}{'Occurrences' :<15}Frequency") for num_eaten, cnt in fish_eaten: print(f"{num_eaten:<15}{cnt:<15}{(cnt / num_videos) * 100:.3g}%") print(f"Total number of videos: {num_videos}")
def _gen_repeating_action_question(self): """ Generate a question asking about which event occurs a given number of times Q: What does the <object> do <n> times? A: <event> Note: The object will always be the octopus :return: (question: str, answer: str) """ event_counts = self._count_events() if event_counts.get(NO_EVENT) is not None: del event_counts[NO_EVENT] events = list(event_counts.keys()) random.shuffle(events) # Track the number of times each count occurs counts = {} for _, count in event_counts.items(): util.increment_in_map_(counts, count) question_count = None question_event = None for event in events: count = event_counts[event] num_counts = counts[count] if count != 0 and num_counts == 1: question_count = count question_event = event if question_count is None: return None question = f"What does the octopus do {question_count} times?" answer = question_event return question, answer
def count_colours(video_dicts): rock_colours = {} octo_colours = {} num_frames = 0 for video in video_dicts: frames = video["frames"] for frame in frames: num_frames += 1 objects = frame["objects"] for obj in objects: if obj["class"] == "rock": increment_in_map_(rock_colours, obj["colour"]) elif obj["class"] == "octopus": increment_in_map_(octo_colours, obj["colour"]) print(f"{'Rock colour' :<20}{'Occurrences' :<15}Frequency") for colour, num in rock_colours.items(): print(f"{colour:<20}{num:<15}{(num / num_frames) * 100:.3g}%") print(f"\n{'Octopus colour' :<20}{'Occurrences' :<15}Frequency") for colour, num in octo_colours.items(): print(f"{colour:<20}{num:<15}{(num / num_frames) * 100:.3g}%") print(f"\nTotal number of frames: {num_frames}\n")
def _analyse_q_1(qa_pairs): print("\nAnalysing relation QA pairs...") rel_cnt = {} ans_cnt = {} for question, answer in qa_pairs: words = question.split(" ") if words[3] in ["close", "above", "below"]: increment_in_map_(rel_cnt, words[3]) else: increment_in_map_(rel_cnt, words[4]) increment_in_map_(ans_cnt, answer) _print_cnt_dict(ans_cnt, "Answer") _print_cnt_dict(rel_cnt, "Relation")