
做机器视觉项目的人第一道坎往往不是模型选型而是数据标注。但凡你接触过目标检测、语义分割或者实例分割就一定绕不开两个名字labelme和labelImg。我在社区里被问过太多次“这两个标注工具到底该用哪个”甚至很多人会把labelImg误写成lableImg把labelme记成labelim一搜资料就更乱。这篇文章就直接把这两款工具从定位、安装、实操、格式转换到常见坑完完整整做一次对比顺便把我在实际项目中同时用它们的经验一并写出来。无论你是准备入行机器视觉的新手还是已经带项目但一直被标注环节拖后腿的工程师这篇都能帮你少踩几个坑。1. 干机器视觉为什么绕不开标注工具1.1 标注环节决定模型效果上限很多人第一次训练模型时往往急着调参、换骨干网络结果模型精度上不去折腾半天才发现问题出在标注数据上。圈内有一句话garbage ingarbage out——喂给模型的标注是脏的、乱的、不一致的模型就算再强也学不出干净的特征。机器视觉项目的标准流程里数据采集之后紧跟着就是数据清洗和标注标注产出直接决定后续训练、评估、迭代的效率。而标注工具的选择又直接决定了标注效率和数据格式。工具选对了几百张图可能一天就能标完工具选错了光是在格式转换和坐标对齐上就能耗掉两三天。labelme和labelImg之所以被经常摆在一起比较是因为它们几乎是目前开源工具里使用率最高的两个但它们的定位差异很大一个服务于分割类任务一个服务于检测类任务。搞清楚它们的差异你才能真正知道自己适合哪一个。1.2 阅读本文你能获得什么这篇对比不是简单罗列功能而是会拆到“为什么会有这样的差异”“实际标注中怎么操作最顺”“标注完之后数据怎么处理”这些层面。我会把两个工具的安装步骤、标注流程、快捷键、输出格式、格式转换脚本、常见报错和选型建议全部整理出来。我自己在多个机器视觉项目里同时用过这两个工具检测任务用labelImg画框分割任务用labelme画多边形中间也踩过不少坑比如路径编码问题、JSON 文件解析失败、YOLO 格式坐标不对齐等等这些真实经验会一并分享。所以这不是一篇只讲“哪个好”的软文而是一篇能直接照着操作的手册。2. labelme 和 labelImg核心差别与技术定位2.1 labelme为“分割”而生的多边形标注工具先说labelme。它由 MIT 开源协议发布底层基于 Python 和 PyQt 开发核心能力是多边形Polygon标注。也就是说你可以沿着图像中目标的边缘一个点一个点地描出来最终生成一个任意形状的闭合区域而不是简单的矩形框。这种标注方式天然适合语义分割、实例分割任务比如医疗影像里的器官轮廓、工业缺陷里的划痕、道路场景里的车辆与行人轮廓。我在实际项目里最常用labelme的场景是玻璃划痕检测。玻璃上的划痕是不规则条状你用矩形框去框会把大量正常区域也框进去模型训练时很容易被干扰而用labelme沿着划痕边缘描几圈多边形标注出来的掩码就非常干净模型能学到真正属于“缺陷”的像素。这是矩形框做不到的。labelme除了画多边形还支持矩形框、圆形、点、线等标注类型满足不同任务的特殊需求。它的输出是 JSON 文件里面不仅保存了标注对象的坐标还会记录图像尺寸、标签名称、标注类型等信息。要注意的是labelme保存的 JSON 中含有imageData字段默认会把原始图片以 base64 编码存进去好处是单文件自包含换电脑不丢图坏处是文件特别大一张高分辨率图可能产生几十 MB 的 JSON。2.2 labelImg目标检测界的矩形框老将再来看labelImg。它的拼写容易被误写成lableImg但正确写法是labelImg由开发者 Tzutalin 长期维护核心功能就是矩形框Bounding Box标注。它的历史很长早期版本基于 Python 2.7 和 Qt4后来逐步升级到 Python 3 和 Qt5提供的安装包里也有一些资源比较旧的版本需要额外处理。它广泛用于目标检测任务也就是用矩形框把目标框出来然后标记类别名称。labelImg的输出格式默认是PASCAL VOC 格式的 XML 文件同时它也内置了 YOLO 格式的切换选项可以直接导出 YOLO 训练需要的 txt 文件。因此在 YOLO 系列模型成为目标检测主流之后labelImg依然长期霸榜因为它的工作流和 YOLO 的输入格式衔接太顺了。在界面和使用逻辑上labelImg比labelme更轻量、更直白打开图片目录、画框、输入类别、保存非常符合“快速产出”的需求。如果你只是做常规目标检测不希望标完还要做格式转换那labelImg会节省很多时间。2.3 一张表说清两者差别对比维度labelmelabelImg技术栈Python PyQtPython/PyQt另有 C 编译版主要标注类型多边形、矩形、点、线、圆矩形框典型任务语义分割、实例分割、姿态估计、像素级缺陷检测目标检测矩形框检测输出格式JSON含坐标、形状类型、imageDataPASCAL VOC XML / YOLO txt单文件自包含是JSON 内嵌 base64 图片否XML 和图片分开存放快捷键学习成本中等很低开源协议MITMIT格式转换生态官方提供 json_to_dataset、labelme2coco 等社区脚本极多转 YOLO 非常方便适合团队协作适合单文件便于分发需要保持图片目录同步维护活跃度较活跃版本迭代较快基本稳定更新频率低这张表基本能看出两个工具的定位完全不同。labelme更像是“像素级标注工作台”强调标注形状的任意性和数据自包含labelImg则是“检测框快速标注器”强调操作效率和输出格式的直接可用性。2.4 底层设计差异带来的连锁影响两个工具的差异不仅体现在标注形状上更体现在后续数据处理的链条上。labelme因为输出 JSON且每个目标可以是一个任意多边形所以它可以天然支持多实例分割。同一张图里出现多个缺陷、多个人物、多个物体时每个目标都会对应一条独立的shapes记录后续转换成 COCO 格式时每个多边形就是一个annotation的segmentation字段。COCO 格式是目前实例分割模型比如 Mask R-CNN、YOLOv8-seg最常用的数据格式因此labelme在这条生态里的位置非常稳固。labelImg输出 XML 后社区有大量脚本把 XML 转成 YOLO 的 txt 文件而 YOLO 训练时的 txt 格式要求每行是class x_center y_center width height像素/图宽和像素/图高的归一化结果。labelImg虽然内置了 YOLO 模式但实际操作中往往还需要配置类别文件、检查坐标是否越界这些细节我会在后面的实操部分展开。正因为底层设计不同你在选工具之前应该先想清楚自己的任务是“检测”还是“分割”。检测用labelImg分割用labelme这是最省心的大原则。如果非要反向使用也不是不行但要额外处理很多格式和精度问题得不偿失。3. 安装与上手实操3.1 labelme 安装与启动labelme的安装非常简单Python 环境齐全的话一条命令就能搞定。但有几个版本需要注意pip install labelme如果你是 Python 3.8 到 3.11 的环境通常能直接装好。如果遇到 PyQt5 依赖报错可以手动补一下pip install pyqt5装完之后在终端或命令行里输入labelme就能启动图形界面。这里建议你用一个独立的虚拟环境避免和项目里已有的opencv、torch依赖打架。虚拟环境操作是基础但很多人恰恰在这步翻车conda create -n labelme python3.9 conda activate labelme pip install labelme labelme启动后会打开一个独立的标注窗口界面很简洁。左侧工具条就是主要的标注入口最常用的是 “Create Polygons” 按钮点击后就可以在画布上逐点点击描出目标轮廓。描完后按回车确认闭合会弹窗让你输入标签名称。这样一次多边形就完成了。labelme的新版本还支持矩形、圆形、线、点等形状直接在 “Edit” 菜单里选择即可。3.2 labelImg 安装与启动labelImg的安装相比之下要复杂一点因为它的分发形态比较多。最省事的方法是直接去官方 GitHub 的 Releases 页面下载 Windows 编译好的压缩包解压后点击labelImg.exe就能运行不需要配置 Python 环境。这个方式对新手特别友好我很多同事就是这么用的。但如果你用的是 Linux 环境或者想确保版本一致那建议源码安装。Linux 下的安装方式大致是这样git clone https://github.com/HumanSignal/labelImg.git cd labelImg pip install pyqt5 lxml pyrcc5 -o libs/resources.py resources.qrc python labelImg.py这里有个容易踩坑的点如果你在终端直接执行pip install labelImg可能会安装到一个比较老的第三方打包版本界面还是 Qt4 时代的样式配 Python 3 环境时容易出现各种兼容问题。所以我不建议用 pip 装 labelImg优先下载官方编译包或源码运行。启动之后界面默认是英文的各类菜单一眼就能看懂。常用的功能在左侧工具栏上都有快捷入口比如打开图片目录、切换 YOLO/XML 格式、编辑预设类别等。如果你用过任何一款图像标注工具上手labelImg基本不需要看教程。3.3 安装环节的典型坑安装阶段最常见的问题有两类版本不匹配和依赖缺失。labelme在 Python 3.12 以上版本偶尔会出现 PyQt5 编译兼容问题因为我实测下来 3.12 的某些子版本会直接报ModuleNotFoundError或OSError这个时候不要死磕换成 Python 3.9 或者 3.10 做虚拟环境往往一秒解决。labelImg的 Windows 编译包有时候会被杀毒软件误报因为部分压缩包内包含了预编译的二进制文件建议从官方 Releases 下载并且留意文件校验信息。如果真的下了第三方打包的版本很可能界面里没有 YOLO 模式切换按钮那基本可以确定是阉割版趁早换。4. 标注流程全记录从打开图片到产出标注文件4.1 labelme 多边形标注实操步骤我自己标玻璃划痕缺陷时完整流程是这样的打开终端激活labelme的虚拟环境输入labelme启动。在菜单栏选择 “Open Dir” 打开存放原始图片的文件夹。在左侧工具栏点击 “Create Polygons”。在图像上沿着目标边缘依次单击鼠标左键添加锚点锚点越多轮廓越精细。描完一个闭合区域后按回车键弹出输入框填写类别名比如scratch。如果一张图里有多个目标重复第 3-5 步。标注完成后按CtrlS保存会生成一个与图片同名的.json文件。实际操作中我会先在菜单栏设置里确认自动保存已经打开避免标完一批图忘记保存导致白干。labelme的自动保存在File - Auto Saving里勾选即可。这个功能在标注大量图片时非常重要省去每张图手动按保存键的时间。4.2 labelImg 矩形框标注实操步骤labelImg的标准流程会更快打开软件点击左侧 “Open Dir” 选择图片目录。点击 “Change Save Dir” 选择标注文件的保存目录一般我会另建一个Annotations文件夹和图片分开。在菜单栏或者左侧选择保存格式PASCAL VOC 或 YOLO。按快捷键W进入画框模式在目标左上角按下鼠标左键拖到右下角松开。弹出标签输入框输入类别名称比如person、car。按D切换到下一张图片继续标注。最后按CtrlS保存 XML 或 txt 文件。如果你事先在data/predefined_classes.txt里配置好了类别那画完框可以直接选择不用每次打字。这个文件需要手动编辑类别名每行一个保存后重启labelImg才能生效。labelImg还有一个非常实用的功能是“自动保存模式”在View - Auto Save mode勾选后每次切换到下一张图时都会自动保存上一张的标注文件基本可以杜绝忘记保存的情况。4.3 标注效率技巧标注工作的核心不是“能标”而是“标得快、标得准”。这里分享几个实际项目里验证过的效率技巧第一先建立统一的类别命名规范。尤其是多人协同时同一个目标你今天叫scratch明天叫defect模型训练时会直接当成两个类别数据就废了。建议项目开始前先列一张类别清单所有人共用一份 predefined_classes 文件或者 labelme 的标签列表。第二合理利用快捷键减少鼠标移动。labelImg里W画框、D下一张、A上一张、CtrlS保存这一套组合一旦肌肉记忆形成标注速度能提升一倍。labelme里也有对应的快捷键比如CtrlZ撤销锚点、CtrlE编辑多边形等熟练了之后效率会明显上升。第三不要把每张图标到极致精细。很多新手描多边形时喜欢把每个像素边缘都描进去实际上对分割模型来说大致贴合边缘就已经够了。过度精细不仅浪费时间而且容易引入标注噪声反而干扰模型训练。我一般建议多边形锚点控制在目标轮廓的关键拐点不必追求逐像素的贴合。5. 标注数据的后续处理与格式转换5.1 labelme JSON 的结构拆解labelme保存的 JSON 长这样{ version: 5.3.1, flags: {}, shapes: [ { label: scratch, points: [[162, 208], [171, 218], [185, 207], [178, 199]], group_id: null, shape_type: polygon, flags: {} } ], imagePath: 001.png, imageData: iVBORw0KGgoAAAANSUhEUgA... , imageHeight: 512, imageWidth: 512 }shapes字段是整个文件的核心每一个元素就代表一个标注目标points是这个多边形的顶点坐标列表shape_type表示这是多边形、矩形还是别的形状label就是类别名。imageData里是 base64 编码的图片数据如果你用labelme_json_to_dataset转换时觉得文件大、转换慢可以在标注时手动把imageData置空保存后单独管理图片目录。5.2 labelImg XML 的结构拆解labelImg输出的 PASCAL VOC XML 格式是这样的annotation folderimages/folder filename001.jpg/filename size width1920/width height1080/height depth3/depth /size object nameperson/name bndbox xmin100/xmin ymin150/ymin xmax300/xmax ymax400/ymax /bndbox /object /annotation这里面的bndbox就是矩形框的左上角和右下角坐标都是像素值。多目标情况下会有多个object块。这个结构本身很简单但实际训练时不同框架的标准格式还不太一样所以转换工具才那么重要。5.3 转 YOLO / COCO 的几条路径如果做目标检测最常用的是把labelImg的 XML 转成 YOLO txt。YOLO 的每行格式是class_id x_center y_center width height其中x_center、y_center、width、height都是归一化后的值也就是实际像素除以图片宽或高范围在 0 到 1 之间。换算公式不复杂x_center (xmin xmax) / 2 / width y_center (ymin ymax) / 2 / height box_width (xmax - xmin) / width box_height (ymax - ymin) / height社区里有很多现成脚本比如labelimg2yolo可以直接把整个 XML 目录转成 YOLO 格式。如果你用的是labelme做分割那么转换时通常要先转成 COCO 格式再给 Mask R-CNN、Detectron2、MMDetection 这类框架用。官方提供了labelme2coco.py脚本具体用法python labelme2coco.py --input_folder ./labeled_data --output_file ./annotations.json不过要注意的是不同版本的labelme对脚本的位置和依赖要求不一致比如 5.x 版本里很多旧脚本被移除了需要直接安装labelme之后执行编译好的工具命令或者使用独立的labelme2coco第三方库。前者更官方后者更省心。建议先在你自己的虚拟环境里跑一条最小示例确认输出文件没问题后再批量转换。5.4 与机器视觉后处理环节的衔接这里我多说一个很多人会忽略的衔接点。在玻璃划痕、布匹瑕疵等工业检测项目里labelme标注出来的掩码往往不会直接作为最终检测输出而是用来训练一个分割模型模型推理输出的 mask 可能还有噪声需要继续做形态学处理比如开闭运算、连通域分析。开闭运算的核大小和迭代次数不是拍脑袋定的有一个更可靠的方式用标注好的真值 mask 做参照统计你关心的缺陷区域最小外接矩形尺寸和边长分布然后据此设定结构元素尺寸。标注数据不仅用于训练还能反过来帮你确定后处理参数这个思路在很多落地项目里都非常实用。6. 常见问题排查与避坑实录6.1 安装与启动类问题问题现象可能原因解决方案labelme 安装后输入命令提示 not found虚拟环境未激活先conda activate labelmelabelme 启动报 ModuleNotFoundError: PyQt5Python 版本和 PyQt5 不兼容手动pip install pyqt5或降级 Python 到 3.10labelImg 点击 exe 无反应杀毒软件误杀或 VC 运行库缺失恢复文件后重新运行安装 VC 运行库labelImg 源码运行没有界面pyrcc5未执行在源码目录执行pyrcc5 -o libs/resources.py resources.qrc安装阶段的问题大多集中在环境上不要在某个报错上死磕太久。我处理过很多次同事的标注环境问题最后基本都是“重开一个虚拟机、重装一遍”最快。标注工具不像训练框架没有那么多玄学环境干净了就能跑。6.2 标注操作类问题labelme画多边形时最常见的困惑是“怎么闭合”。很多人以为必须点回起点实际上你只要在最后一个位置按回车或者双击鼠标右键程序就会自动连接首尾形成闭合。如果你觉得锚点位置不对按CtrlZ可以撤回上一个点。labelImg画框时最怕的就是误点了Cancel导致整个矩形框白画。特别是快速标注时手稍微一抖就没了需要重新画。这个只能靠熟练来避免我个人的习惯是画完立刻输入类别名并回车把每个操作尽快固化不要停在半途。另外一个隐藏很深的问题是图片旋转导致标注错位。有些相机拍出来的照片自带 EXIF 方向信息在 Windows 看图软件里看是正的但在labelImg或labelme里加载时可能是旋转后的标完导出时坐标就和原图对不上了。遇到这种情况最好先批量统一图片方向再去标注。6.3 数据转换类问题转换阶段最容易出问题的是坐标越界。labelImg画框时偶尔会把框拖到图片边界之外一点点导致导出的xmax或ymax大于图片宽高。YOLO 训练时遇到这类坐标会直接报错或者影响 loss 计算所以在转换后一定要做一次边界检查。一个简单的检查思路是用 Python 写个脚本扫一遍所有 txt 或 XML凡是出现xmax width或者ymax height的要么裁剪要么跳过重标。这种问题在图片分辨率高、边界被压缩显示时尤其容易发生。labelme转 COCO 时常见的问题则是类别 ID 映射错乱。labelme2coco脚本默认按类别名称字典序给 ID如果脚本执行后你发现类别 ID 和预期不符建议在脚本里手动指定映射表不要依赖默认排序。这个问题我踩过一次最后检查才发现有一类标签的 ID 全部变成了另一个类别浪费了不少时间。6.4 团队协作场景的数据一致性如果你不是单人项目而是几个人一起标注同一批数据那么命名规范和目录结构一定要事先定好。labelImg的 XML 和图片是分开的如果 A 同事保存到Annotations目录B 同事保存到labels目录后期合并时就要手动整理labelme的 JSON 虽然自带图片但也存在多人编辑同一个 JSON 导致覆盖的风险。更稳健的做法是把所有标注文件统一交给一个入口用 DVC 或者 Git LFS 管理数据集版本每次合并前跑一遍格式校验脚本。数据虽然听着不如模型高级但它是项目的地基这个地基不夯实后面所有环节都会被拖累。7. 到底怎么选几条实战选择建议7.1 按任务类型选这可能是最直观的判断标准做目标检测输出框级位置选择labelImg做语义分割或实例分割需要像素级掩码选择labelme做姿态估计关键点、点云标记或者需要画线、画圆等特殊形状选labelme项目周期极紧、需要快速产出大量检测框选labelImg学习成本低到几乎没有。如果你的项目是复杂场景检测目标是“把物体找到并识别出来”矩形框足够那就没必要用多边形方案。反过来如果目标是缺陷检测、精密轮廓分析矩形框显然会引入太多背景噪声这时候必须上labelme。7.2 按团队与项目阶段选团队里有纯新人、没做过标注的人我建议先用labelImg。它的界面直白快捷键少教一遍基本就会不容易出错。labelme涉及多边形描点新手上手会有一定适应期而且描出来的多边形质量参差不齐审核成本更高。项目处于快速原型验证阶段时也用labelImg更合适因为你可以快速拿到一批检测框去验证算法可行性。一旦验证通过进入正式迭代、需要分割模型才能满足精度需求时再组织人力用labelme做精细标注。这样的节奏更合理而不是一上来就上强度。7.3 我的实际混合使用方案最后说说我自己的做法。我的很多项目其实不是非此即彼而是两个工具同时用。检测头的数据我用labelImg标分割头的数据我用labelme标然后按任务类型组织目录dataset/ ├── detection/ │ ├── images/ │ ├── xml/ │ └── labels/ ├── segmentation/ │ ├── raw_images/ │ └── json_files/ └── coco_annotation.json两个工具各司其职互不干扰。因为目标检测和实例分割在很多业务里是共存的比如智慧安防项目需要先检测行人再对行人轮廓做分割工业质检需要先定位缺陷区域再判断缺陷类型。如果你的项目也是这种“检测分割”的混合需求参考这种并行标注方式会比你只选一个工具到处凑合要高效得多。另外工具只是起点不要忽略标注规范的价值。我见过太多项目组把时间花在选工具、换工具、比较工具上结果标注规范一片空白最后模型效果差又回头怪工具不好。工具之间虽然有差异但都不是银弹真正决定数据质量的是标注管理流程和团队执行的一致性。我个人在踩过几次坑之后现在对待标注的态度是先定任务类型再定工具最后定规范。工具服从任务规范服从质量顺序一定不能反过来。如果你也在纠结labelme和labelImg怎么选希望这篇能帮你在半小时内做出决定并且把后面可能遇到的大多数坑提前绕开。