labelme与labelimg快捷键自定义配置修改完全指南
2026/9/17 2:19:58 网站建设 项目流程

1. 写在前面:为什么非改不可?

做目标检测、图像分割的朋友,十有八九都用过 labelme 或者 labelimg。两个工具都是标注圈的老面孔,labelme 偏向多边形分割标注,labelimg 偏向矩形框检测标注。我用 labelme 的时间差不多有五年,从最早的 Windows 版本一路用到现在的 Anaconda 环境,中间还给团队配过统一的标注规范。说句实在话,工具本身很能打,但默认快捷键一直是我的心结。

默认策略其实很常规:D切下一张、A切上一张、Ctrl+S保存、W绘制多边形、Ctrl+Z撤回、Ctrl+Shift+Z重做。看起来没毛病,可一旦你一天标注几百张图,或者是团队里多人共用一台标注机器,问题马上就来了。每个人的肌肉记忆不一样,有人习惯E是下一张,有人习惯Space是下一张,还有人想把标注完自动跳转和快捷键联动起来。对这些需求,UI 设置面板里一个都找不到。

我最早也以为这功能得改源码才能实现,后来翻配置文件才发现,labelme 的快捷键映射其实写在一个 YAML 文件里。改起来不难,麻烦的是网上的教程特别零散,有的还停留在老版本路径,照着操作一半就卡住了。更气人的是,labelimg 和 labelme 虽然出自同一套设计思路,配置文件格式却不完全一样,网上经常有人混着讲,照着改完根本不生效。

这篇文章我打算一次性讲清楚三件事:快捷键配置到底藏在哪、怎么改才能生效、以及改坏了怎么恢复。labelme 为主,labelimg 的相关差异我会单独拎出来说明,因为这两者我都实际改过,踩过的坑应该能帮你少走很多弯路。

2. 配置文件定位与备份策略

2.1 不同系统下的配置文件位置

先说 labelme。从 4.x 版本开始,labelme 的快捷键配置不再写在源码里,而是放到用户目录下的配置文件中。具体路径取决于你的操作系统:

  • Windows:C:\Users\你的用户名\.labelmerc
  • Linux:~/.labelmerc
  • macOS:~/.labelmerc

如果你用的是 Anaconda 或者虚拟环境安装的 labelme,路径仍然是这样,不会变成虚拟环境目录下的路径。这一点很多人容易搞混,我一开始也以为配置会跟随环境走,实际测试下来,labelme 读取配置的优先级是:当前目录下的.labelmerc优先于用户目录下的.labelmerc,如果两个地方都没有,就全部用内置默认值。

这里有个很容易被忽略的细节:labelme 启动时会检查当前工作目录里有没有.labelmerc。如果你经常在项目目录里手动激活环境并启动命令,那配置文件可能根本不在用户目录,而是在你启动命令时所在的目录里。建议你分别在两个位置检查一下,别只盯着用户目录。

再说 labelimg。labelimg 的快捷键配置路径和 labelme 不一样。如果你用的是 GitHub 上的开源版本,配置逻辑完全写在libs/settings.py和主窗口的keyPressEvent事件里。也就是说,想改快捷键就得直接改源代码。如果你用的是打包好的 exe 版本或者通过 pip 安装的版本,就得找到安装路径下的libs目录来修改。

我自己实测过的场景是:Anaconda 环境下用 pip 安装 labelimg,安装路径一般在你的虚拟环境目录下,形如C:\Users\用户名\anaconda3\envs\标注环境名\Lib\site-packages\labelimg。修改前最好先确认这个路径存在。

2.2 动手前的必要备份

改配置这种操作,看似只是改几个字母,但真改出问题来也挺头疼。我吃过一次亏:当时为了测试不同的快捷键组合,改完没有备份,结果整个工具栏的快捷键全乱了,只能卸载重装。后来我养成了习惯,每次修改前先备份,而且备份文件会留 2 到 3 个版本,防止改到最后想回退却找不到原始配置。

备份很简单,复制一份原文件就行。Windows 下推荐重命名为.labelmerc.backup,Linux 下也一样。如果后续你从网上找到其他用户分享的配置文件,建议不要直接覆盖,而是先对比一下格式,确认没有额外字段再替换,避免因为版本不兼容导致启动报错。

提示:配置文件的编码格式推荐保存为 UTF-8 无 BOM。如果你用 Windows 自带的记事本修改并保存,可能会默认存成带 BOM 的格式,某些情况下 labelme 会解析报错。我遇到过两次,表现是启动后快捷键全部失灵,控制台报 Unicode 解码错误。后来改用 VS Code 或 Notepad++ 保存,问题就没了。

2.3 labelme 与 labelimg 配置机制差异速查

我整理了一张表,方便你快速知道两者的区别:

对比项labelmelabelimg
配置文件位置用户目录~/.labelmerc,或当前目录.labelmerc无独立配置文件,需修改源码libs/目录
配置格式YAML 键值对Python 字典 + 事件绑定
启动时读取方式自动读取,无需重启环境每次修改后需重启程序,有时需重编译
修改难度低,直接改文本中,需要找到对应代码位置
是否支持热加载不支持,需重启程序不支持,需重启程序
出错后果解析失败会回退默认值,或报错退出缩进写错直接无法启动

看完这张表你应该明白了,labelme 的改动思路是“改配置”,labelimg 的改动思路是“改代码”。下面我分两部分详细说,先讲最常用、最省事的 labelme。

3. labelme 快捷键配置文件逐行拆解

3.1 认识.labelmerc里的核心字段

打开.labelmerc文件,你会看到一堆看起来有点懵的字段。我这边用一段标注了关键部分的示例来解释,这是我在实际项目中改过的配置,参数都验证过可用:

auto_save: false display_label_popup: true store_data: true keep_prev: false keep_prev_scale: false keep_prev_brightness: false keep_prev_size: false zoom_in: "i" zoom_out: "u" zoom_to_original: "0" open_next_image: "d" open_prev_image: "a" save: "Ctrl+S" create_mode: "w" edit_mode: "Ctrl+J" delete: "Delete" undo: "Ctrl+Z" redo: "Ctrl+Y"

先看核心操作字段:

  • open_next_image:切换到下一张图,默认是d,我建议改成eSpace,看个人习惯。
  • open_prev_image:切换到上一张图,默认是a,我建议改成q,让左右手操作更顺手。
  • create_mode:进入绘制模式,默认是w,这个一般不用改。
  • edit_mode:进入编辑模式,默认是Ctrl+J。注意,如果你把编辑模式的快捷键改成和绘制模式相同,程序不会报错,但两个模式会互相冲突,我测试过,结果是鼠标点击时行为异常。
  • undoredo:默认Ctrl+ZCtrl+Y。有些用户习惯用Ctrl+Shift+Z做重做,可以改,但要确认和系统或其他软件的快捷键不冲突。

需要说明的是,auto_save不属于快捷键,但它是标注流程中影响效率的隐藏密码。如果改成true,每画完一个多边形都会自动保存标注文件,不用再手动按Ctrl+S。这个功能我强烈建议开启,缺点是如果画错了想撤销并恢复到上一次保存的状态,难度会大一些,所以建议在确认标注规范后再开启。

3.2 修改快捷键时的语义陷阱

改配置看似简单,但我发现很多人在这一步会卡住,原因在于对“字段语义”理解不透。我举两个例子:

第一,create_modeedit_mode的快捷键不是全局的。也就是说,当程序处于某个状态时,你按下的键可能不会立即触发对应功能。我在测试中发现,如果当前模式是“创建多边形”,按下w(同样映射到 create_mode)不会重新激活创建工具,必须先用鼠标点一下工具栏里的图标,或者按下edit_mode再切回来,状态刷新后才正常。这不是 bug,只是 GUI 状态机的一种常见设计,但如果你不懂这一点,很容易误判为“改配置无效”。

第二,按键值大小写敏感。"D""d"在配置里是两回事。labelme 对按键事件的处理逻辑是:先匹配键盘事件中的 key 值,再匹配修饰键组合。如果你在配置里写了"D",实际上需要按Shift+D才能触发。很多人改完发现没反应,检查了半天才发现是把小写字母写成了大写。我自己的做法统一用小写字母,除非我主动设置"Ctrl+D"这样的组合键。

第三,不要用中文输入法状态下配置快捷键。这一点非常坑。如果你在键盘切换成中文输入法时按下了某个键,labelme 收到的 key 值可能不是你期望的。我自己在 Windows 上遇到过,配置里是"a",但输入法处于全角模式时,按下按键后 labelme 没任何反应。所以使用标注工具时,建议把系统输入法默认切换成英文模式,或者用工具锁定英文状态。

3.3 一个实测可用的效率配置方案

分享一套我目前用的配置,适合每天要标注大量图片的场景:

auto_save: true display_label_popup: false store_data: true keep_prev: false keep_prev_scale: false keep_prev_brightness: false keep_prev_size: false zoom_in: "i" zoom_out: "u" zoom_to_original: "0" open_next_image: "e" open_prev_image: "q" save: "Ctrl+S" create_mode: "w" edit_mode: "Ctrl+J" delete: "Delete" undo: "Ctrl+Z" redo: "Ctrl+Y"

这套配置的核心思路是:把翻图操作移到键盘左侧,让左手负责翻图,右手负责鼠标绘制。eq分别是下一张和上一张,配合w绘制模式,一天标注几百张图也不会觉得手酸。我把display_label_popup关了,这样画完多边形不会每次都弹出标签输入框,而是直接沿用上一次的标签,效率提升很明显。缺点是需要你确认类别顺序稳定,不然容易标错标签。

4. labelme 改快捷键的完整实操步骤

4.1 第一步:找到并备份配置文件

在命令行或者文件管理器里进入用户目录,找到.labelmerc。如果找不到这个文件,说明你还没启动过一次 labelme,或者软件版本较老。我的建议是随便打开一张图片,进入标注界面正常使用一下,然后退出,再去查看配置文件是否生成。

确认文件存在后,复制一份作为备份:

cp ~/.labelmerc ~/.labelmerc.backup

Windows 用户可以在 PowerShell 里执行:

Copy-Item $HOME\.labelmerc $HOME\.labelmerc.backup

备份完成后,再用 VS Code 或 Notepad++ 打开.labelmerc

4.2 第二步:修改快捷键映射

假设你要把“下一张”从d改成e,把“上一张”从a改成q,把“撤销”从Ctrl+Z改成Ctrl+Shift+Z(如果你更习惯这套组合)。只需要修改对应的字段:

open_next_image: "e" open_prev_image: "q" undo: "Ctrl+Shift+Z"

修改完成保存后,重启 labelme。这一步必须重启,配置只在程序启动时加载一次。

4.3 第三步:验证修改是否生效

重启后,先按一下新设置的快捷键,看是否执行对应操作。我建议分三步验证:

  1. 直接按单键快捷键,观察底部状态栏是否有提示。
  2. 按组合键,如Ctrl+Shift+Z,观察是否触发撤销功能。
  3. 测试create_modeedit_mode切换后,再按其他快捷键,确认没有出现“按了没反应”或者“触发错功能”的情况。

如果你发现快捷键不生效,可以打开命令行窗口,用调试模式启动 labelme,看看有没有报错信息:

labelme --debug

或者直接看终端输出,YAML 格式错误时通常会在启动阶段打印解析异常,比如这样:yaml.parser.ParserError: while parsing a block mapping。看到这种提示,基本可以确定是配置文件格式问题。

4.4 常见配置错误与恢复方法

我总结了一张速查表,覆盖了最常见的几种情况:

错误现象可能原因解决方案
启动崩溃,提示 YAML 解析错误配置文件缺少字段或缩进错误用备份文件恢复,或者删除.labelmerc重新生成
快捷键按了没反应大小写写错、键值不合法检查键值是否全小写,组合键是否带引号
所有快捷键全部失效输入法干扰、配置文件被改坏切换英文输入法,恢复备份配置
翻图快捷键变成了输入字母全角输入状态切换成英文半角模式再试
打开 labelme 后工具栏消失了配置里误改了某些 UI 字段对比默认配置,只保留快捷键相关字段

这里特别提一个容易被忽略的恢复技巧:如果你不知道默认配置长什么样,最简单的方法是删除.labelmerc,然后重新启动 labelme。程序检测到配置文件不存在时,会自动用内置默认值生成一份新的。这个方法比手动改回字段要快得多,也是我屡试不爽的“后悔药”。

5. labelimg 快捷键修改完全指南

5.1 找到 labelimg 源码位置

labelimg 没有独立的配置文件,要修改快捷键,必须找到源码目录。根据安装方式不同,路径差异很大。

如果你用的是 pip 安装,可以通过下面的 Python 命令定位安装路径:

python -c "import labelimg; print(labelimg.__file__)"

如果输出的是/path/to/site-packages/labelimg/__init__.py,那么源码目录就在这个文件的上一级。Windows 下典型路径是:

C:\Users\用户名\anaconda3\envs\标注环境\Lib\site-packages\labelimg\

如果你是从 GitHub 下载的源码包,目录就是解压后的文件夹,比如labelImg-master。这种源码版改起来比 pip 安装版更直观,因为所有文件都在明面上。

5.2 在libs/settings.py中调整快捷键

labelimg 的快捷键绑定主要分散在两个地方:libs/settings.py负责定义默认快捷键字典,主窗口文件(通常是labelImg.py)负责处理键盘事件。settings.py里会有类似下面的代码:

DEFAULT_SHORTCUTS = { 'open': 'Ctrl+O', 'open_dir': 'Ctrl+U', 'next_image': 'D', 'prev_image': 'A', 'save': 'Ctrl+S', 'create_box': 'W', 'delete_box': 'Delete', 'undo': 'Ctrl+Z', }

想改哪个键,直接修改对应字符串就行。把'next_image': 'D'改成'next_image': 'E',然后保存文件,重新运行 labelimg,快捷键就变了。

需要特别小心的是,在labelImg.py里,某些快捷键的处理逻辑没有读取settings.py,而是硬编码在keyPressEvent里。比如我遇到过Ctrl+Z的撤回功能就单独写死在事件处理函数中,光是改settings.py根本不生效。这种问题的排查方法是:搜索keyPressEvent,看里面是否有if key == Qt.Key_Z and modifiers == Qt.ControlModifier之类的语句,如果有,就要同步修改。

5.3 适配不同系统的 Qt 按键写法

labelimg 基于 PyQt 或 PySide,快捷键字符串的写法必须遵循 Qt 的格式,否则会静默失败。举个例子:

  • 单键:'D''d',大小写含义不同。
  • 组合键:'Ctrl+S''Ctrl+Shift+Z',注意修饰键顺序不是关键,但拼写不能错。
  • 功能键:'Delete''Return''Space',不能写成'Del''Enter',除非 Qt 版本支持别名。

如果你改了之后仍然没反应,可以打开 labelimg 的调试输出,看看键盘事件到底收到了什么键值。一个快速判断方法是:在keyPressEvent里临时加一行print(event.key(), event.modifiers()),然后点击图片窗口并按目标按键,观察终端打印结果。我之前就是靠这个办法定位到了一个非常隐蔽的问题:某个版本下,方向键的 key 值被系统拦截,导致next_image即使绑定了Right也无法触发。

5.4 labelimg 修改后的常见坑

labelimg 的一个特殊之处在于,它可能同时存在多个副本。比如你同时安装了 pip 版和源码版,启动命令labelimg默认调用的是环境变量 PATH 里先找到的那个。这种情况下,你改了源码版的文件,但运行的是 pip 版,自然不生效。

解决办法是确认当前运行的是哪个版本。在 Python 环境里执行:

labelimg --help

看看启动欢迎信息或者定位到的路径。如果显示的是 site-packages 路径,说明改对了地方;如果显示的是其他路径,就要切换到对应目录修改。

还有一个非常常见的坑是文件权限。Windows 下 site-packages 里的文件可能被系统保护,直接编辑保存会提示权限不足。建议以管理员身份打开编辑器,或者先复制一份到桌面,改好后再复制回去。我遇到过保存后仍然没变化的情况,最后发现是系统缓存了旧文件,重启了几次才生效。

6. 高级技巧:自定义快捷键组合联动标注流程

6.1 如何实现“标注完自动跳转下一张”

很多标注团队都有这样一个需求:画完一个目标后,自动跳转到下一张图,省去手动按翻页键的步骤。这个功能在 labelme 和 labelimg 里都没有现成开关,但可以通过调整配置和操作习惯变相实现,甚至可以直接改源码。

先说 labelme 的曲线实现思路。由于 labelme 的keep_prev字段控制“保持上一次标注内容”,当你的标注对象在连续图片里位置不变时,开启keep_prev: true可以复制上一张的标注。但如果你需要的是“画完即切图”,就得改代码,或者通过auto_save: true配合一个外部脚本监控文件夹,检测到新.json文件生成后,自动控制程序切换图片。这种方式有点糙,但对不改代码的人来说算是个替代方案。

再说 labelimg 的源码实现。在labelImg.py中,你可以找到“保存并下一张”的触发逻辑。实现思路很简单:在保存动作完成后,主动调用切换到下一张图片的方法。关键代码大概是这样:

def save_next(self): self.save_file() self.open_next_image()

然后在键盘事件里,把某个快捷键绑定到这个新方法上:

if key == Qt.Key_E and modifiers == Qt.ControlModifier: self.save_next()

这样按下Ctrl+E,就能实现“保存当前标注并跳到下一张”,整个流程行云流水。不过改这种源码的前提是,你要对 PyQt 的信号槽机制有一点基本了解,不然改错了容易报错。

6.2 批量改键:用脚本统一替换键值

如果你需要给团队里的每台机器统一快捷键配置,手动一个个改太费时间。我的做法是写一个简单脚本,自动完成备份、替换、校验三步。

以 labelme 为例,Python 脚本可以这样写:

import os import shutil home = os.path.expanduser("~") config_path = os.path.join(home, ".labelmerc") backup_path = config_path + ".backup" if not os.path.exists(backup_path): shutil.copy2(config_path, backup_path) with open(config_path, "r", encoding="utf-8") as f: content = f.read() content = content.replace('open_next_image: "d"', 'open_next_image: "e"') content = content.replace('open_prev_image: "a"', 'open_prev_image: "q"') with open(config_path, "w", encoding="utf-8") as f: f.write(content) print("快捷键配置已更新")

这个脚本有几个细节值得注意:

  1. 备份只做一次,如果备份已存在,就不重复覆盖,防止把原始默认配置弄丢。
  2. 替换用的是精确匹配的字符串替换,不会误伤其他字段。
  3. 保存时指定了 UTF-8 编码,避免 Windows 下出现编码问题。

对于 labelimg,也可以用类似思路,但就要改成对settings.py的内容做字符串替换。如果你不熟悉 Python,只做 labelme 的配置批量替换就够了,团队协作场景下这个脚本能省不少事。

6.3 输出快捷键速查表,减少团队沟通成本

配置改完了,还要让团队里的人都知道。我习惯在每次调整快捷键后,生成一份 Markdown 格式的速查表,放在项目仓库里。

比如这样:

| 功能 | 快捷键 | 说明 | | --- | --- | --- | | 下一张 | E | 左手食指,高频操作 | | 上一张 | Q | 左手无名指,与 E 配合 | | 绘制多边形 | W | 进入创建模式 | | 保存 | Ctrl+S | 手动保存标注 | | 撤销 | Ctrl+Z | 撤回上一步操作 | | 重做 | Ctrl+Shift+Z | 恢复撤销操作 |

这份速查表我一般会同步更新到团队的知识库中,避免新同事来了还要自己摸索。如果你是用 labelimg 的团队,也可以做一份类似的,放在源码目录的README.md里,方便接手的人一眼看懂。

7. 常见问题与排查技巧实录

7.1 改了配置为什么不生效?

这个问题我见得太多了,且大多数时候不是配置本身的问题,而是启动环境不对。我总结过几个优先排查的方向:

第一,看启动方式。如果你是在 Anaconda 的某个环境里启动 labelme,而配置文件修改的是另一个环境下的用户目录,那当然不会生效。虽然前面说过 labelme 的配置统一放用户目录,但如果你用源码方式运行,配置读取规则会有所不同,甚至会遇到源码目录下自带的.labelmerc优先于用户目录的情况。排查时可以检查当前启动目录下是否存在该文件。

第二,看程序是否完全重启。labelme 的配置只在启动时加载一次,如果你只是关闭了标注窗口但没有退出主程序,重新打开的窗口仍然沿用旧配置。建议彻底退出程序,再重新启动。

第三,看版本差异。我遇到过用户在 3.x 版本上测试,发现配置文件名根本不叫.labelmerc,而是.labelmerc.yaml之类的变体。不同版本的命名规则有差异,如果你找不到文件,建议直接去 GitHub 仓库的 README 里看对应版本的使用说明。

7.2 修改 labelimg 后无法启动怎么办?

labelimg 改源码后无法启动的原因通常集中在 Python 语法错误和 Qt 类型错误上。遇到这种情况,不要慌,先在命令行里运行程序,看具体的报错信息。

常见的报错是:

TabError: inconsistent use of tabs and spaces in indentation

说明你在修改代码时混用了 tab 和空格,Python 对缩进极其敏感,遇到这种报错只能手动把相关代码行的缩进统一成空格。我建议用 VS Code 打开文件,开启“显示空格”功能,一眼就能看到问题。

另一类报错是:

AttributeError: 'MainWindow' object has no attribute 'save_next'

意思是说你在键盘事件里调用了self.save_next(),但类里根本没有定义这个方法。解决办法是在主窗口类里补一个方法,方法内容可以直接复制现有的保存和翻页逻辑,或者直接调用已有的两个方法。

7.3 如何避免把快捷键改成系统冲突键?

自定义快捷键最怕什么?最怕和你正在使用的其他软件冲突。比如你把 labelme 的“下一张”设置成Ctrl+D,那么在浏览器里可能是“收藏网址”的快捷键,导致你标注中途切出窗口时误触。

我的建议是:

  1. 尽量用不常见的单键,如EQZX,避开Ctrl+CCtrl+V这种全局通用组合。
  2. 如果一定要用组合键,优先考虑Ctrl+Shift开头的组合,冲突概率比Ctrl+Alt低。
  3. 设置完快捷键后,在程序窗口里逐项测试,确认没有“按下后弹出了系统对话框”的情况。

另外,如果你用的是远程桌面或者虚拟机,还要注意宿主机和虚拟机之间的快捷键拦截问题。我在 VMware 里用 labelme 时,发现某些按键(比如Ctrl+Alt组合)会被宿主机拦截,导致虚拟机里的标注工具收不到事件。这种情况下,建议改用单键或Ctrl+Shift组合。

7.4 团队协作时如何统一快捷键?

如果你是团队里负责标注规范的人,统一快捷键这件事不要靠口头通知,而是要靠配置文件 + 文档双管齐下。

我的做法是:在项目仓库里维护一份.labelmerc模板文件,任何新成员入场时,直接拷贝到自己的用户目录即可。模板里我会写好注释,说明每个字段的意义。虽然 YAML 默认不支持注释太多,但少量注释完全没问题。同时在仓库的docs/快捷键说明.md文档里写明修改方法和注意事项。

对于 labelimg 团队,统一快捷键更麻烦一点,因为要每个人修改本地源码。我目前的做法是写一个setup_shortcuts.py脚本,自动定位 labelimg 安装路径并替换键值。这样团队里每个人只要跑一遍脚本就能同步快捷键配置,省去手动改代码的麻烦。

8. 实操心得与最终建议

做标注工具配置这件事,说难不难,说简单也不简单,关键在于对“配置加载机制”的理解。经过这些年的实践,我最大的体会是:不要一上来就追求花哨的快捷键组合,先把手上最高频的三个操作调到最顺手的状态,其余慢慢调整。我自己的顺序是:翻图、保存、撤销,这三个用得最多,改好之后效率至少能提升三成。

另一个建议是,无论是 labelme 还是 labelimg,改造之前一定先备份。这句话听起来像废话,但每一次翻车都出在没备份上。一个.backup文件不占空间,却能在关键时刻救你一次。

如果你用的是 labelme 4.5 以上版本,我特别推荐把auto_save开启,再配好顺手翻图键,基本能做到“打开图片、画框、一切自动完成”的半自动化体验。这个组合我用了一年多,每天能比之前多标注 50 到 80 张图片,而且出错率明显下降。

最后再分享一个小技巧:如果你经常需要标注视频抽帧或者连续序列图片,建议在绑定快捷键时,把上一张和下一张设置为QE,把绘制键设为W,这样三个键连成一条斜线,左手食指和中指可以轮流操作,食指主要负责翻图,中指负责进入绘制模式,整体手感非常舒服。这个小改动对提升连续标注效率帮助很大,你可以亲自试试看。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询