YOLOv8实例分割实战:从LabelMe标注到模型训练全流程(附完整代码)
如果你正在尝试用YOLOv8做实例分割,但卡在了数据标注和格式转换这一步,这篇文章就是为你准备的。我见过不少开发者,模型调参头头是道,却在最基础的数据准备环节栽了跟头,导致训练结果一塌糊涂。实例分割不同于目标检测,它要求模型不仅要找到物体,还要精确勾勒出物体的轮廓,这对数据标注的质量和格式提出了更高的要求。本文将带你走通从零开始的全流程:如何用LabelMe这个免费工具高效标注,如何将标注结果转换成YOLOv8能“读懂”的格式,以及如何配置和训练模型,最终获得一个能精准分割出目标的实用模型。整个过程我会附上详细的代码和踩坑经验,无论你是初学者还是需要快速上手的开发者,都能直接套用。
1. 数据标注:用LabelMe打好地基
实例分割模型的好坏,七分靠数据,三分靠训练。而数据质量的核心,在于标注的精准度。LabelMe以其简单直观的交互和免费开源的特性,成为许多研究者和工程师的首选。但直接用LabelMe导出的JSON文件去训练YOLOv8是行不通的,中间必须经过一次关键的格式转换。
1.1 LabelMe标注的核心技巧与规范
安装LabelMe非常简单,一条命令即可:
pip install labelme
安装完成后,在命令行输入 labelme 即可打开图形化界面。标注时,有几个细节直接影响后续模型的表现:
- 多边形勾勒要贴合边缘:用多边形工具勾勒物体轮廓时,点与点之间的线段应尽量贴近物体真实边缘。对于弯曲的边缘,适当增加节点;对于平直边缘,减少不必要的节点。过于稀疏的节点会导致轮廓粗糙,过于密集则会增加计算负担且容易引入标注噪声。
- 统一类别命名:确保同一个物体类别在所有图片中的标签名完全一致,区分大小写。例如,“Person”和“person”会被视为两个不同的类别。
- 处理遮挡与截断:对于被部分遮挡的物体,应沿着可见部分进行标注。对于图片边缘截断的物体,同样只标注可见部分。
标注完成后,每张图片会生成一个同名的 .json 文件。这个文件包含了图片尺寸、所有标注物体的类别和多边形顶点坐标(基于图片像素的绝对坐标)等信息。这是我们的“原材料”。
1.2 从LabelMe到YOLO格式:关键的转换步骤
YOLOv8实例分割所需的标签格式是文本文件(.txt),其核心内容是类别ID和归一化的多边形坐标。转换过程需要解决两个问题:坐标归一化和文件结构组织。
我们可以使用 ultralytics 官方提供的转换工具,它封装了这个过程。假设你的LabelMe标注文件都放在 labelme_annotations 文件夹里,你可以这样转换:
from ultralytics.data.converter import convert_labelme2yolo
# 指定LabelMe标注目录和YOLO格式标签的目标保存目录
convert_labelme2yolo(
labelme_json_dir="path/to/your/labelme_annotations",
save_dir="path/to/your/seg_dataset/labels"
)
运行后,工具会在 save_dir 下生成对应的 .txt 标签文件。让我们深入看看这个 .txt 文件里到底有什么。以下是一个示例内容:
0 0.423 0.512 0.435 0.523 0.420 0.538 0.408 0.527
1 0.712 0.334 0.728 0.340 0.725 0.360 0.710 0.355
注意:转换工具会自动从
labelme_annotations的同级目录寻找同名图片文件。请确保.json文件和.jpg/.png图片文件在同一目录下,或者json文件中正确记录了图片路径。
格式解读:
- 每一行代表一个实例(物体)。
- 第一个数字是类别ID(从0开始)。这个ID与后续数据集配置文件中的
names列表顺序对应。 - 后面是一系列成对的浮点数
x1 y1 x2 y2 ...,代表多边形各个顶点的坐标。 - 这些坐标是归一化的,即
x = 像素横坐标 / 图片宽度,y = 像素纵坐标 / 图片高度,取值范围在0到1之间。这种归一化处理使得模型训练不受原始图片尺寸影响。
2. 构建YOLOv8分割数据集
格式转换完成后,我们需要按照YOLOv8约定的目录结构来组织我们的图片和标签,并编写一个至关重要的配置文件。
2.1 标准的目录结构
一个清晰规范的目录结构是避免路径错误的关键。请严格按照以下方式组织:
my_custom_seg_dataset/
├── dataset.yaml # 数据集配置文件(稍后创建)
├── images/
│ ├── train/ # 存放训练集图片,如 train_001.jpg, train_002.png
│ └── val/ # 存放验证集图片
└── labels/
├── train/ # 存放训练集标签,如 train_001.txt, train_002.txt
└── val/ # 存放验证集标签
关键点:
images/train和labels/train中的文件必须一一对应,且主文件名

&spm=1001.2101.3001.5002&articleId=154729387&d=1&t=3&u=ed5993955f9b4d1e9f7155a84a298b51)
923

被折叠的 条评论
为什么被折叠?



