ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

labelme与labelimg快捷键自定义配置修改完全指南

labelme与labelimg快捷键自定义配置修改完全指南 1. 写在前面为什么非改不可做目标检测、图像分割的朋友十有八九都用过 labelme 或者 labelimg。两个工具都是标注圈的老面孔labelme 偏向多边形分割标注labelimg 偏向矩形框检测标注。我用 labelme 的时间差不多有五年从最早的 Windows 版本一路用到现在的 Anaconda 环境中间还给团队配过统一的标注规范。说句实在话工具本身很能打但默认快捷键一直是我的心结。默认策略其实很常规D切下一张、A切上一张、CtrlS保存、W绘制多边形、CtrlZ撤回、CtrlShiftZ重做。看起来没毛病可一旦你一天标注几百张图或者是团队里多人共用一台标注机器问题马上就来了。每个人的肌肉记忆不一样有人习惯E是下一张有人习惯Space是下一张还有人想把标注完自动跳转和快捷键联动起来。对这些需求UI 设置面板里一个都找不到。我最早也以为这功能得改源码才能实现后来翻配置文件才发现labelme 的快捷键映射其实写在一个 YAML 文件里。改起来不难麻烦的是网上的教程特别零散有的还停留在老版本路径照着操作一半就卡住了。更气人的是labelimg 和 labelme 虽然出自同一套设计思路配置文件格式却不完全一样网上经常有人混着讲照着改完根本不生效。这篇文章我打算一次性讲清楚三件事快捷键配置到底藏在哪、怎么改才能生效、以及改坏了怎么恢复。labelme 为主labelimg 的相关差异我会单独拎出来说明因为这两者我都实际改过踩过的坑应该能帮你少走很多弯路。2. 配置文件定位与备份策略2.1 不同系统下的配置文件位置先说 labelme。从 4.x 版本开始labelme 的快捷键配置不再写在源码里而是放到用户目录下的配置文件中。具体路径取决于你的操作系统WindowsC:\Users\你的用户名\.labelmercLinux~/.labelmercmacOS~/.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.backupLinux 下也一样。如果后续你从网上找到其他用户分享的配置文件建议不要直接覆盖而是先对比一下格式确认没有额外字段再替换避免因为版本不兼容导致启动报错。提示配置文件的编码格式推荐保存为 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: CtrlS create_mode: w edit_mode: CtrlJ delete: Delete undo: CtrlZ redo: CtrlY先看核心操作字段open_next_image切换到下一张图默认是d我建议改成e或Space看个人习惯。open_prev_image切换到上一张图默认是a我建议改成q让左右手操作更顺手。create_mode进入绘制模式默认是w这个一般不用改。edit_mode进入编辑模式默认是CtrlJ。注意如果你把编辑模式的快捷键改成和绘制模式相同程序不会报错但两个模式会互相冲突我测试过结果是鼠标点击时行为异常。undo和redo默认CtrlZ和CtrlY。有些用户习惯用CtrlShiftZ做重做可以改但要确认和系统或其他软件的快捷键不冲突。需要说明的是auto_save不属于快捷键但它是标注流程中影响效率的隐藏密码。如果改成true每画完一个多边形都会自动保存标注文件不用再手动按CtrlS。这个功能我强烈建议开启缺点是如果画错了想撤销并恢复到上一次保存的状态难度会大一些所以建议在确认标注规范后再开启。3.2 修改快捷键时的语义陷阱改配置看似简单但我发现很多人在这一步会卡住原因在于对“字段语义”理解不透。我举两个例子第一create_mode和edit_mode的快捷键不是全局的。也就是说当程序处于某个状态时你按下的键可能不会立即触发对应功能。我在测试中发现如果当前模式是“创建多边形”按下w同样映射到 create_mode不会重新激活创建工具必须先用鼠标点一下工具栏里的图标或者按下edit_mode再切回来状态刷新后才正常。这不是 bug只是 GUI 状态机的一种常见设计但如果你不懂这一点很容易误判为“改配置无效”。第二按键值大小写敏感。D和d在配置里是两回事。labelme 对按键事件的处理逻辑是先匹配键盘事件中的 key 值再匹配修饰键组合。如果你在配置里写了D实际上需要按ShiftD才能触发。很多人改完发现没反应检查了半天才发现是把小写字母写成了大写。我自己的做法统一用小写字母除非我主动设置CtrlD这样的组合键。第三不要用中文输入法状态下配置快捷键。这一点非常坑。如果你在键盘切换成中文输入法时按下了某个键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: CtrlS create_mode: w edit_mode: CtrlJ delete: Delete undo: CtrlZ redo: CtrlY这套配置的核心思路是把翻图操作移到键盘左侧让左手负责翻图右手负责鼠标绘制。e和q分别是下一张和上一张配合w绘制模式一天标注几百张图也不会觉得手酸。我把display_label_popup关了这样画完多边形不会每次都弹出标签输入框而是直接沿用上一次的标签效率提升很明显。缺点是需要你确认类别顺序稳定不然容易标错标签。4. labelme 改快捷键的完整实操步骤4.1 第一步找到并备份配置文件在命令行或者文件管理器里进入用户目录找到.labelmerc。如果找不到这个文件说明你还没启动过一次 labelme或者软件版本较老。我的建议是随便打开一张图片进入标注界面正常使用一下然后退出再去查看配置文件是否生成。确认文件存在后复制一份作为备份cp ~/.labelmerc ~/.labelmerc.backupWindows 用户可以在 PowerShell 里执行Copy-Item $HOME\.labelmerc $HOME\.labelmerc.backup备份完成后再用 VS Code 或 Notepad 打开.labelmerc。4.2 第二步修改快捷键映射假设你要把“下一张”从d改成e把“上一张”从a改成q把“撤销”从CtrlZ改成CtrlShiftZ如果你更习惯这套组合。只需要修改对应的字段open_next_image: e open_prev_image: q undo: CtrlShiftZ修改完成保存后重启 labelme。这一步必须重启配置只在程序启动时加载一次。4.3 第三步验证修改是否生效重启后先按一下新设置的快捷键看是否执行对应操作。我建议分三步验证直接按单键快捷键观察底部状态栏是否有提示。按组合键如CtrlShiftZ观察是否触发撤销功能。测试create_mode和edit_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: CtrlO, open_dir: CtrlU, next_image: D, prev_image: A, save: CtrlS, create_box: W, delete_box: Delete, undo: CtrlZ, }想改哪个键直接修改对应字符串就行。把next_image: D改成next_image: E然后保存文件重新运行 labelimg快捷键就变了。需要特别小心的是在labelImg.py里某些快捷键的处理逻辑没有读取settings.py而是硬编码在keyPressEvent里。比如我遇到过CtrlZ的撤回功能就单独写死在事件处理函数中光是改settings.py根本不生效。这种问题的排查方法是搜索keyPressEvent看里面是否有if key Qt.Key_Z and modifiers Qt.ControlModifier之类的语句如果有就要同步修改。5.3 适配不同系统的 Qt 按键写法labelimg 基于 PyQt 或 PySide快捷键字符串的写法必须遵循 Qt 的格式否则会静默失败。举个例子单键D或d大小写含义不同。组合键CtrlS、CtrlShiftZ注意修饰键顺序不是关键但拼写不能错。功能键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()这样按下CtrlE就能实现“保存当前标注并跳到下一张”整个流程行云流水。不过改这种源码的前提是你要对 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, encodingutf-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, encodingutf-8) as f: f.write(content) print(快捷键配置已更新)这个脚本有几个细节值得注意备份只做一次如果备份已存在就不重复覆盖防止把原始默认配置弄丢。替换用的是精确匹配的字符串替换不会误伤其他字段。保存时指定了 UTF-8 编码避免 Windows 下出现编码问题。对于 labelimg也可以用类似思路但就要改成对settings.py的内容做字符串替换。如果你不熟悉 Python只做 labelme 的配置批量替换就够了团队协作场景下这个脚本能省不少事。6.3 输出快捷键速查表减少团队沟通成本配置改完了还要让团队里的人都知道。我习惯在每次调整快捷键后生成一份 Markdown 格式的速查表放在项目仓库里。比如这样| 功能 | 快捷键 | 说明 | | --- | --- | --- | | 下一张 | E | 左手食指高频操作 | | 上一张 | Q | 左手无名指与 E 配合 | | 绘制多边形 | W | 进入创建模式 | | 保存 | CtrlS | 手动保存标注 | | 撤销 | CtrlZ | 撤回上一步操作 | | 重做 | CtrlShiftZ | 恢复撤销操作 |这份速查表我一般会同步更新到团队的知识库中避免新同事来了还要自己摸索。如果你是用 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 的“下一张”设置成CtrlD那么在浏览器里可能是“收藏网址”的快捷键导致你标注中途切出窗口时误触。我的建议是尽量用不常见的单键如E、Q、Z、X避开CtrlC、CtrlV这种全局通用组合。如果一定要用组合键优先考虑CtrlShift开头的组合冲突概率比CtrlAlt低。设置完快捷键后在程序窗口里逐项测试确认没有“按下后弹出了系统对话框”的情况。另外如果你用的是远程桌面或者虚拟机还要注意宿主机和虚拟机之间的快捷键拦截问题。我在 VMware 里用 labelme 时发现某些按键比如CtrlAlt组合会被宿主机拦截导致虚拟机里的标注工具收不到事件。这种情况下建议改用单键或CtrlShift组合。7.4 团队协作时如何统一快捷键如果你是团队里负责标注规范的人统一快捷键这件事不要靠口头通知而是要靠配置文件 文档双管齐下。我的做法是在项目仓库里维护一份.labelmerc模板文件任何新成员入场时直接拷贝到自己的用户目录即可。模板里我会写好注释说明每个字段的意义。虽然 YAML 默认不支持注释太多但少量注释完全没问题。同时在仓库的docs/快捷键说明.md文档里写明修改方法和注意事项。对于 labelimg 团队统一快捷键更麻烦一点因为要每个人修改本地源码。我目前的做法是写一个setup_shortcuts.py脚本自动定位 labelimg 安装路径并替换键值。这样团队里每个人只要跑一遍脚本就能同步快捷键配置省去手动改代码的麻烦。8. 实操心得与最终建议做标注工具配置这件事说难不难说简单也不简单关键在于对“配置加载机制”的理解。经过这些年的实践我最大的体会是不要一上来就追求花哨的快捷键组合先把手上最高频的三个操作调到最顺手的状态其余慢慢调整。我自己的顺序是翻图、保存、撤销这三个用得最多改好之后效率至少能提升三成。另一个建议是无论是 labelme 还是 labelimg改造之前一定先备份。这句话听起来像废话但每一次翻车都出在没备份上。一个.backup文件不占空间却能在关键时刻救你一次。如果你用的是 labelme 4.5 以上版本我特别推荐把auto_save开启再配好顺手翻图键基本能做到“打开图片、画框、一切自动完成”的半自动化体验。这个组合我用了一年多每天能比之前多标注 50 到 80 张图片而且出错率明显下降。最后再分享一个小技巧如果你经常需要标注视频抽帧或者连续序列图片建议在绑定快捷键时把上一张和下一张设置为Q和E把绘制键设为W这样三个键连成一条斜线左手食指和中指可以轮流操作食指主要负责翻图中指负责进入绘制模式整体手感非常舒服。这个小改动对提升连续标注效率帮助很大你可以亲自试试看。
返回列表