Skip to content

Commit

Permalink
Merge pull request #74 from vietanhdev/feature/auto_use_last_label
Browse files Browse the repository at this point in the history
Implement "Auto Use Last Label"
  • Loading branch information
vietanhdev authored May 5, 2023
2 parents 431ad85 + b65b237 commit 1f9d12a
Show file tree
Hide file tree
Showing 10 changed files with 148,792 additions and 148,642 deletions.
1 change: 1 addition & 0 deletions anylabeling/configs/anylabeling_config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ keep_prev: false
keep_prev_scale: false
keep_prev_brightness: false
keep_prev_contrast: false
auto_use_last_label: false
show_cross_line: true
show_groups: true
show_texts: true
Expand Down
296,626 changes: 148,335 additions & 148,291 deletions anylabeling/resources/resources.py

Large diffs are not rendered by default.

239 changes: 127 additions & 112 deletions anylabeling/resources/translations/en_US.ts

Large diffs are not rendered by default.

Binary file modified anylabeling/resources/translations/vi_VN.qm
Binary file not shown.
241 changes: 128 additions & 113 deletions anylabeling/resources/translations/vi_VN.ts

Large diffs are not rendered by default.

Binary file modified anylabeling/resources/translations/zh_CN.qm
Binary file not shown.
239 changes: 127 additions & 112 deletions anylabeling/resources/translations/zh_CN.ts

Large diffs are not rendered by default.

81 changes: 67 additions & 14 deletions anylabeling/views/labeling/label_widget.py
Original file line number Diff line number Diff line change
Expand Up @@ -347,11 +347,23 @@ def __init__(
self.toggle_keep_prev_mode,
shortcuts["toggle_keep_prev_mode"],
None,
self.tr('Toggle "keep pevious annotation" mode'),
self.tr('Toggle "Keep Previous Annotation" mode'),
checkable=True,
)
toggle_keep_prev_mode.setChecked(self._config["keep_prev"])

toggle_auto_use_last_label_mode = action(
self.tr("Auto Use Last Label"),
self.toggle_auto_use_last_label,
None,
None,
self.tr('Toggle "Auto Use Last Label" mode'),
checkable=True,
)
toggle_auto_use_last_label_mode.setChecked(
self._config["auto_use_last_label"]
)

create_mode = action(
self.tr("Create Polygons"),
lambda: self.toggle_draw_mode(False, create_mode="polygon"),
Expand Down Expand Up @@ -707,6 +719,7 @@ def __init__(
close=close,
delete_file=delete_file,
toggle_keep_prev_mode=toggle_keep_prev_mode,
toggle_auto_use_last_label_mode=toggle_auto_use_last_label_mode,
delete=delete,
edit=edit,
duplicate=duplicate,
Expand Down Expand Up @@ -750,6 +763,7 @@ def __init__(
remove_point,
None,
toggle_keep_prev_mode,
toggle_auto_use_last_label_mode,
),
# menu shown at right click
menu=(
Expand Down Expand Up @@ -1710,10 +1724,14 @@ def new_shape(self):
or not text
or self.canvas.shapes[-1].label == AutoLabelingMode.OBJECT
):
previous_text = self.label_dialog.edit.text()
text, flags, group_id = self.label_dialog.pop_up(text)
if not text:
self.label_dialog.edit.setText(previous_text)
last_label = self.find_last_label()
if self._config["auto_use_last_label"] and last_label:
text = last_label
else:
previous_text = self.label_dialog.edit.text()
text, flags, group_id = self.label_dialog.pop_up(text)
if not text:
self.label_dialog.edit.setText(previous_text)

if text and not self.validate_label(text):
self.error_message(
Expand Down Expand Up @@ -1802,21 +1820,25 @@ def set_fit_width(self, value=True):
def enable_keep_prev_scale(self, enabled):
self._config["keep_prev_scale"] = enabled
self.actions.keep_prev_scale.setChecked(enabled)
save_config(self._config)

def enable_show_cross_line(self, enabled):
self._config["show_cross_line"] = enabled
self.actions.show_cross_line.setChecked(enabled)
self.canvas.set_show_cross_line(enabled)
save_config(self._config)

def enable_show_groups(self, enabled):
self._config["show_groups"] = enabled
self.actions.show_groups.setChecked(enabled)
self.canvas.set_show_groups(enabled)
save_config(self._config)

def enable_show_texts(self, enabled):
self._config["show_texts"] = enabled
self.actions.show_texts.setChecked(enabled)
self.canvas.set_show_texts(enabled)
save_config(self._config)

def on_new_brightness_contrast(self, qimage):
self.canvas.load_pixmap(
Expand Down Expand Up @@ -2111,6 +2133,7 @@ def open_prev_image(self, _value=False):
Qt.ControlModifier | Qt.ShiftModifier
):
self._config["keep_prev"] = True
save_config(self._config)

if not self.may_continue():
return
Expand All @@ -2128,13 +2151,15 @@ def open_prev_image(self, _value=False):
self.load_file(filename)

self._config["keep_prev"] = keep_prev
save_config(self._config)

def open_next_image(self, _value=False, load=True):
keep_prev = self._config["keep_prev"]
if QtWidgets.QApplication.keyboardModifiers() == (
Qt.ControlModifier | Qt.ShiftModifier
):
self._config["keep_prev"] = True
save_config(self._config)

if not self.may_continue():
return
Expand All @@ -2157,6 +2182,7 @@ def open_next_image(self, _value=False, load=True):
self.load_file(self.filename)

self._config["keep_prev"] = keep_prev
save_config(self._config)

def open_file(self, _value=False):
if not self.may_continue():
Expand Down Expand Up @@ -2361,6 +2387,13 @@ def current_path(self):

def toggle_keep_prev_mode(self):
self._config["keep_prev"] = not self._config["keep_prev"]
save_config(self._config)

def toggle_auto_use_last_label(self):
self._config["auto_use_last_label"] = not self._config[
"auto_use_last_label"
]
save_config(self._config)

def remove_selected_point(self):
self.canvas.remove_selected_point()
Expand Down Expand Up @@ -2577,6 +2610,19 @@ def find_last_label(self):
Find the last label in the label list.
Exclude labels for auto labeling.
"""

# Get from dialog history
last_label = self.label_dialog.get_last_label()
if last_label:
return last_label

# Get selected label from the label list
items = self.label_list.selected_items()
if items:
shape = items[0].data(Qt.UserRole)
return shape.label

# Get the last label from the label list
for item in reversed(self.label_list):
shape = item.data(Qt.UserRole)
if shape.label not in [
Expand All @@ -2585,6 +2631,8 @@ def find_last_label(self):
AutoLabelingMode.REMOVE,
]:
return shape.label

# No label is found
return ""

def finish_auto_labeling_object(self):
Expand All @@ -2600,15 +2648,20 @@ def finish_auto_labeling_object(self):
return

# Ask a label for the object
previous_text = self.label_dialog.edit.text()
text, flags, group_id = self.label_dialog.pop_up(
text=self.find_last_label(),
flags={},
group_id=None,
)
if not text:
self.label_dialog.edit.setText(previous_text)
return
text, flags, group_id = "", {}, None
last_label = self.find_last_label()
if self._config["auto_use_last_label"] and last_label:
text = last_label
else:
previous_text = self.label_dialog.edit.text()
text, flags, group_id = self.label_dialog.pop_up(
text=self.find_last_label(),
flags={},
group_id=None,
)
if not text:
self.label_dialog.edit.setText(previous_text)
return

if not self.validate_label(text):
self.error_message(
Expand Down
6 changes: 6 additions & 0 deletions anylabeling/views/labeling/widgets/label_dialog.py
Original file line number Diff line number Diff line change
Expand Up @@ -124,8 +124,14 @@ def __init__(
raise ValueError(f"Unsupported completion: {completion}")
completer.setModel(self.label_list.model())
self.edit.setCompleter(completer)
# Save last label
self._last_label = ""

def get_last_label(self):
return self._last_label

def add_label_history(self, label):
self._last_label = label
if self.label_list.findItems(label, QtCore.Qt.MatchExactly):
return
self.label_list.addItem(label)
Expand Down
1 change: 1 addition & 0 deletions scripts/format_code.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
black -l 79 --exclude="tests/|anylabeling/resources/resources.py" .

0 comments on commit 1f9d12a

Please sign in to comment.