HumanSignal / labelImg

LabelImg is now part of the Label Studio community. The popular image annotation tool created by Tzutalin is no longer actively being developed, but you can check out Label Studio, the open source data labeling tool for images, text, hypertext, audio, video and time-series data.
https://youtu.be/p0nR2YsCY_U
MIT License
22.51k stars 6.27k forks source link

Hotkeys for labels #242

Open JesperChristensen89 opened 6 years ago

JesperChristensen89 commented 6 years ago

Instead having the dialog open and pressinh enter each time, it would be nice if one could simply use 1, 2, 3 etc. for bbox labels. Would this be possible?

vdalv commented 6 years ago

I'm not sure, but you're more than welcome to try 😊

JasperMorrison commented 2 years ago

Base on v1.8.6, hotkeys including 1-5.

diff --git a/labelImg.py b/labelImg.py
index 915ca04..56d1505 100644
--- a/labelImg.py
+++ b/labelImg.py
@@ -103,6 +103,9 @@ class MainWindow(QMainWindow, WindowMixin):
         self.cur_img_idx = 0
         self.img_count = 1

+        # Number hotkeys
+        self.hotkey_number = 0
+
         # Whether we need to save or not.
         self.dirty = False

@@ -270,6 +273,17 @@ class MainWindow(QMainWindow, WindowMixin):
         edit_mode = action(get_str('editBox'), self.set_edit_mode,
                            'Ctrl+J', 'edit', get_str('editBoxDetail'), enabled=False)

+        create_1 = action(get_str('crtBox'), self.create_shape_1,
+                        '1', 'new', get_str('crtBoxDetail'), enabled=True)
+        create_2 = action(get_str('crtBox'), self.create_shape_2,
+                        '2', 'new', get_str('crtBoxDetail'), enabled=True)
+        create_3 = action(get_str('crtBox'), self.create_shape_3,
+                        '3', 'new', get_str('crtBoxDetail'), enabled=True)
+        create_4 = action(get_str('crtBox'), self.create_shape_4,
+                        '4', 'new', get_str('crtBoxDetail'), enabled=True)
+        create_5 = action(get_str('crtBox'), self.create_shape_5,
+                        '5', 'new', get_str('crtBoxDetail'), enabled=True)
+
         create = action(get_str('crtBox'), self.create_shape,
                         'w', 'new', get_str('crtBoxDetail'), enabled=False)
         delete = action(get_str('delBox'), self.delete_selected_shape,
@@ -357,6 +371,7 @@ class MainWindow(QMainWindow, WindowMixin):
         # Store actions for further handling.
         self.actions = Struct(save=save, save_format=save_format, saveAs=save_as, open=open, close=close, resetAll=reset_all, deleteImg=delete_image,
                               lineColor=color1, create=create, delete=delete, edit=edit, copy=copy,
+                              create_1=create_1,create_2=create_2,create_3=create_3,create_4=create_4,create_5=create_5,
                               createMode=create_mode, editMode=edit_mode, advancedMode=advanced_mode,
                               shapeLineColor=shape_line_color, shapeFillColor=shape_fill_color,
                               zoom=zoom, zoomIn=zoom_in, zoomOut=zoom_out, zoomOrg=zoom_org,
@@ -422,6 +437,7 @@ class MainWindow(QMainWindow, WindowMixin):
         self.tools = self.toolbar('Tools')
         self.actions.beginner = (
             open, open_dir, change_save_dir, open_next_image, open_prev_image, verify, save, save_format, None, create, copy, delete, None,
+            create_1,create_2,create_3,create_4,create_5,
             zoom_in, zoom, zoom_out, fit_window, fit_width)

         self.actions.advanced = (
@@ -669,6 +685,31 @@ class MainWindow(QMainWindow, WindowMixin):
     def show_shortcuts_dialog(self):
         self.show_tutorial_dialog(browser='default', link='https://github.com/tzutalin/labelImg#Hotkeys')

+    def create_shape_1(self):
+        self.set_hotkey_number(1)
+        if self.actions.create.isEnabled():
+            self.create_shape()
+
+    def create_shape_2(self):
+        self.set_hotkey_number(2)
+        if self.actions.create.isEnabled():
+            self.create_shape()
+
+    def create_shape_3(self):
+        self.set_hotkey_number(3)
+        if self.actions.create.isEnabled():
+            self.create_shape()
+
+    def create_shape_4(self):
+        self.set_hotkey_number(4)
+        if self.actions.create.isEnabled():
+            self.create_shape()
+
+    def create_shape_5(self):
+        self.set_hotkey_number(5)
+        if self.actions.create.isEnabled():
+            self.create_shape()
+
     def create_shape(self):
         assert self.beginner()
         self.canvas.set_editing(False)
@@ -919,13 +960,16 @@ class MainWindow(QMainWindow, WindowMixin):
         else:  # User probably changed item visibility
             self.canvas.set_shape_visible(shape, item.checkState() == Qt.Checked)

+    def set_hotkey_number(self, number=0):
+        self.hotkey_number = number
+
     # Callback functions:
     def new_shape(self):
         """Pop-up and give focus to the label editor.

         position MUST be in global coordinates.
         """
-        if not self.use_default_label_checkbox.isChecked() or not self.default_label_text_line.text():
+        if self.hotkey_number == 0 or self.hotkey_number >= len(self.label_hist) and (not self.use_default_label_checkbox.isChecked() or not self.default_label_text_line.text()):
             if len(self.label_hist) > 0:
                 self.label_dialog = LabelDialog(
                     parent=self, list_item=self.label_hist)
@@ -936,8 +980,12 @@ class MainWindow(QMainWindow, WindowMixin):
             else:
                 text = self.label_dialog.pop_up(text=self.prev_label_text)
                 self.lastLabel = text
-        else:
+        elif self.hotkey_number == 0 or self.hotkey_number >= len(self.label_hist):
             text = self.default_label_text_line.text()
+        else:
+            text = self.label_hist[self.hotkey_number-1]
+
+        self.hotkey_number = 0

         # Add Chris
         self.diffc_button.setChecked(False)