Files
Yolo/README.md
2026-01-05 17:49:10 +08:00

165 lines
5.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# YOLO11l-seg 室内导盲模型训练指南 (V2)
本方案针对 Dell R730 服务器RTX 3090 24GB, 192GB RAM定制使用大规模合并数据集进行 **实例分割 (Instance Segmentation)** 训练。
## 1. 硬件环境配置
### 1.1 系统与环境
```bash
# 1. 创建虚拟环境
conda create -n yolo python=3.10 -y
conda activate yolo
# 2. 安装 PyTorch (CUDA 12.4)
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124
# 3. 安装 Ultralytics 和 常用工具
pip install ultralytics tqdm opencv-python pyyaml
# 4. 其它依赖
pip install opencv-python matplotlib albumentations
```
### 1.2 监控显卡
```bash
watch -n 1 nvidia-smi
```
---
## 2. 数据集 (V2 大规模合并版 - 22 类)
### 2.1 数据集组成
我们合并了多个来源的高质量分割数据集,数据源经过精心清洗和重映射:
| 数据集来源 | 描述 | 作用 |
|------|------|------|
| **MIT Indoor** | 室内场景分类 | 核心补充:提供 `appliance`, `tableware`, `furniture` 等日常物品 |
| **Indoor Blind** | 早期筛选的导盲数据 | 基础核心数据 (Walkable areas) |
| **Washroom** | 卫浴分割 | 覆盖 `toilet`, `sink` 等卫生间关键设施 |
| **Spoon Fork Chopstick**| 餐具特写 | 极大增强 `tableware` 中细小餐具的识别 (筷子/勺子/叉子) |
| **Stair Seg** | 楼梯分割 | 增强对楼梯的识别 |
| **Stair Chair Couch**| 楼梯/椅子分割 | 补充高质量椅子与楼梯数据 |
**已移除**:
- **Estima AI**: 因全部为平面设计图而非实景图,已移除。
### 2.2 类别定义 (22 类)
统一后的 22 个导盲核心类别:
| ID | 类别 | 中文 | ID | 类别 | 中文 |
|----|------|------|----|------|------|
| 0 | `floor` | 地面 | 11 | `wall` | 墙壁 |
| 1 | `corridor` | 走廊 | 12 | `window` | 窗户 |
| 2 | `sidewalk` | 人行道 | 13 | `cabinet` | 柜子 |
| 3 | `chair` | 椅子 | 14 | `trash_can`| 垃圾桶 |
| 4 | `table` | 桌子 | 15 | `person` | 行人 |
| 5 | `sofa_bed` | 沙发/床 | 16 | `bag` | 包/背包 |
| 6 | `door` | 门 | 17 | `electronics`| 电子电器 |
| 7 | `elevator` | 电梯 | 18 | `plant` | 植物 |
| 8 | `stairs` | 楼梯 | 19 | `obstacle` | 通用障碍 |
| 9 | `appliance` | 家电 | 20 | `toilet` | 卫生间/马桶 |
| 10 | `sink` | 洗手台 | 21 | `tableware` | 餐具/物品 |
> **注**: `tableware` (ID 21) 包含杯子、碗、盘子、勺子、筷子、瓶子等。
### 2.3 目录结构 (服务器端)
请确保服务器 `/home/rongye/ProgramFiles/Yolo/` 结构如下:
```
/home/rongye/ProgramFiles/Yolo/
├── yolo11l-seg.pt # 预训练权重 (标准模型)
├── train_merged.py # 🔥 主力训练脚本 (使用合并数据)
├── datasets/
│ └── blind_guidance_merged/ # 🔥 V2 主力数据集
│ ├── data.yaml # 配置 (22类, 路径必须正确)
│ ├── train/
│ ├── valid/
│ └── test/
└── blind_guide_project/ # 训练日志输出
```
---
## 3. 训练配置
### 3.1 主力配置 `blind_guidance_merged/data.yaml`
**关键点**`path` 必须是服务器上的绝对路径。
```yaml
# 路径必须为服务器绝对路径
path: /home/rongye/ProgramFiles/Yolo/datasets/blind_guidance_merged
train: train/images
val: valid/images
test: test/images
nc: 22
names: [floor, corridor, sidewalk, chair, table, sofa_bed, door, elevator, stairs, wall, window, cabinet, trash_can, person, bag, electronics, plant, obstacle, appliance, toilet, sink, tableware]
```
### 3.2 训练脚本 `train_merged.py`
```python
from ultralytics import YOLO
# 加载标准模型
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, # 数据量大跑200轮
imgsz=640, # 训练分辨率
batch=16, # 3090 24G 显存充足
device=1, # 指定使用 GPU 1
workers=16, # 多线程加载
cache="ram", # 192GB 内存全量缓存加速
optimizer="AdamW", # 优化器
close_mosaic=15, # 最后15轮关闭增强
project="blind_guide_project",
name="yolo11l_blind_v2", # V2 版本
amp=False # ⚠️ 关键:必须关闭混合精度以防止 Loss NaN/Inf
)
```
> **注意**: 如果训练出现 `Loss NaN/Inf`,请确保设置 `amp=False`。混合精度虽然省显存,但在某些特定数据集分布下会导致梯度溢出。
---
## 4. 开始训练流程
### 步骤 1: 上传数据
将本地生成的 `blind_guidance_merged` 文件夹完整上传到服务器 `/home/rongye/ProgramFiles/Yolo/datasets/` 目录。
> **⚠️ 特别提醒**: 上传后,请务必检查服务器上的 `data.yaml` 中的 `path` 字段是否为 `/home/rongye/ProgramFiles/Yolo/datasets/blind_guidance_merged`。如果还是 Windows 路径,请手动修改或上传正确的版本。
### 步骤 2: 运行训练
```bash
cd /home/rongye/ProgramFiles/Yolo
python train_merged.py
```
### 步骤 3: 监控
使用 `watch -n 1 nvidia-smi` 查看显存占用。
---
## 5. 模型导出 (TensorRT)
训练完成后 (V2),最佳模型位于 `blind_guide_project/yolo11l_blind_v2/weights/best.pt`
导出命令:
```python
from ultralytics import YOLO
model = YOLO("blind_guide_project/yolo11l_blind_v2/weights/best.pt")
# 导出为 TensorRT engine, 半精度 fp16, 动态尺寸固定为 480 (或 640 根据推理端需求)
model.export(format="engine", imgsz=480, half=True, device=0)
```
目标文件名:`yolo11l-seg-indoor.engine` (导出后重命名)