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()
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)