YOLO11图像分割实战:Labelme标注+自动转换脚本高效处理

在实际项目中,图像分割任务常面临一个现实困境:标注成本高、格式转换繁琐、数据组织混乱。YOLO11作为新一代实例分割框架,虽性能强大,但若缺乏一套轻量、可控、可复现的数据准备流程,再好的模型也难落地。本文不讲抽象原理,不堆参数配置,而是带你从零完成一个真实可用的图像分割工作流——用Labelme画多边形、用Python脚本自动转YOLO格式、一键划分训练验证集、快速启动训练与推理。所有操作均基于预置YOLO11镜像环境,无需手动装依赖、配路径、调环境变量。

你不需要懂PyTorch底层机制,也不用研究YOLO11的C3k2模块怎么计算;你需要的,是一套能今天下午就跑通、明天就能用在自己数据上的实操方案。下面开始。

1. 环境确认与项目结构初始化

YOLO11镜像已为你预装完整开发环境:Python 3.9、PyTorch 2.3、Ultralytics 8.3.9、Labelme、OpenCV等核心依赖全部就绪。你只需确认两点:

  • 镜像已成功启动,可通过Jupyter或SSH访问(参考镜像文档中的截图路径)
  • 工作目录结构清晰,避免路径嵌套过深导致相对引用失效

我们采用扁平化、语义明确的目录设计,所有内容均置于ultralytics-8.3.9/根目录下(即镜像默认工作区):

ultralytics-8.3.9/
├── resources/
│   ├── images/
│   │   └── seg/
│   │       ├── json/          # Labelme原始json标注文件(与原图同名)
│   │       └── datasets/      # 转换后YOLO格式数据集
│   │           ├── images/
│   │           │   ├── train/
│   │           │   └── val/
│   │           └── labels/
│   │               ├── train/
│   │               └── val/
│   ├── config/
│   │   ├── data/
│   │   │   └── yolo11-seg.yaml   # 数据集路径与类别定义
│   │   └── model/
│   │       └── yolo11-seg.yaml   # 模型结构配置(官方提供)
│   └── weights/
│       └── seg/
│           └── yolo11n-seg.pt    # 官方预训练分割权重
├── tool/
│   ├── tool_json2label_seg.py    # JSON→YOLO标签转换脚本
│   └── tool_seg2datasets.py      # 标签/图片→训练集划分脚本
├── train_seg.py                  # 自定义训练入口
└── predict_seg.py                # 推理预测脚本

关键提醒:所有路径均为相对路径,且严格区分大小写。resources/images/seg/json/必须存放原始图片+同名json文件,这是后续脚本能正确运行的前提。

1.1 进入项目并检查基础依赖

打开终端(Jupyter中新建Terminal或通过SSH连接),执行:

cd ultralytics-8.3.9/
python -c "import labelme; print('Labelme OK')"
python -c "from ultralytics import YOLO; print('Ultralytics OK')"

若输出Labelme OKUltralytics OK,说明环境已就绪。若报错ModuleNotFoundError,请先运行pip install labelme ultralytics --no-deps(镜像已预装依赖,此命令仅补全可能缺失的顶层包)。

2. Labelme标注:聚焦“人”与“车”的精准轮廓

图像分割标注的核心是像素级边界定义。YOLO11要求每个目标用闭合多边形(polygon)描述,而非矩形框。Labelme是目前最轻量、最适配该需求的开源工具。

2.1 启动Labelme并加载图片

在终端中进入标注目录:

cd resources/images/seg/json/
labelme

Labelme界面启动后,点击左上角Open Dir,选择当前目录(即json/),所有图片将自动列出。注意:此时目录内应仅有.jpg.png图片,无其他干扰文件。

2.2 多边形绘制与类别标注

以一张含行人与汽车的街景图为例:

  • 点击左侧工具栏Polygon图标(或按快捷键P
  • 在图像上依次点击目标边缘关键点,形成闭合区域(双击最后一点或右键→Close
  • 弹出对话框,在Label输入框中准确填写类别名:personcar必须与yolo11-seg.yaml中names定义完全一致,区分大小写
  • 点击OK确认。重复此过程,为图中所有personcar目标逐个绘制多边形
  • 全部标注完成后,点击Save,保存为同名.json文件(如001.jpg001.json

实操建议

  • 优先标注清晰、完整的目标,遮挡严重或边缘模糊的可暂不标,避免引入噪声
  • 每个多边形顶点数建议控制在20–50个,过多影响转换效率,过少丢失细节
  • Labelme会自动生成imagePathimageData字段,脚本将自动提取imagePath用于关联原图

2.3 标注质量自查清单

标注完成后,快速检查三项:

  • 所有.json文件与.jpg/.png文件同名,且在同一目录
  • 每个.jsonshapes数组非空,且每个shapelabel值为personcar
  • shapespoints为二维坐标列表,如[[120,85],[135,78],...],无负数或超界值

若发现错误,直接在Labelme中打开对应json文件修改后重存即可。

3. 自动化转换:两步脚本打通标注到训练

手动将数百个JSON转为YOLO格式是不可持续的。我们提供两个精简脚本,全程自动化、零报错、可复现。

3.1 JSON转YOLO标签:tool_json2label_seg.py

该脚本读取json/目录下所有.json文件,解析多边形坐标,归一化后写入labels/对应路径。核心逻辑如下:

  • 提取imagePath获取原图宽高(用于坐标归一化)
  • 遍历shapes,对每个person(0)或car(1)生成一行YOLO格式:0 x1 y1 x2 y2 ...(类别索引+归一化顶点坐标)
  • 坐标归一化公式:x_norm = x / image_width, y_norm = y / image_height
  • 输出文件与原图同名,扩展名为.txt,存于resources/images/seg/datasets/labels/

执行方式(在ultralytics-8.3.9/根目录下):

python tool/tool_json2label_seg.py

运行后,你会看到类似输出:

Processed 5 JSON files → generated 5 TXT labels in resources/images/seg/datasets/labels/

验证方法:打开任意一个生成的.txt文件(如001.txt),首行应为0 0.123 0.456 0.132 ...(偶数个数字,以0或1开头),表明转换成功。

3.2 划分训练/验证集:tool_seg2datasets.py

YOLO11要求数据集按images/train/images/val/labels/train/labels/val/结构组织。此脚本自动完成:

  • 扫描json/目录下所有图片,随机打乱顺序
  • train:val = 8:2比例分配(可修改脚本内split_ratio = 0.8调整)
  • 将图片软链接(Linux/macOS)或复制(Windows)至datasets/images/{train,val}/
  • 将对应.txt标签文件同步至datasets/labels/{train,val}/
  • 生成空test/目录(YOLO11配置支持,但本例暂不使用)

执行方式

python tool/tool_seg2datasets.py

运行后,检查目录:

ls resources/images/seg/datasets/images/train/  # 应有4张图(5×0.8=4)
ls resources/images/seg/datasets/labels/val/     # 应有1个txt文件

为什么用软链接?
镜像默认为Linux环境,软链接避免重复存储图片,节省空间且保证源数据唯一性。若需物理复制,可编辑脚本将os.symlink替换为shutil.copy2

4. 数据配置与模型训练:轻量启动,专注效果

4.1 编写数据配置文件 resources/config/data/yolo11-seg.yaml

这是YOLO11识别数据集的“地图”。内容极简,仅需指定路径与类别:

# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
path: ../resources/images/seg/datasets  # 注意:此处为相对于train.py的路径
train: images/train
val: images/val
test: images/val  # 可选,验证集复用

# Classes
names:
  0: person
  1: car

关键点path值是train.py所在位置(即ultralytics-8.3.9/)的相对路径,因此写为../resources/...。若填错,训练时会报FileNotFoundError

4.2 启动训练:train_seg.py详解

你无需修改模型结构(yolo11-seg.yaml已由Ultralytics官方维护),只需专注训练策略。train_seg.py已预置合理参数:

  • model.train(...) 加载预训练权重yolo11n-seg.pt,收敛更快
  • epochs=1000 + patience=100:足够长的训练周期,配合早停防过拟合
  • batch=16 + imgsz=640:平衡显存占用与精度(镜像默认GPU显存充足)
  • optimizer='AdamW' + lr0=1e-3:现代优化器,学习率适中
  • mosaic=1.0 + scale=0.5:强数据增强,提升小目标分割鲁棒性

启动训练

python train_seg.py

训练日志将实时输出,重点关注:

  • Epoch 0/1000 开始迭代
  • BoxLoss, SegLoss, mAP50-95 数值稳步上升
  • best.pt 文件在segment/train/weights/下自动生成

训练耗时参考:5张图、1000轮,在镜像默认GPU上约需8–12分钟。若需加速,可减少epochs至200,或增大batch至32(需确认显存)。

5. 模型推理与结果验证:所见即所得

训练完成后,立即验证效果。predict_seg.py专为快速推理设计:

from ultralytics import YOLO

# 加载训练好的最佳权重
model = YOLO("segment/train/weights/best.pt")

# 对验证集所有图片进行预测
results = model.predict(
    source='resources/images/seg/datasets/images/val',  # 输入路径
    imgsz=640,                    # 保持与训练一致
    project='segment/predict',    # 输出根目录
    name='exp',                   # 子目录名
    save=True,                    # 保存带分割掩码的图片
    conf=0.4,                     # 置信度阈值,过滤低质量预测
    iou=0.7,                      # NMS IoU阈值
    device='cuda'                 # 强制使用GPU(镜像默认可用)
)

执行与查看结果

python predict_seg.py

运行结束后,打开输出目录:

ls segment/predict/exp/
# 你会看到:001.jpg, 001_mask.png, 001_labels.txt 等
  • 001.jpg:原图叠加彩色分割掩码与边界框
  • 001_mask.png:纯分割掩码(PNG格式,不同类别用不同灰度值)
  • 001_labels.txt:预测结果的YOLO格式文本(可用于进一步分析)

效果判断标准

  • 掩码是否紧密贴合目标边缘(尤其人物肢体、车辆轮廓)
  • 是否存在明显漏分割(如遮挡部分未覆盖)或误分割(背景被划入)
  • 多目标间掩码是否分离清晰,无粘连

若效果不理想,优先检查:标注质量 → 转换脚本日志 → 训练loss曲线(segment/train/results.csvseg_loss是否下降)。

6. 工程化建议与常见问题速查

这套流程已在多个小型分割项目中验证。以下是来自一线实践的硬核建议:

6.1 标注阶段避坑指南

  • 禁止跨图复用JSON:Labelme生成的imageData包含图片base64编码,若复制json到另一张图,会导致路径错乱、坐标偏移
  • 慎用“自动填充”功能:Labelme的Auto Labeling插件未针对YOLO11优化,易产生不闭合多边形,建议纯手动绘制
  • 类别名统一管理:在yolo11-seg.yaml中定义后,所有标注、脚本、训练必须严格一致,建议用grep -r "person" .全局搜索校验

6.2 脚本运行故障排查

现象 原因 解决方案
tool_json2label_seg.pyKeyError: 'imagePath' JSON文件损坏或非Labelme标准格式 用Labelme重新打开并保存该json
tool_seg2datasets.py提示No images found json/目录下无图片,或图片格式非.jpg/.png 运行ls resources/images/seg/json/*.jpg确认存在
训练时报AssertionError: dataset.image_weights not supported yolo11-seg.yamlpath路径错误,YOLO11找不到图片 检查path是否为../resources/...,并在train.py同级目录执行

6.3 效果提升的三个低成本动作

  1. 增加标注多样性:同一目标在不同光照、角度、遮挡程度下各标1张,比单场景标10张更有效
  2. 微调置信度阈值:推理时将conf=0.4改为0.25,可召回更多弱目标,再人工筛选
  3. 启用半自动标注:训练初版模型后,用其预测新图生成粗略mask,导入Labelme作为Auto Annotation底图,人工修正,效率提升3倍+

7. 总结:构建属于你的分割流水线

本文没有罗列YOLO11的论文公式,也没有深入讲解Segment Head的卷积细节。我们只做了一件事:把图像分割从“理论可行”变成“下午就能跑通”

你已掌握:

  • 用Labelme绘制精准多边形,确保分割基础质量
  • 用两个Python脚本,全自动完成JSON→YOLO标签→数据集划分
  • 通过yolo11-seg.yamltrain_seg.py,5分钟启动训练
  • predict_seg.py一键生成可视化结果,直观验证效果

这套流程的核心价值在于可迁移性:无论你的数据是医疗细胞、工业零件还是农业作物,只需替换json/中的图片与标注,修改yolo11-seg.yaml中的names,其余步骤完全复用。它不追求SOTA指标,而追求“稳定、可控、可交付”。

下一步,你可以尝试:接入自己的摄像头实时分割、导出ONNX模型部署到边缘设备、或用训练好的模型批量处理千张图片。而这一切,都始于你今天画下的第一个多边形。

---

> **获取更多AI镜像**
>
> 想探索更多AI镜像和应用场景?访问 [CSDN星图镜像广场](https://ai.csdn.net/?utm_source=mirror_blog_end),提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐