Esempio n. 1
0
class TruthingViewer:
    def __init__(self):

        # init
        self.dataDir = Path(test_data_path + block)
        self.masks = []
        self.image_map = {}
        self.image_items = [None] * 4

        self.selected = []
        self.start = time.time()

        # Windowing
        self.win = KeyPressWindow()
        self.win.set_function(self.update_keypress)
        self.win.resize(1500, 400)

        self.view = pg.GraphicsLayoutWidget()
        self.view.setBackground('w')
        self.win.setCentralWidget(self.view)
        self.win.show()
        self.win.setWindowTitle('truthing')

        # self.answer = self.read_answers(berkeley)
        self.ground_truth = self.read_answers(gt)
        self.write_results()

    def read_answers(self, filename):
        try:
            with open(filename) as answer_file:
                answer = Answer()
                answer.parse_answer_file(answer_file)
                return answer
        except:
            print(" No such file {}".format(filename))
            answer = Answer()
            return answer

    def set_test_num(self, test_num):
        if test_num < 0 or test_num > 1080:
            print("going off edge of tests")
            return

        self.test_num = test_num
        self.test_num_string = str(self.test_num).zfill(4)
        self.read_images()

        self.win.setWindowTitle(
            str('truthing ') + str(block) + " / " + str(self.test_num_string))

    def read_images(self):
        self.image_map.clear()
        for scene in range(0, 4):
            frame_map = {}
            for frame_num in range(1, 101):
                frame_num_string = str(frame_num).zfill(3)
                image_name = self.dataDir / self.test_num_string / str(
                    scene + 1) / "scene" / ("scene_" + frame_num_string +
                                            ".png")
                img_src = mpimg.imread(str(image_name))
                frame_map[frame_num] = img_src
            self.image_map[scene] = frame_map

    def update_keypress(self, event):

        sys.stdout.flush()

        if event.key() == 70:
            self.set_test_num(self.test_num + 1)
            self.update_slider(1)
        elif event.key() == 66:
            self.set_test_num(self.test_num - 1)
            self.update_slider(1)
        elif event.key() == 49:  # This is '1'
            print("1")
            self.selected.append(1)
        elif event.key() == 50:  # this is '2'
            print("2")
            self.selected.append(2)
        elif event.key() == 51:  # this is '3'
            print("3")
            self.selected.append(3)
        elif event.key() == 52:  # this is '4'
            print("4")
            self.selected.append(4)
        elif event.key() == 81:  # this is 'q', for quit
            exit(0)
        elif event.key() == 84:  # this is 't', for toggle
            current_val = int(self.slider.get_val())
            if current_val == 1:
                self.slider.set_val(100)
            else:
                self.slider.set_val(1)
        else:
            print("key: {}".format(event.key()))

        self.handle_selected()

    def handle_selected(self):
        """If both have been selected, write out and reset"""
        if not len(self.selected) == 2:
            return

        if self.selected[0] == self.selected[1]:
            print("Cannot have same!! {}".format(self.selected[0]))
            self.selected.clear()
            return

        if self.selected[0] < 1 or self.selected[0] > 4 or self.selected[
                1] < 1 or self.selected[1] > 4:
            print("Not in Range!! {} {}".format(self.selected[0],
                                                self.selected[1]))
            self.selected.clear()
            return

        self.set_results()
        self.write_results()
        self.selected.clear()

        self.set_test_num(self.test_num + 1)
        self.update_slider(1)
        diff = time.time() - self.start
        print("Wrote results for: {}.  {} sec".format(self.test_num,
                                                      str(diff)))
        self.start = time.time()

    def set_results(self):
        vals = [1, 1, 1, 1]
        vals[self.selected[0] - 1] = 0
        vals[self.selected[1] - 1] = 0
        test = str(self.test_num).zfill(4)
        self.ground_truth.set_vals(block, test, vals)

    def write_results(self):

        self.ground_truth.write_answer_file(gt)

        # backup file
        gt_name = str(gt + "." + datetime.datetime.now().isoformat())
        self.ground_truth.write_answer_file(gt_name)

    def mouseMoved(self, ev):
        print(" mouse moved {}".format(ev))

    def set_up_view(self):

        # Use specified test or get the latest one that has not been truthed
        test_num = starting_test
        if starting_test == -1:
            test_num = self.ground_truth.next_test(block)
        self.set_test_num(test_num)

        for scene in range(0, 4):
            image_name = self.dataDir / self.test_num_string / str(
                scene + 1) / "scene" / "scene_001.png"
            img_src = mpimg.imread(str(image_name))
            self.image_items[scene] = pg.ImageItem(img_src,
                                                   axisOrder='row-major',
                                                   border='w')

            vb = self.view.ci.addViewBox(row=0, col=scene)
            vb.invertY()
            vb.addItem(self.image_items[scene])

        self.create_slider()

    def create_slider(self):
        horizLayout = QHBoxLayout(self.view)
        self.slider = Slider(0, 100)
        self.slider.setCallback(self.update_slider)
        horizLayout.addWidget(self.slider)

    def update_slider(self, val):
        frame_num = int(val)
        if frame_num > 100 or frame_num < 1:
            return

        answer = self.ground_truth.get_answer()

        for scene in range(0, 4):
            img = self.image_map[scene][frame_num]
            scene_name = str(scene + 1)
            # If already truthed as implausible, show as red
            if answer[block][self.test_num_string][scene_name] == 0:
                self.image_items[scene].setImage(img,
                                                 border=pg.mkPen(color=(255, 0,
                                                                        0),
                                                                 width=8))
            else:
                self.image_items[scene].setImage(img, border='w')