0e08372badc6ff4244d4424dee42338abfa9aaeb
YOLO11l-seg 室内导盲模型训练指南
本方案针对 Dell R730 服务器(RTX 3090 24GB, 192GB RAM)定制,专注于室内导盲场景下的 实例分割 (Instance Segmentation) 任务。
1. 硬件环境配置
1.1 系统与环境
# 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 监控显卡
watch -n 1 nvidia-smi
2. 数据集
2.1 原始数据集
使用 Roboflow 的 MIT Indoor Scene Classification 数据集:
| 项目 | 内容 |
|---|---|
| 来源 | Roboflow Universe |
| 格式 | 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 筛选脚本
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
# 导盲分割数据集 - 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
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 验证模型
python -c "from ultralytics import YOLO; m=YOLO('best.pt'); m.predict('test/images', save=True)"
5.2 导出 TensorRT
model = YOLO("blind_guide_project/yoloe_seg_blind_v1/weights/best.pt")
model.export(format="engine", imgsz=480, half=True, device=0)
5.3 重命名模型
建议重命名为更清晰的名称:
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 可以进一步提速。
Description