手把手教你用YOLO11训练自己的分割模型
前言
你是不是也想自己动手训练一个能精准识别物体轮廓的AI模型?比如让AI帮你从照片里抠出每一只猫、每一辆车,甚至是一片叶子的边缘?这不再是遥不可及的技术幻想。今天我们就来实战——用YOLO11训练属于你自己的实例分割模型。
本文专为初学者设计,不讲复杂理论,只带你一步步走通从数据准备到模型训练再到推理预测的完整流程。无论你是学生、工程师还是AI爱好者,只要跟着做,三天内就能跑通第一个自己的分割项目。
我们使用的环境是CSDN星图提供的YOLO11镜像,它已经预装了所有依赖库和工具,省去了繁琐的配置过程,真正实现“开箱即用”。接下来,让我们开始吧!
1. 准备你的数据:标注与格式转换
1.1 使用Labelme进行图像标注
要训练模型,首先得有“教材”——也就是带标签的数据。对于实例分割任务,我们需要标注出每个目标的精确轮廓。
推荐使用Labelme工具,轻量又直观:
- 安装命令:
pip install labelme - 启动方式:
labelme
打开后操作很简单:
- 点击“打开目录”,加载你的图片文件夹
- 选择“创建多边形”工具
- 沿着物体边缘逐点点击,围成一个闭合区域
- 输入类别名称(如
cat,car) - 点击“保存”,生成同名
.json文件
小贴士:建议每类至少准备50张标注图,太少容易过拟合;尽量覆盖不同角度、光照和遮挡情况。
1.2 将Labelme的JSON转为YOLO格式TXT
YOLO11要求的标签格式如下:
<class_id> <x1> <y1> <x2> <y2> ... <xn> <yn>其中:
class_id是类别编号(从0开始)- 坐标是归一化后的浮点数(范围0~1),表示相对于图像宽高的比例
例如:
0 0.15 0.20 0.35 0.25 0.30 0.40 0.10 0.30下面这段代码可以批量将Labelme生成的JSON文件转换为YOLO所需的TXT格式:
import json import os # 修改为你自己的类别映射 label_to_class_id = { "cat": 0, "dog": 1, "car": 2, } def convert_labelme_json_to_yolo(json_file, output_dir, img_width, img_height): with open(json_file, 'r') as f: data = json.load(f) filename = os.path.splitext(os.path.basename(json_file))[0] txt_path = os.path.join(output_dir, f"{filename}.txt") with open(txt_path, 'w') as txt_file: for shape in data['shapes']: label = shape['label'] points = shape['points'] class_id = label_to_class_id.get(label) if class_id is None: print(f"警告:未找到类别 '{label}' 的ID,跳过该标注") continue normalized = [(x / img_width, y / img_height) for x, y in points] line = [str(class_id)] for x_norm, y_norm in normalized: line.append(f"{x_norm:.6f}") line.append(f"{y_norm:.6f}") txt_file.write(" ".join(line) + "\n") if __name__ == "__main__": json_dir = "datasets/mydata/labels_json" # JSON文件所在路径 output_dir = "datasets/mydata/labels" # 输出TXT路径 img_width = 640 img_height = 640 if not os.path.exists(output_dir): os.makedirs(output_dir) for file in os.listdir(json_dir): if file.endswith(".json"): convert_labelme_json_to_yolo( os.path.join(json_dir, file), output_dir, img_width, img_height )运行后你会在labels目录下看到对应的.txt文件,这就是YOLO能读懂的“答案册”。
2. 配置项目结构与环境
2.1 下载YOLO11源码
进入工作目录,下载官方代码库:
git clone https://github.com/ultralytics/ultralytics.git cd ultralytics或者直接下载ZIP包解压。
2.2 构建标准项目结构
建议按照以下结构组织文件:
project/ ├── datasets/ │ └── myseg/ │ ├── images/ │ │ ├── train/ │ │ └── val/ │ └── labels/ │ ├── train/ │ └── val/ ├── weights/ │ └── yolo11m-seg.pt # 预训练权重 ├── train.py # 训练脚本 ├── infer.py # 推理脚本 └── myseg.yaml # 数据集配置把你的图片按8:2比例分到train和val文件夹中,对应标签也放进去。
3. 编写数据集配置文件
在项目根目录创建myseg.yaml,内容如下:
path: ./datasets/myseg train: images/train val: images/val # 类别定义 names: 0: cat 1: dog 2: car这个文件告诉模型:
- 数据放在哪
- 训练集和验证集路径
- 总共几个类别,分别叫什么
你可以根据实际需求修改路径和类别名。
4. 开始训练模型
4.1 编写训练脚本train.py
from ultralytics import YOLO # 加载模型结构并加载预训练权重 model = YOLO("yolo11m-seg.yaml").load("weights/yolo11m-seg.pt") # 开始训练 results = model.train( data="myseg.yaml", # 数据配置文件 epochs=50, # 训练轮数 imgsz=640, # 输入图像大小 batch=16, # 批次大小(根据显存调整) device=0, # 使用GPU 0,若无GPU则设为'cpu' workers=4, # 数据加载线程数 project="runs/segment", # 结果保存主目录 name="my_custom_model", # 运行名称 save=True, save_period=10, # 每10轮保存一次检查点 exist_ok=False, # 不覆盖已有结果 optimizer='AdamW', # 优化器选择 lr0=0.001, # 初始学习率 amp=True, # 启用混合精度加速 val=True, # 每轮都做验证 plots=True # 生成训练曲线图 )4.2 启动训练
执行命令:
python train.py你会看到类似输出:
Epoch GPU_mem box_loss seg_loss cls_loss Instances Size 1/50 5.12G 1.789 3.921 4.012 12 640: 100%|███████| 45/45 [00:07<00:00, 6.2it/s] all 200 310 0.987 0.821 0.892 0.512 0.951 0.801 0.863 0.421训练过程中会自动生成:
weights/best.pt:最佳模型权重weights/last.pt:最后一轮权重results.png:训练曲线图(loss、mAP等)confusion_matrix.png:分类混淆矩阵
5. 模型推理与效果展示
5.1 编写推理脚本infer.py
from ultralytics import YOLO # 加载训练好的模型 model = YOLO("runs/segment/my_custom_model/weights/best.pt") # 对单张图片或整个文件夹进行预测 results = model.predict( source="datasets/myseg/images/val/", # 图片路径 conf=0.5, # 置信度阈值 iou=0.6, # NMS IoU阈值 imgsz=640, # 输入尺寸 device=0, # 使用GPU save=True, # 保存结果图 save_txt=True, # 保存检测框和掩码坐标 show_labels=True, # 显示类别标签 show_conf=True, # 显示置信度 line_width=2 # 边框宽度 )运行后会在runs/predict目录下生成带分割掩码的结果图,颜色区分不同个体,即使重叠也能准确分离。
5.2 实际效果观察
你会发现:
- 单个物体边缘非常贴合
- 多个同类物体(如一群猫)也能区分开
- 小目标和遮挡目标也有不错表现
这是传统目标检测做不到的精细程度。
6. 常见问题与调优建议
6.1 训练不收敛怎么办?
- 检查标签是否正确对齐:确保每张图都有对应
.txt文件,且路径匹配 - 降低学习率:尝试将
lr0改为0.0001 - 减少batch size:如果显存不足导致梯度不稳定
- 增加数据增强:开启更多增强选项提升泛化能力
6.2 如何提高小目标检测效果?
- 使用更大的输入尺寸(如
imgsz=800) - 在数据增强中加入
copy_paste,把小物体复制粘贴到其他位置 - 调整
mask_ratio=2提高掩码分辨率
6.3 推理速度太慢怎么优化?
- 改用更小的模型,如
yolo11n-seg.yaml - 开启半精度推理:
half=True - 减少
imgsz到320或480
7. 总结
通过这篇文章,你应该已经成功完成了以下关键步骤:
- 用Labelme完成图像分割标注
- 将JSON格式转换为YOLO专用TXT标签
- 配置数据集YAML文件
- 使用预训练权重启动训练
- 跑通推理流程并查看分割效果
整个过程不需要手动安装CUDA、PyTorch或其他依赖,得益于CSDN星图提供的YOLO11完整镜像环境,你只需要专注在模型训练本身。
下一步你可以尝试:
- 换自己的真实业务数据(比如工业缺陷检测、医学影像分割)
- 微调超参数进一步提升精度
- 导出为ONNX格式部署到生产环境
记住:AI不是黑盒子,动手才是最好的学习方式。你现在拥有的技能,足以让你在CV领域迈出独立开发的第一步。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。