def _evaluate(Gt, Hy, threshold, cost_fun, info=False, debug_info=False): if debug_info: fp, m, mme, c, d, g, FN_pairs, FP_pairs, MME_pairs = MOTM.evaluate( Gt, Hy, threshold, cost_fun, debug_info=True) else: fp, m, mme, c, d, g = MOTM.evaluate(Gt, Hy, threshold, cost_fun) FN = np.sum(m) FP = np.sum(fp) IDSW = np.sum(mme) GT = np.sum(g) mota = 1 - (FN + FP + IDSW) / GT result = [mota] if info: result.append({'FN': FN, 'FP': FP, 'IDSW': IDSW, 'GT': GT}) if debug_info: result.append({"FN": FN_pairs, "FP": FP_pairs, "IDSW": MME_pairs}) if len(result) > 1: return result else: return result[0]
def test_motm_1mme(self): Gt = np.array([ [1, 1, 0, 0], [2, 1, 0, 0] ]) Hy = np.array([ [1, 1, 0, 0], [2, 2, 0, 0] ]) cost = lambda a, b: la.norm(a-b) fp, m, mme, c, d, g = MOTM.evaluate(Gt, Hy, 10, cost) self.assertEqual(len(fp), 2) self.assertEqual(len(m), 2) self.assertEqual(len(mme), 2) self.assertEqual(len(c), 2) self.assertEqual(len(d), 2) self.assertEqual(len(g), 2) self.assertEqual(np.sum(fp), 0) self.assertEqual(np.sum(m), 0) self.assertEqual(np.sum(mme), 1) self.assertEqual(np.sum(d), 0) self.assertEqual(np.sum(g), 2) self.assertEqual(np.sum(c), 2)
def test_motm_fp_with_debug_info(self): Gt = np.array([ [1, 1, 0, 0], [1, 2, 10, 10], [2, 1, 0, 0] ]) Hy = np.array([ [1, 2, 10, 10], [1, 3, 20, 20], [1, 4, 30, 30], [2, 1, 0, 0], [1, 1, 0, 0], [2, 5, 88, 99] ]) cost = lambda a, b: la.norm(a-b) fp, m, mme, c, d, g, FN_pairs, FP_pairs, MME_pairs =\ MOTM.evaluate(Gt, Hy, 5, cost, debug_info=True) self.assertEqual(len(FN_pairs), 0) self.assertEqual(len(FP_pairs), 3) self.assertEqual(len(MME_pairs), 0) self.assertEqual(FP_pairs[0][0], 1) self.assertEqual(FP_pairs[1][0], 1) self.assertEqual(FP_pairs[2][0], 2) self.assertEqual(FP_pairs[0][2], 20) self.assertEqual(FP_pairs[1][2], 30) self.assertEqual(FP_pairs[2][2], 88) self.assertEqual(len(fp), 2) self.assertEqual(len(m), 2) self.assertEqual(len(mme), 2) self.assertEqual(len(c), 2) self.assertEqual(len(d), 2) self.assertEqual(len(g), 2) self.assertEqual(np.sum(fp), 3) self.assertEqual(np.sum(m), 0) self.assertEqual(np.sum(mme), 0) self.assertEqual(np.sum(d), 0) self.assertEqual(np.sum(g), 3) self.assertEqual(np.sum(c), 3)
def evaluate(Gt, Hy, threshold): """ Ground-truth vs hypothesis for the Multiple Object Tracking Precision Gt: [ (frame, pid, x, y) ] Hy: [ (frame, pid, x, y) ] threshold: after which no correspondence is possible """ cost_fun = lambda a, b: la.norm(a-b) fp, m, mme, c, d, g = MOTM.evaluate(Gt, Hy, threshold, cost_fun) D = np.sum(d) C = np.sum(c) return D/C
def test_motm_interrupt(self): Gt = np.array([ [1, 1, 0, 0], [2, 1, 0, 0], [5, 1, 0, 0], [6, 1, 0, 0], [7, 1, 0, 0], [8, 1, 0, 0] ]) Hy = np.array([ [1, 1, 0, 0], [2, 1, 0, 0], [5, 1, 0, 0], [6, 1, 0, 0], [7, 1, 0, 0], [8, 1, 0, 0] ]) cost = lambda a, b: la.norm(a-b) fp, m, mme, c, d, g = MOTM.evaluate(Gt, Hy, 10, cost) self.assertEqual(len(fp), 8) self.assertEqual(len(m), 8) self.assertEqual(len(mme), 8) self.assertEqual(len(c), 8) self.assertEqual(len(d), 8) self.assertEqual(len(g), 8) self.assertEqual(np.sum(fp), 0) self.assertEqual(np.sum(m), 0) self.assertEqual(np.sum(mme), 0) self.assertEqual(np.sum(d), 0) self.assertEqual(np.sum(g), 6) self.assertEqual(np.sum(c), 6)