瀏覽代碼

docs: 更新 README,增加双模配置说明与边云协同介绍

wmy 3 周之前
父節點
當前提交
0986ef7bfa
共有 1 個文件被更改,包括 101 次插入21 次删除
  1. 101 21
      README.md

+ 101 - 21
README.md

@@ -8,13 +8,16 @@
 
 ### 第 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 信息:
 ```bash
@@ -61,12 +64,14 @@ python auto_training/standalone_train.py --data-dir /你的音频数据目录
 
 ```bash
 ./start.sh              # 前台运行(调试用)
-./start.sh -d           # 后台运行(生产用
-./start.sh stop         # 停止
+./start.sh -d           # 后台运行(主推理、自动模型训练等全部托管
+./start.sh stop         # 一键停止(含所有辅助进程)
 ./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`。
@@ -126,7 +218,7 @@ deploy_pickup/
 │   └── auto_training.yaml     #   训练参数
 ├── predictor/                 # 推理
-│   ├── model_def.py           #   ConvAutoencoder(base_ch=16
+│   ├── model_def.py           #   ConvAutoencoder(base_ch=8, ~49K参数
 │   ├── multi_model_predictor.py   #   多设备模型管理 + 热加载
 │   ├── config.py / datasets.py / utils.py
@@ -146,15 +238,3 @@ deploy_pickup/
 ├── tool/migrate_yaml_to_db.py # YAML → DB 迁移
 └── 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 推理