Exemple #1
0
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()
Exemple #2
0
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")
Exemple #3
0
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")
Exemple #4
0
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")
Exemple #5
0
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")
Exemple #6
0
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")
Exemple #7
0
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")
Exemple #8
0
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")
Exemple #9
0
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")
Exemple #10
0
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")
Exemple #11
0
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}")
Exemple #12
0
    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
Exemple #13
0
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")
Exemple #14
0
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")