4.0 KiB
4.0 KiB
Day 27: 室内导航模型集成与训练调试
📅 日期: 2026-01-05
📝 摘要
完成室内导盲数据集 (V2) 的构建,合并了 Estima AI 等多个数据源至 20 类标准。开发了室内导航工作流 (workflow_indoor.py) 并集成至服务器。在模型训练过程中修复了 Loss NaN 问题,并验证了数据集完整性。
🔧 主要变更
1. 数据集准备 (V2 大规模合并版)
- 数据源扩展: 成功下载并合并了多个新数据集:
Estima AI: ~2.5k 图片,映射为floor及其它家具。Stair Chair Couch: 增强椅子、沙发和楼梯数据。Indoor Blind: 原始 V1 数据集。
- 合并策略: 将上述数据集合并为统一的 20 类标准 (blind_guidance_merged),总数据量约 12.4k 张。
- 健康检查: 运行
check_dataset_health.py验证了所有 13k+ 图片和标签的完整性。
2. 室内导航工作流 (workflow_indoor.py)
- 新文件创建: 基于盲道导航逻辑,创建了专用的室内导航器。
- 20类映射: 定义了完整的
CLASS_NAMES和CLASS_NAMES_CN,涵盖:- 可行走区域: 地面 (floor), 走廊 (corridor), 人行道 (sidewalk)
- 障碍物: 椅子, 桌子, 沙发, 柜子, 垃圾桶, 行人, 障碍物等
- 兴趣点 (POI): 门, 电梯, 楼梯 (重点优化)
- 可视化与语音: 实现了针对这些类别的特定颜色可视化和语音提示逻辑。
3. 服务器集成 (app_main.py)
- 模型加载: 修改了
load_indoor_model函数,默认加载路径更新为model/yolo11l-seg-indoor.engine。 - 预热逻辑: 增加了对 TensorRT 引擎的识别和模型预热代码。
4. 模型训练 (V2)
- 配置: 使用
train_merged.py脚本,基于yolo11l-seg.pt预训练模型。 - 参数: Epochs=200, Batch=16, Device=RTX 3090 (GPU 1)。
- 调试 (
train_merged.py): - NaN/Inf 错误修复: 在训练 YOLO11l-seg 时遇到 Loss NaN 问题。
- 原因: 混合精度训练 (AMP) 在该数据集分布下导致梯度溢出。
- 解决: 在训练脚本中强制设置
amp=False(使用 FP32 全精度训练)。
- 数据集检查: 编写并运行了
check_dataset_health.py,确认本地数据集的图片和标签无损坏、无 NaN 坐标,排除了数据源问题。
5. 数据集深度优化 (22类)
- Tableware 扩展:
- 响应用户需求,专门合并了
Spoon Fork Chopstick数据集 (~160张高质量特写)。 - 将 Class 21 从
cup_item重命名为更准确的tableware(餐具),包含碗、勺、叉、筷子、盘子等。
- 响应用户需求,专门合并了
- 卫浴数据增强: 确认并合并了
washroom数据集,覆盖马桶 (toilet) 和洗手台 (sink)。 - 路径修正:
- 发现 Windows 本地训练脚本生成的
data.yaml包含本地绝对路径,会导致 Linux 服务器报错。 - 修复: 修改
merge_datasets.py,使其在生成data.yaml时强制写入服务器绝对路径 (/home/rongye/ProgramFiles/Yolo/datasets/blind_guidance_merged),实现跨平台无缝部署。
- 发现 Windows 本地训练脚本生成的
🐛 遇到的问题与解决
- 问题: 服务器训练启动后 Loss 迅速变为 NaN,报错
Checkpoint is corrupted。- 排查: 检查了显存、CUDA 版本,最后定位到 AMP 不稳定性。
- 解决: 关闭 AMP 后解决,同时编写了数据检查脚本作为防御性措施。
- 问题: 旧代码残留
indoor14命名。- 解决: 全局搜索并清理了所有
indoor14引用,统一为yolo11l-seg-indoor。
- 解决: 全局搜索并清理了所有
- 问题: 训练脚本报错
FileNotFoundError(路径错误)。- 原因:
data.yaml由 Windows 生成,携带了d:\...路径。 - 解决: 手动修正
data.yaml并更新生成脚本,统一使用 Linux 服务器路径。
- 原因:
📋 下一步计划
- 等待服务器模型训练完成 (预计 200 epochs)。
- 将训练好的
.pt模型转换为 TensorRT.engine。 - 部署到端侧进行实地测试。