def add_cless(self): try: new_class = self.catLineEditWidget.text() if len(new_class) > 0: self.catListWidget.addItem(new_class) config = get_config() config['classes'][len(self.classes)] = new_class with open("config/default_config.yaml", 'w') as f: yaml.dump(config, f) self.classes = self.get_classes() QtWidgets.QMessageBox.about(self, "message", "Add Category : %s" % new_class) except Exception as e: pass
def delete_class(self): try: del_class = self.catListWidget.currentText() self.catListWidget.removeItem(self.catListWidget.currentIndex()) config = get_config() del_class_key = [ k for k, v in config['classes'].items() if v == del_class ] config['classes'].__delitem__(del_class_key[0]) with open("config/default_config.yaml", 'w') as f: yaml.dump(config, f) self.classes = self.get_classes() QtWidgets.QMessageBox.about(self, "message", "Delete Category : %s" % del_class) except Exception as e: pass
def category_save(self): try: config = get_config() labeled_path = config['paths']['labeled_path'] file_name = self.selected_file_name ch_category = self.catListWidget.currentText() src_dir = os.path.abspath(self.selected_file_path) dst_dir = os.path.abspath(os.path.join(labeled_path, ch_category)) if os.path.exists(dst_dir) is False: os.makedirs(dst_dir) shutil.move(os.path.join(src_dir, file_name), os.path.join(dst_dir, file_name)) self.labeled_file_list[file_name]['path'] = dst_dir self.labeled_file_list[file_name]['class'] = ch_category QtWidgets.QMessageBox.about( self, "message", "Move Category\n(%s -> %s)" % (self.selected_file_type, ch_category)) except Exception as e: print(e)
def __init__(self, **kwargs): super(MainWindow, self).__init__() self.setWindowTitle(__appname__) config = kwargs['config'] if 'config' in kwargs else get_config() filename = kwargs['filename'] if 'filename' in kwargs else None output = kwargs['output'] if 'output' in kwargs else None output_file = kwargs['output_file'] if 'output_file' in kwargs else None output_dir = kwargs['output_dir'] if 'output_dir' in kwargs else None self._config = config if filename is not None and osp.isdir(filename): self.importDirImages(filename, load=False) else: self.filename = filename if output is not None: logger.warning( 'argument output is deprecated, use output_file instead') if output_file is None: output_file = output self.output_file = output_file self.output_dir = output_dir self._selectedAll = False self._noSelectionSlot = False self.lastOpenDir = None self.dirty = False # widgets self.flag_widget = QtWidgets.QListWidget() self.flag_widget.itemChanged.connect(self.setDirty) self.zoomWidget = ZoomWidget() self.zoomWidget.valueChanged.connect(self.paintCanvas) self.labelList = LabelQListWidget() self.labelList.setParent(self) # canvas self.canvasInit = CanvasInit(parent=self, epsilon=self._config['epsilon']) self.canvas = self.canvasInit.canvas self.labelList.canvas = self.canvas self.setCentralWidget(self.canvasInit.canvasWidget) # docks self.inference = InferenceDock() self.inference_dock = self.inference.inference_dock self.property = PropertyDock(config=self._config) self.property_dock = self.property.property_dock self.defect = DefectDock(path_info=self._config['paths']) self.defect_dock = self.defect.defect_dock self.file = FileDock(parent=self) self.file_dock = self.file.file_dock self.category = CategoryDock() self.category_dock = self.category.category_dock features = QtWidgets.QDockWidget.DockWidgetFeatures() for dock in [ 'inference_dock', 'property_dock', 'defect_dock', 'file_dock', 'category_dock' ]: if self._config[dock]['closable']: features = features | QtWidgets.QDockWidget.DockWidgetClosable if self._config[dock]['floatable']: features = features | QtWidgets.QDockWidget.DockWidgetFloatable if self._config[dock]['movable']: features = features | QtWidgets.QDockWidget.DockWidgetMovable getattr(self, dock).setFeatures(features) if self._config[dock]['show'] is False: getattr(self, dock).setVisible(False) self.addDockWidget(Qt.RightDockWidgetArea, self.category_dock) self.addDockWidget(Qt.RightDockWidgetArea, self.inference_dock) self.addDockWidget(Qt.RightDockWidgetArea, self.property_dock) self.addDockWidget(Qt.RightDockWidgetArea, self.defect_dock) self.addDockWidget(Qt.RightDockWidgetArea, self.file_dock) self.labelDialog = LabelDialog( parent=self, labels=self._config['labels'], sort_labels=self._config['sort_labels'], show_text_field=self._config['show_label_text_field'], completion=self._config['label_completion'], fit_to_content=self._config['fit_to_content'], flags=self._config['label_flags']) if config['flags']: self.loadFlags({k: False for k in config['flags']}) if config['file_search']: self.file.fileSearch.setText(config['file_search']) self.file.fileSearchChanged() # Actions, menu self.init_action() self.init_menu() # Application state. self.image = QtGui.QImage() self.imagePath = None self.recentFiles = [] self.maxRecent = 7 self.lineColor = None self.fillColor = None self.otherData = None self.zoom_level = 100 self.fit_window = False # Restore application settings. self.settings = QtCore.QSettings('ImageDefectAnalytics', 'ImageDefectAnalytics') self.recentFiles = self.settings.value('recentFiles', []) or [] self.resize(self.settings.value('window/size', QtCore.QSize(600, 500))) self.move(self.settings.value('window/position', QtCore.QPoint(0, 0))) self.restoreState( self.settings.value('window/state', QtCore.QByteArray())) self.populateModeActions() self.updateFileMenu() if self.filename is not None: self.queueEvent(functools.partial(self.loadFile, self.filename)) self.statusBar().showMessage('%s started.' % __appname__) self.statusBar().show()
def get_classes(self): config = get_config() classes = config['classes'] return list(classes.values())
def main(): parser = argparse.ArgumentParser() parser = init_parser(parser) args = parser.parse_args() if args.version: print('{0} {1}'.format(__appname__, __version__)) sys.exit(0) logger.setLevel(getattr(logging, args.logger_level.upper())) if hasattr(args, 'flags'): if os.path.isfile(args.flags): with codecs.open(args.flags, 'r', encoding='utf-8') as f: args.flags = [l.strip() for l in f if l.strip()] else: args.flags = [l for l in args.flags.split(',') if l] if hasattr(args, 'labels'): if os.path.isfile(args.labels): with codecs.open(args.labels, 'r', encoding='utf-8') as f: args.labels = [l.strip() for l in f if l.strip()] else: args.labels = [l for l in args.labels.split(',') if l] if hasattr(args, 'label_flags'): if os.path.isfile(args.label_flags): with codecs.open(args.label_flags, 'r', encoding='utf-8') as f: args.label_flags = yaml.load(f) else: args.label_flags = yaml.load(args.label_flags) config_from_args = args.__dict__ config_from_args.pop('version') reset_config = config_from_args.pop('reset_config') filename = config_from_args.pop('filename') output = config_from_args.pop('output') config_file = config_from_args.pop('config_file') config = get_config(config_from_args, config_file) if not config['labels'] and config['validate_label']: logger.error('--labels must be specified with --validatelabel or ' 'validate_label: true in the config file ' '(ex. ~/.ida_setting).') sys.exit(1) output_file = None output_dir = None if output is not None: if output.endswith('.json'): output_file = output else: output_dir = output app = QtWidgets.QApplication(sys.argv) app.setApplicationName(__appname__) app.setWindowIcon(newIcon('development')) win = MainWindow( config=config, filename=filename, output_file=output_file, output_dir=output_dir, ) win.showMaximized() if reset_config: logger.info('Resetting Qt config: %s' % win.settings.fileName()) win.settings.clear() sys.exit(0) win.show() win.raise_() sys.exit(app.exec_())