def slot_export_npy_and_label(self):
     poses = PlayingUnit.only_ins.pose_model._fdata
     logger.debug(list(poses.keys()))
     labels = self.mw.table_labeled.get_all_labels()
     labels = [l for l in labels if l.pose_index != -1]
     logger.debug(len(labels))
     npy = []
     label_len_max = 0
     for label in labels:
         one_action_pose = []
         label_len_max = max(label_len_max, label.end - label.begin + 1)
         for frame_index in range(label.begin, label.end + 1):
             one_action_pose.append(
                 np.asarray(poses[str(frame_index)][int(label.pose_index)]))
         npy.append(np.asarray(one_action_pose))
     logger.debug([len(o_a_p) for o_a_p in npy])
     logger.debug(label_len_max)
     for one_action_pose in npy:
         one_action_pose.resize((label_len_max, *one_action_pose.shape[1:]),
                                refcheck=False)
     npy = np.asarray(npy)
     npy = np.expand_dims(npy, axis=1)
     npy = np.repeat(npy, 3, axis=1)
     logger.info(npy.shape)
     time_stamp = int(time.time())
     CommonUnit.save_ndarray(npy, f'train_data_{time_stamp}.npy')
     CommonUnit.save_pkl(
         ([f'name{i}'
           for i in range(len(npy))], [l.action_id for l in labels]),
         f'train_label_{time_stamp}.pkl')
 def table_timeline_cell_double_clicked(self, qindex):
     logger.debug('')
     r, c = qindex.row(), qindex.column()
     label = self.mw.table_timeline.detect_label(r, c)  # type:ActionLabel
     if not label:
         self.mw.table_timeline.col_to_center(
             self.mw.table_timeline.current_column)
         CommonUnit.status_prompt(
             str(f'Current Frame {self.mw.table_timeline.current_column}'))
         self.mw.table_timeline.label_create_dialog.exec_()
 def slot_del_selected_actions(self, checked):
     logger.debug('')
     if not self.mw.table_action.selectedIndexes():
         CommonUnit.status_prompt('Select actions first!', True)
         return
     if self.mw.table_labeled.rowCount():
         if QMessageBox.Cancel == QMessageBox().warning(
                 self.mw, 'ActionLabeller Warning',
                 "All you sure to delete action template?"
                 " All the related action labels will be deleted!",
                 QMessageBox.Ok | QMessageBox.Cancel, QMessageBox.Cancel):
             return
     self.mw.table_action.slot_delete_selected()
     self.slot_sync_action_update()
Exemple #4
0
    def __init__(self):
        QMainWindow.__init__(self, flags=Qt.Window)
        Ui_MainWindow.__init__(self)
        self.setupUi(self)

        double_validator = QDoubleValidator()

        self.combo_speed: QComboBox
        self.combo_speed.setEditable(True)
        self.combo_speed.lineEdit().setValidator(double_validator)
        self.combo_speed.addItems(
            ['0.25', '0.5', '0.75', '1.0', '1.25', '1.5', '1.75'])
        self.combo_speed.setCurrentIndex(3)
        self.combo_sortby.addItems(['filename', 'timestamp'])
        self.combo_sortby.setCurrentIndex(0)

        def init_buttons():
            self.btn_open_video.setFocus()

        def init_settings():
            Settings.v_interval = int(self.spin_interval.text())

        def prettify():
            shadowEffect = QGraphicsDropShadowEffect()
            shadowEffect.setColor(QColor(0, 0, 0, 255 * 0.9))
            shadowEffect.setOffset(0)
            shadowEffect.setBlurRadius(8)
            self.label_show.setGraphicsEffect(shadowEffect)
            self.label_note.setGraphicsEffect(shadowEffect)

            vheader = self.table_timeline.verticalHeader()
            vheader.setDefaultSectionSize(5)
            vheader.sectionResizeMode(QHeaderView.Fixed)

        init_buttons()
        init_settings()
        prettify()

        self.table_timeline.__init_later__()
        self.table_labeled.__init_later__()
        self.table_action.__init_later__()
        self.table_xml_setting.__init_later__(self.table_action.model())

        CommonUnit.set_mw(self)
        # Hold to avoid being destroyed
        self._holder0 = ApplicationUnit(self)
        self._holder1 = XmlSettingUnit(self)
        self._holder2 = PlayingUnit(self)
        self._holder3 = ActionLabellingUnit(self)
 def slot_export_labeled(self):
     logger.debug('')
     video_obj = PlayingUnit.only_ins.video_model
     video_info = video_obj and video_obj.get_info()
     video_uri = video_info and video_info['fname']
     video_name = video_uri and os.path.basename(video_uri)
     save_as = CommonUnit.get_save_name(f'{video_name}.json')
     if not save_as:
         return
     pose_obj = PlayingUnit.only_ins.pose_model
     pose_file_uri = pose_obj and pose_obj.file.uri
     pose_file_md5 = pose_file_uri and FileHelper.hashOfFile(pose_file_uri)
     json_file_labels = JsonFileLabels()
     json_file_labels['video_info.uri'] = video_uri
     json_file_labels[
         'video_info.hash_md5'] = video_uri and FileHelper.hashOfFile(
             video_uri)
     json_file_labels['video_info.w'] = video_info and video_info['width']
     json_file_labels['video_info.h'] = video_info and video_info['height']
     json_file_labels['pose_info.uri'] = pose_file_uri
     json_file_labels['pose_info.hash_md5'] = pose_file_md5
     json_file_labels['labels'] = {
         i + 1: {
             'action': label.action,
             'begin': label.begin,
             'end': label.end,
             'pose_index': label.pose_index,
         }
         for i, label in enumerate(self.mw.table_labeled.get_all_labels())
     }
     json_file_labels.dump(save_as)
    def slot_open_file(self):
        # TODO: remove native directory
        all_types_filter = f'*{" *".join(Settings.video_exts + Settings.image_exts + Settings.plotting_exts)}'
        file_uri = CommonUnit.get_open_name(
            filter_=f"Media Files ({all_types_filter})")
        # got = '/Users/zdl/Downloads/下载-视频/poses.json'
        # got = '/Users/zdl/Downloads/下载-视频/金鞭溪-张家界.mp4'
        logger.info(file_uri)
        if not file_uri:
            return
        ext = os.path.splitext(file_uri)[1]
        if ext in Settings.video_exts:
            self.mw.tab_media.setCurrentIndex(0)
            video_model = Video(file_uri) \
                .set_viewer(self.mw.label_show)
            video_model.fps = video_model.get_info()['fps'] * float(
                self.mw.combo_speed.currentText())
            video_model.file = FileInfo(file_uri)
            self.video_model = video_model
            self.set_model(video_model)

            self.mw.table_timeline.set_column_num(
                video_model.get_info()['frame_c'])
            self.mw.video_textBrowser.append(file_uri)
        elif ext in Settings.plotting_exts:
            self.mw.tab_media.setCurrentIndex(2)
            file = JsonFilePoses.load(file_uri)
            plotter = self.mw.graphics_view.main_plotter
            plotter.set_range([0, int(file['video_info.w'])],
                              [0, int(file['video_info.h'])])
            pose_model = PosePlotting(file['info.pose_type']) \
                .set_data(file['poses']) \
                .set_viewer(plotter)
            pose_model.file = file
            self.pose_model = pose_model
            self.set_model(pose_model)

            self.mw.table_timeline.set_column_num(
                int(pose_model.indices[-1]) + 1)
            self.mw.plotting_textBrowser.append(file_uri)
        else:
            logger.warn(f'{file_uri} type {ext} not supported.')
            return
        self.media_model.signals.flushed.connect(
            self.mw.table_timeline.slot_follow_to)
        self.media_model.signals.flushed.connect(self.slot_follow_to)
        self.slot_start()
 def slot_import_labeled(self):
     logger.debug('')
     json_file_labels = JsonFileLabels.load(CommonUnit.get_open_name())
     existed_actions = {
         action.name: action
         for action in self.mw.table_action.get_all_actions()
     }
     for i, label in json_file_labels['labels'].items():
         action_name, begin, end, pose_index = ZDict(label)['action',
                                                            'begin', 'end',
                                                            ('pose_index',
                                                             -1)]
         if action_name not in existed_actions:
             action = self.mw.table_action.slot_insert_action(action_name)
             existed_actions[action_name] = action
         else:
             action = existed_actions[action_name]
         action_label = ActionLabel(action.name, action.id, action.color,
                                    begin, end, None, pose_index)
         logger.debug(action_label)
         self.mw.table_timeline.settle_label(action_label)
         self.mw.table_labeled.add_label(action_label)
 def slot_follow_to(self, to):
     CommonUnit.status_prompt(f'Frame {to}')
 def slot_fast_rewind(self):
     logger.debug('')
     if self.media_model is None:
         return
     step = CommonUnit.get_value(self.mw.input_step, int)
     self.media_model.schedule(-1, step, -1, MySignals.Emitter.BTN)