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:
2026-05-25 16:59:59 +08:00
commit 7c43b44c57
1619 changed files with 373355 additions and 0 deletions

View 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模型

View 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/ # 各任务 yamlpath 为相对路径
├── 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`2050 张代表性图,覆盖场景)
- [ ] **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
```
---
## 阶段 5ONNX → 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*