Spaces:
Paused
Paused
| # Copyright (c) Meta Platforms, Inc. and affiliates. | |
| # All rights reserved. | |
| # This source code is licensed under the license found in the | |
| # LICENSE file in the root directory of this source tree. | |
| import numpy as np | |
| def compute_map(submission_array, gt_array): | |
| """ Returns mAP, weighted mAP, and AP array """ | |
| m_aps = [] | |
| n_classes = submission_array.shape[1] | |
| for oc_i in range(n_classes): | |
| sorted_idxs = np.argsort(-submission_array[:, oc_i]) | |
| tp = gt_array[:, oc_i][sorted_idxs] == 1 | |
| fp = np.invert(tp) | |
| n_pos = tp.sum() | |
| if n_pos < 0.1: | |
| m_aps.append(float('nan')) | |
| continue | |
| fp.sum() | |
| f_pcs = np.cumsum(fp) | |
| t_pcs = np.cumsum(tp) | |
| prec = t_pcs / (f_pcs+t_pcs).astype(float) | |
| avg_prec = 0 | |
| for i in range(submission_array.shape[0]): | |
| if tp[i]: | |
| avg_prec += prec[i] | |
| m_aps.append(avg_prec / n_pos.astype(float)) | |
| m_aps = np.array(m_aps) | |
| #m_ap = np.mean(m_aps) | |
| m_ap = m_aps[~np.isnan(m_aps)] | |
| print(f'num of available classes: {len(m_ap)}') | |
| m_ap = m_ap.mean() # compute mean w/o nan | |
| w_ap = (m_aps * gt_array.sum(axis=0) / gt_array.sum().sum().astype(float)) | |
| return m_ap, w_ap, m_aps | |
| def charades_map(submission_array, gt_array): | |
| """ | |
| Approximate version of the charades evaluation function | |
| For precise numbers, use the submission file with the official matlab script | |
| """ | |
| fix = submission_array.copy() | |
| empty = np.sum(gt_array, axis=1) == 0 | |
| fix[empty, :] = np.NINF | |
| return compute_map(fix, gt_array) | |
| def create_submission(video_list, predictions, out_file): | |
| assert len(video_list) == predictions.shape[0] | |
| with open(out_file, 'w') as f: | |
| for i, video_id in enumerate(video_list): | |
| pred_str = ' '.join(map(lambda x: str(x), predictions[i].tolist())) | |
| f.write('{} {}\n\n'.format(video_id, pred_str)) | |