从零开始:使用Labelme进行语义分割数据标注全流程解析

张开发
2026/4/16 0:16:41 15 分钟阅读

分享文章

从零开始:使用Labelme进行语义分割数据标注全流程解析
1. 为什么选择Labelme进行语义分割标注第一次接触语义分割任务时我和很多初学者一样被各种标注工具弄得眼花缭乱。试过五六种工具后最终锁定Labelme作为主力标注工具主要因为它有这几个不可替代的优势首先是跨平台支持。Labelme基于Python开发在Windows、Mac和Linux系统上都能完美运行。我经常需要在实验室的Linux服务器和家里的Windows电脑之间切换工作Labelme的跨平台特性让我无需重新适应不同操作系统。其次是轻量级安装。相比需要配置复杂环境的专业标注软件Labelme只需要简单的pip安装命令。记得有次帮学弟配置标注环境从安装到标注第一张图只用了不到5分钟他当时惊讶的表情我至今难忘。最重要的是标注精度控制。Labelme支持像素级的多边形标注配合快捷键可以快速调整节点位置。在做医疗影像分割时这种精细标注能力帮我们团队将肿瘤边缘的识别准确率提升了12%。当然Labelme也不是没有缺点。比如批量处理功能较弱标注大量数据时会比较耗时。不过对于刚入门语义分割的新手这些缺点完全在可接受范围内。2. 环境搭建与数据准备2.1 三种安装方式详解很多人第一次安装Labelme就遇到各种报错其实是因为没选对安装方式。根据我的踩坑经验推荐以下三种安装方案方案一纯净Python环境安装适合已有Python基础pip install pyqt5 # 必须先安装PyQt5 pip install labelme这个方案最简洁但需要自己解决依赖问题。有次我在Ubuntu服务器上安装时就遇到了缺少libxcb-xinerama0的问题需要用apt-get install额外安装。方案二Anaconda环境安装推荐新手使用conda create -n labelme python3.8 conda activate labelme pip install labelmeAnaconda会自动处理大部分依赖特别适合Windows用户。我带的实习生都用这种方式基本没出过错。方案三Docker方式适合团队统一环境docker pull wkentaro/labelme docker run -it -v $(pwd):/root/work -p 8080:8080 wkentaro/labelme这是我们团队现在采用的方案确保所有成员的标注环境完全一致。2.2 数据准备实战技巧准备标注数据时最容易犯的错误就是文件组织混乱。建议按照这个结构组织project/ ├── images/ # 存放原始图片 │ ├── img1.jpg │ └── img2.jpg └── labels.txt # 标签定义文件labels.txt的编写讲究第一行必须是__ignore__第二行写_background_从第三行开始才是你的实际类别。比如做街景分割时我的labels.txt是这样的__ignore__ _background_ road building car pedestrian有个容易忽略的细节Labelme默认只加载.jpg和.png格式图片。去年有个项目用了.bmp格式的医学影像折腾半天才发现需要修改源码的图片过滤规则。3. 标注操作全流程详解3.1 高效标注技巧启动Labelme后别急着标注先设置这几个关键选项在View菜单勾选Advanced Mode解锁更多功能在File-Save Automatically开启自动保存调整Edit-Preferences中的标签字体大小实际标注时这些快捷键能提升3倍效率CtrlR旋转图片处理医学影像特别有用CtrlE编辑选中多边形CtrlD复制当前标注空格键快速切换下一张图我标注遥感图像时发现个小技巧先用大多边形框选大致区域再用CtrlE微调边缘比直接精确标注快得多。3.2 标注文件生成原理Labelme生成的JSON文件包含这些关键信息{ version: 4.5.6, flags: {}, shapes: [ { label: car, points: [[100,150],[120,180],[150,170]], shape_type: polygon } ], imagePath: img1.jpg, imageData: base64编码的图片数据 }很多教程直接教转换命令却不解释原理。其实labelme2voc.py脚本主要完成以下转换将JSON中的多边形坐标转为像素级掩码根据labels.txt分配类别ID生成PASCAL VOC格式的数据集转换时常见的两个坑路径包含中文会报错建议全英文路径图片尺寸过大可能导致内存溢出可以先resize再标注4. 实战问题解决方案4.1 PNG波段问题深度解析这个问题困扰了我整整两周现象是模型训练时准确率卡在50%不动。后来发现是Labelme默认生成的PNG是三通道的而多数语义分割模型预期单通道标签。解决方案对比方案优点缺点修改模型输入通道不用处理数据可能影响模型性能ENVI手动转换可视化操作批量处理麻烦Python代码转换一键批量处理需要编程基础推荐这个Python转换代码from PIL import Image import numpy as np def convert_to_single_band(png_path): img Image.open(png_path) arr np.array(img) # 取第一个通道 single_band arr[:,:,0] if arr.ndim3 else arr Image.fromarray(single_band).save(png_path)4.2 其他常见问题排查问题1标注保存失败检查文件是否只读确认磁盘空间充足尝试另存为其他路径问题2标注闪烁或卡顿关闭不必要的图层降低图片显示质量在Preferences中设置升级显卡驱动问题3标签显示不全检查labels.txt编码必须是UTF-8确认标签名称没有特殊字符重启Labelme试试去年处理卫星图像时遇到个诡异问题标注时一切正常但生成的掩码总是错位。最后发现是因为图片包含EXIF方向信息用exiftool移除后问题解决。5. 进阶技巧与最佳实践5.1 团队协作标注方案当需要多人协作标注时原始Labelme有些力不从心。我们团队改进的方案是使用Git管理JSON标注文件二进制图片用Git LFS编写检查脚本确保标签一致性用labelme_draw_json批量预览标注结果这个方案让我们10人团队在一个月内完成了20万张医疗影像的标注。5.2 标注质量检查方法低质量标注是模型表现差的常见原因。我们开发了这套质检流程随机抽样检查至少10%使用labelme_json_to_dataset生成可视化结果用OpenCV计算标注覆盖率指标对边界模糊区域进行多人交叉验证有个项目原标注准确率只有83%经过三轮质检提升到97%最终模型mIoU提高了8个点。5.3 与其他工具的协作Labelme标注的数据可以轻松转换为其他格式转COCO格式使用labelme2coco.py转YOLO格式先用labelme2voc.py再写脚本转换转Cityscapes格式需要额外处理实例ID我们经常先用Labelme做初标注再用CVAT进行复核和补充结合两者的优势。

更多文章