deep-person-reid/tools/parse_test_res.py

102 lines
2.8 KiB
Python

"""
This script aims to automate the process of calculating average results
stored in the test.log files over multiple splits.
How to use:
For example, you have done evaluation over 20 splits on VIPeR, leading to
the following file structure
log/
eval_viper/
split_0/
test.log-xxxx
split_1/
test.log-xxxx
split_2/
test.log-xxxx
...
You can run the following command in your terminal to get the average performance:
$ python tools/parse_test_res.py log/eval_viper
"""
import os
import re
import glob
import numpy as np
import argparse
from collections import defaultdict
from torchreid.utils import check_isfile, listdir_nohidden
def parse_file(filepath, regex_mAP, regex_r1, regex_r5, regex_r10, regex_r20):
results = {}
with open(filepath, 'r') as f:
lines = f.readlines()
for line in lines:
line = line.strip()
match_mAP = regex_mAP.search(line)
if match_mAP:
mAP = float(match_mAP.group(1))
results['mAP'] = mAP
match_r1 = regex_r1.search(line)
if match_r1:
r1 = float(match_r1.group(1))
results['r1'] = r1
match_r5 = regex_r5.search(line)
if match_r5:
r5 = float(match_r5.group(1))
results['r5'] = r5
match_r10 = regex_r10.search(line)
if match_r10:
r10 = float(match_r10.group(1))
results['r10'] = r10
match_r20 = regex_r20.search(line)
if match_r20:
r20 = float(match_r20.group(1))
results['r20'] = r20
return results
def main(args):
regex_mAP = re.compile(r'mAP: ([\.\deE+-]+)%')
regex_r1 = re.compile(r'Rank-1 : ([\.\deE+-]+)%')
regex_r5 = re.compile(r'Rank-5 : ([\.\deE+-]+)%')
regex_r10 = re.compile(r'Rank-10 : ([\.\deE+-]+)%')
regex_r20 = re.compile(r'Rank-20 : ([\.\deE+-]+)%')
final_res = defaultdict(list)
directories = listdir_nohidden(args.directory, sort=True)
num_dirs = len(directories)
for directory in directories:
fullpath = os.path.join(args.directory, directory)
filepath = glob.glob(os.path.join(fullpath, 'test.log*'))[0]
check_isfile(filepath)
res = parse_file(
filepath, regex_mAP, regex_r1, regex_r5, regex_r10, regex_r20
)
for key, value in res.items():
final_res[key].append(value)
print(f'* Average results over {num_dirs} splits')
for key, values in final_res.items():
mean_val = np.mean(values)
print(f'{key}: {mean_val:.1f}')
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('directory', type=str, help='Path to directory')
args = parser.parse_args()
main(args)