diff --git a/README.md b/README.md index 8d171d0..9d6dc4f 100644 --- a/README.md +++ b/README.md @@ -1,234 +1,163 @@ -# YOLO11l-seg 室内导盲模型训练指南 - -本方案针对 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 - -# 4. 其它依赖 -pip install opencv-python matplotlib albumentations -``` - -### 1.2 监控显卡 - -```bash -watch -n 1 nvidia-smi -``` - ---- - -## 2. 数据集 - -### 2.1 原始数据集 - -使用 Roboflow 的 **MIT Indoor Scene Classification** 数据集: - -| 项目 | 内容 | -|------|------| -| 来源 | [Roboflow Universe](https://universe.roboflow.com/pasha-renaisan-gmail-com/indoor-mit-scene-classification) | -| 格式 | YOLOv11 (带分割标注) | -| 原始类别 | **2573 个** (过多且杂乱) | - -### 2.2 类别筛选 - -原始 2573 个类别包含大量与导盲无关的物体(如 alarm clock、bananas 等),需要筛选。 - -使用 `filter_categories.py` 脚本将类别从 **2573 → 14** 个导盲相关类别: - -| ID | 类别 | 说明 | -|----|------|------| -| 0 | `floor` | 可行走地面 | -| 1 | `corridor` | 走廊/通道 | -| 2 | `sidewalk` | 人行道 | -| 3 | `chair` | 椅子 | -| 4 | `table` | 桌子 | -| 5 | `sofa_bed` | 沙发/床 | -| 6 | `door` | 门 | -| 7 | `elevator` | 电梯 | -| 8 | `stairs` | 楼梯 | -| 9 | `wall` | 墙壁 | -| 10 | `person` | 行人 | -| 11 | `cabinet` | 柜子 | -| 12 | `trash_can` | 垃圾桶 | -| 13 | `window` | 窗户/玻璃门 | - -### 2.3 筛选脚本 - -```bash -python filter_categories.py -``` - -生成的数据集: - -| 集合 | 数量 | -|------|------| -| 训练集 | 1265 张 | -| 验证集 | 363 张 | -| 测试集 | 175 张 | - -### 2.4 目录结构 - -``` -/home/rongye/ProgramFiles/Yolo/ -├── yolo11l-seg.pt # 预训练权重 (标准模型) -├── train.py # 训练脚本 -├── data.yaml # 数据配置 -├── filter_categories.py # 类别筛选脚本 -└── datasets/ - └── indoor_blind/ # 筛选后的数据集 - ├── data.yaml - ├── train/ - │ ├── images/ - │ └── labels/ - ├── valid/ - │ ├── images/ - │ └── labels/ - └── test/ - ├── images/ - └── labels/ -``` - ---- - -## 3. 训练配置 - -### 3.1 数据配置 `data.yaml` - -```yaml -# 导盲分割数据集 - 14 个核心类别 -path: /home/rongye/ProgramFiles/Yolo/datasets/indoor_blind -train: train/images -val: valid/images -test: test/images - -nc: 14 -names: - - floor # 0: 可行走地面 - - corridor # 1: 走廊/通道 - - sidewalk # 2: 人行道 - - chair # 3: 椅子 - - table # 4: 桌子 - - sofa_bed # 5: 沙发/床 - - door # 6: 门 - - elevator # 7: 电梯 - - stairs # 8: 楼梯 - - wall # 9: 墙壁 - - person # 10: 行人 - - cabinet # 11: 柜子 - - trash_can # 12: 垃圾桶 - - window # 13: 窗户/玻璃门 -``` - -### 3.2 训练脚本 `train.py` - -```python -from ultralytics import YOLO - -# 注意:使用标准 yolo11l-seg.pt,而非 yoloe-11l-seg.pt -# YOLOE 不支持自定义类别训练! -model = YOLO("/home/rongye/ProgramFiles/Yolo/yolo11l-seg.pt") - -results = model.train( - data="data.yaml", - epochs=150, # 导盲任务建议150轮 - imgsz=640, # 训练分辨率 - batch=16, # 3090 显存足够 - device=1, # 第二块 3090 - workers=16, # 多线程加载 - cache='ram', # 192GB 内存全量缓存 - optimizer='AdamW', - close_mosaic=10, # 最后10轮关闭mosaic - amp=True, # 混合精度 - project="blind_guide_project", - name="yoloe_seg_blind_v1" -) -``` - -> ⚠️ **重要**:必须使用 `yolo11l-seg.pt`,不能使用 `yoloe-11l-seg.pt`! -> YOLOE 是零样本模型,不支持自定义类别训练。 - ---- - -## 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 可以进一步提速。 \ No newline at end of file +# 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 + +# 4. 其它依赖 +pip install opencv-python matplotlib albumentations +``` + +### 1.2 监控显卡 + +```bash +watch -n 1 nvidia-smi +``` + +--- + +## 2. 数据集 (V2 大规模合并版) + +### 2.1 数据集组成 + +我们合并了多个来源的高质量分割数据集,总数据量约 **12,400 张**: + +| 数据集来源 | 描述 | 作用 | +|------|------|------| +| **MIT Indoor** | 室内场景分类 | 提供丰富背景和基础物体 | +| **Indoor Blind** | 早期筛选的导盲数据 | 基础核心数据 | +| **Stair Seg** | 楼梯分割 | 增强对楼梯的识别 (Map to `stairs`) | +| **Stair Chair Couch**| 楼梯/椅子分割 | 补充高质量椅子与楼梯数据 | +| **Estima AI** | 室内房间分割 | 映射为 **`floor`**,极大增强可行走区域识别 | + +### 2.2 类别定义 (20 类) + +统一后的 20 个导盲核心类别: + +| ID | 类别 | 说明 | ID | 类别 | 说明 | +|----|------|------|----|------|------| +| 0 | `floor` | 可行走地面 | 10 | `stairs` | 楼梯 | +| 1 | `corridor` | 走廊/通道 | 11 | `wall` | 墙壁 | +| 2 | `sidewalk` | 人行道 | 12 | `window` | 窗户 | +| 3 | `chair` | 椅子 | 13 | `cabinet` | 柜子 | +| 4 | `table` | 桌子 | 14 | `trash_can`| 垃圾桶 | +| 5 | `sofa_bed` | 沙发/床 | 15 | `person` | 行人 | +| 6 | `door` | 门 | 16 | `cup_bottle`| 杯子/瓶子 | +| 7 | `elevator` | 电梯 | 17 | `bag` | 包 | +| 8 | `plant` | 植物 | 18 | `electronics`| 电子电器 | +| 9 | `clock` | 时钟/挂钟 | 19 | `obstacle` | 通用障碍物 | + +### 2.3 目录结构 (服务器端) + +请确保服务器 `/home/rongye/ProgramFiles/Yolo/` 结构如下: + +``` +/home/rongye/ProgramFiles/Yolo/ +├── yolo11l-seg.pt # 预训练权重 (标准模型) +├── train_merged.py # 🔥 主力训练脚本 (使用合并数据) +├── train.py # 🛡️ 备份训练脚本 (使用旧数据) +├── datasets/ +│ ├── blind_guidance_merged/ # 🔥 V2 主力数据集 (12k images) +│ │ ├── data.yaml # 配置 (20类) +│ │ ├── train/ +│ │ ├── valid/ +│ │ └── test/ +│ └── indoor_blind/ # 🛡️ 备份数据集 (1.8k images) +│ └── data.yaml # 配置 (14类) +└── blind_guide_project/ # 训练日志输出 +``` + +--- + +## 3. 训练配置 + +### 3.1 主力配置 `blind_guidance_merged/data.yaml` + +```yaml +# 路径必须为绝对路径 +path: /home/rongye/ProgramFiles/Yolo/datasets/blind_guidance_merged +train: train/images +val: valid/images +test: test/images + +nc: 20 +names: [floor, corridor, sidewalk, chair, table, sofa_bed, door, elevator, stairs, wall, window, cabinet, trash_can, person, cup_bottle, bag, electronics, plant, clock, obstacle] +``` + +### 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 版本 +) +``` + +--- + +## 4. 开始训练 + +### 步骤 1: 上传数据 +将本地生成的 `blind_guidance_merged` 文件夹完整上传到服务器 `/home/rongye/ProgramFiles/Yolo/datasets/` 目录。 + +### 步骤 2: 运行训练 +```bash +conda activate yolo +cd /home/rongye/ProgramFiles/Yolo +python train_merged.py +``` + +### 步骤 3: 监控 +使用 `watch -n 1 nvidia-smi` 查看显存占用,确保训练正常开始。 + +--- + +## 5. 备份方案 (旧数据) + +如果需要回退到旧版本训练(仅 14 类,数据量较小): + +1. 使用备份脚本:`train.py` +2. 数据路径:`/home/rongye/ProgramFiles/Yolo/datasets/indoor_blind/data.yaml` +3. 运行:`python train.py` + +--- + +## 6. 模型导出 (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") +model.export(format="engine", imgsz=480, half=True, device=0) +``` + diff --git a/datasets/blind_guidance_merged/data.yaml b/datasets/blind_guidance_merged/data.yaml new file mode 100644 index 0000000..a997ea4 --- /dev/null +++ b/datasets/blind_guidance_merged/data.yaml @@ -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 diff --git a/train_merged.py b/train_merged.py new file mode 100644 index 0000000..dac10e1 --- /dev/null +++ b/train_merged.py @@ -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 +)