|
import os
|
|
import json
|
|
import argparse
|
|
|
|
def eval_pope(answers, label_file):
|
|
label_list = [json.loads(q)['label'] for q in open(label_file, 'r')]
|
|
|
|
for answer in answers:
|
|
text = answer['text']
|
|
|
|
|
|
if text.find('.') != -1:
|
|
text = text.split('.')[0]
|
|
|
|
text = text.replace(',', '')
|
|
words = text.split(' ')
|
|
if 'No' in words or 'not' in words or 'no' in words:
|
|
answer['text'] = 'no'
|
|
else:
|
|
answer['text'] = 'yes'
|
|
|
|
for i in range(len(label_list)):
|
|
if label_list[i] == 'no':
|
|
label_list[i] = 0
|
|
else:
|
|
label_list[i] = 1
|
|
|
|
pred_list = []
|
|
for answer in answers:
|
|
if answer['text'] == 'no':
|
|
pred_list.append(0)
|
|
else:
|
|
pred_list.append(1)
|
|
|
|
pos = 1
|
|
neg = 0
|
|
yes_ratio = pred_list.count(1) / len(pred_list)
|
|
|
|
TP, TN, FP, FN = 0, 0, 0, 0
|
|
for pred, label in zip(pred_list, label_list):
|
|
if pred == pos and label == pos:
|
|
TP += 1
|
|
elif pred == pos and label == neg:
|
|
FP += 1
|
|
elif pred == neg and label == neg:
|
|
TN += 1
|
|
elif pred == neg and label == pos:
|
|
FN += 1
|
|
|
|
print('TP\tFP\tTN\tFN\t')
|
|
print('{}\t{}\t{}\t{}'.format(TP, FP, TN, FN))
|
|
|
|
precision = float(TP) / float(TP + FP)
|
|
recall = float(TP) / float(TP + FN)
|
|
f1 = 2*precision*recall / (precision + recall)
|
|
acc = (TP + TN) / (TP + TN + FP + FN)
|
|
print('Accuracy: {}'.format(acc))
|
|
print('Precision: {}'.format(precision))
|
|
print('Recall: {}'.format(recall))
|
|
print('F1 score: {}'.format(f1))
|
|
print('Yes ratio: {}'.format(yes_ratio))
|
|
print('%.3f, %.3f, %.3f, %.3f, %.3f' % (f1, acc, precision, recall, yes_ratio) )
|
|
|
|
if __name__ == "__main__":
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument("--annotation-dir", type=str)
|
|
parser.add_argument("--question-file", type=str)
|
|
parser.add_argument("--result-file", type=str)
|
|
args = parser.parse_args()
|
|
|
|
questions = [json.loads(line) for line in open(args.question_file)]
|
|
questions = {question['question_id']: question for question in questions}
|
|
answers = [json.loads(q) for q in open(args.result_file)]
|
|
for file in os.listdir(args.annotation_dir):
|
|
assert file.startswith('coco_pope_')
|
|
assert file.endswith('.json')
|
|
category = file[10:-5]
|
|
cur_answers = [x for x in answers if questions[x['question_id']]['category'] == category]
|
|
print('Category: {}, # samples: {}'.format(category, len(cur_answers)))
|
|
eval_pope(cur_answers, os.path.join(args.annotation_dir, file))
|
|
print("====================================")
|
|
|