| import os, sys | |
| import pandas as pd | |
| print("current directory:") | |
| print(os.curdir) | |
| print(os.getcwd()) | |
| TOP_COMMENTARIES_DIR = os.path.join( | |
| os.getcwd(), | |
| "prompting", | |
| "top_commentaries" | |
| ) | |
| ARTEMIS_EMOTIONS = [ | |
| "amusement", | |
| "anger", | |
| "awe", | |
| "contentment", | |
| "disgust", | |
| "excitement", | |
| "fear", | |
| "sadness", | |
| "something else", | |
| ] | |
| DEFAULT_N_SAMPLES = 4 | |
| DEFAULT_RANDOM_STATE = 42 | |
| DEFAULT_OBJECT_THRESHOLD = 0.1 | |
| def fill_extracted_items( | |
| colors_list = None, | |
| objects_list = None, | |
| emotion = None, | |
| commentary = None, | |
| ): | |
| result = "" | |
| if colors_list: | |
| result += f"colors: {', '.join(colors_list)}" | |
| result += "\n" | |
| if objects_list: | |
| result += f"objects: {', '.join(objects_list)}" | |
| result += "\n" | |
| if emotion: | |
| result += f"emotion: {emotion}" | |
| result += "\n" | |
| if commentary: | |
| result += f"commentary: {commentary}" | |
| result += "\n" | |
| else: | |
| result += "commentary: " | |
| return result | |
| def load_dataframe( | |
| csv_filepath, | |
| ): | |
| df = pd.read_csv(csv_filepath, index_col = 0) | |
| for stringified_col in [ | |
| "maskrcnn_objects", | |
| "colors", | |
| "clip_recognized_objects", | |
| ]: | |
| df[stringified_col] = df[stringified_col].apply(eval) | |
| return df | |
| TOP_COMMENTARIES_DFS = { | |
| emotion : load_dataframe(os.path.join(TOP_COMMENTARIES_DIR, f"top_{emotion.replace(' ', '_')}.csv")) | |
| for emotion in ARTEMIS_EMOTIONS | |
| } | |
| def filter_items( | |
| items_and_probs_list, | |
| items_threshold = DEFAULT_OBJECT_THRESHOLD | |
| ): | |
| return [item for item, prob in items_and_probs_list if prob > items_threshold] | |
| def get_random_samples_for_emotion( | |
| emotion, | |
| n_samples = DEFAULT_N_SAMPLES, | |
| random_state = DEFAULT_RANDOM_STATE, | |
| object_threshold = DEFAULT_OBJECT_THRESHOLD | |
| ): | |
| emotion_df = TOP_COMMENTARIES_DFS[emotion] | |
| samples = emotion_df.sample(n_samples, random_state = random_state) | |
| result = [] | |
| for _, sample in samples.iterrows(): | |
| colors_list = sample["colors"] | |
| commentary = sample["utterance"] | |
| emotion = sample["emotion"] | |
| objects_and_probs_list = sample["clip_recognized_objects"] | |
| objects_list = filter_items(objects_and_probs_list, object_threshold) | |
| entry = { | |
| "colors_list" : colors_list, | |
| "objects_list" : objects_list, | |
| "emotion" : emotion, | |
| "commentary" : commentary, | |
| } | |
| result.append(entry) | |
| return result | |
| def get_subprompt_for_emotion( | |
| emotion, | |
| n_samples = DEFAULT_N_SAMPLES, | |
| random_state = DEFAULT_RANDOM_STATE, | |
| object_threshold = DEFAULT_OBJECT_THRESHOLD, | |
| ): | |
| random_samples = get_random_samples_for_emotion( | |
| emotion = emotion, | |
| n_samples = n_samples, | |
| random_state = random_state, | |
| object_threshold=object_threshold, | |
| ) | |
| subprompt = [ | |
| fill_extracted_items(**entry) for entry in random_samples | |
| ] | |
| subprompt = "\n".join(subprompt) | |
| return subprompt | |
| def get_subprompt_with_examples( | |
| n_samples_per_emotion = DEFAULT_N_SAMPLES, | |
| random_state = DEFAULT_RANDOM_STATE, | |
| object_threshold = DEFAULT_OBJECT_THRESHOLD, | |
| ): | |
| examples = [ | |
| get_subprompt_for_emotion( | |
| emotion=emotion, | |
| n_samples = n_samples_per_emotion, | |
| random_state = random_state, | |
| object_threshold = object_threshold | |
| ) | |
| for emotion in ARTEMIS_EMOTIONS | |
| ] | |
| examples = "\n".join(examples) | |
| return examples | |
| def get_user_prompt( | |
| colors_list, | |
| objects_list, | |
| emotion, | |
| n_samples_per_emotion = DEFAULT_N_SAMPLES, | |
| random_state = DEFAULT_RANDOM_STATE, | |
| object_threshold = DEFAULT_OBJECT_THRESHOLD, | |
| ): | |
| user_prompt= ( | |
| "You have to write a commentary for an artwork.\n" | |
| "To write the commentary, you are given the objects present in the picture, " | |
| "the colors present in the picture, and the emotion the picture evokes.\n" | |
| "You are first shown several examples, and then have to give your commentary.\n" | |
| "First come the examples, and then the objects, colors, and emotion you will have to use for your commentary.\n" | |
| "Avoid explicitly mentioning the objects, or colors, or emotion, if it sounds more natural.\n" | |
| "Only write the commentary.\n" | |
| "\n" | |
| "EXAMPLES:" | |
| "\n\n" | |
| "{examples}" | |
| "\n" | |
| "Now, write your personal opinion about the picture." | |
| "\n" | |
| "{image_subprompt}" | |
| ) | |
| examples = get_subprompt_with_examples( | |
| n_samples_per_emotion = n_samples_per_emotion, | |
| random_state = random_state, | |
| object_threshold=object_threshold, | |
| ) | |
| image_subprompt = fill_extracted_items( | |
| colors_list = colors_list, | |
| objects_list = objects_list, | |
| emotion = emotion, | |
| commentary = None, | |
| ) | |
| result = user_prompt.format(examples = examples, image_subprompt = image_subprompt) | |
| return result |