def setupGui(self): self.ui = uic.loadUi(os.path.join(GUIDIR, "labeltool.ui"), self) # get inserters and items from labels # FIXME for handling the new-style config correctly inserters = dict([ (label['attributes']['class'], label['inserter']) for label in config.LABELS if 'class' in label.get('attributes', {}) and 'inserter' in label ]) items = dict([ (label['attributes']['class'], label['item']) for label in config.LABELS if 'class' in label.get('attributes', {}) and 'item' in label ]) # Property Editor self.property_editor = PropertyEditor(config.LABELS) self.ui.dockProperties.setWidget(self.property_editor) # Scene self.scene = AnnotationScene(self.labeltool, items=items, inserters=inserters) self.property_editor.insertionModeStarted.connect( self.scene.onInsertionModeStarted) self.property_editor.insertionModeEnded.connect( self.scene.onInsertionModeEnded) # SceneView self.view = GraphicsView(self) self.view.setSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.MinimumExpanding) self.view.setScene(self.scene) self.central_widget = QWidget() self.central_layout = QVBoxLayout() self.controls = ControlButtonWidget() self.controls.back_button.clicked.connect(self.labeltool.gotoPrevious) self.controls.forward_button.clicked.connect(self.labeltool.gotoNext) self.central_layout.addWidget(self.controls) self.central_layout.addWidget(self.view) self.central_widget.setLayout(self.central_layout) self.setCentralWidget(self.central_widget) self.initShortcuts(config.HOTKEYS) self.initOptions() self.initAnnotationMenu() self.treeview = AnnotationTreeView() self.treeview.setSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Preferred) self.ui.dockAnnotations.setWidget(self.treeview) self.scene.selectionChanged.connect(self.scene.onSelectionChanged) self.treeview.selectedItemsChanged.connect( self.scene.onSelectionChangedInTreeView) self.posinfo = QLabel("-1, -1") self.posinfo.setFrameStyle(QFrame.StyledPanel) self.statusBar().addPermanentWidget(self.posinfo) self.scene.mousePositionChanged.connect(self.onMousePositionChanged) self.image_resolution = QLabel("[no image]") self.image_resolution.setFrameStyle(QFrame.StyledPanel) self.statusBar().addPermanentWidget(self.image_resolution) self.zoominfo = QLabel() self.zoominfo.setFrameStyle(QFrame.StyledPanel) self.statusBar().addPermanentWidget(self.zoominfo) self.view.scaleChanged.connect(self.onScaleChanged) self.onScaleChanged(self.view.getScale()) self.sb_progress = QProgressBar() # View menu self.ui.menu_Views.addAction(self.ui.dockProperties.toggleViewAction()) self.ui.menu_Views.addAction( self.ui.dockAnnotations.toggleViewAction()) # Annotation menu self.copyAnnotations = CopyAnnotations(self.labeltool) self.interpolateRange = InterpolateRange(self.labeltool) # Show the UI. It is important that this comes *after* the above # adding of custom widgets, especially the central widget. Otherwise the # dock widgets would be far to large. self.ui.show() ## connect action signals self.connectActions()
], 'Mark image as labeled/confirmed and go to next'), ('Backspace', lambda lt: lt.gotoPrevious(), 'Previous image/frame'), ('PgDown', lambda lt: lt.gotoNext(), 'Next image/frame'), ('PgUp', lambda lt: lt.gotoPrevious(), 'Previous image/frame'), ('Tab', lambda lt: lt.selectNextAnnotation(), 'Select next annotation'), ('Shift+Tab', lambda lt: lt.selectPreviousAnnotation(), 'Select previous annotation'), ('Ctrl+f', lambda lt: lt.view().fitInView(), 'Fit current image/frame into window'), ('Del', lambda lt: lt.deleteSelectedAnnotations(), 'Delete selected annotations'), ('Ctrl+Shift+Del', [lambda lt: lt.selectAllAnnotations(), lambda lt: lt.deleteSelectedAnnotations(), lambda lt: lt.currentImage().setUnlabeled(True)],'Delete all annotations on this image and mark it as unlabeled'), ('ESC', lambda lt: lt.exitInsertMode(), 'Exit insert mode'), ('Shift+l', lambda lt: lt.currentImage().setUnlabeled(False), 'Mark current image as labeled'), ('Shift+c', lambda lt: lt.currentImage().confirmAll(), 'Mark all annotations in image as confirmed'), ('c', lambda lt: lt.mainWindow().copyAnnotations.copy(), 'Copy all annotations from the previous image to this one'), ('Ctrl+c', lambda lt: CopyAnnotations(lt, overlap_threshold=0.9).copy(), 'Copy all non-overlapping annotations from the previous image'), ('n', [lambda lt: lt.currentImage().confirmAll(), lambda lt: lt.currentImage().setUnlabeled(False), lambda lt: lt.gotoNext(), lambda lt: lt.mainWindow().copyAnnotations.copy() ], 'Mark image as labeled/confirmed and go to next then copy all annotations from the previous image.'), ('F5', lambda lt: toggleShowLabels(), 'Toggle showing labels on boxes'), ) # CONTAINERS # # A list/tuple of two-tuples defining the mapping between filename pattern and # annotation container classes. The filename pattern can contain wildcards # such as * and ?. The corresponding container is expected to either a python # class implementing the sloth container interface, or a module path pointing # to such a class.