diff --git a/README.md b/README.md index acef2ae..c4d8cbf 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,172 @@ -# Yolo - -Yolo模型训练 \ No newline at end of file +# YOLOE-11l-seg 室内导盲模型全流程指南 + +本方案针对 Dell R730 服务器(RTX 3090 24GB, 192GB RAM)定制,专注于室内导盲场景下的 **实例分割 (Instance Segmentation)** 任务。 + +## 1. 硬件环境优化 (Server Optimization) + +你的服务器拥有海量内存(192GB),这是提升训练速度的核心武器。 + +### 1.1 系统与环境配置 + +```bash +# 1. 创建虚拟环境 +conda create -n yolo python=3.10 -y +conda activate yolo + +# 2. 安装适配 3090 (Ampere架构) 的 PyTorch +# CUDA 12.8 驱动兼容 CUDA 12.4 版本的 PyTorch +pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124 + +# 3. 安装 Ultralytics (支持 YOLOE-11 系列) +pip install ultralytics + +# 4. 其它必要库 +pip install opencv-python matplotlib albumentations +``` + +### 1.2 监控显卡温度 + +3090 在服务器内散热压力大,建议训练时另开窗口运行: + +```bash +watch -n 1 nvidia-smi +``` + +## 2. 数据集 (Dataset) + +推荐使用 Roboflow 的 **Indoor Obstacle Detection** 数据集,包含室内导盲所需的关键类别。 + +### 2.1 数据集信息 + +| 项目 | 内容 | +|------|------| +| 来源 | [Roboflow Universe](https://universe.roboflow.com/indooroutdoornavigation/indoor-obstacle-detection) | +| 版本 | v11 | +| 训练集 | 1440 张 | +| 验证集 | 57 张 | +| 测试集 | 54 张 | +| 类别数 | 8 个 | + +### 2.2 类别列表 + +| ID | 类别 | 说明 | +|----|------|------| +| 0 | `closed_door` | 关闭的门 | +| 1 | `door` | 门 | +| 2 | `elevator` | 电梯 | +| 3 | `escalator` | 自动扶梯 | +| 4 | `footpath` | 步道/可行走区域 | +| 5 | `obstacle` | 障碍物 | +| 6 | `person` | 行人 | +| 7 | `wall` | 墙壁 | + +### 2.3 下载与上传 + +1. 在 Roboflow 选择 **YOLOv11** 格式下载 +2. 解压后修改 `data.yaml` 中的路径为服务器绝对路径 +3. 按以下结构上传至服务器: + +``` +/home/rongye/ProgramFiles/Yolo/ +├── yoloe-11l-seg.pt # 预训练权重 +├── train.py # 训练脚本 +├── data.yaml # 数据配置 +└── datasets/ + └── indoor_obstacle/ # 数据集目录 + ├── train/ + │ ├── images/ + │ └── labels/ + ├── valid/ + │ ├── images/ + │ └── labels/ + └── test/ + ├── images/ + └── labels/ +``` + +## 3. 训练配置 (Training Protocol) + +针对 3090 (24GB) 和 192GB 内存优化的脚本。 + +### 3.1 编写 `data.yaml` + +```yaml +# 数据集配置 - Indoor Obstacle Detection v11 +path: /home/rongye/ProgramFiles/Yolo/datasets/indoor_obstacle +train: train/images +val: valid/images +test: test/images + +nc: 8 +names: ['closed_door', 'door', 'elevator', 'escalator', 'footpath', 'obstacle', 'person', 'wall'] +``` + +### 3.2 训练脚本 `train.py` + +```python +from ultralytics import YOLO + +# 加载 YOLOE-11l-seg 权重 (Everything/World系列) +# 11l 是 Large 版本,拥有最强的特征提取能力 +model = YOLO("yoloe-11l-seg.pt") + +# 开始训练 +results = model.train( + data="data.yaml", + epochs=150, # 导盲任务建议150轮以确保收敛 + imgsz=640, # 训练分辨率保持 640 + batch=16, # 3090 显存大,16-32 均可 + device=1, # 指定第二块 3090 + workers=16, # 利用双路 Xeon CPU 的多线程能力 + cache='ram', # 【核心优化】192GB内存足够载入全部数据,极大缩短IO等待 + optimizer='AdamW', # 分割任务建议使用 AdamW + close_mosaic=10, # 最后 10 轮关闭增强,提升 Mask 边缘的细腻程度 + amp=True, # 开启混合精度,提速并省显存 + project="blind_guide_project", + name="yoloe_11l_v1" +) +``` + +## 4. 适配 480p 实时推理 (Inference Adaption) + +你训练用 640,使用用 480。11l 模型具有很强的尺度鲁棒性。 + +### 4.1 服务器端推理优化 + +在服务器上运行推理时,通过导出 **TensorRT** 格式,可以将 3090 的延迟降至 10ms 以内: + +```python +# 训练完后执行导出 +model = YOLO("blind_guide_project/yoloe_11l_v1/weights/best.pt") +model.export(format="engine", imgsz=480, half=True, device=0) +``` + +### 4.2 将"像素"转化为"语音" + +在服务器端处理结果时,利用分割结果计算行走路径: + +```python +import numpy as np + +def generate_guide_command(results): + for r in results: + # 获取 footpath (class 4) 的掩码 + footpath_mask = r.masks.data[r.boxes.cls == 4].cpu().numpy() + + # 将掩码横向分为 左、中、右 三个扇区 + # 如果中间扇区地面像素占比低于阈值,说明前方有障碍物 + h, w = footpath_mask[0].shape + middle_zone = footpath_mask[0][int(h*0.5):, int(w*0.35):int(w*0.65)] + + if np.mean(middle_zone) < 0.5: + return "停止,前方有障碍物" + else: + return "路径安全,请直行" +``` + +## 5. 常见问题 (FAQ) + +- **Q: 训练过程中显卡太热怎么办?** + - A: R730 散热主要是靠前排风扇。如果 3090 超过 85度,请在 iDRAC 里将风扇转速手动设为 70% 或更高。 +- **Q: 为什么不用小模型 (11s)?** + - A: 因为你的模型运行在服务器上。3090 跑 11l 和跑 11s 的延迟差距对导盲来说可以忽略(都是毫秒级),但 11l 能发现 11s 漏掉的细电线。 \ No newline at end of file diff --git a/data.yaml b/data.yaml new file mode 100644 index 0000000..7d9ee0c --- /dev/null +++ b/data.yaml @@ -0,0 +1,24 @@ +# 导盲分割数据集 - 从 MIT Indoor 筛选的 14 个核心类别 +# 原始 2573 类别 -> 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: 窗户/玻璃门 \ No newline at end of file diff --git a/train.py b/train.py new file mode 100644 index 0000000..30d8d4e --- /dev/null +++ b/train.py @@ -0,0 +1,21 @@ +from ultralytics import YOLO + +# 加载 YOLOv11-Large 分割模型 (标准版本,支持自定义训练) +# 注意:YOLOE 不支持自定义类别数训练,需使用标准 YOLO11 +model = YOLO("/home/rongye/ProgramFiles/Yolo/yolo11l-seg.pt") + +# 开始训练 +results = model.train( + data="data.yaml", + epochs=150, # 导盲任务建议150轮以确保收敛 + imgsz=640, # 训练分辨率保持 640 + batch=16, # 3090 显存大,16-32 均可 + device=1, # 指定第二块 3090 + workers=16, # 利用双路 Xeon CPU 的多线程能力 + cache='ram', # 【核心优化】192GB内存足够载入全部数据,极大缩短IO等待 + optimizer='AdamW', # 分割任务建议使用 AdamW + close_mosaic=10, # 最后 10 轮关闭增强,提升 Mask 边缘的细腻程度 + amp=True, # 开启混合精度,提速并省显存 + project="blind_guide_project", + name="yoloe_seg_blind_v1" +) \ No newline at end of file diff --git a/yolo11l-seg.pt b/yolo11l-seg.pt new file mode 100644 index 0000000..b0f5f2f Binary files /dev/null and b/yolo11l-seg.pt differ