Exemple #1
0
    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
Exemple #2
0
    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
Exemple #3
0
    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)
Exemple #4
0
    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()
Exemple #5
0
    def get_classes(self):
        config = get_config()
        classes = config['classes']

        return list(classes.values())
Exemple #6
0
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_())