再训练

This commit is contained in:
Kevin Wong
2026-01-05 12:41:43 +08:00
parent 0e08372bad
commit fec2523b5c
3 changed files with 217 additions and 234 deletions

397
README.md
View File

@@ -1,234 +1,163 @@
# YOLO11l-seg 室内导盲模型训练指南 # YOLO11l-seg 室内导盲模型训练指南 (V2)
本方案针对 Dell R730 服务器RTX 3090 24GB, 192GB RAM定制专注于室内导盲场景下的 **实例分割 (Instance Segmentation)** 任务 本方案针对 Dell R730 服务器RTX 3090 24GB, 192GB RAM定制使用大规模合并数据集进行 **实例分割 (Instance Segmentation)** 训练
## 1. 硬件环境配置 ## 1. 硬件环境配置
### 1.1 系统与环境 ### 1.1 系统与环境
```bash ```bash
# 1. 创建虚拟环境 # 1. 创建虚拟环境
conda create -n yolo python=3.10 -y conda create -n yolo python=3.10 -y
conda activate yolo conda activate yolo
# 2. 安装 PyTorch (CUDA 12.4) # 2. 安装 PyTorch (CUDA 12.4)
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124 pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124
# 3. 安装 Ultralytics # 3. 安装 Ultralytics
pip install ultralytics pip install ultralytics
# 4. 其它依赖 # 4. 其它依赖
pip install opencv-python matplotlib albumentations pip install opencv-python matplotlib albumentations
``` ```
### 1.2 监控显卡 ### 1.2 监控显卡
```bash ```bash
watch -n 1 nvidia-smi watch -n 1 nvidia-smi
``` ```
--- ---
## 2. 数据集 ## 2. 数据集 (V2 大规模合并版)
### 2.1 原始数据集 ### 2.1 数据集组成
使用 Roboflow 的 **MIT Indoor Scene Classification** 数据集 我们合并了多个来源的高质量分割数据集,总数据量约 **12,400 张**
| 项目 | 内容 | | 数据集来源 | 描述 | 作用 |
|------|------| |------|------|------|
| 来源 | [Roboflow Universe](https://universe.roboflow.com/pasha-renaisan-gmail-com/indoor-mit-scene-classification) | | **MIT Indoor** | 室内场景分类 | 提供丰富背景和基础物体 |
| 格式 | YOLOv11 (带分割标注) | | **Indoor Blind** | 早期筛选的导盲数据 | 基础核心数据 |
| 原始类别 | **2573 个** (过多且杂乱) | | **Stair Seg** | 楼梯分割 | 增强对楼梯的识别 (Map to `stairs`) |
| **Stair Chair Couch**| 楼梯/椅子分割 | 补充高质量椅子与楼梯数据 |
### 2.2 类别筛选 | **Estima AI** | 室内房间分割 | 映射为 **`floor`**,极大增强可行走区域识别 |
原始 2573 个类别包含大量与导盲无关的物体(如 alarm clock、bananas 等),需要筛选。 ### 2.2 类别定义 (20 类)
使用 `filter_categories.py` 脚本将类别从 **2573 → 14** 个导盲相关类别: 统一后的 20 个导盲核心类别:
| ID | 类别 | 说明 | | ID | 类别 | 说明 | ID | 类别 | 说明 |
|----|------|------| |----|------|------|----|------|------|
| 0 | `floor` | 可行走地面 | | 0 | `floor` | 可行走地面 | 10 | `stairs` | 楼梯 |
| 1 | `corridor` | 走廊/通道 | | 1 | `corridor` | 走廊/通道 | 11 | `wall` | 墙壁 |
| 2 | `sidewalk` | 人行道 | | 2 | `sidewalk` | 人行道 | 12 | `window` | 窗户 |
| 3 | `chair` | 椅子 | | 3 | `chair` | 椅子 | 13 | `cabinet` | 柜子 |
| 4 | `table` | 桌子 | | 4 | `table` | 桌子 | 14 | `trash_can`| 垃圾桶 |
| 5 | `sofa_bed` | 沙发/床 | | 5 | `sofa_bed` | 沙发/床 | 15 | `person` | 行人 |
| 6 | `door` | 门 | | 6 | `door` | 门 | 16 | `cup_bottle`| 杯子/瓶子 |
| 7 | `elevator` | 电梯 | | 7 | `elevator` | 电梯 | 17 | `bag` | 包 |
| 8 | `stairs` | 楼梯 | | 8 | `plant` | 植物 | 18 | `electronics`| 电子电器 |
| 9 | `wall` | 墙壁 | | 9 | `clock` | 时钟/挂钟 | 19 | `obstacle` | 通用障碍物 |
| 10 | `person` | 行人 |
| 11 | `cabinet` | 柜子 | ### 2.3 目录结构 (服务器端)
| 12 | `trash_can` | 垃圾桶 |
| 13 | `window` | 窗户/玻璃门 | 请确保服务器 `/home/rongye/ProgramFiles/Yolo/` 结构如下:
### 2.3 筛选脚本 ```
/home/rongye/ProgramFiles/Yolo/
```bash ├── yolo11l-seg.pt # 预训练权重 (标准模型)
python filter_categories.py ├── train_merged.py # 🔥 主力训练脚本 (使用合并数据)
``` ├── train.py # 🛡️ 备份训练脚本 (使用旧数据)
├── datasets/
生成的数据集: │ ├── blind_guidance_merged/ # 🔥 V2 主力数据集 (12k images)
│ │ ├── data.yaml # 配置 (20类)
| 集合 | 数量 | │ │ ├── train/
|------|------| │ │ ├── valid/
| 训练集 | 1265 张 | │ │ └── test/
| 验证集 | 363 张 | │ └── indoor_blind/ # 🛡️ 备份数据集 (1.8k images)
| 测试集 | 175 张 | │ └── data.yaml # 配置 (14类)
└── blind_guide_project/ # 训练日志输出
### 2.4 目录结构 ```
``` ---
/home/rongye/ProgramFiles/Yolo/
├── yolo11l-seg.pt # 预训练权重 (标准模型) ## 3. 训练配置
├── train.py # 训练脚本
├── data.yaml # 数据配置 ### 3.1 主力配置 `blind_guidance_merged/data.yaml`
├── filter_categories.py # 类别筛选脚本
└── datasets/ ```yaml
└── indoor_blind/ # 筛选后的数据集 # 路径必须为绝对路径
├── data.yaml path: /home/rongye/ProgramFiles/Yolo/datasets/blind_guidance_merged
├── train/ train: train/images
│ ├── images/ val: valid/images
│ └── labels/ test: test/images
├── valid/
│ ├── images/ nc: 20
│ └── labels/ names: [floor, corridor, sidewalk, chair, table, sofa_bed, door, elevator, stairs, wall, window, cabinet, trash_can, person, cup_bottle, bag, electronics, plant, clock, obstacle]
└── test/ ```
├── images/
└── labels/ ### 3.2 训练脚本 `train_merged.py`
```
```python
--- from ultralytics import YOLO
## 3. 训练配置 # 加载标准模型
model = YOLO("/home/rongye/ProgramFiles/Yolo/yolo11l-seg.pt")
### 3.1 数据配置 `data.yaml`
# 开始训练
```yaml results = model.train(
# 导盲分割数据集 - 14 个核心类别 data="/home/rongye/ProgramFiles/Yolo/datasets/blind_guidance_merged/data.yaml",
path: /home/rongye/ProgramFiles/Yolo/datasets/indoor_blind epochs=200, # 数据量大跑200轮
train: train/images imgsz=640, # 训练分辨率
val: valid/images batch=16, # 3090 24G 显存充足
test: test/images device=1, # 指定使用 GPU 1
workers=16, # 多线程加载
nc: 14 cache="ram", # 192GB 内存全量缓存加速
names: optimizer="AdamW", # 优化器
- floor # 0: 可行走地面 close_mosaic=15, # 最后15轮关闭增强
- corridor # 1: 走廊/通道 project="blind_guide_project",
- sidewalk # 2: 人行道 name="yolo11l_blind_v2" # V2 版本
- chair # 3: 椅子 )
- table # 4: 桌子 ```
- sofa_bed # 5: 沙发/床
- door # 6: ---
- elevator # 7: 电梯
- stairs # 8: 楼梯 ## 4. 开始训练
- wall # 9: 墙壁
- person # 10: 行人 ### 步骤 1: 上传数据
- cabinet # 11: 柜子 将本地生成的 `blind_guidance_merged` 文件夹完整上传到服务器 `/home/rongye/ProgramFiles/Yolo/datasets/` 目录。
- trash_can # 12: 垃圾桶
- window # 13: 窗户/玻璃门 ### 步骤 2: 运行训练
``` ```bash
conda activate yolo
### 3.2 训练脚本 `train.py` cd /home/rongye/ProgramFiles/Yolo
python train_merged.py
```python ```
from ultralytics import YOLO
### 步骤 3: 监控
# 注意:使用标准 yolo11l-seg.pt而非 yoloe-11l-seg.pt 使用 `watch -n 1 nvidia-smi` 查看显存占用,确保训练正常开始。
# YOLOE 不支持自定义类别训练!
model = YOLO("/home/rongye/ProgramFiles/Yolo/yolo11l-seg.pt") ---
results = model.train( ## 5. 备份方案 (旧数据)
data="data.yaml",
epochs=150, # 导盲任务建议150轮 如果需要回退到旧版本训练(仅 14 类,数据量较小):
imgsz=640, # 训练分辨率
batch=16, # 3090 显存足够 1. 使用备份脚本:`train.py`
device=1, # 第二块 3090 2. 数据路径:`/home/rongye/ProgramFiles/Yolo/datasets/indoor_blind/data.yaml`
workers=16, # 多线程加载 3. 运行:`python train.py`
cache='ram', # 192GB 内存全量缓存
optimizer='AdamW', ---
close_mosaic=10, # 最后10轮关闭mosaic
amp=True, # 混合精度 ## 6. 模型导出 (TensorRT)
project="blind_guide_project",
name="yoloe_seg_blind_v1" 训练完成后 (V2),最佳模型位于 `blind_guide_project/yolo11l_blind_v2/weights/best.pt`
)
``` 导出命令:
```python
> ⚠️ **重要**:必须使用 `yolo11l-seg.pt`,不能使用 `yoloe-11l-seg.pt` from ultralytics import YOLO
> YOLOE 是零样本模型,不支持自定义类别训练。 model = YOLO("blind_guide_project/yolo11l_blind_v2/weights/best.pt")
model.export(format="engine", imgsz=480, half=True, device=0)
--- ```
## 4. 训练结果
### 4.1 模型信息
| 项目 | 数值 |
|------|------|
| 模型 | YOLO11l-seg |
| 参数量 | 27.6M |
| 训练轮数 | 150 epochs |
### 4.2 推理性能
| 阶段 | 速度 |
|------|------|
| 训练时 | 4.8 ms/张 |
| 验证时 | 23 ms/张 |
### 4.3 输出位置
```
blind_guide_project/yoloe_seg_blind_v1/
├── weights/
│ ├── best.pt ← 最佳模型
│ └── last.pt
├── results.csv
└── results.png
```
---
## 5. 推理与部署
### 5.1 验证模型
```bash
python -c "from ultralytics import YOLO; m=YOLO('best.pt'); m.predict('test/images', save=True)"
```
### 5.2 导出 TensorRT
```python
model = YOLO("blind_guide_project/yoloe_seg_blind_v1/weights/best.pt")
model.export(format="engine", imgsz=480, half=True, device=0)
```
### 5.3 重命名模型
建议重命名为更清晰的名称:
```bash
cp best.pt yolo11l-seg-indoor14.pt
```
---
## 6. 常见问题
**Q: 为什么不用 YOLOE**
YOLOE (YOLO Everything) 是零样本/开放词汇模型,设计用于通过文字描述检测任意物体,**不支持自定义类别训练**。训练时会报错:
```
RuntimeError: shape '[16, 78, -1]' is invalid for input of size 14745600
```
**Q: 为什么要筛选类别?**
原始 MIT Indoor 数据集有 2573 个类别,绝大部分与导盲无关(如 alarm clock、bananas。筛选后 14 个类别更聚焦,训练效果更好。
**Q: 训练用 640推理用 480**
是的。YOLO11l 具有很强的尺度鲁棒性TensorRT 导出时用 480 可以进一步提速。

View File

@@ -0,0 +1,26 @@
names:
- floor
- corridor
- sidewalk
- chair
- table
- sofa_bed
- door
- elevator
- stairs
- wall
- window
- cabinet
- trash_can
- person
- cup_bottle
- bag
- electronics
- plant
- clock
- obstacle
nc: 20
path: /home/rongye/ProgramFiles/Yolo/datasets/blind_guidance_merged
test: test/images
train: train/images
val: valid/images

28
train_merged.py Normal file
View File

@@ -0,0 +1,28 @@
# train_merged.py
# -*- coding: utf-8 -*-
"""
合并数据集训练脚本
在服务器上运行python train_merged.py
"""
from ultralytics import YOLO
# 使用标准 YOLO11l-seg 模型(不要用 YOLOE
model = YOLO("/home/rongye/ProgramFiles/Yolo/yolo11l-seg.pt")
# 开始训练
results = model.train(
data="/home/rongye/ProgramFiles/Yolo/datasets/blind_guidance_merged/data.yaml",
epochs=200, # 数据量大,增加轮次
imgsz=640, # 训练分辨率
batch=16, # 3090 显存足够
device=1, # 第二块 3090
workers=16, # 多线程加载
cache='ram', # 192GB 内存全量缓存
optimizer='AdamW',
close_mosaic=15, # 最后15轮关闭mosaic
amp=True, # 混合精度
patience=30, # 早停耐心值
project="blind_guide_project",
name="yolo11l_blind_v2" # 版本2
)