labelme与labelImg对比:机器视觉标注工具选型与实战避坑指南
2026/9/11 8:23:34 网站建设 项目流程

做机器视觉项目的人,第一道坎往往不是模型选型,而是数据标注。但凡你接触过目标检测、语义分割或者实例分割,就一定绕不开两个名字:labelmelabelImg。我在社区里被问过太多次“这两个标注工具到底该用哪个”,甚至很多人会把labelImg误写成lableImg,把labelme记成labelim,一搜资料就更乱。这篇文章就直接把这两款工具从定位、安装、实操、格式转换到常见坑,完完整整做一次对比,顺便把我在实际项目中同时用它们的经验一并写出来。无论你是准备入行机器视觉的新手,还是已经带项目但一直被标注环节拖后腿的工程师,这篇都能帮你少踩几个坑。

1. 干机器视觉,为什么绕不开标注工具

1.1 标注环节决定模型效果上限

很多人第一次训练模型时,往往急着调参、换骨干网络,结果模型精度上不去,折腾半天才发现问题出在标注数据上。圈内有一句话:garbage in,garbage out——喂给模型的标注是脏的、乱的、不一致的,模型就算再强也学不出干净的特征。机器视觉项目的标准流程里,数据采集之后紧跟着就是数据清洗和标注,标注产出直接决定后续训练、评估、迭代的效率。

而标注工具的选择,又直接决定了标注效率和数据格式。工具选对了,几百张图可能一天就能标完;工具选错了,光是在格式转换和坐标对齐上就能耗掉两三天。labelmelabelImg之所以被经常摆在一起比较,是因为它们几乎是目前开源工具里使用率最高的两个,但它们的定位差异很大,一个服务于分割类任务,一个服务于检测类任务。搞清楚它们的差异,你才能真正知道自己适合哪一个。

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 的输入格式衔接太顺了。

在界面和使用逻辑上,labelImglabelme更轻量、更直白:打开图片目录、画框、输入类别、保存,非常符合“快速产出”的需求。如果你只是做常规目标检测,不希望标完还要做格式转换,那labelImg会节省很多时间。

2.3 一张表说清两者差别

对比维度labelmelabelImg
技术栈Python + PyQtPython/PyQt,另有 C++ 编译版
主要标注类型多边形、矩形、点、线、圆矩形框
典型任务语义分割、实例分割、姿态估计、像素级缺陷检测目标检测(矩形框检测)
输出格式JSON(含坐标、形状类型、imageData)PASCAL VOC XML / YOLO txt
单文件自包含是,JSON 内嵌 base64 图片否,XML 和图片分开存放
快捷键学习成本中等很低
开源协议MITMIT
格式转换生态官方提供 json_to_dataset、labelme2coco 等社区脚本极多,转 YOLO 非常方便
适合团队协作适合,单文件便于分发需要保持图片目录同步
维护活跃度较活跃,版本迭代较快基本稳定,更新频率低

这张表基本能看出两个工具的定位完全不同。labelme更像是“像素级标注工作台”,强调标注形状的任意性和数据自包含;labelImg则是“检测框快速标注器”,强调操作效率和输出格式的直接可用性。

2.4 底层设计差异带来的连锁影响

两个工具的差异不仅体现在标注形状上,更体现在后续数据处理的链条上。

labelme因为输出 JSON,且每个目标可以是一个任意多边形,所以它可以天然支持多实例分割。同一张图里出现多个缺陷、多个人物、多个物体时,每个目标都会对应一条独立的shapes记录,后续转换成 COCO 格式时,每个多边形就是一个annotationsegmentation字段。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就能启动图形界面。这里建议你用一个独立的虚拟环境,避免和项目里已有的opencvtorch依赖打架。虚拟环境操作是基础,但很多人恰恰在这步翻车:

conda create -n labelme python=3.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 的某些子版本会直接报ModuleNotFoundErrorOSError,这个时候不要死磕,换成 Python 3.9 或者 3.10 做虚拟环境往往一秒解决。

labelImg的 Windows 编译包有时候会被杀毒软件误报,因为部分压缩包内包含了预编译的二进制文件,建议从官方 Releases 下载,并且留意文件校验信息。如果真的下了第三方打包的版本,很可能界面里没有 YOLO 模式切换按钮,那基本可以确定是阉割版,趁早换。

4. 标注流程全记录:从打开图片到产出标注文件

4.1 labelme 多边形标注实操步骤

我自己标玻璃划痕缺陷时,完整流程是这样的:

  1. 打开终端,激活labelme的虚拟环境,输入labelme启动。
  2. 在菜单栏选择 “Open Dir” 打开存放原始图片的文件夹。
  3. 在左侧工具栏点击 “Create Polygons”。
  4. 在图像上沿着目标边缘依次单击鼠标左键添加锚点,锚点越多,轮廓越精细。
  5. 描完一个闭合区域后,按回车键,弹出输入框填写类别名,比如scratch
  6. 如果一张图里有多个目标,重复第 3-5 步。
  7. 标注完成后按Ctrl+S保存,会生成一个与图片同名的.json文件。

实际操作中,我会先在菜单栏设置里确认自动保存已经打开,避免标完一批图忘记保存导致白干。labelme的自动保存在File -> Auto Saving里勾选即可。这个功能在标注大量图片时非常重要,省去每张图手动按保存键的时间。

4.2 labelImg 矩形框标注实操步骤

labelImg的标准流程会更快:

  1. 打开软件,点击左侧 “Open Dir” 选择图片目录。
  2. 点击 “Change Save Dir” 选择标注文件的保存目录,一般我会另建一个Annotations文件夹,和图片分开。
  3. 在菜单栏或者左侧选择保存格式:PASCAL VOC 或 YOLO。
  4. 按快捷键W进入画框模式,在目标左上角按下鼠标左键,拖到右下角松开。
  5. 弹出标签输入框,输入类别名称(比如personcar)。
  6. D切换到下一张图片,继续标注。
  7. 最后按Ctrl+S保存 XML 或 txt 文件。

如果你事先在data/predefined_classes.txt里配置好了类别,那画完框可以直接选择,不用每次打字。这个文件需要手动编辑,类别名每行一个,保存后重启labelImg才能生效。

labelImg还有一个非常实用的功能是“自动保存模式”,在View -> Auto Save mode勾选后,每次切换到下一张图时都会自动保存上一张的标注文件,基本可以杜绝忘记保存的情况。

4.3 标注效率技巧

标注工作的核心不是“能标”,而是“标得快、标得准”。这里分享几个实际项目里验证过的效率技巧:

第一,先建立统一的类别命名规范。尤其是多人协同时,同一个目标你今天叫scratch,明天叫defect,模型训练时会直接当成两个类别,数据就废了。建议项目开始前先列一张类别清单,所有人共用一份 predefined_classes 文件或者 labelme 的标签列表。

第二,合理利用快捷键,减少鼠标移动labelImgW画框、D下一张、A上一张、Ctrl+S保存,这一套组合一旦肌肉记忆形成,标注速度能提升一倍。labelme里也有对应的快捷键,比如Ctrl+Z撤销锚点、Ctrl+E编辑多边形等,熟练了之后效率会明显上升。

第三,不要把每张图标到极致精细。很多新手描多边形时喜欢把每个像素边缘都描进去,实际上对分割模型来说,大致贴合边缘就已经够了。过度精细不仅浪费时间,而且容易引入标注噪声,反而干扰模型训练。我一般建议多边形锚点控制在目标轮廓的关键拐点,不必追求逐像素的贴合。

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> <folder>images</folder> <filename>001.jpg</filename> <size> <width>1920</width> <height>1080</height> <depth>3</depth> </size> <object> <name>person</name> <bndbox> <xmin>100</xmin> <ymin>150</ymin> <xmax>300</xmax> <ymax>400</ymax> </bndbox> </object> </annotation>

这里面的bndbox就是矩形框的左上角和右下角坐标,都是像素值。多目标情况下会有多个<object>块。这个结构本身很简单,但实际训练时不同框架的标准格式还不太一样,所以转换工具才那么重要。

5.3 转 YOLO / COCO 的几条路径

如果做目标检测,最常用的是把labelImg的 XML 转成 YOLO txt。

YOLO 的每行格式是:

class_id x_center y_center width height

其中x_centery_centerwidthheight都是归一化后的值,也就是实际像素除以图片宽或高,范围在 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 labelme
labelme 启动报 ModuleNotFoundError: PyQt5Python 版本和 PyQt5 不兼容手动pip install pyqt5,或降级 Python 到 3.10
labelImg 点击 exe 无反应杀毒软件误杀或 VC 运行库缺失恢复文件后重新运行,安装 VC++ 运行库
labelImg 源码运行没有界面pyrcc5未执行在源码目录执行pyrcc5 -o libs/resources.py resources.qrc

安装阶段的问题大多集中在环境上,不要在某个报错上死磕太久。我处理过很多次同事的标注环境问题,最后基本都是“重开一个虚拟机、重装一遍”最快。标注工具不像训练框架,没有那么多玄学,环境干净了就能跑。

6.2 标注操作类问题

labelme画多边形时最常见的困惑是“怎么闭合”。很多人以为必须点回起点,实际上你只要在最后一个位置按回车或者双击鼠标右键,程序就会自动连接首尾形成闭合。如果你觉得锚点位置不对,按Ctrl+Z可以撤回上一个点。

labelImg画框时最怕的就是误点了Cancel,导致整个矩形框白画。特别是快速标注时,手稍微一抖就没了,需要重新画。这个只能靠熟练来避免,我个人的习惯是画完立刻输入类别名并回车,把每个操作尽快固化,不要停在半途。

另外一个隐藏很深的问题是图片旋转导致标注错位。有些相机拍出来的照片自带 EXIF 方向信息,在 Windows 看图软件里看是正的,但在labelImglabelme里加载时可能是旋转后的,标完导出时坐标就和原图对不上了。遇到这种情况,最好先批量统一图片方向,再去标注。

6.3 数据转换类问题

转换阶段最容易出问题的是坐标越界。labelImg画框时偶尔会把框拖到图片边界之外一点点,导致导出的xmaxymax大于图片宽高。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

两个工具各司其职,互不干扰。因为目标检测和实例分割在很多业务里是共存的,比如智慧安防项目需要先检测行人,再对行人轮廓做分割;工业质检需要先定位缺陷区域,再判断缺陷类型。如果你的项目也是这种“检测+分割”的混合需求,参考这种并行标注方式,会比你只选一个工具到处凑合要高效得多。

另外,工具只是起点,不要忽略标注规范的价值。我见过太多项目组把时间花在选工具、换工具、比较工具上,结果标注规范一片空白,最后模型效果差,又回头怪工具不好。工具之间虽然有差异,但都不是银弹,真正决定数据质量的是标注管理流程和团队执行的一致性。

我个人在踩过几次坑之后,现在对待标注的态度是:先定任务类型,再定工具,最后定规范。工具服从任务,规范服从质量,顺序一定不能反过来。如果你也在纠结labelmelabelImg怎么选,希望这篇能帮你在半小时内做出决定,并且把后面可能遇到的大多数坑提前绕开。

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

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

立即咨询