LabelMe与LabelImg快捷键自定义完全指南:从配置文件到高效标注实战
干了几年数据标注和算法训练LabelMe和LabelImg这两个工具几乎天天捏在手里。LabelMe用来做多边形精细标注LabelImg对付矩形框检测本来各干各的挺顺手但一旦标注量大起来默认快捷键真是能逼疯人。尤其是LabelMe默认的快捷键分布对左手键位一点都不友好频繁切换鼠标和键盘时手一抖就点到别的工具上去了。我后来花了一个晚上把快捷键彻底改了一遍连带着发现LabelImg的改键逻辑和LabelMe几乎一模一样今天就把这套改键经验完整写出来。1. 为什么LabelMe和LabelImg能共用一套改键思路1.1 两个工具其实是同门师兄弟先把这个底层关系讲清楚。LabelMe是MIT开源的项目用PyQt写的后来整理成了labelme这个Python包LabelImg则是基于PyQt5开发的另一款标注工具。两者的图形界面框架都是Qt而且很多交互逻辑是互相借鉴的特别是快捷键这块配置文件的结构几乎同源。我最初以为只能改LabelMe的快捷键改完LabelImg再一看发现它同样是把按键绑定写在一个名为default.yaml的配置文件里里面用Qt的keySequence格式记录快捷键。也就是说只要掌握了LabelMe的修改套路LabelImg踩个脚就到了。1.2 快捷键到底存在哪里很多人第一次找配置文件时会在安装目录下翻半天。我明确告诉大家LabelMe和LabelImg的快捷键配置文件不会放在源码目录里而是放在系统用户目录下的配置文件夹中。在Windows上通常是这个路径C:/Users/你的用户名/.labelmerc这个.labelmerc里其实还引用了default.yaml真正的按键映射是存在一个叫default.yaml的文件里。我第一次找的时候绕了不少弯路后来才摸清楚.labelmerc是主配置里面会指定default.yaml的位置而default.yaml才是快捷键的“总开关”。在Linux和macOS上配置文件路径类似在终端输入echo $HOME就能看到当前用户目录# 查看配置是否存在 ls -la ~/.labelmerc正常安装过LabelMe并运行过一次之后这个文件会自动生成。如果找不到就先打开一次LabelMe再关闭配置文件就会自动落盘。2. 改键之前的准备定位配置、备份好文件2.1 先把配置文件找出来我在Windows 10上实际操作的路径是C:/Users/tsuser/.labelmerc注意如果你用了多用户或者公司电脑做了账号管理路径里的用户名要换成你自己的。最快的定位方式不是去文件资源管理器一层层点而是用命令行python -c import labelme, os; print(os.path.expanduser(~))这个命令会直接打印出当前用户的家目录然后再拼上.labelmerc就是完整路径。顺便说一句很多人在热词里搜“labelimg 不是内部或外部命令”大概率是安装后没有把Python脚本目录加入环境变量定位配置文件和这个问题的排查思路是两回事后面我在常见问题里也会提到。找到.labelmerc后用记事本打开。里面内容不多关键就是下面这行config_file: C:/Users/tsuser/appdata/local/programs/python/python38/lib/site-packages/labelme/config/default_config.yaml这行指向的就是整个工具的默认配置文件默认快捷键全部定义在这里。一定要把default.yaml和default_label.txt这两个文件区分开default_label.txt是你标注时用的类别列表default.yaml才是快捷键和界面参数的集合。2.2 备份是最便宜的后悔药改配置前我一定会做的一步把default.yaml复制一份存成default.yaml.bak。这个操作不是多余因为一旦你手误把某个键位删了或者写错了格式LabelMe启动时会直接报错最典型的就是闪退或提示YAML解析错误。到时候没有备份只能卸载重装类目列表重新配反人类至极。在命令行里执行copy C:/path/to/default_config.yaml C:/path/to/default_config.yaml.bakLinux或者macOS则是cp ~/path/to/default_config.yaml ~/path/to/default_config.yaml.bak备份好了之后开始改键前心里完全不慌改坏了回滚一行命令的事。3. 亲手把快捷键改掉核心实操3.1 读懂default.yaml的键位映射用文本编辑器打开default.yaml你会看到类似下面这样的结构# create a label create: label: Create Polygons shortcut: CtrlN tip: Create a new label # edit the label edit: label: Edit Polygons shortcut: CtrlJ tip: Edit a label # delete delete: label: Delete Polygons shortcut: CtrlD tip: Delete a label save: label: Save shortcut: CtrlS tip: Save labels next_image: label: Next Image shortcut: D tip: Go to next image这个格式非常直观每一组都对应一个操作命令操作命令下面的shortcut就是按键绑定。以create为例默认快捷键是CtrlN如果你觉得不舒服直接改成别的组合键即可。注意这里有个细节Qt的keySequence解析规则里字母键默认是不区分大小写的但如果你同时写“ShiftP”那就代表大写P。比如你写CtrlShiftP它会严格匹配三个键的组合。写错一个字母或者用了中文输入法下的冒号都会导致整个配置文件读取失败。我改键的核心原则是高频操作尽量用单键且放在左手能触及的位置中频操作使用Ctrl组合键低频操作使用CtrlShift组合键。千万别把两个重要操作绑到同一个键上否则Qt只会响应最后一个匹配到的动作。3.2 把“保存”改成CtrlS的完整操作很多人刚用LabelMe时最不习惯的一件事就是默认的保存不是CtrlS。LabelMe默认绑定的是CtrlS已经算是合理的但有些人习惯连续标注完直接按CtrlS此时就要确认default.yaml里的save下面的shortcut确实是save: label: Save shortcut: CtrlS tip: Save annotations如果发现被改成了别的组合直接改成CtrlS保存配置后重启LabelMe即可。但这里有个坑我要特意提醒LabelMe有好几个“保存”相关的操作比如save_file、save_auto在default.yaml里可能不叫save而是叫save_file或类似字段。建议全局搜索关键词“save”把所有出现shortcut:的地方都过一遍别漏掉。LabelImg这边的配置路径相似LabelImg的default.yaml中保存相关的字段一般是save: shortcut: CtrlS如果你用LabelImg时发现CtrlS没反应八成是配置文件里被写成了Ctrls或者被某个中文输入法状态拦截了。3.3 一整套适合日常标注的键位方案我基于自己的标注习惯整理了一套键位方案不一定适合所有人但可以当参考直接抄作业也完全没问题。我的核心操作流程是选工具 → 画框/画多边形 → 填标签 → 保存 → 下一张。每一步都要尽量缩短手指移动距离。功能原默认键我的改法理由创建多边形/画框CtrlNW极高频操作单键W最顺手避开误触编辑多边形CtrlJE和W紧挨画完立马切编辑修点删除选中的标注CtrlDDelete删除键单按最直观不容易混保存标注CtrlSCtrlS保持惯例肌肉记忆下一张图DSpace继续标注时右手鼠标不动左手敲空格最顺上一张图ABackspace回退审查离保存区近复制选中标注CtrlCCtrlC复杂多边形复制再微调效率极高粘贴标注CtrlVCtrlV搭配复制使用撤销CtrlZCtrlZ不改改错时最顺手缩放Ctrl滚轮Alt滚轮避免和操作系统快捷键冲突注意这个表格里我特意把polygon的创建改成W之后在中文输入法激活状态下按W是输入字母不是触发快捷键。所以标注过程中一定要保证输入法处于英文模式或者直接在LabelMe设置里把“强制英文模式”打开。LabelImg也有类似情况中文输入法开着的时候所有字母单键快捷键都会失灵。把方案写入default.yaml时格式要保持原样对齐。比如我改一处就只改一行create: label: Create Polygons shortcut: W tip: Create a new label改完后保存文件重新启动LabelMe。启动后先按W画一个多边形试试能画就说明生效了。4. 改完踩坑排雷常见问题速查4.1 改完没有生效的几种原因这个问题我遇到太多次了也帮同事排查过不少次归纳起来大概有四种情况第一种是改错文件。不少人改的是labelme安装包里的default_config.yaml但.labelmerc里指定的路径可能是另一个site-packages下的副本。如果你pip安装过多个Python版本的labelme或者conda和pip混装很容易指向错的文件。判断方法很简单打开.labelmerc看它引用的具体路径再把default.yaml的实际内容打开看一遍两边对一下就知道改没改对地方。第二种是缓存。Qt程序有时会缓存配置文件修改后不会立即读取。重启软件不行的话就把整个配置文件夹下的缓存文件清掉比如.labelme_cache目录如果存在就删掉。第三种是文件保存格式问题。Windows自带记事本另存为时如果选了带BOM的UTF-8格式PyYAML解析时可能会出错或者忽略最后一个键值。建议使用VS Code、Notepad或者Sublime Text这类工具保存时选择UTF-8无BOM。第四种是被全局输入法或系统快捷键拦截。比如你设了Ctrl空格结果这正好是Windows切换输入法的快捷键Qt界面根本收不到按键事件。这就要和系统快捷键错开。下面直接给一个排查表现象可能原因解决办法改完全部配置重启后全部快捷键没反应修改的文件不是配置引用的文件修改.labelmerc指向的文件部分快捷键没反应键位冲突或系统拦截更换为不冲突的组合键启动时闪退YAML格式错误用编辑器检查格式回滚备份字母键没反应输入法处于中文状态切到英文输入法保存功能失效配置里save字段写错搜索save相关字段逐一排查4.2 键位冲突怎么排查Qt本身对重复绑定的策略不是报错而是后读取的覆盖先读取的。也就是说如果default.yaml里有两个命令都绑了W显示上不会报任何问题但实际按下W时只有后声明的那条命令生效另一条变成休眠。排查冲突没有特别聪明的办法就是平时留意哪些键按了没反应。我习惯是每次改完配置后把所有自定义过的键都按一遍过一遍完整流程大概也就五分钟。如果时间特别紧最稳妥的做法是使用组合键因为两个按键同时被占用的概率远远低于单个字母键。另外还要留意LabelMe和LabelImg的默认配置里空格键有时绑定的不是“下一张”而是“缩放”或“移动”。我自己踩过把D改成空格后原来默认配置里有个隐藏的space快捷键没有卸载导致按空格既切换图片又触发部分编辑器状态画面变得很鬼畜。所以改键前一定先全局搜索一下你要设的目标按键看有没有被别的地方占用了。4.3 路径、命名等隐藏细节含LabelImg的差异LabelImg的配置机制和LabelMe大体相同但有个重要区别默认的配置文件名不一定是default.yaml有可能是settings.xml。这就引出一个常见的困惑很多人用notepad打开settings.xml发现格式完全不同不知道在哪改快捷键。settings.xml里改快捷键的方式是这样的shortcut namesave valueCtrlS/要改就直接改value属性的值。同样地修改前备份修改后重启。LabelImg比较懒经常不会自动创建settings.xml首次启动后要手动保存一次偏好设置才会生成。如果你找不到这个文件可以先随便改一下界面语言之类设置保存退出后再去用户目录找。路径方面还有个细节LabelImg如果在无权限的目录下安装配置文件可能被重定向到AppData下不是常规用户目录。命令终端里输入echo %APPDATA%能快速找到真实目录。搜“labelimg闪退”的人里不少就是配置文件权限问题导致的负载失败。LabelMe和LabelImg在类别列表上的配置也不一样。LabelMe用的是default_label.txt改快捷键跟它没关系。LabelImg则是用predefined_classes.txt。这两个文件不要乱动不小心清空会导致标注时完全没有类别可选这也是新手常遇到的怪问题。5. 顺手再调教一下的工具细节5.1 设置项里那些和效率直接相关的开关改完快捷键其实只做了一半的事。就算再好用的快捷键如果基础设置不对效率照样起不来。我把几个和标注效率直接相关的设置项列出来这些和快捷键配合起来才是完整的标注提速方案。第一个是自动保存。LabelMe里开启自动保存后标注完一张切到下一张时自动落盘即使中途崩溃也不怕丢数据。在default.yaml里找到一个类似auto_save的字段改成true即可。LabelImg的自动保存放在了偏好设置对话框里勾选即可。这个功能一定得开标注过程和写代码一样拼的就是防崩溃能力。第二个是标签自动填充。LabelMe可以设置在画完多边形后弹出标签输入框时默认填入上一次用过的标签。如果整个数据集类别只有那几类这个设置能省掉大量重复输入。前提是你的确定义在default_label.txt里并且名字完全一致一个字符都不能差。我第一次用的时候以为label的名字会自动补全结果打错了一个字母后来的统计脚本全部对不上返工到崩溃。第三个是自定义类别列表。LabelMe用的是default_label.txtLabelImg用的是predefined_classes.txt。这两类文件每行一个类别名或者在LabelMe里用__ignore__、_background_这种特殊标记控制标注逻辑。文件改完之后标注界面里类别下拉框就会有对应选项比手动一个个点“新建类别”快得多。5.2 三个提升标注效率的小习惯配置调完之后真正拉开效率差距的是日常操作习惯。我这里分享三个自己坚持了很久的小习惯。第一个是规范命名标注文件。LabelMe默认标注文件和图片同名后缀是.json。建议始终保持这个默认规则因为LabelMe后续的转换脚本比如labelme_json_to_dataset就是基于同名匹配来找图片和标注的。手动改名后转换脚本识别不到关联图片会输出一堆错误。LabelImg的VOC格式虽然是把标注写到同名xml里但改名后也要人工检查关联关系。第二个是把常用类目固定在最上面。在default_label.txt里把最常标的类目写在文件开头标注时下拉框默认往往停在第一项这么调完基本不用动下拉列表。尤其在连续几百张图都是同一个类别的情况下效率提升非常直观。第三个是配合脚本做批量检查。快捷键改好了配置稳了最后还缺一个批量自检的手段。我写了一个不到三十行的小脚本用os.walk递归遍历标注目录下的所有.json或xml文件检查标签类目是否都存在于预设类别列表里用这个做一轮“体检”比手动抽查靠谱得多。import os import json label_set set() with open(default_label.txt, r, encodingutf-8) as f: for line in f: line line.strip() if line: label_set.add(line) root_dir annotations error_count 0 for dirpath, _, filenames in os.walk(root_dir): for name in filenames: if not name.endswith(.json): continue fp os.path.join(dirpath, name) with open(fp, r, encodingutf-8) as f: data json.load(f) for shape in data.get(shapes, []): if shape[label] not in label_set: print(f未知标签: {fp} - {shape[label]}) error_count 1 print(f检查完成共发现 {error_count} 处问题)长话短说吧LabelMe和LabelImg的快捷键配置其实没有多深奥核心就两步找到default.yaml或settings.xml改对对应字段。但就是这两步能做到“顺手指”和“不冲突”确实需要一点时间调试。你要是标注量不大用默认键也能凑合要是跟我一样天天跟几千张图打交道这套修改方案值得花一晚上彻底配好。毕竟工具趁手了后面所有环节都跟着省时间。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →