def _report_metric(self, res_file, metrics, pck_thr=0.2, auc_nor=30): """Keypoint evaluation. Args: res_file (str): Json file stored prediction results. metrics (str | list[str]): Metric to be performed. Options: 'PCK', 'PCKh', 'AUC', 'EPE'. pck_thr (float): PCK threshold, default as 0.2. pckh_thr (float): PCKh threshold, default as 0.7. auc_nor (float): AUC normalization factor, default as 30 pixel. Returns: List: Evaluation results for evaluation metric. """ info_str = [] with open(res_file, 'r') as fin: preds = json.load(fin) assert len(preds) == len(self.db) outputs = [] gts = [] masks = [] threshold_bbox = [] for pred, item in zip(preds, self.db): outputs.append(np.array(pred['keypoints'])[:, :-1]) gts.append(np.array(item['joints_3d'])[:, :-1]) masks.append((np.array(item['joints_3d_visible'])[:, 0]) > 0) if 'PCK' in metrics: bbox = np.array(item['bbox']) bbox_thr = np.max(bbox[2:]) threshold_bbox.append(np.array([bbox_thr, bbox_thr])) outputs = np.array(outputs) gts = np.array(gts) masks = np.array(masks) threshold_bbox = np.array(threshold_bbox) if 'PCK' in metrics: _, pck, _ = keypoint_pck_accuracy(outputs, gts, masks, pck_thr, threshold_bbox) info_str.append(('PCK', pck)) if 'AUC' in metrics: info_str.append(('AUC', keypoint_auc(outputs, gts, masks, auc_nor))) if 'EPE' in metrics: info_str.append(('EPE', keypoint_epe(outputs, gts, masks))) return info_str
def _report_metric(self, res_file, metrics, pck_thr=0.3): """Keypoint evaluation. Args: res_file (str): Json file stored prediction results. metrics (str | list[str]): Metric to be performed. Options: 'PCK', 'NME'. pck_thr (float): PCK threshold, default: 0.3. Returns: dict: Evaluation results for evaluation metric. """ info_str = [] with open(res_file, 'r') as fin: preds = json.load(fin) assert len(preds) == len(self.db) outputs = [] gts = [] masks = [] for pred, item in zip(preds, self.db): outputs.append(np.array(pred['keypoints'])[:, :-1]) gts.append(np.array(item['joints_3d'])[:, :-1]) masks.append((np.array(item['joints_3d_visible'])[:, 0]) > 0) outputs = np.array(outputs) gts = np.array(gts) masks = np.array(masks) normalize_factor = self._get_normalize_factor(gts) if 'PCK' in metrics: _, pck, _ = keypoint_pck_accuracy(outputs, gts, masks, pck_thr, normalize_factor) info_str.append(('PCK', pck)) if 'NME' in metrics: info_str.append( ('NME', keypoint_nme(outputs, gts, masks, normalize_factor))) return info_str
def _report_metric(self, res_file, metrics): """Keypoint evaluation. Report PCK, AUC or EPE. """ info_str = [] with open(res_file, 'r') as fin: preds = json.load(fin) assert len(preds) == len(self.db) outputs = [] gts = [] for pred, item in zip(preds, self.db): outputs.append(pred['keypoints']) gts.append(item['joints_3d']) outputs = np.array(outputs)[:, :, :-1] gts = np.array(gts)[:, :, :-1] if 'PCK' in metrics: hit = 0 exist = 0 for pred, item in zip(preds, self.db): bbox = np.array(item['bbox']) threshold = np.max(bbox[2:]) * 0.2 h, _, e = keypoint_pck_accuracy( np.array(pred['keypoints'])[None, :, :-1], np.array(item['joints_3d'])[None, :, :-1], 1, np.array([[threshold, threshold]])) hit += len(h[h > 0]) exist += e pck = hit / exist info_str.append(('PCK', pck)) if 'AUC' in metrics: info_str.append(('AUC', keypoint_auc(outputs, gts, 30))) if 'EPE' in metrics: info_str.append(('EPE', keypoint_epe(outputs, gts))) return info_str
def _report_metric(self, res_file, metrics, pck_thr=0.2): """Keypoint evaluation. Args: res_file (str): Json file stored prediction results. metrics (str | list[str]): Metric to be performed. Options: 'PCK', 'PCKh', 'AUC', 'EPE'. pck_thr (float): PCK threshold, default as 0.2. pckh_thr (float): PCKh threshold, default as 0.7. auc_nor (float): AUC normalization factor, default as 30 pixel. Returns: dict: Evaluation results for evaluation metric. """ info_str = [] with open(res_file, 'r') as fin: preds = json.load(fin) assert len(preds) == len(self.db) outputs = [] gts = [] masks = [] threshold_bbox = [] threshold_torso = [] for pred, item in zip(preds, self.db): outputs.append(np.array(pred['keypoints'])[:, :-1]) gts.append(np.array(item['joints_3d'])[:, :-1]) masks.append((np.array(item['joints_3d_visible'])[:, 0]) > 0) if 'PCK' in metrics: bbox = np.array(item['bbox']) bbox_thr = np.max(bbox[2:]) threshold_bbox.append(np.array([bbox_thr, bbox_thr])) if 'tPCK' in metrics: torso_thr = np.linalg.norm(item['joints_3d'][4, :2] - item['joints_3d'][5, :2]) if torso_thr < 1: torso_thr = np.linalg.norm( np.array(pred['keypoints'])[4, :2] - np.array(pred['keypoints'])[5, :2]) warnings.warn('Torso Size < 1.') threshold_torso.append(np.array([torso_thr, torso_thr])) outputs = np.array(outputs) gts = np.array(gts) masks = np.array(masks) threshold_bbox = np.array(threshold_bbox) threshold_torso = np.array(threshold_torso) if 'PCK' in metrics: pck_p, pck, _ = keypoint_pck_accuracy(outputs, gts, masks, pck_thr, threshold_bbox) stats_names = [ 'Head PCK', 'Sho PCK', 'Elb PCK', 'Wri PCK', 'Hip PCK', 'Knee PCK', 'Ank PCK', 'Mean PCK' ] stats = [ pck_p[2], 0.5 * pck_p[3] + 0.5 * pck_p[4], 0.5 * pck_p[7] + 0.5 * pck_p[8], 0.5 * pck_p[11] + 0.5 * pck_p[12], 0.5 * pck_p[5] + 0.5 * pck_p[6], 0.5 * pck_p[9] + 0.5 * pck_p[10], 0.5 * pck_p[13] + 0.5 * pck_p[14], pck ] info_str.extend(list(zip(stats_names, stats))) if 'tPCK' in metrics: pck_p, pck, _ = keypoint_pck_accuracy(outputs, gts, masks, pck_thr, threshold_torso) stats_names = [ 'Head tPCK', 'Sho tPCK', 'Elb tPCK', 'Wri tPCK', 'Hip tPCK', 'Knee tPCK', 'Ank tPCK', 'Mean tPCK' ] stats = [ pck_p[2], 0.5 * pck_p[3] + 0.5 * pck_p[4], 0.5 * pck_p[7] + 0.5 * pck_p[8], 0.5 * pck_p[11] + 0.5 * pck_p[12], 0.5 * pck_p[5] + 0.5 * pck_p[6], 0.5 * pck_p[9] + 0.5 * pck_p[10], 0.5 * pck_p[13] + 0.5 * pck_p[14], pck ] info_str.extend(list(zip(stats_names, stats))) return info_str