diff --git a/PPOCRLabel/PPOCRLabel.py b/PPOCRLabel/PPOCRLabel.py index 98e2b1ef77f6fb63b49cd8d32ca87d3d783daf50..3ee5eb60450be0c806316f70dea9b8d4c5f31503 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() @@ -178,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) @@ -394,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) + 'Alt+X', 'delete', getStr('delBoxDetail'), enabled=False) copy = action(getStr('dupBox'), self.copySelectedShape, 'Ctrl+C', 'copy', getStr('dupBoxDetail'), @@ -1388,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 @@ -1596,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: @@ -1790,7 +1801,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): @@ -1908,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) @@ -2089,8 +2103,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): diff --git a/PPOCRLabel/README.md b/PPOCRLabel/README.md index e8634ef8c06feae1f0adffb22c5694084dab78cd..10bfa4699d0141c94131a7cb5b4860f7a1edd03f 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 + 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 e1c391bc8637baa4adfa8852d805ed0f4bf04d6d..03e1b2da2eac7c71f029ce612a89fb4e8ccae993 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 + 鼠标左键 | 多选标记框 | -| Backspace | 删除所选框 | +| Ctrl + 鼠标左键 | 多选标记框 | +| Ctrl + X | 删除所选框 | | Ctrl + V | 确认本张图片标记 | | Ctrl + Shift + d | 删除本张图片 | | D | 下一张图片 | diff --git a/PPOCRLabel/libs/autoDialog.py b/PPOCRLabel/libs/autoDialog.py index 3374e92cc587baa7e8bab5c7d8e8dc34eb6366b6..189a590de851228e08d71f1dd2c00c823b9c2b0c 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))).split(".")[0] # Remove microseconds + 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)