-
Notifications
You must be signed in to change notification settings - Fork 25
Expand file tree
/
Copy pathmask_metric.py
More file actions
122 lines (107 loc) · 3.53 KB
/
mask_metric.py
File metadata and controls
122 lines (107 loc) · 3.53 KB
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#!/usr/bin/env python
import os
import sys
from time import time
import argparse
import numpy as np
import pandas as pd
from davis2017.evaluation import MaskEvaluation
# code from das3r
seq_list_2016 = [
'blackswan',
'bmx-trees',
'breakdance',
'camel',
'car-roundabout',
'car-shadow',
'cows',
'dance-twirl',
'dog',
'drift-chicane',
'drift-straight',
'goat',
'horsejump-high',
'kite-surf',
'libby',
'motocross-jump',
'paragliding-launch',
'parkour',
'scooter-black',
'soapbox'
]
seq_list_2017 = [
'bike-packing',
'blackswan',
'bmx-trees',
'breakdance',
'camel',
'car-roundabout',
'car-shadow',
'cows',
'dance-twirl',
'dog',
'dogs-jump',
'drift-chicane',
'drift-straight',
'goat',
'gold-fish',
'horsejump-high',
'india',
'judo',
'kite-surf',
'lab-coat',
'libby',
'loading',
'mbike-trick',
'motocross-jump',
'paragliding-launch',
'parkour',
'pigs',
'scooter-black',
'shooting',
'soapbox'
]
seq_list = None # seq_list_2016, seq_list_2017, None for all
time_start = time()
parser = argparse.ArgumentParser()
parser.add_argument('--label_path', type=str, help='Subset to evaluate the results', default='data/davis/DAVIS/Annotations/480p')
parser.add_argument('--results_path', type=str, help='Subset to evaluate the results', default='all')
args, _ = parser.parse_known_args()
csv_name_global = f'global_results.csv'
csv_name_per_sequence = f'per-sequence_results.csv'
# Check if the method has been evaluated before, if so read the results, otherwise compute the results
csv_name_global_path = os.path.join(args.results_path, csv_name_global)
csv_name_per_sequence_path = os.path.join(args.results_path, csv_name_per_sequence)
print(f'Evaluating sequences...')
# Create dataset and evaluate
if seq_list is None:
seq_list = os.listdir(args.label_path)
dataset_eval = MaskEvaluation(root=args.label_path, sequences=seq_list)
metrics_res = dataset_eval.evaluate(args.results_path)
J, F = metrics_res['J'], metrics_res['F']
# Generate dataframe for the general results
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"])])
g_res = np.reshape(g_res, [1, len(g_res)])
table_g = pd.DataFrame(data=g_res, columns=g_measures)
with open(csv_name_global_path, 'w') as f:
table_g.to_csv(f, index=False, float_format="%.3f")
print(f'Global results saved in {csv_name_global_path}')
# Generate a dataframe for the per sequence results
seq_names = list(J['M_per_object'].keys())
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 = pd.DataFrame(data=list(zip(seq_names, J_per_object, F_per_object)), columns=seq_measures)
with open(csv_name_per_sequence_path, 'w') as f:
table_seq.to_csv(f, index=False, float_format="%.3f")
print(f'Per-sequence results saved in {csv_name_per_sequence_path}')
# Print the results
sys.stdout.write(f"--------------------------- Global results ---------------------------\n")
print(table_g.to_string(index=False))
# sys.stdout.write(f"\n---------- Per sequence results ----------\n")
# print(table_seq.to_string(index=False))
total_time = time() - time_start
sys.stdout.write('\nTotal time:' + str(total_time))