feat: initial HSAP platform
Huaxu Sentinel Active Safety Platform with embedded algorithm code, Docker Compose setup, and vendored dataset scaffolds for clone-and-run. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
87
datasets/dms/docs/ISA模型训练指导手册.md
Executable file
87
datasets/dms/docs/ISA模型训练指导手册.md
Executable file
@@ -0,0 +1,87 @@
|
||||
1,链接webserver
|
||||
地址:192.168.1.175
|
||||
密码:123
|
||||
用户名:xzl
|
||||
|
||||
2,remmina 远程传数据
|
||||
|
||||
/home/xzl/yolov5-6.2 训练代码
|
||||
/mnt/sas/xzl13/datasets/isa_detect 检测数据集
|
||||
/home/xzl/datasets 分类数据集(最新的是 isa_class_1120)
|
||||
|
||||
|
||||
3,vscode
|
||||
|
||||
/home/xzl/yolov5-6.2 训练工程代码文件夹
|
||||
激活训练环境
|
||||
conda activate /mnt/sas/xzl13/conda/yolov5s62
|
||||
|
||||
3.1 检测模型
|
||||
3.1.1 数据处理
|
||||
标注后的图片和xml标注文件整理到一个文件夹src_data下面。
|
||||
所有.jpg图片放到src_data/images,所有xml文件放到src_data/labels
|
||||
tar cvf isa_detect_1120.tar.gz src_data
|
||||
/mnt/sas/xzl13/datasets 下新建文件夹 isa_detect_1120
|
||||
remmina传输文件到下面
|
||||
解压
|
||||
cd /mnt/sas/xzl13/datasets/isa_detect_1120
|
||||
tar xvf isa_detect_1120.tar.gz
|
||||
|
||||
执行脚本处理数据
|
||||
python isa_detect_preprocess.py --src-data ./isa_detect_1124_test/src_data
|
||||
|
||||
拷贝检测数据到 /mnt/sas/xzl13/datasets/isa_detect
|
||||
cd /mnt/sas/xzl13/datasets/isa_detect_1120
|
||||
cp -r dst_data/* ../isa_detect/
|
||||
|
||||
3.1.2 服务器训练检测模型
|
||||
检测训练脚本位置:/home/xzl/yolov5-6.2/train.py
|
||||
cd /home/xzl/yolov5-6.2/
|
||||
nohup python train.py --data isa-detect.yaml --weights '' --cfg yolov5s_isa.yaml --img 640 --batch-size 128 --device 1,2 > train_isa_detect_1124_log &
|
||||
|
||||
only modify train_isa_detect_1120_log for log
|
||||
|
||||
3.1.3 导出模型为onnx
|
||||
训练完模型保存位置/home/xzl/yolov5-6.2/runs/train/exp6/weights/best.pt
|
||||
执行导出转换脚本
|
||||
cd /home/xzl/yolov5-6.2/
|
||||
python export.py --weights runs/train/exp6/weights/best.pt --include onnx
|
||||
导出文件位置:/home/xzl/yolov5-6.2/runs/train/exp6/weights/best.onnx
|
||||
|
||||
|
||||
|
||||
|
||||
3.2 分类模型
|
||||
|
||||
3.2.1 从检测数据集roi截图
|
||||
cd /mnt/sas/xzl13/datasets/
|
||||
python isa_roi_img.py --train-label ./isa_detect_1120/dst_data/labels/train --val-label ./isa_detect_1120/dst_data/labels/val --save-dir ./isa_detect_1120/roi
|
||||
roi截图后保存在/mnt/sas/xzl13/datasets/isa_detect_1120/roi下面。下载到本地,用于下一步分类处理数据
|
||||
|
||||
3.2.2 数据处理
|
||||
从webserver下载上次训练数据集src_data到本地
|
||||
将欧洲回传的截图或检测数据集roi截图拷贝到src_data相应文件夹下
|
||||
|
||||
在webserser的/home/xzl/datasets/ 下新建文件夹 isa_class_1120 ,并将本地处理完的src_data数据上传到此目录下。
|
||||
|
||||
分类数据处理脚本:
|
||||
cd home/xzl/datasets/
|
||||
python isa_preprocess.py --src-data ./isa_class_1120/src_data
|
||||
cp /home/xzl/datasets/isa_class_1120/dst_data/* /home/xzl/datasets/isa_class_1120
|
||||
|
||||
3.2.3 训练
|
||||
/home/xzl/yolov5-6.2/classify/train.py 分类训练脚本
|
||||
nohup python classify/train.py --model mobilenet_v3_large --data isa_class_1120 --epochs 80 --img 224 --device 3 > train_isa_clas_1120_log &
|
||||
|
||||
--data isa_class_1120 指定数据集到/home/xzl/datasets/isa_class_1120
|
||||
|
||||
|
||||
训练完,生成文件在/home/xzl/yolov5-6.2/runs/train-cls/exp5下面。
|
||||
模型文件在 /home/xzl/yolov5-6.2/runs/train-cls/exp5/weights/best.pt
|
||||
|
||||
3.2.4 导出onnx模型
|
||||
cd /home/xzl/yolov5-6.2
|
||||
python export.py --weights runs/train-cls/isa1120_classify_mobilenetv3_large/weights/best.pt --include onnx --imgsz 224
|
||||
|
||||
--weights 指定新生成的模型文件
|
||||
转生成onnx模型,
|
||||
176
datasets/dms/docs/TODO_gyp_to_yolo26.md
Normal file
176
datasets/dms/docs/TODO_gyp_to_yolo26.md
Normal file
@@ -0,0 +1,176 @@
|
||||
# GYP 数据整理 → YOLO26 RKNN 迁移 Todo
|
||||
|
||||
> 数据根目录:`/home/chengfanglu/DATA/DMS/DATASET/gyp`(约 **45G**,已自 `gyp_org` / `BK2/archive/gyp` 迁入)
|
||||
> 配置:`/home/chengfanglu/DATA/DMS/DATASET/configs/`
|
||||
> 目标工程:`/home/chengfanglu/DATA/DMS/Code/yolo26_rknn_ultralytics-main`
|
||||
|
||||
---
|
||||
|
||||
## 阶段 0:环境与目录(先做)
|
||||
|
||||
- [ ] **0.1** 确认 conda:`clrnet_export` / 新建 `yolo26` 环境,能跑 `yolo train` / `yolo export format=rknn`
|
||||
- [ ] **0.2** RKNN 量化环境单独建 venv(与 ultralytics 依赖隔离,见 README-EN)
|
||||
- [ ] **0.3** 确定目标芯片平台(如 `rk3588`)写入后续 convert 命令
|
||||
- [ ] **0.4** 统一数据根目录 `DMS/DATASET/dms_yolo/`(使用 `scripts/refresh_yaml.py`)
|
||||
```
|
||||
dms_yolo/
|
||||
├── yaml/ # 各任务 yaml,path 为相对路径
|
||||
├── ddaw/ -> ../gyp/ddaw_1124
|
||||
├── addw/, addw_face/, isa/, dam/, dam_0417/, isa_class/
|
||||
├── manifests/
|
||||
└── README.md
|
||||
```
|
||||
迁移服务器: `scripts/pack_dms_yolo.sh` 或 `rsync --copy-links`
|
||||
|
||||
---
|
||||
|
||||
## 阶段 1:盘点源数据(BK2/archive/gyp)
|
||||
|
||||
| 业务 | 源路径 | 格式 | 体量 | 类别数 |
|
||||
|------|--------|------|------|--------|
|
||||
| DDAW | `DATASET/gyp/ddaw_1124` | YOLO images/labels | ~646M | 9 |
|
||||
| ADDW | `DATASET/gyp/addw_0523` | YOLO | ~553M | 4 |
|
||||
| ADDW 人脸 | `DATASET/gyp/yoloface-0726` | YOLO pose | ~1.6G | face + 37 kpts |
|
||||
| ISA | `DATASET/gyp/isa_detect` | YOLO | ~40G | 4 |
|
||||
| ISA 分类 | `DATASET/gyp/isa_class_0116` | 文件夹分类 | ~448M | 多类 |
|
||||
| DAM | `DATASET/gyp/dam_src_0417` / `dam_0516` | jpg+xml / YOLO | ~540M + ~930M | 待确认 |
|
||||
| DOWN | `down/yolov5-6.2` | 代码+runs,数据在 yaml 指向服务器路径 | 待查本地 data |
|
||||
|
||||
- [ ] **1.1** 对每个子项目跑一遍统计:train/val 图片数、标签数、空标签、坏图
|
||||
- [x] **1.2** 唯一数据根:`DMS/DATASET/gyp/`(已从 archive 补齐 isa / yoloface / isa_class)
|
||||
- [x] **1.3** 已删除 `gyp_org` 及 `BK2/archive/gyp` 中重复数据目录(约释放 40G+)
|
||||
|
||||
---
|
||||
|
||||
## 阶段 2:转换为 Ultralytics/YOLO26 标准结构
|
||||
|
||||
### 划分原则(必守)
|
||||
|
||||
**不要按总量随机划分 train/val**,必须 **按类别分层**,使各类在 train/val 中的比例接近(默认 val≈10%)。
|
||||
|
||||
- **YOLO 检测**:`scripts/stratified_split.py yolo`
|
||||
合并现有 train+val 为池子后,按「图像所含最稀有类」优先依次划分,避免稀有类全进 train。
|
||||
- **文件夹分类**:`scripts/stratified_split.py classify`
|
||||
**每个类别目录内独立**划分(与 `isa_preprocess.py` 思路一致),禁止全库 `random.sample`。
|
||||
- 划分前用 `--dry-run` 查看各类 val 占比;满意后再去掉 `--dry-run` 执行。
|
||||
|
||||
```bash
|
||||
cd DMS/DATASET/scripts
|
||||
python stratified_split.py yolo --root ../gyp/ddaw_1124 --val-ratio 0.1 --dry-run
|
||||
python stratified_split.py yolo --root ../gyp/ddaw_1124 --val-ratio 0.1 --seed 42
|
||||
python stratified_split.py classify --root ../gyp/isa_class_0116 --src-split train --val-ratio 0.1 --dry-run
|
||||
```
|
||||
|
||||
每个检测任务目标结构:
|
||||
|
||||
```
|
||||
dms_yolo/<task>/
|
||||
images/train/
|
||||
images/val/
|
||||
labels/train/ # 与 images 同名 .txt
|
||||
labels/val/
|
||||
<task>.yaml
|
||||
```
|
||||
|
||||
- [ ] **2.1 DDAW**(优先,与 DMS 疲劳最相关)
|
||||
- 源:`ddaw_1124`(已是 YOLO 布局)
|
||||
- 复制或软链到 `dms_yolo/ddaw/`
|
||||
- 编写 `ddaw.yaml`:`path`、`nc: 9`、`names`(与 `gyp_org/configs/ddaw.yaml` 一致)
|
||||
- 校验 train/val 一一配对
|
||||
|
||||
- [ ] **2.2 ADDW 检测**
|
||||
- 源:`addw_0523`
|
||||
- 同上,生成 `addw.yaml`(4 类)
|
||||
|
||||
- [ ] **2.3 ISA 检测**(体量大,可放后)
|
||||
- 源:`isa/jiancexunlian/isa_detect`(约 5 万 train 图)
|
||||
- 生成 `isa.yaml`(4 类:indicative / prohibitory / warning / vehicle)
|
||||
- **必须**用 `stratified_split.py yolo` 按类重划分(约 6 万图,先 `--dry-run`)
|
||||
|
||||
- [ ] **2.4 DAM**
|
||||
- 源:`dam/src_data_0417_pick`(jpg + xml)
|
||||
- [ ] 编写 xml → YOLO txt 转换脚本(可参考原 yolov5 `dam-0516` 流程)
|
||||
- [ ] 划分 train/val 后写入 `dms_yolo/dam/`
|
||||
|
||||
- [ ] **2.5 ADDW 人脸 Pose**(若上 RKNN)
|
||||
- 源:`yoloface-0726`
|
||||
- 确认 yolo26 是否支持 `format=rknn` + pose;若不支持,单独保留 ultralytics820 链路
|
||||
- 生成 `yoloface.yaml`(`kpt_shape: [37,3]`)
|
||||
|
||||
- [ ] **2.6 DOWN / 其他**
|
||||
- 清点 `down/` 下是否有本地 `images/labels`;若仅 yaml 指远程路径,从 archive 或备份补数据
|
||||
|
||||
---
|
||||
|
||||
## 阶段 3:清单与量化校准集(RKNN 必需)
|
||||
|
||||
`rknn_export/convert.py` 需要 **图片路径列表 txt**(默认 `coco_subset_20.txt`)。
|
||||
|
||||
- [ ] **3.1** 每个任务生成 `manifests/<task>_calib_20.txt`(20~50 张代表性图,覆盖场景)
|
||||
- [ ] **3.2** 每个任务生成 `manifests/<task>_train.txt` / `val.txt`(可选,用于训练记录)
|
||||
- [ ] **3.3** 图片尺寸统一策略:
|
||||
- 检测默认 **640×640**(与 `yolo export format=rknn` 一致)
|
||||
- 记录原图分辨率,训练 yaml 里可设 `imgsz`
|
||||
|
||||
---
|
||||
|
||||
## 阶段 4:迁入 yolo26 工程并训练
|
||||
|
||||
路径:`DMS/Code/yolo26_rknn_ultralytics-main`
|
||||
|
||||
- [ ] **4.1** 在工程下建 `data/` 或软链:`data/dms_yolo -> ../../DATASET/dms_yolo`
|
||||
- [ ] **4.2** 冒烟训练(每个任务先 1 epoch / 小 subset):
|
||||
```bash
|
||||
yolo detect train data=../../DATASET/dms_yolo/ddaw/ddaw.yaml model=yolo26n.pt epochs=1 imgsz=640
|
||||
```
|
||||
- [ ] **4.3** 正式训练记录:`runs/`、best.pt、指标
|
||||
- [ ] **4.4** 导出 RKNN 用 ONNX:
|
||||
```bash
|
||||
yolo export model=runs/detect/train/weights/best.pt format=rknn imgsz=640
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 阶段 5:ONNX → RKNN
|
||||
|
||||
- [ ] **5.1** 使用任务专属校准列表:
|
||||
```bash
|
||||
python rknn_export/convert.py \
|
||||
--model-path <best.onnx> \
|
||||
--platform rk3588 \
|
||||
--data-path ../../DATASET/dms_yolo/manifests/ddaw_calib_20.txt
|
||||
```
|
||||
- [ ] **5.2** 板端验证:原始输出 6 tensor + CPU 后处理(decode/NMS,见 README-EN)
|
||||
- [ ] **5.3** 与旧 yolov5/yolov8 模型对比精度与延迟
|
||||
|
||||
---
|
||||
|
||||
## 阶段 6:清理与文档
|
||||
|
||||
- [ ] **6.1** 确认 `BK2/archive/gyp` 无再用压缩包(**已完成删 16 个,约释 43G**)
|
||||
- [ ] **6.2** 更新 `gyp_org/README.md`:指向 `dms_yolo` 新路径
|
||||
- [ ] **6.3** 在 `DMS/Code/yolo26_rknn_ultralytics-main` 增加 `docs/DMS_DATASETS.md`(类名、路径、训练命令)
|
||||
|
||||
---
|
||||
|
||||
## 建议优先级
|
||||
|
||||
1. **DDAW** → 冒烟训练 → RKNN 导出(验证整条链路)
|
||||
2. **ADDW 检测** → 同上
|
||||
3. **DAM**(需 xml 转换)
|
||||
4. **ISA**(40G,训练成本高,按需)
|
||||
5. **人脸 Pose**(依赖 RKNN 对 pose 的支持情况)
|
||||
|
||||
---
|
||||
|
||||
## 当前磁盘参考
|
||||
|
||||
| 路径 | 大小(删包后) |
|
||||
|------|----------------|
|
||||
| `BK2/archive/gyp` | **~51G** |
|
||||
| `DMS/DATASET/gyp_org` | ~48G(若与 archive 重复,合并后可再省) |
|
||||
| 系统盘可用 | **~137G** |
|
||||
|
||||
---
|
||||
|
||||
*生成日期:2026-05-20*
|
||||
Reference in New Issue
Block a user