13 KiB
13 KiB
YOLO 分割模型训练完整教程
📚 目录
🚀 快速开始 - 训练搭电设备数据集
步骤 1: 准备数据
确保你的数据集目录结构如下:
datasets/
└── 搭电设备/
├── data.yaml # 数据集配置文件
├── train/
│ ├── images/ # 训练图片(.jpg, .png等)
│ └── labels/ # 训练标注(.txt文件,多边形格式)
└── val/
├── images/ # 验证图片
└── labels/ # 验证标注
步骤 2: 检查 data.yaml 配置
打开 datasets/搭电设备/data.yaml,确保内容如下:
train: train/images
val: val/images
nc: 2
names: ['JumperCable', 'NoJumperCable']
说明:
train: 训练图片目录(相对于data.yaml的路径)val: 验证图片目录nc: 类别数量names: 类别名称列表(顺序对应类别ID:0, 1, 2...)
步骤 3: 验证标注格式(可选但推荐)
在训练前验证标注格式是否正确:
python verify_seg_labels.py datasets/搭电设备/train/labels datasets/搭电设备/train/images
如果看到 "✓ 格式正确",说明标注没问题。
步骤 4: 开始训练
方法一:直接运行(使用默认配置)
python train_segmentation.py
方法二:修改脚本参数
打开 train_segmentation.py,修改 main() 函数中的参数:
def main():
train_segmentation_model(
dataset_path="datasets/搭电设备/data.yaml", # 数据集路径
model_name="yolov8n-seg.pt", # 模型选择
epochs=100, # 训练轮数
batch=8, # 批次大小
imgsz=640, # 图片尺寸
device="cpu" # 设备:cpu 或 cuda
)
步骤 5: 查看训练结果
训练完成后,模型保存在:
runs/segment/train/weights/
├── best.pt # 最佳模型(推荐使用)
└── last.pt # 最后一轮的模型
训练日志和可视化结果在:
runs/segment/train/
├── results.png # 训练曲线图
├── confusion_matrix.png # 混淆矩阵
└── ...
🎯 训练其他数据集
示例 1: 训练仪表盘数据集
步骤 1: 检查数据集结构
# 查看数据集目录
ls datasets/仪表盘/
步骤 2: 检查 data.yaml
打开 datasets/仪表盘/data.yaml,应该看到:
train: train/images
val: val/images
nc: 2
names: ['Dashboard', 'NoDashboard']
步骤 3: 创建训练脚本或修改现有脚本
选项 A: 创建新脚本 train_dashboard_seg.py
from train_segmentation import train_segmentation_model
def main():
train_segmentation_model(
dataset_path="datasets/仪表盘/data.yaml",
model_name="yolov8n-seg.pt",
epochs=100,
batch=8,
imgsz=640,
device="cpu"
)
if __name__ == '__main__':
main()
选项 B: 修改 train_segmentation.py
def main():
train_segmentation_model(
dataset_path="datasets/仪表盘/data.yaml", # 修改这里
model_name="yolov8n-seg.pt",
epochs=100,
batch=8,
imgsz=640,
device="cpu"
)
步骤 4: 运行训练
python train_dashboard_seg.py
# 或
python train_segmentation.py
示例 2: 训练检测仪数据集
步骤 1: 检查 data.yaml
train: train/images
val: val/images
nc: 2
names: ['Detector', 'NoDetector']
步骤 2: 创建训练脚本 train_detector_seg.py
from train_segmentation import train_segmentation_model
def main():
train_segmentation_model(
dataset_path="datasets/检测仪/data.yaml",
model_name="yolov8n-seg.pt",
epochs=100,
batch=8,
imgsz=640,
device="cpu"
)
if __name__ == '__main__':
main()
步骤 3: 运行
python train_detector_seg.py
示例 3: 训练新数据集(从头开始)
假设你要训练一个名为 "新设备" 的数据集:
步骤 1: 创建数据集目录结构
mkdir -p datasets/新设备/train/images
mkdir -p datasets/新设备/train/labels
mkdir -p datasets/新设备/val/images
mkdir -p datasets/新设备/val/labels
步骤 2: 准备数据
- 将训练图片放到
datasets/新设备/train/images/ - 将训练标注(.txt文件)放到
datasets/新设备/train/labels/ - 将验证图片放到
datasets/新设备/val/images/ - 将验证标注放到
datasets/新设备/val/labels/
重要: 标注文件名必须与图片文件名一致(仅扩展名不同)
- 图片:
image001.jpg - 标注:
image001.txt
步骤 3: 创建 data.yaml
创建文件 datasets/新设备/data.yaml:
train: train/images
val: val/images
nc: 3
names: ['设备A', '设备B', '设备C']
说明:
nc: 3表示有3个类别names列表中的顺序对应类别ID:- '设备A' = 类别 0
- '设备B' = 类别 1
- '设备C' = 类别 2
步骤 4: 验证标注
python verify_seg_labels.py datasets/新设备/train/labels datasets/新设备/train/images
步骤 5: 创建训练脚本
创建 train_new_device.py:
from train_segmentation import train_segmentation_model
def main():
train_segmentation_model(
dataset_path="datasets/新设备/data.yaml",
model_name="yolov8n-seg.pt",
epochs=100,
batch=8,
imgsz=640,
device="cpu"
)
if __name__ == '__main__':
main()
步骤 6: 开始训练
python train_new_device.py
⚙️ 详细配置说明
1. 模型选择
YOLO 提供了多种模型大小,根据你的需求选择:
| 模型 | 速度 | 精度 | 参数量 | 适用场景 |
|---|---|---|---|---|
| yolov8n-seg.pt | 最快 | 较低 | 最少 | 实时检测、资源受限 |
| yolov8s-seg.pt | 快 | 中等 | 较少 | 平衡速度和精度 |
| yolov8m-seg.pt | 中等 | 较高 | 中等 | 一般应用 |
| yolov8l-seg.pt | 较慢 | 高 | 较多 | 高精度需求 |
| yolov8x-seg.pt | 最慢 | 最高 | 最多 | 最高精度需求 |
修改方法:
model_name="yolov8s-seg.pt" # 改为你想要的模型
2. 训练轮数 (epochs)
- 小数据集(< 500张): 100-200 epochs
- 中等数据集(500-2000张): 50-100 epochs
- 大数据集(> 2000张): 30-50 epochs
修改方法:
epochs=100 # 根据数据集大小调整
3. 批次大小 (batch)
根据你的GPU/CPU内存调整:
| 设备 | 推荐batch大小 |
|---|---|
| CPU | 4-8 |
| GPU 4GB | 8-16 |
| GPU 8GB | 16-32 |
| GPU 16GB+ | 32-64 |
修改方法:
batch=8 # 如果内存不足,减小这个值;如果有GPU,可以增大
4. 图片尺寸 (imgsz)
- 640: 标准尺寸,平衡速度和精度(推荐)
- 416: 更快,但精度略低
- 832: 更慢,但精度更高
修改方法:
imgsz=640 # 可以改为 416, 512, 832 等
5. 设备选择 (device)
device="cpu" # 使用CPU(较慢)
device="cuda" # 使用默认GPU
device="0" # 使用第1块GPU
device="1" # 使用第2块GPU
检查GPU是否可用:
import torch
print(torch.cuda.is_available()) # True表示有GPU
🔧 常见问题解决
问题 1: 找不到模型文件
错误信息:
FileNotFoundError: yolov8n-seg.pt not found
解决方法:
- 首次运行会自动下载,确保网络连接正常
- 或手动下载后放到项目根目录
- 下载地址:https://github.com/ultralytics/assets/releases
问题 2: 内存不足 (Out of Memory)
错误信息:
RuntimeError: CUDA out of memory
解决方法:
- 减小批次大小:
batch=4 # 从8改为4 - 减小图片尺寸:
imgsz=416 # 从640改为416 - 使用更小的模型:
model_name="yolov8n-seg.pt" # 使用nano版本
问题 3: 标注文件格式错误
错误信息:
ValueError: invalid literal for int() with base 10
解决方法:
- 运行验证脚本检查:
python verify_seg_labels.py datasets/你的数据集/train/labels - 确保标注格式为:
class_id x1 y1 x2 y2 x3 y3 ... - 确保坐标值在 [0, 1] 范围内
问题 4: 训练损失不下降
可能原因和解决方法:
-
学习率过高或过低
- 使用默认学习率(通常不需要修改)
- 如果损失震荡,可以尝试减小学习率
-
数据质量问题
- 检查标注是否正确
- 确保训练集和验证集都有足够的样本
-
模型太小
- 尝试使用更大的模型(如 yolov8s-seg.pt)
-
训练轮数不够
- 增加 epochs 数量
问题 5: 验证集准确率很低
解决方法:
- 检查验证集标注是否正确
- 确保验证集和训练集的数据分布相似
- 增加训练数据量
- 使用数据增强(YOLO默认已启用)
问题 6: 训练速度很慢
解决方法:
- 使用GPU(最重要):
device="cuda" # 改为GPU - 减小图片尺寸:
imgsz=416 # 从640改为416 - 使用更小的模型:
model_name="yolov8n-seg.pt" - 启用缓存(如果内存足够):
# 在train()中添加 cache=True
💡 训练技巧和优化
技巧 1: 使用预训练模型继续训练
如果训练中断,可以从上次保存的模型继续:
# 加载之前训练的模型
model = YOLO("runs/segment/train/weights/last.pt")
# 继续训练
model.train(
data="datasets/搭电设备/data.yaml",
epochs=50, # 继续训练50轮
resume=True # 继续训练
)
技巧 2: 调整学习率
如果训练不稳定,可以调整学习率:
results = model.train(
data="datasets/搭电设备/data.yaml",
epochs=100,
lr0=0.001, # 初始学习率(默认0.01)
lrf=0.1, # 最终学习率因子
...
)
技巧 3: 数据增强
YOLO默认启用数据增强,可以调整:
results = model.train(
data="datasets/搭电设备/data.yaml",
epochs=100,
hsv_h=0.015, # 色调增强
hsv_s=0.7, # 饱和度增强
hsv_v=0.4, # 明度增强
degrees=10, # 旋转角度
translate=0.1, # 平移
scale=0.5, # 缩放
fliplr=0.5, # 水平翻转概率
...
)
技巧 4: 早停机制
如果验证损失不再下降,自动停止训练:
results = model.train(
data="datasets/搭电设备/data.yaml",
epochs=100,
patience=50, # 50轮没有改善就停止
...
)
技巧 5: 多GPU训练
如果有多个GPU,可以使用:
device=[0, 1] # 使用GPU 0和1
技巧 6: 监控训练过程
训练时会实时显示:
- 损失曲线
- 准确率
- mAP(平均精度)
训练完成后查看:
# 查看训练结果图片
open runs/segment/train/results.png
# 查看混淆矩阵
open runs/segment/train/confusion_matrix.png
📝 完整训练示例
示例:训练搭电设备数据集(完整流程)
from train_segmentation import train_segmentation_model
def main():
# 步骤1: 验证标注(可选)
# python verify_seg_labels.py datasets/搭电设备/train/labels datasets/搭电设备/train/images
# 步骤2: 开始训练
train_segmentation_model(
dataset_path="datasets/搭电设备/data.yaml",
model_name="yolov8n-seg.pt", # 使用nano模型(速度快)
epochs=100, # 训练100轮
batch=8, # 批次大小8
imgsz=640, # 图片尺寸640
device="cuda" # 使用GPU(如果有)
)
# 步骤3: 训练完成后,模型保存在 runs/segment/train/weights/best.pt
# 可以使用这个模型进行推理
if __name__ == '__main__':
main()
🎓 总结
训练新数据集的通用步骤:
- ✅ 准备数据 - 组织好目录结构
- ✅ 创建 data.yaml - 配置数据集信息
- ✅ 验证标注 - 确保格式正确
- ✅ 修改训练脚本 - 设置正确的数据集路径
- ✅ 开始训练 - 运行训练脚本
- ✅ 查看结果 - 检查训练曲线和模型
快速参考表:
| 要修改的内容 | 修改位置 | 示例 |
|---|---|---|
| 数据集路径 | dataset_path |
"datasets/仪表盘/data.yaml" |
| 模型大小 | model_name |
"yolov8s-seg.pt" |
| 训练轮数 | epochs |
150 |
| 批次大小 | batch |
16 |
| 图片尺寸 | imgsz |
832 |
| 设备类型 | device |
"cuda" |
📞 需要帮助?
如果遇到问题:
- 查看错误信息
- 检查数据格式
- 运行验证脚本
- 参考本文档的"常见问题解决"部分
祝你训练顺利!🎉