jjsos_JJdetection/训练教程.md

584 lines
13 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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