def __test(self): """Testing function.""" self.net.eval() data_list = list() with torch.no_grad(): for i, data_tuple in enumerate(tqdm(self.data_loader, desc="Test")): """ input, gt """ inputs = data_tuple[0].to(self.device) tmp = "{};".format(len(data_list) + 1) start = list() end = list() prediction_data = list() s = StateMachine(threshold_window_S1=10, threshold_S3=25) for idx, window in enumerate(inputs): output = self.net(window.unsqueeze(0)) predicted = torch.argmax(output.detach(), dim=-1).cpu().numpy() prediction_data.append(predicted.squeeze()) retval = s.update(predicted.squeeze(), idx) if retval: start.append(s.get_start()) end.append(s.get_end()) pred = np.array(prediction_data)[start[-1]:end[-1] + 1] pred = pred[pred != CLASS.index("NO_GESTURE")] pred = np.bincount(pred.flatten()).argmax() tmp += "{};{};{};".format(CLASS[pred], start[-1] + 2, end[-1] + 2) s.reset() if s.active in [2, 3]: if (len(inputs) - 1 - s.get_start()) > 3: start.append(s.get_start()) end.append(len(inputs) - 1) pred = np.array(prediction_data)[start[-1]:end[-1] + 1] pred = pred[pred != CLASS.index("NO_GESTURE")] pred = np.bincount(pred.flatten()).argmax() tmp += "{};{};{};".format(CLASS[pred], start[-1] + 2, end[-1] + 2) s.reset() tmp += "\n" data_list.append(tmp) if not os.path.exists("./outputs"): os.makedirs("./outputs") with open( "./outputs/" + self.configer.get("checkpoints", "save_name") + ".txt", "wt") as outfile: outfile.write("".join(data_list))
def state_machine(self, predicted, correct, start_end, data_list = None, data_list_gt = None): s = StateMachine(threshold_window_S1=10, threshold_S3=25) start_gt = list() end_gt = list() for idx, window in enumerate(correct): retval = s.update(window, idx) if retval: start_gt.append(s.get_start()) end_gt.append(s.get_end()) s.reset() if s.active in [2, 3]: if (len(correct) - 1 - s.get_start()) > 3: start_gt.append(s.get_start()) end_gt.append(len(correct) - 1) s.reset() start = list() end = list() for idx, window in enumerate(predicted): retval = s.update(window, idx) if retval: start.append(s.get_start()) end.append(s.get_end()) s.reset() if s.active in [2, 3]: if (len(predicted) - 1 - s.get_start()) > 3: start.append(s.get_start()) end.append(len(predicted) - 1) TP = 0 FP = 0 couples = dict() start_end = start_end[0] for i in range(len(start)): s = start[i] e = end[i] best_idx = ((np.abs((np.array(start_end[..., 0]) - s)) + np.abs((np.array(start_end[..., 1]) - e)) / 2)).argmin() if best_idx not in couples: couples[best_idx] = [i, ((np.abs((np.array(start_end[..., 0]) - s)) + np.abs((np.array(start_end[..., 1]) - e))) / 2).min()] else: if ((np.abs((np.array(start_end[..., 0]) - s)) + np.abs((np.array(start_end[..., 1]) - e))) / 2).min() < couples[best_idx][1]: couples[best_idx] = [i, ((np.abs((np.array(start_end[..., 0]) - s)) + np.abs((np.array(start_end[..., 1]) - e))) / 2).min()] FP += 1 FN = len(start_gt) - len(couples) for k, v in couples.items(): self.frame_error_start.append(np.abs(start_end[k, 0] - start[v[0]])) self.frame_error_end.append(np.abs(start_end[k, 1] - end[v[0]])) pred = predicted[start[v[0]]:end[v[0]] + 1] pred = pred[pred != CLASS.index("NO_GESTURE")] try: pred = np.bincount(pred.flatten()).argmax() except ValueError: print("OK") gt = correct[start_end[k][0]:start_end[k][1] + 1] gt = gt[gt != CLASS.index("NO_GESTURE")] gt = np.bincount(gt.flatten()).argmax() self.confusion[gt, pred] += 1 if pred == gt: TP += 1 else: FP += 1 if data_list is not None: tmp = "{};".format(len(data_list) + 1) for start, end in zip(start, end): pred = predicted[start:end + 1] pred = pred[pred != CLASS.index("NO_GESTURE")] pred = np.bincount(pred.flatten()).argmax() tmp += "{};{};{};".format(CLASS[pred], start+2, end+2) tmp += "\n" data_list.append(tmp) if data_list_gt is not None: tmp = "{};".format(len(data_list_gt) + 1) for i, (s, e) in enumerate(zip(start_gt, end_gt)): gt = correct[s:e + 1] gt = gt[gt != CLASS.index("NO_GESTURE")] gt = np.bincount(gt.flatten()).argmax() tmp += "{};{};{};".format(CLASS[gt], start_end[i, 0], start_end[i, 1]) tmp += "\n" data_list_gt.append(tmp) self.AP.append((TP / (TP + FP)) if TP + FP != 0 else 0) self.AR.append((TP / (TP + FN)) if TP + FN != 0 else 0) self.FALSE_POS.append(FP) self.CORR_CLASS.append(TP / len(couples)) self.MISLAB.append(1 - TP / len(couples))