|
@@ -8,13 +8,16 @@
|
|
|
|
|
|
|
|
### 第 1 步:配置水厂信息(只需做一次)
|
|
### 第 1 步:配置水厂信息(只需做一次)
|
|
|
|
|
|
|
|
-```bash
|
|
|
|
|
-# 方式一:从已有 YAML 导入(推荐首次部署)
|
|
|
|
|
-python tool/migrate_yaml_to_db.py --yaml 你的配置.yaml --force
|
|
|
|
|
|
|
+系统采用 **双模配置设计**:
|
|
|
|
|
+- **测试/单机模式(优先读 YAML)**:只要 `config/rtsp_config.yaml` 文件存在,系统**强制读取它**。修改该文件并执行 `./start.sh restart` 即可在一张表、所有相关进程(推理、上传、同步)中全局生效。
|
|
|
|
|
+- **生产/多机模式(回退读 DB)**:如果重命名或移走 `rtsp_config.yaml`,系统会自动尝试读取 `config/pickup_config.db`,此时支持通过 `:8080/api/config` 接口进行在线热更新配置。
|
|
|
|
|
|
|
|
-# 方式二:通过 API 配置(系统运行后)
|
|
|
|
|
-# 见下方「配置管理 API」章节
|
|
|
|
|
|
|
+**如果你想使用 DB 模式**,需要先将 YAML 导入到 DB:
|
|
|
|
|
+```bash
|
|
|
|
|
+# 执行迁移脚本(默认每次都会先清空 DB 里的旧配置,保证状态最新)
|
|
|
|
|
+python tool/migrate_yaml_to_db.py --yaml config/rtsp_config.yaml
|
|
|
```
|
|
```
|
|
|
|
|
+导入完毕后,记得把 YAML 删掉或者改名。
|
|
|
|
|
|
|
|
导入后可检查 DB 信息:
|
|
导入后可检查 DB 信息:
|
|
|
```bash
|
|
```bash
|
|
@@ -61,12 +64,14 @@ python auto_training/standalone_train.py --data-dir /你的音频数据目录
|
|
|
|
|
|
|
|
```bash
|
|
```bash
|
|
|
./start.sh # 前台运行(调试用)
|
|
./start.sh # 前台运行(调试用)
|
|
|
-./start.sh -d # 后台运行(生产用)
|
|
|
|
|
-./start.sh stop # 停止
|
|
|
|
|
|
|
+./start.sh -d # 后台运行(主推理、自动模型训练等全部托管)
|
|
|
|
|
+./start.sh stop # 一键停止(含所有辅助进程)
|
|
|
./start.sh restart # 重启
|
|
./start.sh restart # 重启
|
|
|
-./start.sh status # 查看状态
|
|
|
|
|
|
|
+./start.sh status # 查看所有关联进程状态
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
|
|
+> **注**:`./start.sh` 会自动检测配置中是否启用了边云协同(`cloud_sync` / `model_sync`),如果是,则会自动拉起数据上传 (`run_upload_worker.py`) 和模型同步 (`run_model_sync.py`) 等辅助进程,不需要手动分开管理。
|
|
|
|
|
+
|
|
|
---
|
|
---
|
|
|
|
|
|
|
|
## 模型更新(后期维护)
|
|
## 模型更新(后期维护)
|
|
@@ -101,6 +106,93 @@ python auto_training/standalone_train.py --data-dir /你的音频数据目录
|
|
|
|
|
|
|
|
---
|
|
---
|
|
|
|
|
|
|
|
|
|
+## 边云协同架构 (Edge-Cloud)
|
|
|
|
|
+
|
|
|
|
|
+为支持多水厂、大规模设备的高效集约化管理,系统内置了完善的“边云协同”机制。云端服务位于 `cloud_server/`(基于 FastAPI)。在边缘端(一体机)开启协同后,将形成如下三进程架构(统一被 `./start.sh` 所管理):
|
|
|
|
|
+
|
|
|
|
|
+1. **主监控进程 (`run_with_auto_training.py` + `run_pickup_monitor.py`)**
|
|
|
|
|
+ 负责 RTSP 拉流、异常检测及本地冷启动训练。检测到异常时,将相关上下文生成任务写入本地队列。
|
|
|
|
|
+2. **异步上传 Worker (`run_upload_worker.py`)**
|
|
|
|
|
+ 开关:`cloud_sync.enabled = true`
|
|
|
|
|
+ 通过监控本地队列(`data/upload_queue/`),将正常的音频抽样和异常事件音频进行高压转码(转为 FLAC 格式,体积小50%)并异步推送到云端服务,彻底解耦网络延迟对主推理环的阻塞。
|
|
|
|
|
+3. **模型同步客户端 (`run_model_sync.py`)**
|
|
|
|
|
+ 开关:`model_sync.enabled = true`
|
|
|
|
|
+ 定时长轮询云端的 `manifest.json`,发现新版本后自动下载压缩包、比对 SHA256,然后安全原子替换到边缘机,并通知主监控进程进行亚秒级的模型热重载。
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
|
|
+## 技术架构
|
|
|
|
|
+
|
|
|
|
|
+### 音频处理流水线
|
|
|
|
|
+
|
|
|
|
|
+```
|
|
|
|
|
+RTSP 拾音器 ──FFmpeg──> 8秒WAV切片 ──librosa──> Mel频谱图 ──AutoEncoder──> 重建误差 ──汇总──> 1分钟上报
|
|
|
|
|
+ │ [1,1,64,504] 推理 │
|
|
|
|
|
+ │ │
|
|
|
|
|
+ data/audio/{设备}/current/ 每分钟取平均 abnormal_score
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+- **8 秒**:模型推理的最小单元。FFmpeg 按 8 秒切片产出 WAV,每个文件对应一个 Mel 频谱图输入
|
|
|
|
|
+- **1 分钟**:业务上报周期。汇总该分钟内所有 8 秒片段的平均重建误差作为 `abnormal_score`
|
|
|
|
|
+- **滑动窗口投票**:5 次中 >= 3 次异常才判定为异常,避免单次毛刺误报
|
|
|
|
|
+
|
|
|
|
|
+### 模型架构
|
|
|
|
|
+
|
|
|
|
|
+4 层卷积自编码器(ConvAutoencoder),参数量 ~49K,权重文件 ~192KB:
|
|
|
|
|
+
|
|
|
|
|
+| 组件 | 结构 | 维度变化 |
|
|
|
|
|
+|------|------|---------|
|
|
|
|
|
+| 编码器 | 4×Conv2d(stride=2)+BN+ReLU | [B,1,64,504] → [B,64,4,32] |
|
|
|
|
|
+| 解码器 | 4×ConvTranspose2d(stride=2)+BN+ReLU | [B,64,4,32] → [B,1,64,504] |
|
|
|
|
|
+
|
|
|
|
|
+异常检测原理:正常音频重建误差低,异常音频重建误差高于阈值(3σ 法则)。
|
|
|
|
|
+
|
|
|
|
|
+### NPU 推理
|
|
|
|
|
+
|
|
|
|
|
+系统支持在 BM1684X NPU 上执行推理(通过 sophon.sail.Engine),模型转换流程:
|
|
|
|
|
+
|
|
|
|
|
+```
|
|
|
|
|
+ae_model.pth ──torch.onnx.export──> ae_model.onnx ──TPU-MLIR──> ae_model.bmodel
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+```bash
|
|
|
|
|
+# 导出 ONNX + 生成 BModel(需 TPU-MLIR 环境)
|
|
|
|
|
+python tool/convert_to_bmodel.py --all --with-bmodel --quantize fp16
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+当 `models/{设备}/ae_model.bmodel` 存在且 `sophon.sail` 可用时,推理引擎自动切换到 NPU。
|
|
|
|
|
+
|
|
|
|
|
+### 模型训练方案
|
|
|
|
|
+
|
|
|
|
|
+系统支持三种训练模式,按项目阶段选择:
|
|
|
|
|
+
|
|
|
|
|
+| 模式 | 命令 | 适用场景 |
|
|
|
|
|
+|------|------|---------|
|
|
|
|
|
+| **本地离线训练**(推荐) | `python auto_training/standalone_train.py --data-dir /数据目录` | 初期部署,水厂少,快速落地 |
|
|
|
|
|
+| **NPU 端自训练** | `python run_with_auto_training.py`(定时 02:00 触发) | 边缘盒子 CPU 资源充足时 |
|
|
|
|
|
+| **云端训练+下发** | 需额外开发数据上传和模型下发模块 | 规模化阶段(>3 个水厂) |
|
|
|
|
|
+
|
|
|
|
|
+**训练参数**(`config/auto_training.yaml`):
|
|
|
|
|
+
|
|
|
|
|
+| 参数 | 默认值 | 说明 |
|
|
|
|
|
+|------|--------|------|
|
|
|
|
|
+| epochs | 30 | 训练轮数(配合早停,实际通常更少) |
|
|
|
|
|
+| learning_rate | 0.0001 | 学习率 |
|
|
|
|
|
+| batch_size | 32 | 批大小 |
|
|
|
|
|
+| early_stop_patience | 5 | 连续 N 轮无改善则早停 |
|
|
|
|
|
+| training_device | auto | auto/cpu/cuda,auto 自动检测 GPU 显存 |
|
|
|
|
|
+| min_samples | 50 | 最少样本数,不足则跳过训练 |
|
|
|
|
|
+
|
|
|
|
|
+**安全机制**:
|
|
|
|
|
+- 训练前自动备份模型(保留 7 份)
|
|
|
|
|
+- 新旧模型误差对比,退化超 2 倍自动回滚
|
|
|
|
|
+- 音频质量预筛(IQR 离群值过滤)
|
|
|
|
|
+- 验证集早停防过拟合
|
|
|
|
|
+
|
|
|
|
|
+> 详细方案对比见 `docs/NPU自编码器模型训练方案.docx`
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
## 多水厂部署
|
|
## 多水厂部署
|
|
|
|
|
|
|
|
每个水厂独立部署一个实例,各自拥有独立的 `pickup_config.db`。
|
|
每个水厂独立部署一个实例,各自拥有独立的 `pickup_config.db`。
|
|
@@ -126,7 +218,7 @@ deploy_pickup/
|
|
|
│ └── auto_training.yaml # 训练参数
|
|
│ └── auto_training.yaml # 训练参数
|
|
|
│
|
|
│
|
|
|
├── predictor/ # 推理
|
|
├── predictor/ # 推理
|
|
|
-│ ├── model_def.py # ConvAutoencoder(base_ch=16)
|
|
|
|
|
|
|
+│ ├── model_def.py # ConvAutoencoder(base_ch=8, ~49K参数)
|
|
|
│ ├── multi_model_predictor.py # 多设备模型管理 + 热加载
|
|
│ ├── multi_model_predictor.py # 多设备模型管理 + 热加载
|
|
|
│ ├── config.py / datasets.py / utils.py
|
|
│ ├── config.py / datasets.py / utils.py
|
|
|
│
|
|
│
|
|
@@ -146,15 +238,3 @@ deploy_pickup/
|
|
|
├── tool/migrate_yaml_to_db.py # YAML → DB 迁移
|
|
├── tool/migrate_yaml_to_db.py # YAML → DB 迁移
|
|
|
└── data/ # 运行时音频
|
|
└── data/ # 运行时音频
|
|
|
```
|
|
```
|
|
|
-# 启用 NPU 推理步骤
|
|
|
|
|
-# 未来在 BM1684X 服务器上启用时:
|
|
|
|
|
-# 1. 导出 ONNX
|
|
|
|
|
-# python tool/convert_to_bmodel.py --all
|
|
|
|
|
-# 2. 安装 TPU-MLIR 后生成 BModel
|
|
|
|
|
-# python tool/convert_to_bmodel.py --all --with-bmodel --quantize fp16
|
|
|
|
|
-# 3. 取消 multi_model_predictor.py 中的注释
|
|
|
|
|
-# - import BM1684XEngine, is_bm1684x_available
|
|
|
|
|
-# - self.bm_engine = self._load_bmodel()
|
|
|
|
|
-# - _load_bmodel() 方法
|
|
|
|
|
-# 4. 修改 _compute_reconstruction_error() 中
|
|
|
|
|
-# 判断 device_predictor.bm_engine 是否存在,优先调用 NPU 推理
|
|
|