简介:这是一份面向深度学习与计算机视觉方向的芒果实例分割数据集,采用YOLOv8标注格式,可直接用于YOLOv8的实例分割训练与验证,适合从事目标检测、实例分割研究的学生、算法工程师及农业智能化应用开发者。资源包共1088个文件,以542张png图像与542个同名txt标注文件为主,另含2个json配置与2个cache缓存文件,压缩包约187.03MB,训练集453条、验证集91条,目录结构清晰,便于直接接入训练流程。数据集覆盖精准农业、自动化采摘、质量分级、病虫害检测及储运监控等场景,可用于模型训练、精度评估与算法对比实验。目前已有761人学习下载,能为芒果识别与分割任务提供现成的数据基础,帮助读者快速搭建实验环境、验证模型效果并推进相关应用落地。
1. 芒果实例分割数据集落地:453 张训练图到底能训出什么
拿到一份标注好的芒果实例分割数据集,第一反应通常不是兴奋,而是怀疑——453 条训练数据、91 条验证数据,这个量级放在 yolov8 实例分割任务里,究竟能不能训出一个可用的模型?我一开始也这么想。去年做果园巡检项目时,我手上正好有一批芒果图像,标注了果实轮廓,格式是 yolov8 可直接读取的实例分割标签。当时最关心的问题很具体:数据量够不够、要不要做增强、验证集怎么切、训练完 mAP 能到多少。这份数据集的价值不在于它有多大,而在于它把「芒果」这个细分场景的实例分割任务从零到一跑通了——训练集 453 张、验证集 91 张,覆盖了不同光照、遮挡和果实成熟度,标签是 polygon 多边形格式,直接对应 yolov8-seg 的输入要求。如果你正在做农业视觉检测、果园产量估算,或者只是想找一个真实场景的实例分割数据集练手,这份数据能让你跳过最耗时的标注环节,把精力放在模型训练和调参上。它适合两类人:一是需要快速验证芒果检测方案可行性的工程师,二是想理解实例分割数据组织方式的初学者。接下来我会把从数据检查到训练收敛的完整路径拆开讲,包括参数怎么设、坑在哪、怎么判断模型是不是真的学到了东西。
2. 芒果实例分割数据集的结构与 yolov8 格式对齐
2.1 实例分割标签长什么样:polygon 与 bbox 的区别
yolov8 的实例分割任务和纯目标检测最大的区别在于标签格式。目标检测只需要一个矩形框,四个坐标值;实例分割需要每个目标的精确轮廓,用一系列多边形顶点表示。这份芒果数据集用的是 polygon 标注,每张图对应一个 txt 文件,每行代表一个芒果实例,格式是:类别索引 + 归一化后的多边形顶点坐标序列。举个例子,一行可能是0 0.312 0.456 0.325 0.478 0.341 0.502 ...,其中第一个 0 是类别(芒果),后面每两个数是一个顶点的 x、y 坐标,全部除以图像宽高做了归一化。这种格式的好处是 yolov8 的YOLODataset类可以直接解析,不需要额外转换。但要注意,polygon 顶点数量不固定,有的芒果轮廓简单可能十几个点,有的被叶子遮挡后轮廓复杂可能上百个点。yolov8 在加载时会统一处理,但顶点过多会拖慢数据加载速度,顶点过少则分割掩码粗糙。我一般会检查一下顶点数量的分布,如果有个别实例超过 200 个点,考虑用多边形简化算法抽稀一下。
2.2 目录结构怎么摆:train/val 与 images/labels 的对应关系
yolov8 对数据集的目录结构有约定,不按这个来会直接报错找不到标签。标准布局是根目录下分images和labels两个文件夹,各自再分train和val。这份芒果数据集已经切好了 453 张训练、91 张验证,所以目录应该是:
mango_seg/ ├── images/ │ ├── train/ # 453 张 .jpg 或 .png │ └── val/ # 91 张 └── labels/ ├── train/ # 453 个 .txt └── val/ # 91 个 .txt关键点是 images 和 labels 下的文件名必须一一对应,除了扩展名不同。比如images/train/mango_001.jpg对应labels/train/mango_001.txt。我见过有人把标签文件命名成mango_001_label.txt,结果训练时 loss 一直是 nan,排查半天才发现是文件名不匹配。另外,如果原始数据是 labelme 标注的 json,需要先转成 yolov8 格式,转换脚本后面会讲。
2.3 data.yaml 的五个必填字段与常见填错
yolov8 训练时通过一个 yaml 文件告诉模型数据在哪、有几个类别、类别叫什么。这个文件通常叫data.yaml,放在数据集根目录或任意位置,训练命令里指定路径即可。必填字段有五个:
| 字段 | 含义 | 这份芒果数据集的填法 |
|---|---|---|
| path | 数据集根目录 | /home/user/mango_seg |
| train | 训练集相对路径 | images/train |
| val | 验证集相对路径 | images/val |
| nc | 类别数量 | 1(只检测芒果) |
| names | 类别名称列表 | ['mango'] |
常见错误是train和val写成了绝对路径,或者路径里用了反斜杠。yolov8 在 Windows 和 Linux 下对路径分隔符处理不一样,保险起见统一用正斜杠。还有一个坑是nc和names长度不一致,比如 nc 写了 1 但 names 里放了两个类别,训练时不会报错但类别索引会乱。填完可以用一行 Python 验证一下:
import yaml with open('data.yaml', 'r') as f: data = yaml.safe_load(f) assert data['nc'] == len(data['names']), "nc 与 names 数量不匹配" print("类别:", data['names'], "数量:", data['nc'])这段代码就是读 yaml 然后断言类别数和名称列表长度一致,跑一下能避免后面训练时出现莫名其妙的类别错位。
3. 从零跑通 yolov8 实例分割训练:环境、命令与参数
3.1 环境搭建:CPU 版本也能跑,但 GPU 才是正路
yolov8 的环境配置比 yolov5 简单不少,官方 ultralytics 包把依赖都封好了。如果你手头只有 CPU 机器,比如 Ubuntu 20.04 的云服务器没有显卡,也能跑,只是慢。我实测过在 8 核 CPU 上训 453 张图,一个 epoch 大概 3 到 5 分钟,100 个 epoch 要跑大半天。有 GPU 的话,比如 GTX 1660 Ti 6G 显存,batch size 设 8 左右,一个 epoch 不到 30 秒。安装命令:
# 创建虚拟环境 python3 -m venv yolov8_env source yolov8_env/bin/activate # 安装 ultralytics,会自动装 torch 等依赖 pip install ultralytics # 验证安装 yolo checksyolo checks会输出当前环境的信息,包括 torch 版本、CUDA 是否可用。如果显示CUDA: None说明没装 GPU 版 torch,需要去 pytorch 官网找对应 CUDA 版本的安装命令重装。注意不要混用 conda 和 pip 装 torch,容易出现库冲突。
3.2 训练命令逐参数拆解:epochs、imgsz、batch 怎么定
yolov8 的训练入口是yolo segment train,后面跟一堆参数。针对这份芒果数据集,我一般这么起手:
yolo segment train \ data=/home/user/mango_seg/data.yaml \ model=yolov8n-seg.pt \ epochs=100 \ imgsz=640 \ batch=8 \ device=0 \ workers=4 \ project=mango_runs \ name=exp1 \ patience=20 \ save=True \ plots=True逐条说:model=yolov8n-seg.pt用的是 nano 版分割模型,参数量小,适合小数据集快速验证。如果数据量再大一些或者精度不够,可以换yolov8s-seg.pt或yolov8m-seg.pt。epochs=100是上限,实际可能提前停。imgsz=640是输入分辨率,芒果图像如果原图很大,缩到 640 会丢小目标细节,可以试 800 或 1024,但显存占用会涨。batch=8在 6G 显存下比较稳,显存够可以加到 16。patience=20是早停耐心值,验证集指标 20 个 epoch 不提升就停,避免过拟合。plots=True会画出训练曲线和验证集预测样例,后面分析要用。
3.3 训练过程看什么:loss 曲线与 mAP 的解读
训练启动后终端会打印每个 epoch 的 loss 和指标。重点看三个:box_loss、seg_loss、mask mAP50。box_loss 是检测框回归损失,seg_loss 是分割掩码损失,两个都应该稳步下降。如果 seg_loss 降到某个值就不动了,可能是学习率太大或者数据标注有问题。mask mAP50是 IoU 阈值 0.5 时的平均精度,对这份数据,我预期能到 0.7 以上算正常,0.5 左右说明模型还没学好,低于 0.3 基本是数据或参数出了大问题。训练结束后在mango_runs/exp1/下会生成results.csv,可以用 pandas 读出来画图:
import pandas as pd import matplotlib.pyplot as plt df = pd.read_csv('mango_runs/exp1/results.csv') df.columns = df.columns.str.strip() # 列名可能有空格 fig, axes = plt.subplots(1, 2, figsize=(12, 4)) axes[0].plot(df['epoch'], df['train/box_loss'], label='box_loss') axes[0].plot(df['epoch'], df['train/seg_loss'], label='seg_loss') axes[0].set_xlabel('epoch') axes[0].set_ylabel('loss') axes[0].legend() axes[1].plot(df['epoch'], df['metrics/mAP50(B)'], label='box mAP50') axes[1].plot(df['epoch'], df['metrics/mAP50(M)'], label='mask mAP50') axes[1].set_xlabel('epoch') axes[1].set_ylabel('mAP') axes[1].legend() plt.tight_layout() plt.savefig('training_curves.png')这段代码读 results.csv,画 loss 和 mAP 两条曲线。注意列名里可能有空格,用strip()去掉。如果 loss 曲线震荡剧烈,考虑调小学习率;如果 mAP 早早饱和,说明模型容量不够,换大一号的模型。
4. 小数据集训练芒果分割的避坑与排查
4.1 验证集 mAP 高但实际预测一塌糊涂
现象:训练日志里 mask mAP50 到了 0.85,但拿几张没见过的芒果图去预测,分割掩码要么缺一块要么多一块。原因通常是验证集和训练集分布太接近,91 张验证图可能和 453 张训练图来自同一批拍摄,光照、角度、背景几乎一样,模型只是记住了而不是学会了。解决办法是重新切分验证集,确保验证集里有训练集没出现过的场景,比如不同时间段拍的、不同果园的。如果原始数据不够,至少按拍摄批次切,不要随机切。
4.2 训练到一半 loss 变成 nan
现象:前几个 epoch 正常,突然 box_loss 或 seg_loss 变成 nan,之后所有指标都废了。原因多半是标注文件里有非法值,比如多边形坐标超出了 0 到 1 的范围,或者某个 txt 文件里有多余的空行、乱码。yolov8 在加载时不会逐行校验,坏数据进了 loss 计算就炸了。解决办法是写个脚本扫一遍所有标签文件:
import os def check_labels(label_dir): bad_files = [] for fname in os.listdir(label_dir): if not fname.endswith('.txt'): continue path = os.path.join(label_dir, fname) with open(path, 'r') as f: for line_num, line in enumerate(f, 1): parts = line.strip().split() if len(parts) < 7: # 类别 + 至少3个点(6个坐标) bad_files.append((path, line_num, '顶点太少')) continue coords = [float(x) for x in parts[1:]] if any(c < 0 or c > 1 for c in coords): bad_files.append((path, line_num, '坐标越界')) return bad_files bad = check_labels('mango_seg/labels/train') for b in bad: print(b)这段代码遍历标签目录,检查每行的顶点数和坐标范围。发现坏文件后直接删掉对应图片和标签,或者手动修正。
4.3 显存不够报 CUDA out of memory
现象:训练启动几秒后报CUDA out of memory,即使 batch 已经设得很小。原因可能是 imgsz 设太大,或者 workers 太多导致数据加载占用显存。解决办法按优先级:先把imgsz从 640 降到 512,再把batch降到 4,还不行就设workers=0用主进程加载数据。另外,yolov8 默认会缓存图像到内存加速训练,小数据集可以开cache=True,但大数据集会吃满内存,这份 453 张的规模开缓存没问题。
4.4 预测时类别索引对不上
现象:训练时 names 写的是['mango'],预测结果里却出现了类别 1 或类别 2。原因通常是 data.yaml 里的 nc 和 names 不匹配,或者用了预训练模型自带的类别数。yolov8n-seg.pt 是在 COCO 上预训练的,有 80 个类别,微调时如果 data.yaml 没覆盖好,模型可能保留部分旧类别。解决办法是确认 data.yaml 里 nc=1、names=['mango'],训练时加pretrained=True但不要加freeze层数太多,让分类头充分微调。
4.5 数据增强开了反而掉点
现象:默认训练配置里 yolov8 开了 mosaic、mixup 等增强,但在这份芒果数据上 mAP 不升反降。原因是芒果实例分割对轮廓敏感,mosaic 把四张图拼一起会切断芒果轮廓,mixup 叠加两张图会让分割掩码混乱。解决办法是关掉或减弱增强:mosaic=0.0、mixup=0.0,只保留翻转和轻微色彩抖动。我一般会先跑一版默认增强,再跑一版关增强,对比验证集指标再决定。
5. 把 453 张训练图用到极致:增强策略与迁移学习技巧
小数据集训练实例分割,核心思路不是堆 epoch,而是让每张图被模型看到更多样的版本,同时借助预训练权重把通用特征迁移过来。yolov8 默认的增强策略对目标检测友好,但对实例分割有时会帮倒忙。我的做法是分阶段调整:前 30 个 epoch 关掉 mosaic 和 mixup,只开fliplr=0.5、hsv_h=0.015、hsv_s=0.7、hsv_v=0.4,让模型先稳定学到芒果的轮廓和纹理。30 个 epoch 之后如果验证集 mAP 还在涨,再逐步打开mosaic=0.5和scale=0.3,增加场景多样性。注意scale参数控制随机缩放,对芒果这种大小不一的果实有用,但别超过 0.5,否则小芒果缩没了。
迁移学习方面,yolov8n-seg.pt的 backbone 是在 COCO 上训过的,已经能提取边缘、纹理、颜色等底层特征,这些对芒果分割同样有效。训练时默认会加载全部预训练权重,但分割头是随机初始化的。如果数据量特别小,可以冻结 backbone 的前几层,只训分割头和检测头:
yolo segment train \ data=/home/user/mango_seg/data.yaml \ model=yolov8n-seg.pt \ epochs=80 \ imgsz=640 \ batch=8 \ freeze=10 \ lr0=0.001 \ cos_lr=Truefreeze=10表示冻结前 10 层,lr0=0.001是初始学习率,比默认的 0.01 小一个量级,避免微调时把预训练特征冲掉。cos_lr=True用余弦退火调度学习率,后期收敛更平滑。跑完对比一下不冻结的版本,如果冻结版 mAP 更高,说明数据量确实撑不起全量微调。
还有一个技巧是测试时增强(TTA),在预测阶段对同一张图做翻转、缩放,把多次预测结果融合。yolov8 的predict支持augment=True:
from ultralytics import YOLO model = YOLO('mango_runs/exp1/weights/best.pt') results = model.predict( source='test_images/', augment=True, conf=0.25, iou=0.45, save=True, project='mango_pred', name='tta_test' )augment=True开启 TTA,conf=0.25是置信度阈值,iou=0.45是 NMS 的 IoU 阈值。TTA 会拖慢推理速度大概 3 倍,但对小数据集训出的模型,mAP 通常能涨 1 到 3 个点。如果部署环境对延迟不敏感,这个技巧值得加。
最后说一个我踩过的坑:有次训练完发现验证集 mAP 很高,但把模型拿到 RK3588 板端部署时,分割掩码完全错位。排查后发现是预处理不一致——训练时 yolov8 默认把图像 resize 到 640x640 并做了 letterbox 填充,而板端推理时我直接 resize 没做填充,导致坐标映射错乱。后来在板端严格复现了 letterbox 逻辑才解决。所以训练和部署的预处理必须对齐,别只看验证集指标。希望这些经验能帮你把这份芒果实例分割数据集真正跑出可用的模型。
本文还有配套的精品资源,点击获取