From 093667368964e9c6339cd3c38ca08c41b6b82e18 Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Wed, 19 Jan 2022 10:20:56 +0800 Subject: [PATCH 1/9] Optimize discardChangesDialog attention message when using chinese as language. --- PPOCRLabel/PPOCRLabel.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/PPOCRLabel/PPOCRLabel.py b/PPOCRLabel/PPOCRLabel.py index 98e2b1ef77..ee8baeb7b5 100644 --- a/PPOCRLabel/PPOCRLabel.py +++ b/PPOCRLabel/PPOCRLabel.py @@ -1790,7 +1790,10 @@ class MainWindow(QMainWindow, WindowMixin): def discardChangesDialog(self): yes, no, cancel = QMessageBox.Yes, QMessageBox.No, QMessageBox.Cancel - msg = u'You have unsaved changes, would you like to save them and proceed?\nClick "No" to undo all changes.' + if self.lang == 'ch': + msg = u'您有未保存的变更, 您想保存再继续吗?\n点击 "No" 丢弃所有未保存的变更.' + else: + msg = u'You have unsaved changes, would you like to save them and proceed?\nClick "No" to undo all changes.' return QMessageBox.warning(self, u'Attention', msg, yes | no | cancel) def errorMessage(self, title, message): From f21a8f54470259736898bdb137c973a7a63999f3 Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Wed, 19 Jan 2022 10:24:29 +0800 Subject: [PATCH 2/9] Set window maximized and window goes to the front when activate. --- PPOCRLabel/PPOCRLabel.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/PPOCRLabel/PPOCRLabel.py b/PPOCRLabel/PPOCRLabel.py index ee8baeb7b5..b1ccfc2f61 100644 --- a/PPOCRLabel/PPOCRLabel.py +++ b/PPOCRLabel/PPOCRLabel.py @@ -101,6 +101,8 @@ class MainWindow(QMainWindow, WindowMixin): def __init__(self, lang="ch", gpu=False, defaultFilename=None, defaultPrefdefClassFile=None, defaultSaveDir=None): super(MainWindow, self).__init__() self.setWindowTitle(__appname__) + self.setWindowState(Qt.WindowMaximized) # set window max + self.activateWindow() # PPOCRLabel goes to the front when activate # Load setting in the main thread self.settings = Settings() From fd7801c3191e47165c9d2de7a0dd2b299d923f7e Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Wed, 19 Jan 2022 10:28:29 +0800 Subject: [PATCH 3/9] Optimize savePPlabel information message when using chinese as language. --- PPOCRLabel/PPOCRLabel.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/PPOCRLabel/PPOCRLabel.py b/PPOCRLabel/PPOCRLabel.py index b1ccfc2f61..783b3ca33e 100644 --- a/PPOCRLabel/PPOCRLabel.py +++ b/PPOCRLabel/PPOCRLabel.py @@ -2094,8 +2094,11 @@ class MainWindow(QMainWindow, WindowMixin): f.write(key + '\t') f.write(json.dumps(self.PPlabel[key], ensure_ascii=False) + '\n') - if mode=='Manual': - msg = 'Images that have been checked are saved in '+ self.PPlabelpath + if mode == 'Manual': + if self.lang == 'ch': + msg = '已将检查过的图片标签保存在 ' + self.PPlabelpath + " 文件中" + else: + msg = 'Images that have been checked are saved in ' + self.PPlabelpath QMessageBox.information(self, "Information", msg) def saveCacheLabel(self): From 5c7c1f7410b3d8f10d3bfde9a1f3fdcb4b31420c Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Wed, 19 Jan 2022 10:33:15 +0800 Subject: [PATCH 4/9] show file list image count make the labelers more clear about the image situation --- PPOCRLabel/PPOCRLabel.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/PPOCRLabel/PPOCRLabel.py b/PPOCRLabel/PPOCRLabel.py index 783b3ca33e..c6d38e2171 100644 --- a/PPOCRLabel/PPOCRLabel.py +++ b/PPOCRLabel/PPOCRLabel.py @@ -180,7 +180,8 @@ class MainWindow(QMainWindow, WindowMixin): fileListContainer = QWidget() fileListContainer.setLayout(filelistLayout) - self.filedock = QDockWidget(getStr('fileList'), self) + self.fileListName = getStr('fileList') + self.filedock = QDockWidget(self.fileListName, self) self.filedock.setObjectName(getStr('files')) self.filedock.setWidget(fileListContainer) self.addDockWidget(Qt.LeftDockWidgetArea, self.filedock) @@ -1390,6 +1391,13 @@ class MainWindow(QMainWindow, WindowMixin): self.labelList.setCurrentItem(self.labelList.item(self.labelList.count() - 1)) self.labelList.item(self.labelList.count() - 1).setSelected(True) + # show file list image count + select_indexes = self.fileListWidget.selectedIndexes() + if len(select_indexes) > 0: + self.filedock.setWindowTitle(self.fileListName + f" ({select_indexes[0].row() + 1}" + f"/{self.fileListWidget.count()})") + + self.canvas.setFocus(True) return True return False @@ -1598,7 +1606,8 @@ class MainWindow(QMainWindow, WindowMixin): self.actions.rotateLeft.setEnabled(True) self.actions.rotateRight.setEnabled(True) - + self.fileListWidget.setCurrentRow(0) # set list index to first + self.filedock.setWindowTitle(self.fileListName + f" (1/{self.fileListWidget.count()})") # show image count def openPrevImg(self, _value=False): if len(self.mImgList) <= 0: From aed73672f6344fb793060c1cf730c98db0a0a180 Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Wed, 19 Jan 2022 10:36:57 +0800 Subject: [PATCH 5/9] Improve user efficiency: Using [Ctrl+T] to delect the box --- PPOCRLabel/PPOCRLabel.py | 2 +- PPOCRLabel/README.md | 4 ++-- PPOCRLabel/README_ch.md | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/PPOCRLabel/PPOCRLabel.py b/PPOCRLabel/PPOCRLabel.py index c6d38e2171..e3ecc1af00 100644 --- a/PPOCRLabel/PPOCRLabel.py +++ b/PPOCRLabel/PPOCRLabel.py @@ -397,7 +397,7 @@ class MainWindow(QMainWindow, WindowMixin): 'w', 'objects', getStr('crtBoxDetail'), enabled=False) delete = action(getStr('delBox'), self.deleteSelectedShape, - 'backspace', 'delete', getStr('delBoxDetail'), enabled=False) + 'Ctrl+T', 'delete', getStr('delBoxDetail'), enabled=False) copy = action(getStr('dupBox'), self.copySelectedShape, 'Ctrl+C', 'copy', getStr('dupBoxDetail'), diff --git a/PPOCRLabel/README.md b/PPOCRLabel/README.md index e8634ef8c0..04f0d19469 100644 --- a/PPOCRLabel/README.md +++ b/PPOCRLabel/README.md @@ -143,7 +143,7 @@ python PPOCRLabel.py ### 3.1 Shortcut keys | Shortcut keys | Description | -| ------------------------ | ------------------------------------------------ | +|--------------------------| ------------------------------------------------ | | Ctrl + Shift + R | Re-recognize all the labels of the current image | | W | Create a rect box | | Q | Create a four-points box | @@ -151,7 +151,7 @@ python PPOCRLabel.py | Ctrl + R | Re-recognize the selected box | | Ctrl + C | Copy and paste the selected box | | Ctrl + Left Mouse Button | Multi select the label box | -| Backspace | Delete the selected box | +| Ctrl+T | Delete the selected box | | Ctrl + V | Check image | | Ctrl + Shift + d | Delete image | | D | Next image | diff --git a/PPOCRLabel/README_ch.md b/PPOCRLabel/README_ch.md index e1c391bc86..7e77bdb997 100644 --- a/PPOCRLabel/README_ch.md +++ b/PPOCRLabel/README_ch.md @@ -139,8 +139,8 @@ python PPOCRLabel.py --lang ch | Ctrl + E | 编辑所选框标签 | | Ctrl + R | 重新识别所选标记 | | Ctrl + C | 复制并粘贴选中的标记框 | -| Ctrl + 鼠标左键 | 多选标记框 | -| Backspace | 删除所选框 | +| Ctrl + 鼠标左键 | 多选标记框 | +| Ctrl+T | 删除所选框 | | Ctrl + V | 确认本张图片标记 | | Ctrl + Shift + d | 删除本张图片 | | D | 下一张图片 | From c267107926bbbd977fc9d67d3c39fb5e1b77028b Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Wed, 19 Jan 2022 10:44:14 +0800 Subject: [PATCH 6/9] Add [ time left ] while predicting the image for user to know the situation --- PPOCRLabel/libs/autoDialog.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/PPOCRLabel/libs/autoDialog.py b/PPOCRLabel/libs/autoDialog.py index 3374e92cc5..c26bc75995 100644 --- a/PPOCRLabel/libs/autoDialog.py +++ b/PPOCRLabel/libs/autoDialog.py @@ -6,6 +6,8 @@ except ImportError: from PyQt4.QtGui import * from PyQt4.QtCore import * +import time +import datetime import json import cv2 import numpy as np @@ -80,8 +82,9 @@ class AutoDialog(QDialog): self.parent = parent self.ocr = ocr self.mImgList = mImgList + self.lender = lenbar self.pb = QProgressBar() - self.pb.setRange(0, lenbar) + self.pb.setRange(0, self.lender) self.pb.setValue(0) layout = QVBoxLayout() @@ -108,10 +111,16 @@ class AutoDialog(QDialog): self.thread_1.progressBarValue.connect(self.handleProgressBarSingal) self.thread_1.listValue.connect(self.handleListWidgetSingal) self.thread_1.endsignal.connect(self.handleEndsignalSignal) + self.time_start = time.time() # save start time def handleProgressBarSingal(self, i): self.pb.setValue(i) + # calculate time left of auto labeling + avg_time = (time.time() - self.time_start) / i # Use average time to prevent time fluctuations + time_left = str(datetime.timedelta(seconds=avg_time * (self.lender - i))) + self.setWindowTitle("PPOCRLabel -- " + f"Time Left: {time_left}") # show + def handleListWidgetSingal(self, i): self.listWidget.addItem(i) titem = self.listWidget.item(self.listWidget.count() - 1) From a519d4ddbd6da648cc5c3376f3eb6d00dd6ffac5 Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Wed, 19 Jan 2022 11:00:43 +0800 Subject: [PATCH 7/9] [ time left ] remove microseconds --- PPOCRLabel/libs/autoDialog.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PPOCRLabel/libs/autoDialog.py b/PPOCRLabel/libs/autoDialog.py index c26bc75995..189a590de8 100644 --- a/PPOCRLabel/libs/autoDialog.py +++ b/PPOCRLabel/libs/autoDialog.py @@ -118,7 +118,7 @@ class AutoDialog(QDialog): # calculate time left of auto labeling avg_time = (time.time() - self.time_start) / i # Use average time to prevent time fluctuations - time_left = str(datetime.timedelta(seconds=avg_time * (self.lender - i))) + time_left = str(datetime.timedelta(seconds=avg_time * (self.lender - i))).split(".")[0] # Remove microseconds self.setWindowTitle("PPOCRLabel -- " + f"Time Left: {time_left}") # show def handleListWidgetSingal(self, i): From a32e7ce77e5823f0764b84ec04079fc13037736e Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Wed, 19 Jan 2022 11:11:30 +0800 Subject: [PATCH 8/9] FIXED: process rotateImgAction after autoRecognition without any click on file list will raise A ERROR : array out of index --- PPOCRLabel/PPOCRLabel.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PPOCRLabel/PPOCRLabel.py b/PPOCRLabel/PPOCRLabel.py index e3ecc1af00..80a2c82bcc 100644 --- a/PPOCRLabel/PPOCRLabel.py +++ b/PPOCRLabel/PPOCRLabel.py @@ -1922,7 +1922,7 @@ class MainWindow(QMainWindow, WindowMixin): uncheckedList = [i for i in self.mImgList if i not in self.fileStatedict.keys()] self.autoDialog = AutoDialog(parent=self, ocr=self.ocr, mImgList=uncheckedList, lenbar=len(uncheckedList)) self.autoDialog.popUp() - self.currIndex=len(self.mImgList) + self.currIndex = len(self.mImgList) - 1 self.loadFile(self.filePath) # ADD self.haveAutoReced = True self.AutoRecognition.setEnabled(False) From fb8fadcda720175f2beb5137d12f311259be31e7 Mon Sep 17 00:00:00 2001 From: HinGwenWoong Date: Wed, 19 Jan 2022 17:35:53 +0800 Subject: [PATCH 9/9] Optimize short cut: Using [Alt+X] to delect the box --- PPOCRLabel/PPOCRLabel.py | 2 +- PPOCRLabel/README.md | 2 +- PPOCRLabel/README_ch.md | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/PPOCRLabel/PPOCRLabel.py b/PPOCRLabel/PPOCRLabel.py index 80a2c82bcc..3ee5eb6045 100644 --- a/PPOCRLabel/PPOCRLabel.py +++ b/PPOCRLabel/PPOCRLabel.py @@ -397,7 +397,7 @@ class MainWindow(QMainWindow, WindowMixin): 'w', 'objects', getStr('crtBoxDetail'), enabled=False) delete = action(getStr('delBox'), self.deleteSelectedShape, - 'Ctrl+T', 'delete', getStr('delBoxDetail'), enabled=False) + 'Alt+X', 'delete', getStr('delBoxDetail'), enabled=False) copy = action(getStr('dupBox'), self.copySelectedShape, 'Ctrl+C', 'copy', getStr('dupBoxDetail'), diff --git a/PPOCRLabel/README.md b/PPOCRLabel/README.md index 04f0d19469..10bfa4699d 100644 --- a/PPOCRLabel/README.md +++ b/PPOCRLabel/README.md @@ -151,7 +151,7 @@ python PPOCRLabel.py | Ctrl + R | Re-recognize the selected box | | Ctrl + C | Copy and paste the selected box | | Ctrl + Left Mouse Button | Multi select the label box | -| Ctrl+T | Delete the selected box | +| Ctrl + X | Delete the selected box | | Ctrl + V | Check image | | Ctrl + Shift + d | Delete image | | D | Next image | diff --git a/PPOCRLabel/README_ch.md b/PPOCRLabel/README_ch.md index 7e77bdb997..03e1b2da2e 100644 --- a/PPOCRLabel/README_ch.md +++ b/PPOCRLabel/README_ch.md @@ -131,16 +131,16 @@ python PPOCRLabel.py --lang ch ### 3.1 快捷键 -| 快捷键 | 说明 | -| ---------------- | ---------------------------- | +| 快捷键 | 说明 | +|------------------| ---------------------------- | | Ctrl + shift + R | 对当前图片的所有标记重新识别 | | W | 新建矩形框 | | Q | 新建四点框 | | Ctrl + E | 编辑所选框标签 | | Ctrl + R | 重新识别所选标记 | | Ctrl + C | 复制并粘贴选中的标记框 | -| Ctrl + 鼠标左键 | 多选标记框 | -| Ctrl+T | 删除所选框 | +| Ctrl + 鼠标左键 | 多选标记框 | +| Ctrl + X | 删除所选框 | | Ctrl + V | 确认本张图片标记 | | Ctrl + Shift + d | 删除本张图片 | | D | 下一张图片 |