File size: 2,971 Bytes
8874c09 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
import json
import os
import fire
import re
from convert_sqa_to_llava_base_prompt import build_prompt_chatbot
def convert_to_llava(base_dir, split, prompt_format="QCM-LEA"):
split_indices = json.load(open(os.path.join(base_dir, "pid_splits.json")))[split]
problems = json.load(open(os.path.join(base_dir, "problems.json")))
split_problems = build_prompt_chatbot(
problems, split_indices, prompt_format,
use_caption=False, is_test=False)
target_format = []
for prob_id, (input, output) in split_problems.items():
if input.startswith('Question: '):
input = input.replace('Question: ', '')
if output.startswith('Answer: '):
output = output.replace('Answer: ', '')
raw_prob_data = problems[prob_id]
if raw_prob_data['image'] is None:
target_format.append({
"id": prob_id,
"conversations": [
{'from': 'human', 'value': f"{input}"},
{'from': 'gpt', 'value': f"{output}"},
],
})
else:
target_format.append({
"id": prob_id,
"image": os.path.join(prob_id, raw_prob_data['image']),
"conversations": [
{'from': 'human', 'value': f"{input}\n<image>"},
{'from': 'gpt', 'value': f"{output}"},
],
})
print(f'Number of samples: {len(target_format)}')
with open(os.path.join(base_dir, f"llava_{split}_{prompt_format}.json"), "w") as f:
json.dump(target_format, f, indent=2)
def convert_to_jsonl(base_dir, split, prompt_format="QCM-LEPA"):
split_indices = json.load(open(os.path.join(base_dir, "pid_splits.json")))[split]
problems = json.load(open(os.path.join(base_dir, "problems.json")))
split_problems = build_prompt_chatbot(
problems, split_indices, prompt_format,
use_caption=False, is_test=False)
writer = open(os.path.join(base_dir, f"scienceqa_{split}_{prompt_format}.jsonl"), "w")
for prob_id, (input, output) in split_problems.items():
if input.startswith('Question: '):
input = input.replace('Question: ', '')
if output.startswith('Answer: '):
output = output.replace('Answer: ', '')
raw_prob_data = problems[prob_id]
if raw_prob_data['image'] is None:
data = {
"id": prob_id,
"instruction": f"{input}",
"output": f"{output}",
}
else:
data = {
"id": prob_id,
"image": os.path.join(prob_id, raw_prob_data['image']),
"instruction": f"{input}\n<image>",
"output": f"{output}",
}
writer.write(json.dumps(data) + '\n')
writer.close()
def main(task, **kwargs):
globals()[task](**kwargs)
if __name__ == "__main__":
fire.Fire(main)
|