YOLO11实战体验:5张图快速训练出人车分割模型,效果惊艳
1. 引言
1.1 业务场景描述
在智能交通、安防监控和自动驾驶等实际应用中,精确识别并分割出行人与车辆是实现高级视觉理解的关键步骤。传统的目标检测只能提供边界框信息,而图像分割则能精准描绘出每个实例的轮廓,显著提升感知系统的精度。然而,构建一个高效的实例分割模型往往需要大量标注数据和复杂的训练流程。
本文将带你使用YOLO11镜像环境,在仅有5张图片的极小样本条件下,快速完成一个人车实例分割模型的训练与推理全过程。整个过程从数据准备到模型部署仅需数分钟,且结果清晰可用,非常适合快速验证想法或资源受限场景下的原型开发。
1.2 痛点分析
传统深度学习项目常面临以下挑战:
- 数据标注耗时长
- 环境配置复杂
- 训练调参门槛高
- 推理部署流程繁琐
YOLO11镜像提供了开箱即用的完整环境,极大简化了上述流程。结合 Ultralytics 框架强大的易用性,我们可以在极短时间内完成一次端到端的分割任务实践。
1.3 方案预告
本文将详细介绍如何基于 YOLO11 实现以下核心流程:
- 使用 Labelme 进行多边形标注
- 构建符合 YOLO 格式的分割标签
- 配置数据集与模型参数
- 启动训练并监控进度
- 执行推理并可视化结果
最终我们将得到一个可直接用于图像分割的小型化模型,适用于边缘设备或轻量级应用场景。
2. 数据制作与预处理
2.1 建立数据集文件夹结构
首先创建标准的数据目录结构,便于后续管理:
ultralytics-8.3.9/ ├── resources/ │ └── images/ │ └── seg/ │ ├── json/ # 存放原始图像和labelme生成的json │ └── datasets/ │ ├── images/ │ │ ├── train/ │ │ └── val/ │ └── labels/ │ ├── train/ │ └── val/将5张包含行人和车辆的图像放入resources/images/seg/json/目录下。
2.2 使用Labelme进行多边形标注
安装开源标注工具 Labelme:
pip3 install labelme进入标注目录并启动工具:
cd ultralytics-8.3.9/resources/images/seg/json labelme选择“Create Polygon”模式,依次对图像中的person和car类别进行逐像素级轮廓标注,并保存为.json文件。确保类别名称与后续配置一致。
提示:标注时尽量覆盖不同姿态和遮挡情况的人与车,以增强模型泛化能力。
2.3 转换Labelme输出为YOLO格式
YOLO系列模型要求分割标签为特定文本格式:每行代表一个对象,格式如下:
<class_id> <x1> <y1> <x2> <y2> ... <xn> <yn>其中坐标归一化至 [0,1] 区间。
使用提供的转换脚本处理所有 JSON 文件:
# tool/tool_json2label_seg.py import json import os from glob import glob def convert_labelme_to_yolo(json_path, output_dir, class_mapping): with open(json_path, 'r') as f: data = json.load(f) img_w = data['imageWidth'] img_h = data['imageHeight'] filename = os.path.splitext(os.path.basename(json_path))[0] + '.txt' output_file = os.path.join(output_dir, filename) with open(output_file, 'w') as out: for shape in data['shapes']: label = shape['label'] if label not in class_mapping: continue points = [(p[0]/img_w, p[1]/img_h) for p in shape['points']] line = str(class_mapping[label]) + ' ' + ' '.join([f"{x:.6f} {y:.6f}" for x,y in points]) out.write(line + '\n') class_map = {'person': 0, 'car': 1} json_files = glob("*.json") os.makedirs("../datasets/labels/train", exist_ok=True) for j in json_files: convert_labelme_to_yolo(j, "../datasets/labels/train", class_map)该脚本会自动将所有 JSON 标注转换为 YOLO 可读的.txt标签文件。
2.4 划分训练集与验证集
使用数据集划分脚本打乱顺序并按比例分配:
# tool/tool_seg2datasets.py import os import shutil from sklearn.model_selection import train_test_split image_dir = '../json/' label_dir = '../datasets/labels/train/' images = [f for f in os.listdir(image_dir) if f.endswith(('.jpg','.png','.jpeg'))] names = [os.path.splitext(img)[0] for img in images] train_names, val_names = train_test_split(names, test_size=0.2, random_state=42) def copy_files(names, src_img, src_lbl, dst_img, dst_lbl): os.makedirs(dst_img, exist_ok=True) os.makedirs(dst_lbl, exist_ok=True) for name in names: img_ext = [e for e in ['.jpg','.png','.jpeg'] if os.path.exists(f"{src_img}{name}{e}")][0] shutil.copy(f"{src_img}{name}{img_ext}", f"{dst_img}{name}{img_ext}") if os.path.exists(f"{src_lbl}{name}.txt"): shutil.copy(f"{src_lbl}{name}.txt", f"{dst_lbl}{name}.txt") copy_files(train_names, image_dir, label_dir, '../datasets/images/train/', '../datasets/labels/train/') copy_files(val_names, image_dir, label_dir, '../datasets/images/val/', '../datasets/labels/val/')至此,数据集已准备好供模型训练使用。
3. 模型训练配置与执行
3.1 编写数据配置文件
创建resources/config/data/yolo11-seg.yaml:
path: ../ultralytics-yolo11/resources/images/seg/datasets/images train: train val: val names: 0: person 1: car此文件定义了数据路径和类别名称映射关系。
3.2 配置模型结构与训练参数
YOLO11 提供了多种规模的模型(n/s/m/l/x),本文选用轻量级yolo11n-seg模型,适合小样本快速收敛。
新建训练脚本train_seg.py:
from ultralytics import YOLO, settings # 设置日志和权重保存路径 settings.update({ "runs_dir": "./runs", "weights_dir": "./weights/seg" }) def main(): # 加载模型架构并初始化预训练权重 model = YOLO("resources/config/model/yolo11-seg.yaml").load("weights/seg/yolo11n-seg.pt") # 开始训练 results = model.train( data="resources/config/data/yolo11-seg.yaml", epochs=1000, patience=100, batch=16, imgsz=640, workers=4, optimizer='AdamW', lr0=1e-3, hsv_h=0.9, hsv_s=0.9, hsv_v=0.9, degrees=0.2, mosaic=1.0, scale=0.5, shear=0.2, augment=True, agnostic_nms=True, pretrained=True, cos_lr=True, resume=False # 若中断可设为True继续训练 ) if __name__ == "__main__": main()关键参数说明:
mosaic=1.0:启用马赛克增强,有效提升小样本泛化能力cos_lr=True:余弦退火学习率,平稳收敛patience=100:早停机制防止过拟合pretrained=True:加载ImageNet预训练权重加速收敛
3.3 启动训练
进入项目根目录并运行:
cd ultralytics-8.3.9/ python train_seg.py训练过程中会在runs/segment/train/下生成日志、权重和可视化图表。即使只有5张图,由于强数据增强和迁移学习,模型通常能在几十个epoch内达到较好性能。
4. 模型推理与结果展示
4.1 编写推理脚本
创建predict_seg.py进行预测:
from ultralytics import YOLO # 加载最佳模型 model = YOLO("runs/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, device='cpu' # 支持 'cuda' 加速 )4.2 推理结果分析
推理完成后,系统将在segment/predict/exp/生成带分割掩码的图像。每个实例以不同颜色标出轮廓,并附带类别标签和置信度分数。
尽管训练样本极少,但由于 YOLO11 的强大先验知识和数据增强策略,模型仍能准确识别并分割出人与车的边界,尤其在形状保持方面表现优异。
典型输出特征包括:
- 清晰的边缘分割(得益于Mask分支设计)
- 多实例区分能力(基于Anchor-Free机制)
- 较高的推理速度(CPU也可实时运行)
5. 总结
5.1 实践经验总结
通过本次实战,我们验证了 YOLO11 在极小样本条件下的强大实用性:
- 高效性:5张图即可完成基础分割建模
- 易用性:全流程自动化脚本支持,无需手动调参
- 稳定性:借助预训练+数据增强,避免严重过拟合
- 可扩展性:框架支持导出为ONNX/TensorRT,便于部署
5.2 最佳实践建议
- 优先使用预训练模型:即使是小样本任务,也应加载
yolo11n-seg.pt权重以获得良好初始化。 - 增强数据多样性:若可能,增加光照、角度变化的样本以提升鲁棒性。
- 合理设置 batch size:根据显存调整,避免OOM;小batch可适当降低学习率。
- 关注验证指标:观察 mAP@0.5 和 mask mAP 曲线,判断是否收敛或过拟合。
YOLO11 镜像真正实现了“开箱即用”的AI开发体验,让开发者能够专注于业务逻辑而非环境搭建。对于需要快速验证图像分割方案的团队而言,这是一个极具价值的技术路径。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。