由于之前做了一期labelme的教程,但是汉化部分的代码有误,于是在这里贴出完整的app.py代码
# -*- coding: utf-8 -*-
import functools
import math
import os
import os.path as osp
import re
import webbrowser
import imgviz
import natsort
from qtpy import QtCore
from qtpy.QtCore import Qt
from qtpy import QtGui
from qtpy import QtWidgets
from labelme import __appname__
from labelme import PY2
from . import utils
from labelme.config import get_config
from labelme.label_file import LabelFile
from labelme.label_file import LabelFileError
from labelme.logger import logger
from labelme.shape import Shape
from labelme.widgets import BrightnessContrastDialog
from labelme.widgets import Canvas
from labelme.widgets import FileDialogPreview
from labelme.widgets import LabelDialog
from labelme.widgets import LabelListWidget
from labelme.widgets import LabelListWidgetItem
from labelme.widgets import ToolBar
from labelme.widgets import UniqueLabelQListWidget
from labelme.widgets import ZoomWidget
# FIXME
# - [medium] Set max zoom value to something big enough for FitWidth/Window
# TODO(unknown):
# - Zoom is too "steppy".
LABEL_COLORMAP = imgviz.label_colormap()
class MainWindow(QtWidgets.QMainWindow):
FIT_WINDOW, FIT_WIDTH, MANUAL_ZOOM = 0, 1, 2
def __init__(
self,
config=None,
filename=None,
output=None,
output_file=None,
output_dir=None,
):
if output is not None:
logger.warning(
"argument output is deprecated, use output_file instead"
)
if output_file is None:
output_file = output
# see labelme/config/default_config.yaml for valid configuration
if config is None:
config = get_config()
self._config = config
# set default shape colors
Shape.line_color = QtGui.QColor(*self._config["shape"]["line_color"])
Shape.fill_color = QtGui.QColor(*self._config["shape"]["fill_color"])
Shape.select_line_color = QtGui.QColor(
*self._config["shape"]["select_line_color"]
)
Shape.select_fill_color = QtGui.QColor(
*self._config["shape"]["select_fill_color"]
)
Shape.vertex_fill_color = QtGui.QColor(
*self._config["shape"]["vertex_fill_color"]
)
Shape.hvertex_fill_color = QtGui.QColor(
*self._config["shape"]["hvertex_fill_color"]
)
# Set point size from config file
Shape.point_size = self._config["shape"]["point_size"]
super(MainWindow, self).__init__()
self.setWindowTitle(__appname__)
# Whether we need to save or not.
self.dirty = False
self._noSelectionSlot = False
self._copied_shapes = None
# Main widgets and related state.
self.labelDialog = LabelDialog(
parent=self,
labels=self._config["labels"],
sort_labels=self._config["sort_labels"],
show_text_field=self._config["show_label_text_field"],
completion=self._config["label_completion"],
fit_to_content=self._config["fit_to_content"],
flags=self._config["label_flags"],
)
self.labelList = LabelListWidget()
self.lastOpenDir = None
self.flag_dock = self.flag_widget = None
self.flag_dock = QtWidgets.QDockWidget(self.tr("分类标签"), self)
self.flag_dock.setObjectName("Flags")
self.flag_widget = QtWidgets.QListWidget()
if config["flags"]:
self.loadFlags({k: False for k in config["flags"]})
self.flag_dock.setWidget(self.flag_widget)
self.flag_widget.itemChanged.connect(self.setDirty)
self.labelList.itemSelectionChanged.connect(self.labelSelectionChanged)
self.labelList.itemDoubleClicked.connect(self.editLabel)
self.labelList.itemChanged.connect(self.labelItemChanged)
self.labelList.itemDropped.connect(self.labelOrderChanged)
self.shape_dock = QtWidgets.QDockWidget(
self.tr("标注列表"), self
)
self.shape_dock.setObjectName("Labels")
self.shape_dock.setWidget(self.labelList)
self.uniqLabelList = UniqueLabelQListWidget()
self.uniqLabelList.setToolTip(
self.tr(
"Select label to start annotating for it. "
"Press 'Esc' to deselect."
)
)
if self._config["labels"]:
for label in self._config["labels"]:
item = self.uniqLabelList.createItemFromLabel(label)
self.uniqLabelList.addItem(item)
rgb = self._get_rgb_by_label(label)
self.uniqLabelList.setItemLabel(item, label, rgb)
self.label_dock = QtWidgets.QDockWidget(self.tr("分割标签"), self)
self.label_dock.setObjectName("Label List")
self.label_dock.setWidget(self.uniqLabelList)
self.fileSearch = QtWidgets.QLineEdit()
self.fileSearch.setPlaceholderText(self.tr("Search Filename"))
self.fileSearch.textChanged.connect(self.fileSearchChanged)
self.fileListWidget = QtWidgets.QListWidget()
self.fileListWidget.itemSelectionChanged.connect(
self.fileSelectionChanged
)
fileListLayout = QtWidgets.QVBoxLayout()
fileListLayout.setContentsMargins(0, 0, 0, 0)
fileListLayout.setSpacing(0)
fileListLayout.addWidget(self.fileSearch)
fileListLayout.addWidget(self.fileListWidget)
self.file_dock = QtWidgets.QDockWidget(self.tr("文件列表"), self)
self.file_dock.setObjectName("Files")
fileListWidget = QtWidgets.QWidget()
fileListWidget.setLayout(fileListLayout)
self.file_dock.setWidget(fileListWidget)
self.zoomWidget = ZoomWidget()
self.setAcceptDrops(True)
self.canvas = self.labelList.canvas = Canvas(
epsilon=self._config["epsilon"],
double_click=self._config["canvas"]["double_click"],
num_backups=self._config["canvas"]["num_backups"],
)
self.canvas.zoomRequest.connect(self.zoomRequest)
scrollArea = QtWidgets.QScrollArea()
scrollArea.setWidget(self.canvas)
scrollArea.setWidgetResizable(True)
self.scrollBars = {
Qt.Vertical: scrollArea.verticalScrollBar(),
Qt.Horizontal: scrollArea.horizontalScrollBar(),
}
self.canvas.scrollRequest.connect(self.scrollRequest)
self.canvas.newShape.connect(self.newShape)
self.canvas.shapeMoved.connect(self.setDirty)
self.canvas.selectionChanged.connect(self.shapeSelectionChanged)
self.canvas.drawingPolygon.connect(self.toggleDrawingSensitive)
self.setCentralWidget(scrollArea)
features = QtWidgets.QDockWidget.DockWidgetFeatures()
for dock in ["flag_dock", "label_dock", "shape_dock", "file_dock"]:
if self._config[dock]["closable"]:
features = features | QtWidgets.QDockWidget.DockWidgetClosable
if self._config[dock]["floatable"]:
features = features | QtWidgets.QDockWidget.DockWidgetFloatable
if self._config[dock]["movable"]:
features = features | QtWidgets.QDockWidget.DockWidgetMovable
getattr(self, dock).setFeatures(features)
if self._config[dock]["show"] is False:
getattr(self, dock).setVisible(False)
self.addDockWidget(Qt.RightDockWidgetArea, self.flag_dock)
self.addDockWidget(Qt.RightDockWidgetArea, self.label_dock)
self.addDockWidget(Qt.RightDockWidgetArea, self.shape_dock)
self.addDockWidget(Qt.RightDockWidgetArea, self.file_dock)
# Actions
action = functools.partial(utils.newAction, self)
shortcuts = self._config["shortcuts"]
quit = action(
self.tr("退出"),
self.close,
shortcuts["quit"],
"quit",
self.tr("Quit application"),
)
open_ = action(
self.tr("打开"),
self.openFile,
shortcuts["open"],
"open",
self.tr("Open image or label file"),
)
opendir = action(
self.tr("打开文件夹"),
self.openDirDialog,
shortcuts["open_dir"],
"open",
self.tr("Open Dir"),
)
openNextImg = action(
self.tr("下一张图"),
self.openNextImg,
shortcuts["open_next"],
"next",
self.tr("Open next (hold Ctl+Shift to copy labels)"),
enabled=False,
)
openPrevImg = action(
self.tr("上一张图"),
self.openPrevImg,
shortcuts["open_prev"],
"prev",
self.tr("Open prev (hold Ctl+Shift to copy labels)"),
enabled=False,
)
save = action(
self.tr("保存"),
self.saveFile,
shortcuts["save"],
"save",
self.tr("Save labels to file"),
enabled=False,
)
saveAs = action(
self.tr("另存为"),
self.saveFileAs,
shortcuts["save_as"],
"save-as",
self.tr("Save labels to a different file"),
enabled=False,
)
deleteFile = action(
self.tr("删除文件"),
self.deleteFile,
shortcuts["delete_file"],
"delete",
self.tr("Delete current label file"),
enabled=False,
)
changeOutputDir = action(
self.tr("文件另存为"),
slot=self.changeOutputDirDialog,
shortcut=shortcuts["save_to"],
icon="open",
tip=self.tr("Change where annotations are loaded/saved"),
)
saveAuto = action(
text=self.tr("自动保存"),
slot=lambda x: self.actions.saveAuto.setChecked(x),
icon="save",
tip=self.tr("Save automatically"),
checkable=True,
enabled=True,
)
saveAuto.setChecked(self._config["auto_save"])
saveWithImageData = action(
text="使用图像数据保存",
slot=self.enableSaveImageWithData,
tip="Save image data in label file",
checkable=True,
checked=self._config["store_data"],
)
close = action(
"关闭",
self.closeFile,
shortcuts["close"],
"close",
"Close current file",
)
toggle_keep_prev_mode = action(
self.tr("复制上一张图的标注"),
self.toggleKeepPrevMode,
shortcuts["toggle_keep_prev_mode"],
None,
self.tr('Toggle "keep pevious annotation" mode'),
checkable=True,
)
toggle_keep_prev_mode.setChecked(self._config["keep_prev"])
createMode = action(
self.tr("绘制多边形"),
lambda: self.toggleDrawMode(False, createMode="polygon"),
shortcuts["create_polygon"],
"objects",
self.tr("Start drawing polygons"),
enabled=False,
)
createRectangleMode = action(
self.tr("绘制矩形"),
lambda: self.toggleDrawMode(False, createMode="rectangle"),
shortcuts["create_rectangle"],
"objects",
self.tr("Start drawing rectangles"),
enabled=False,
)
createCircleMode = action(
self.tr("绘制圆形"),
lambda: self.toggleDrawMode(False, createMode="circle"),
shortcuts["create_circle"],
"objects",
self.tr("Start drawing circles"),
enabled=False,
)
createLineMode = action(
self.tr("绘制线条"),
lambda: self.toggleDrawMode(False, createMode="line"),
shortcuts["create_line"],
"objects",
self.tr("Start drawing lines"),
enabled=False,
)
createPointMode = action(
self.tr("绘制点"),
lambda: self.toggleDrawMode(False, createMode="point"),
shortcuts["create_point"],
"objects",
self.tr("Start drawing points"),
enabled=False,
)
createLineStripMode = action(
self.tr("绘制线条带"),
lambda: self.toggleDrawMode(False, createMode="linestrip"),
shortcuts["create_linestrip"],
"objects",
self.tr("Start drawing linestrip. Ctrl+LeftClick ends creation."),
enabled=False,
)
editMode = action(
self.tr("编辑"),
self.setEditMode,
shortcuts["edit_polygon"],
"edit",
self.tr("Move and edit the selected polygons"),
enabled=False,
)
delete = action(
self.tr("删除"),
self.deleteSelectedShape,
shortcuts["delete_polygon"],
"cancel",
self.tr("Delete the selected polygons"),
enabled=False,
)
duplicate = action(
self.tr("重做"),
self.duplicateSelectedShape,
shortcuts["duplicate_polygon"],
"copy",
self.tr("Create a duplicate of the selected polygons"),
enabled=False,
)
copy = action(
self.tr("复制"),
self.copySelectedShape,
shortcuts["copy_polygon"],
"copy_clipboard",
self.tr("Copy selected polygons to clipboard"),
enabled=False,
)
paste = action(
self.tr("粘贴"),
self.pasteSelectedShape,
shortcuts["paste_polygon"],
"paste",
self.tr("Paste copied polygons"),
enabled=False,
)
undoLastPoint = action(
self.tr("取消"),