ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

labelme图像标注工具安装使用教程与SAM2辅助标注实战指南

labelme图像标注工具安装使用教程与SAM2辅助标注实战指南 我最早接触 labelme 是在做实例分割数据集的时候当时满世界的教程都在教怎么画框、怎么用 Voc 工具但真正到了自己动手光是安装这一步就被 Python 版本和依赖问题卡了半天。后来用得久了才发现labelme 不是那种“开箱即用”的傻瓜软件它更像一个工具箱用得好不好完全取决于你对它的内部逻辑了解多少。这篇文章就围绕 labelme 下载安装、使用教程、常见问题解决这三个核心需求展开同时把我后来折腾 SAM2 辅助标注的方案也一并整理出来供做图像标注、语义分割、实例分割相关项目的人参考。不论你是刚接触标注的学生还是已经在做目标检测落地的工程师这篇文章的目标都一样让你看完之后能够顺畅地把 labelme 装好、用起来并且遇到报错的时候知道去哪里排查、怎么解决。1. labelme 是什么以及为什么我还在用它做图像标注1.1 一个工具箱式的标注软件labelme 是一个开源的图像标注工具作者是 wkentaro它在图形标注领域算是老牌工具了。它的核心功能一句话就能说清楚让你在图像上画多边形、矩形、圆、线、点并且把标注内容保存为 JSON 格式方便后续转成训练数据。很多做目标检测、语义分割、实例分割的人第一步跑通模型用的数据集都是拿 labelme 标注的。它的定位是“通用标注工具”不是只服务某一种算法。所以你既可以拿它做矩形框给 YOLO 用也可以拿它做精细的多边形给 Mask R-CNN、DeepLab 这类模型用还能做关键点给姿态估计模型用甚至做场景分割的 line 标注。说它是工具箱是因为它不会限制你的标注范式只会把“你画了什么”完整地记录下来。我在选择标注工具的时候曾经对比过很多工具。比如 LabelImg 适合快速画矩形框但它做多边形非常别扭CVAT 功能强大但部署麻烦需要起服务开源云标注平台数据又必须走网络对于有保密要求的项目根本不现实。labelme 本地运行、纯离线、工程结构简单这个特点对很多团队来说就是硬需求。所以尽管它的界面看起来比较朴素但在真实生产环境里它依旧是最常被选用的工具之一。1.2 使用 labelme 前必须想清楚的环境问题很多人装 labelme 失败其实不是 labelme 本身的问题而是环境太乱了。labelme 是基于 PyQt或 PySide开发的 GUI 应用同时依赖 numpy、PIL、imgviz 这些图像处理库。它对 Python 版本有一定要求新版本的 labelme 通常要求 Python 3.9 以上而比较老的 3.x 版本在 Python 3.6/3.7 上跑得比较舒服。如果直接用系统自带的 Python 环境很容易和系统里已有的包产生冲突。所以我强烈建议在做任何标注项目之前先为标注工具单独准备一个虚拟环境。你可以理解为标注工具和训练框架不要住在同一个房间里不然 pip install 一个包的时候可能就把训练环境里的依赖顶掉了这种事情我见过太多次。环境准备这件事情看起来没必要但实际做起来成本很低。一个 conda 虚拟环境或者 Python 自带的 venv都能解决这个问题。后面我会详细介绍安装方式但无论是哪一条路请记住一个原则虚拟环境隔离永远是第一位的。另外一点如果你要使用 GPU 推理能力来跑 SAM2 这类辅助标注模型那么还要提前确认驱动和 CUDA 版本这和 labelme 安装是两个独立的事情但会影响后续配置。2. labelme 安装的三种方式与避坑记录2.1 pip 安装最省事但环境隔离一定要做最常规的安装方式是 pip 直接安装pip install labelme如果你是在全新创建的虚拟环境里执行这一条命令基本上就能装好。安装完成之后在终端输入labelme就能启动图形界面如果能看到黑底色的主窗口说明安装成功。但“直接 pip install”有一个风险如果当前环境中已经装了某些旧版本依赖pip 在安装 labelme 时为了满足版本要求可能会自动升级或降级其他包导致原有项目跑不了。这种情况下我通常会先看它最终打印出的依赖变更列表确认对现有环境没有破坏性影响。部署前备份环境也是一个好习惯比如用pip freeze requirements_backup.txt留个底出问题再回滚。如果你是在内网环境或者无法顺畅访问 PyPI 的服务器上安装可以用国内镜像源加速pip install labelme -i https://pypi.tuna.tsinghua.edu.cn/simple镜像源地址大家可以根据自己的实际情况选择重点不是用哪个源而是安装一定不要急注意看终端里的安装日志。如果出现红色报错大概率是权限问题或者网络问题。权限问题用加--user参数或者改用虚拟环境解决网络问题换镜像源重试即可。2.2 conda 安装适合和 CUDA 环境一起管理如果你本身就在用 conda 管理深度学习环境那么用 conda 安装 labelme 是更贴合现有工作流的方式conda create -n labelme python3.9 conda activate labelme conda install -c conda-forge labelme用 conda 安装的好处是conda 会帮你把 PyQt 这类系统级的 GUI 相关依赖一并解析好减少因为 Qt 库缺失导致的启动报错。特别是有些 Linux 服务器上缺少 X11 相关的 libxcb 库pip 装的 labelme 可能直接就黑屏或者根本无法启动而 conda-forge 的包通常会把这些依赖处理得更好一点。不过我个人的经验是conda 安装 labelme 的版本更新速度通常比 PyPI 慢一点。如果你需要比较新的功能比如支持更新的 AI 插件生态可能还是要老老实实用 pip 安装新版本。conda 方案更适合追求稳定不想折腾 Qt 依赖的人。另外补充一点如果你之前已经用 conda 创建了专门用于训练的环境我不建议把 labelme 直接装进这个环境。标注工具属于“开发调试工具”尽量不要和训练框架混在一起否则某个依赖升级很可能让之前跑得好好的训练脚本突然报错。创建一个专用的 labelme 环境干净又省心。2.3 源码安装留给要改代码或者接 SAM2 的人还有一种安装方式是直接从源码安装git clone https://github.com/wkentaro/labelme.git cd labelme pip install -e .这种方式的优势在于你可以修改 labelme 的源码并立刻生效比如自定义标注导出规则、改界面逻辑或者给 labelme 集成自己的 AI 辅助标注插件。如果你打算做二次开发需要走这条路线。源码安装最容易遇到的问题有两个一是网络无法访问 GitHub这个只能靠代理缓存或者提前把仓库打包传上去解决二是依赖版本不匹配因为源码版本更新后可能要求一些很新的依赖库。我的建议是源码安装时最好在 requirements.txt 基础上逐个确认不要盲目pip install -r requirements.txt,否则很容易装上一堆与项目无关的最新版依赖。如果你是想在 labelme 里部署 sam2实际上也建议优先考虑基于源码安装再加 AI 插件的方式因为你需要把 SAM2 的权重和模型配置文件放到 labelme 可以读取的位置有些版本需要改动 plugin 路径。这些细节后面第 4 章单独说这里先记住一句话不想改代码就用 pip 安装想做二次开发或者接 SAM2 这类外部模型再考虑源码安装。3. labelme 基础使用从打开图片到导出一批可用数据3.1 界面与标注的核心操作逻辑启动 labelme 后你会看到一个比较复古的界面左侧是图片显示区右侧是文件列表和标注管理区。最上面是菜单栏File、Edit、View、Label 几个菜单包含了几乎所有功能。标注前的第一步是打开图片或者图片文件夹。单张图片用File Open整个目录用File Open Dir。打开目录的好处是标注完一张图之后按快捷键可以自动切换到下一张效率会高很多。图片文件列表会出现在右侧支持常见格式包括 jpg、png、bmp 等但我不建议用 tiff 这种超大格式不然打开和保存都会很慢。核心操作逻辑是先在顶部工具栏选择标注工具然后在图片上点击画点最后闭合区域并输入标签。以最常用的多边形工具为例选择Create Polygons然后在目标边缘上连续左键点击每一个左键会生成一个锚点锚点会自动连成多边形轮廓。当你把轮廓的边缘都标记完之后把鼠标移到第一个锚点附近此时会出现一个明显变大的点再左键点击一下多边形就闭合了。随后弹出一个输入框输入类别标签按回车完成标注。矩形工具、圆形工具的逻辑是一样的只是锚点范围不同。矩形只需要点两个点即左上角和右下角圆形需要点一个中心点再拉半径线工具和点工具则更适合做车道线、关键点这类标注。这套逻辑非常简单但有一些细节直接影响效率。比如画错了一个点不需要重新画整个多边形可以按CtrlZ撤销上一个锚点标注完成后如果发现某个顶点位置不准可以点击左侧文件列表下方的Edit Polygons然后拖动顶点进行调整。这些操作如果一开始不用后面返工的成本会很高。3.2 快捷键、标注规范和效率技巧快捷键是标注效率的分水岭。新手用鼠标一个个点菜单老手几乎全键盘操作。我自己会固定一套组合CtrlS保存当前标注CtrlD复制当前标签也就是重复上一步标注的标签名非常好用CtrlZ撤销上一个锚点或撤销上一步操作CtrlShiftZ重做滚轮缩放图片Ctrl 滚轮调整多边形刷子的大小用于编辑模式Delete删除当前选中的标注除了快捷键标注规范也很重要。我见过的数据集千奇百怪最典型的问题就是标签名字不统一同一类东西有人标cat有人标Cat还有人标cat_1。这种低级错误在训练阶段会让模型非常困惑。所以我们在项目开工前一定会制定一份标注规范写明类别名、最小标注尺寸、是否遮挡边缘也要标、边界贴着目标到什么程度等等。还有一个效率技巧是合理利用文件的自动保存机制。labelme 默认会对每张图片生成一个同名的 JSON 文件当你标注完一张图后按CtrlSJSON 就会写到磁盘里。这个 JSON 里面会带上图片的 base64 编码数据所以文件比较大。如果你的图片数量上千磁盘占用量会非常可观。这时候启动 labelme 时加一个参数--nodata保存的 JSON 里就不会包含 imageData 的 base64 内容大小能缩小到原来的几十分之一。但要注意开启--nodata后JSON 文件必须和原图放在同一目录且保留原名否则数据转不出来。另外在标注细节非常密集的场景下建议把图像放大到 200% 甚至更高再画不要为了省事而快速点一圈轮廓因为粗糙的标注后期清洗起来代价更大。标注工作往往不是一次性的你可能在一张图上反复修改所以一开始就把边界画准远比重画效率高。3.3 标注文件的格式解析与 JSON 转数据集labelme 保存的 JSON 文件里面最核心的字段包括version标注器版本号flags一些自定义标志位默认是空对象shapes所有标注对象的列表每个对象里有label、points、group_id、shape_type等字段imagePath当前图片的文件名imageData图片的 base64 编码字符串开启--nodata后这个字段不存在imageWidth和imageHeight图片宽高shapes里的shape_type字段尤其重要它决定了这个标注是polygon、rectangle、circle、line还是point。在做数据转换的时候不同算法需要的标注格式不同YOLO 分割任务需要多边形归一化后的坐标COCO 格式需要分割掩膜 RLEVOC 格式需要索引掩膜图。所以 labelme 保存下来的 JSON 通常不能直接喂给模型需要经过转换。官方提供了一些脚本最常用的是labelme_json_to_datasetlabelme_json_to_dataset 000001.json执行之后会在 JSON 同目录下生成一个000001_json文件夹里面包含img.png原始图片label.png像素级标注掩膜每个类别对应一个像素值label_viz.png可视化标注图方便检查标注是否重叠、是否漏标label_names.txt类别名字表这个脚本的作用就是把 JSON 转成 VOC 风格的分割掩膜很多语义分割模型需要的数据就是这个。它的原理是读取 JSON 里的shapes用PIL在空白画布上把每个多边形填充成对应的类别索引值然后保存为单通道 PNG。理解了这个逻辑你就能明白为什么多边形的点必须按顺序闭合因为填充算法依赖这些点构成合法的区域。如果你要做 COCO 格式官方仓库里也有labelme2coco.py脚本它会生成标准的 COCO JSON 标注文件。做目标检测用矩形框标注时这个脚本很好用。也有第三方的labelme2yolo等工具大家可以按需搜索但最稳妥的永远是直接读官方脚本源码根据自己数据集的特性改一版。3.4 标注质量自检生成后一定要做的事我以前犯过一个错误标注完一百张图直接拿去训练结果模型训练 loss 异常最后发现是其中几十张图的掩膜和原图出现了偏移。所以我现在每次完成一批标注一定会做三件自检第一生成label_viz可视化图快速浏览一遍。这一步能看到每张图的标注轮廓是否贴合目标边缘有没有明显的空白区域或错标。可视化图不能代替精确检查但能快速筛掉非常离谱的标注。第二检查label_names.txt和类别索引是否和训练配置一致。很多人会在标注中途增加类别导致前面的索引号全部错位这个问题很难用肉眼发现但模型一训练就完蛋。最简单的方法是用脚本统计所有 JSON 里的label字段输出一个集合再和预期类别列表做差集。第三抽查原始 JSON 里imagePath对应的图片是否存在尤其是使用--nodata之后如果图片被移动位置或者重命名后面的数据转换会直接失败。我自己写过一个检查脚本遍历所有 JSON验证同名图片文件是否存在并读取尺寸如果尺寸和 JSON 里的宽度高度不一致就单独列出来处理。这种自动化的自检脚本非常值得花半小时写尤其是批量标注的项目它能帮你避免非常多隐藏的坑。4. 结合 SAM2 的进阶标注实践半自动标注到底稳不稳4.1 准备工作模型权重与插件配置图像标注最累的部分就是画精细多边形尤其是边缘复杂的物体比如人、车辆、动物。如果纯手动点一张图可能需要好几分钟。后来社区里出现了一个很自然的思路先用 Segment Anything 这样的通用分割模型做预标注然后人工只需要修正轮廓边界就行。labelme 在后续版本中提供了 AI 标注相关的插件机制社区里也比较成熟的做法是部署 SAM2 模型来辅助标注。这里我先说明一下labelme 官方主仓库的“AI 标注”功能属于插件能力不同版本接入方式有差异。以我踩过的坑来看比较稳妥的方式是找一个社区封装好的labelme-sam2或类似插件先把模型跑通再挂到 labelme 上。因为 SAM2 是 Meta 提出的第二版 Segment Anything 模型它能根据一个点或一个框生成目标掩膜非常适合做标注预判。准备工作分两块第一块是模型本身你需要下载 SAM2 的模型权重文件以及对应的模型配置 yaml 文件。第二块是 labelme 侧需要安装插件依赖并在 labelme 的配置中指定模型权重路径和配置文件路径。不同项目对这个配置的位置定义不太一样有的是通过环境变量有的是在代码里硬编码我建议直接看插件源码里的load_model函数不要盲猜。由于 SAM2 的模型文件通常比较大下载之前一定确认磁盘空间也别把权重放到代码仓库里最好单独建一个checkpoints目录统一管理。如果你的机器有 GPU先用 GPU 跑通一遍再接入 labelme如果只是 CPUSAM2 模型可以跑但速度会明显偏慢标注大批量数据时体验可能不理想。4.2 实操流程点一下、改一下、存一下在我实际使用的流程里接入 SAM2 之后标注一个目标的过程被大大压缩了。具体操作大致是这样的在 labelme 中打开图片选择 AI 相关的标注工具根据你装的插件不同可能是一个带魔棒的按钮或菜单栏里的 AI 选项。点击目标物体的内部区域。这里不需要太精准点到物体中心附近即可。我把这称作“点一下”。模型会生成一个初步的掩膜或者多边形轮廓显示在图片上。此时它会自动转成 labelme 的形状对象并让你输入标签名。接下来是“改一下”检查模型生成的轮廓手动拖动顶点或者边缘锚点修正不贴合的部分。和纯手动从零开始画多边形相比这一步省掉的精力非常可观。最后按CtrlS保存JSON 文件里就包含了修正后的标注结果。这套流程非常适合物体数量多、边缘复杂的图像。例如航拍图像里有很多小目标SAM2 对小目标的分割能力在多数场景下都还不错人只需要逐个点击确认不需要手动勾勒每个目标的轮廓。对于一个几百张图的小型项目半自动标注能节省大约 60% 到 70% 的标注时间。但所谓“半自动标注”并不是全自动它仍然需要人工判断。尤其是目标之间贴得很近的时候SAM2 生成的掩膜可能会把两个物体粘连在一起这时候除了手动修正有时候还需要用插件提供的“负点击”功能把那部分区域再消除掉。这个功能类似于 SAM 系列模型的交互式分割一个正点代表“选中它”一个负点代表“不要这里”模型会综合这些点重新生成掩膜。4.3 SAM2 辅助标注的适用边界与注意事项SAM2 辅助标注虽然高效但并不是所有标注任务都适合用它。我个人的经验是它对“前景和背景有明确视觉区分”的目标效果很好比如照片里的人、车、桌子但对于纹理稀疏、边界不清的物体比如医学影像里的病灶区域、遥感影像里的地物类型效果就会差很多人工修正的工作量可能比从零画还大。另外SAM2 生成的是像素级掩膜如果你最终需要的标注格式是矩形框那么用它辅助反而绕了远路。矩形框用 labelme 的Create Rectangles直接拖两下就完了没必要跑一次模型。SAM2 最大的价值在于精细分割类任务这是使用之前就要明确的。还有一个常见坑是插件和 labelme 版本的兼容性。我遇到过插件在某个 labelme 新版本上无法加载报一堆 Qt 相关的错误。这时候不要急着去重装最新版而是去插件仓库的README里看它明确支持的 labelme 版本范围选择对应版本安装。用源码安装的 labelme 配合插件反而是最可控的因为你可以直接看代码定位问题。从长期维护的角度讲如果你打算系统性地用 SAM2 做辅助标注我建议把标注服务的命令封装成一个启动脚本不要每次都在终端里手动敲长串参数。比如定义好虚拟环境路径、labelme 启动参数、模型权重路径写成 shell 脚本或 Makefile团队其他人也能一键启动避免每个人配出不同的环境。这样整个标注流程才稳定可复制而不是只在你自己的机器上能跑通。5. 高频问题排查这些坑我基本都踩过5.1 安装阶段的高频报错与处理安装 labelme 时的报错主要集中在依赖冲突、权限、Qt 库缺失这三类。下面这个表格是我在实际项目和给同事排查问题时遇到频率最高的几种情况报错信息出现原因解决办法ERROR: Could not install packages due to an EnvironmentError当前 Python 环境没有写入权限加--user参数或者创建虚拟环境后安装ModuleNotFoundError: No module named PyQt5labelme 界面库缺失单独安装pip install PyQt5或卸载重装 labelmeImportError: libGL.so.1: cannot open shared object file系统缺少 OpenGL 相关库安装系统依赖apt-get install -y libgl1 libglib2.0-0Ubuntu/DebianImportError: cannot import name imgviz from imgvizimgviz 包安装不完整或版本冲突重新安装pip install --upgrade imgviz启动 labelme 后窗口无法显示Qt 插件缺失或远程无图形界面检查是否启用 X11 转发或使用带显示的环境确认系统安装了 xcb 相关库安装阶段最重要的建议是一条条看 pip 日志不要只看最后的红色报错。pip 报错信息里通常会把冲突的包名和版本列出来照着提示修就行了。如果有包无法卸载或者说依赖冲突无法解决可以用pip install labelme --ignore-installed PyYAML这种局部跳过的方式但这种方法要有针对性不能什么问题都无视依赖。5.2 启动与显示问题启动 labelme 遇到黑屏或者窗口打不开绝大多数是 Qt 显示环境的问题。本地带图形界面的 Windows 和 macOS 上很少遇到Linux 服务器上反而很常见。如果你是在 Linux 服务器上用 SSH 远程连接启动图形程序需要确认有没有启用 X11 转发以及服务器上是否安装了完整的图形库。没有显示器的情况下可以用虚拟显示工具解决但这已经属于系统运维的范畴了。如果只是纯粹想把标注任务跑起来我建议直接在有图形界面的本机或工作站上操作不要非在无头服务器上折腾 GUI。还有一种情况是启动后能看到窗口但图片区域是黑的或者图片打不开。这通常是图片路径有中文或者图片格式不被 Qt 支持。解决方法是把图片目录移到纯英文路径下并统一转为 jpg/png 格式。这个问题非常隐蔽一个用户的账号目录如果是中文用户名就可能导致 labelme 无法正常读取文件我踩过不少次。5.3 标注过程中的问题与恢复手段标注过程中最怕的是误删标注、多边形闭合不了、标注半天忘记保存。第一个问题误删标注labelme 本身有一个备份机制它会在保存 JSON 时把之前版本重命名为xxx.json.bak。如果不小心覆盖或者删除了标注先去目录下找同名.bak文件把它改名回去通常能找回大部分标注内容。这个.bak机制大概是我最喜欢 labelme 的功能之一了。第二个问题多边形闭合不了。多边形的闭合逻辑是把鼠标移到第一个锚点附近等锚点变大后点击。如果点了很多锚点后回到起点的操作不太顺手可以试试拖动图片到合适位置或者缩小视图让第一个锚点更容易点击。有些新用户不知道这个交互以为要右键菜单里选“闭合”结果越点越多。第三个问题忘记保存。labelme 不会自动保存每一个多边形你需要按CtrlS主动保存。我强烈建议养成“画完一个目标就顺手 CtrlS 一次”的习惯因为如果图片像素超大一次性画完十个目标再保存中途崩溃会损失惨重。另外新手在批量标注时要注意 labelme 切换图片时如果还没有保存它会弹出提示是否保存这个提示一定别点错了曾经有过经验被误操作丢掉一整张图的标注。5.4 数据转换与训练阶段的问题好不容易标注完最后卡在数据转换上是最让人崩溃的。最常见的报错是IndexError: list index out of range通常是某个 JSON 文件里没有shapes或者shapes为空脚本在读取第一个 shape 时崩溃。ValueError: The truth value of an array with more than one element is ambiguous通常是检查代码或者转换脚本里直接用了数组做if判断需要把数组处理成具体布尔值。FileNotFoundError大部分是图片路径对不上尤其是用过--nodata的 JSON它依赖原图路径。遇到这些问题时不要只盯报错行建议直接写一个快速的 JSON 完整性检查脚本遍历所有标注文件解析出imagePath、shapes数量做一个表格输出一眼就能看出哪些 JSON 是空标注、哪些图片文件缺失、哪些类别名特别奇怪。这个脚本本身也建议沉淀下来放进项目里做成一个小工具便于以后每个标注阶段复用。还有一个隐蔽问题是同一张图片被标注了两次产生了两个 JSON比如a.jpg.json和a (1).jpg.json转换脚本去重逻辑不完善就会导致数据集类别索引混乱。这个问题在多人协作标注时特别严重一定要提前定好命名规则并在合并数据前做重复检查。6. 写在最后一点个人心得我从第一次用 labelme 到现在前后也带过不少人做标注项目。最大的体会是工具本身只是起点真正决定项目质量的是使用工具的人对数据规范和流程控制的重视程度。装好一个 labelme 并不难难的是从安装、标注、自检、转换到训练数据落地的整条链路都要顺畅。多花一点时间写检查脚本、统一命名规范、备份好 JSON 文件看起来慢实际上是在给你后续训练阶段节省大量时间。还有一个很实际的小建议每一批标注完成之后别马上丢进训练流程先抽十分之一的图出来做可视化检查把标注轮廓叠在图上快速翻一遍。这个习惯帮我避掉了无数次“看起来没问题训练效果却一塌糊涂”的尴尬。如果你也打算在项目里用 SAM2 这类工具辅助标注我的建议是从一个小数据集开始试评估好精度和人工修正的时间再决定要不要全面推广。标注工具和模型一样没有万能方案只有适合自己的方案。希望这篇文章能帮你把 labelme 用得顺手少踩一些我当年踩过的坑。
返回列表