forked from davisvideochallenge/davis2017-evaluation
-
Notifications
You must be signed in to change notification settings - Fork 0
/
evaluation_codalab.py
93 lines (80 loc) · 4.03 KB
/
evaluation_codalab.py
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
90
91
92
93
#!/usr/bin/env python
import sys
import os.path
from time import time
import numpy as np
import pandas
from davis2017.evaluation import DAVISEvaluation
task = 'semi-supervised'
gt_set = 'test-dev'
time_start = time()
# as per the metadata file, input and output directories are the arguments
if len(sys.argv) < 3:
input_dir = "input_dir"
output_dir = "output_dir"
debug = True
else:
[_, input_dir, output_dir] = sys.argv
debug = False
# unzipped submission data is always in the 'res' subdirectory
# https://github.com/codalab/codalab-competitions/wiki/User_Building-a-Scoring-Program-for-a-Competition#directory-structure-for-submissions
submission_path = os.path.join(input_dir, 'res')
if not os.path.exists(submission_path):
sys.exit('Could not find submission file {0}'.format(submission_path))
# unzipped reference data is always in the 'ref' subdirectory
# https://github.com/codalab/codalab-competitions/wiki/User_Building-a-Scoring-Program-for-a-Competition#directory-structure-for-submissions
gt_path = os.path.join(input_dir, 'ref')
if not os.path.exists(gt_path):
sys.exit('Could not find GT file {0}'.format(gt_path))
# Create dataset
dataset_eval = DAVISEvaluation(davis_root=gt_path, gt_set=gt_set, task=task, codalab=True)
# Check directory structure
res_subfolders = os.listdir(submission_path)
if len(res_subfolders) == 1:
sys.stdout.write(
"Incorrect folder structure, the folders of the sequences have to be placed directly inside the "
"zip.\nInside every folder of the sequences there must be an indexed PNG file for every frame.\n"
"The indexes have to match with the initial frame.\n")
sys.exit()
# Check that all sequences are there
missing = False
for seq in dataset_eval.dataset.get_sequences():
if seq not in res_subfolders:
sys.stdout.write(seq + " sequence is missing.\n")
missing = True
if missing:
sys.stdout.write(
"Verify also the folder structure, the folders of the sequences have to be placed directly inside "
"the zip.\nInside every folder of the sequences there must be an indexed PNG file for every frame.\n"
"The indexes have to match with the initial frame.\n")
sys.exit()
metrics_res = dataset_eval.evaluate(submission_path, debug=debug)
J, F = metrics_res['J'], metrics_res['F']
# Generate output to the stdout
seq_names = list(J['M_per_object'].keys())
if gt_set == "val" or gt_set == "train" or gt_set == "test-dev":
sys.stdout.write("----------------Global results in CSV---------------\n")
g_measures = ['J&F-Mean', 'J-Mean', 'J-Recall', 'J-Decay', 'F-Mean', 'F-Recall', 'F-Decay']
final_mean = (np.mean(J["M"]) + np.mean(F["M"])) / 2.
g_res = np.array([final_mean, np.mean(J["M"]), np.mean(J["R"]), np.mean(J["D"]), np.mean(F["M"]), np.mean(F["R"]),
np.mean(F["D"])])
table_g = pandas.DataFrame(data=np.reshape(g_res, [1, len(g_res)]), columns=g_measures)
table_g.to_csv(sys.stdout, index=False, float_format="%0.3f")
sys.stdout.write("\n\n------------Per sequence results in CSV-------------\n")
seq_measures = ['Sequence', 'J-Mean', 'F-Mean']
J_per_object = [J['M_per_object'][x] for x in seq_names]
F_per_object = [F['M_per_object'][x] for x in seq_names]
table_seq = pandas.DataFrame(data=list(zip(seq_names, J_per_object, F_per_object)), columns=seq_measures)
table_seq.to_csv(sys.stdout, index=False, float_format="%0.3f")
# Write scores to a file named "scores.txt"
with open(os.path.join(output_dir, 'scores.txt'), 'w') as output_file:
final_mean = (np.mean(J["M"]) + np.mean(F["M"])) / 2.
output_file.write("GlobalMean: %f\n" % final_mean)
output_file.write("JMean: %f\n" % np.mean(J["M"]))
output_file.write("JRecall: %f\n" % np.mean(J["R"]))
output_file.write("JDecay: %f\n" % np.mean(J["D"]))
output_file.write("FMean: %f\n" % np.mean(F["M"]))
output_file.write("FRecall: %f\n" % np.mean(F["R"]))
output_file.write("FDecay: %f\n" % np.mean(F["D"]))
total_time = time() - time_start
sys.stdout.write('\nTotal time:' + str(total_time))