Exemplo n.º 1
0
    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))
Exemplo n.º 2
0
    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))