使用了几天,发现网上相关的资料竟然没有,自己摸索写下来记录过程
声明我是Ubuntu 22.04 LTS用户,没错,22年4月发布的最新版本的,警告!不要用这么新的版本,不然坑就在前面等着你
安装的话如果你不是我这个环境,非常容易,下面的命令就能直接安装成功
pip install labelme
当然,我这个环境只能用anaconda安装了,网上这种教程很多,这里就贴一下anacoda的下载地址https://www.anaconda.com/,官网上安装的教程非常可靠!!!!
conda install labelme
当你进入了labelme 5.0.1,作为一个中文软件用户,当然是要用中文界面,网上搜不到干货,自己动手,这个代码在这个路径下/home/mac/anaconda3/lib/python3.9/site-packages/labelme/app.py这里的mac是我的用户名,windows用户的话区找你的ananconda安装目录,代码修改如下:
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("取消"),
self.canvas.undoLastPoint,
shortcuts["undo_last_point"],
"undo",
self.tr("Undo last drawn point"),
enabled=False,
)
removePoint = action(
text="删除选定点",
slot=self.removeSelectedPoint,
shortcut=shortcuts["remove_selected_point"],
icon="edit",
tip="Remove selected point from polygon",
enabled=False,
)
undo = action(
self.tr("撤销"),
self.undoShapeEdit,
shortcuts["undo"],
"undo",
self.tr("Undo last add and edit of shape"),
enabled=False,
)
hideAll = action(
self.tr("隐藏多边形"),
functools.partial(self.togglePolygons, False),
icon="eye",
tip=self.tr("Hide all polygons"),
enabled=False,
)
showAll = action(
self.tr("显示多边形"),
functools.partial(self.togglePolygons, True),
icon="eye",
tip=self.tr("Show all polygons"),
enabled=False,
)
help = action(
self.tr("&Tutorial"),
self.tutorial,
icon="help",
tip=self.tr("Show tutorial page"),
)
zoom = QtWidgets.QWidgetAction(self)
zoom.setDefaultWidget(self.zoomWidget)
self.zoomWidget.setWhatsThis(
str(
self.tr(
"Zoom in or out of the image. Also accessible with "
"{} and {} from the canvas."
)
).format(
utils.fmtShortcut(
"{},{}".format(shortcuts["zoom_in"], shortcuts["zoom_out"])
),
utils.fmtShortcut(self.tr("Ctrl+Wheel")),
)
)
self.zoomWidget.setEnabled(False)
zoomIn = action(
self.tr("放大"),
functools.partial(self.addZoom, 1.1),
shortcuts["zoom_in"],
"zoom-in",
self.tr("Increase zoom level"),
enabled=False,
)
zoomOut = action(
self.tr("缩小"),
functools.partial(self.addZoom, 0.9),
shortcuts["zoom_out"],
"zoom-out",
self.tr("Decrease zoom level"),
enabled=False,
)
zoomOrg = action(
self.tr("原尺寸"),
functools.partial(self.setZoom, 100),
shortcuts["zoom_to_original"],
"zoom",
self.tr("Zoom to original size"),
enabled=False,
)
keepPrevScale = action(
self.tr("保持以前的比例"),
self.enableKeepPrevScale,
tip=self.tr("Keep previous zoom scale"),
checkable=True,
checked=self._config["keep_prev_scale"],
enabled=True,
)
fitWindow = action(
self.tr("匹配窗口"),
self.setFitWindow,
shortcuts["fit_window"],
"fit-window",
self.tr("Zoom follows window size"),
checkable=True,
enabled=False,
)
fitWidth = action(
self.tr("缩放比例"),
self.setFitWidth,
shortcuts["fit_width"],
"fit-width",
self.tr("Zoom follows window width"),
checkable=True,
enabled=False,
)
brightnessContrast = action(
"亮度对比度调节",
self.brightnessContrast,
None,
"color",
"Adjust brightness and contrast",
enabled=False,
)
# Group zoom controls into a list for easier toggling.
zoomActions = (
self.zoomWidget,
zoomIn,
zoomOut,
zoomOrg,
fitWindow,
fitWidth,
)
self.zoomMode = self.FIT_WINDOW
fitWindow.setChecked(Qt.Checked)
self.scalers = {
self.FIT_WINDOW: self.scaleFitWindow,
self.FIT_WIDTH: self.scaleFitWidth,
# Set to one to scale to 100% when loading files.
self.MANUAL_ZOOM: lambda: 1,
}
edit = action(
self.tr("编辑标签"),
self.editLabel,
shortcuts["edit_label"],
"edit",
self.tr("Modify the label of the selected polygon"),
enabled=False,
)
fill_drawing = action(
self.tr("填充多边形"),
self.canvas.setFillDrawing,
None,
"color",
self.tr("Fill polygon while drawing"),
checkable=True,
enabled=True,
)
fill_drawing.trigger()
# Lavel list context menu.
labelMenu = QtWidgets.QMenu()
utils.addActions(labelMenu, (edit, delete))
self.labelList.setContextMenuPolicy(Qt.CustomContextMenu)
self.labelList.customContextMenuRequested.connect(
self.popLabelListMenu
)
# Store actions for further handling.
self.actions = utils.struct(
saveAuto=saveAuto,
saveWithImageData=saveWithImageData,
changeOutputDir=changeOutputDir,
save=save,
saveAs=saveAs,
open=open_,
close=close,
deleteFile=deleteFile,
toggleKeepPrevMode=toggle_keep_prev_mode,
delete=delete,
edit=edit,
duplicate=duplicate,
copy=copy,
paste=paste,
undoLastPoint=undoLastPoint,
undo=undo,
removePoint=removePoint,
createMode=createMode,
editMode=editMode,
createRectangleMode=createRectangleMode,
createCircleMode=createCircleMode,
createLineMode=createLineMode,
createPointMode=createPointMode,
createLineStripMode=createLineStripMode,
zoom=zoom,
zoomIn=zoomIn,
zoomOut=zoomOut,
zoomOrg=zoomOrg,
keepPrevScale=keepPrevScale,
fitWindow=fitWindow,
fitWidth=fitWidth,
brightnessContrast=brightnessContrast,
zoomActions=zoomActions,
openNextImg=openNextImg,
openPrevImg=openPrevImg,
fileMenuActions=(open_, opendir, save, saveAs, close, quit),
tool=(),
# XXX: need to add some actions here to activate the shortcut
editMenu=(
edit,
duplicate,
delete,
None,
undo,
undoLastPoint,
None,
removePoint,
None,
toggle_keep_prev_mode,
),
# menu shown at right click
menu=(
createMode,
createRectangleMode,
createCircleMode,
createLineMode,
createPointMode,
createLineStripMode,
editMode,
edit,
duplicate,
copy,
paste,
delete,
undo,
undoLastPoint,
removePoint,
),
onLoadActive=(
close,
createMode,
createRectangleMode,
createCircleMode,
createLineMode,
createPointMode,
createLineStripMode,
editMode,
brightnessContrast,
),
onShapesPresent=(saveAs, hideAll, showAll),
)
self.canvas.vertexSelected.connect(self.actions.removePoint.setEnabled)
self.menus = utils.struct(
file=self.menu(self.tr("文件")),
edit=self.menu(self.tr("编辑")),
view=self.menu(self.tr("查看")),
help=self.menu(self.tr("帮助")),
recentFiles=QtWidgets.QMenu(self.tr("打开最近")),
labelList=labelMenu,
)
版权声明:本文为cenbug原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。