# 拾音器异响检测系统 水泵/设备异响实时检测系统。通过 RTSP 拾音器采集音频,基于 AutoEncoder 模型进行异常检测。 --- ## 只需 3 步 ### 第 1 步:配置水厂信息(只需做一次) ```bash # 方式一:从已有 YAML 导入(推荐首次部署) python tool/migrate_yaml_to_db.py --yaml 你的配置.yaml --force # 方式二:通过 API 配置(系统运行后) # 见下方「配置管理 API」章节 ``` 导入后可检查 DB 信息: ```bash python -c " import sys; sys.path.insert(0,'.') from config.config_manager import ConfigManager mgr = ConfigManager() cfg = mgr.get_full_config() for p in cfg['plants']: print(f\"水厂: {p['name']} (project_id={p['project_id']}, enabled={p['enabled']})\") for s in p.get('rtsp_streams', []): print(f\" 设备: {s['device_code']} | {s['name']} | model={s.get('model_subdir','')} | url={s['url'][:50]}...\") mgr.close() " ``` ### 第 2 步:训练模型 ```bash python auto_training/standalone_train.py --data-dir /你的音频数据目录 ``` **就这一条命令。** 训练结果自动保存到 `models/{设备编码}/` 目录。 数据目录要求: ``` 你的音频数据目录/ ├── LT-2/ ← 子文件夹名 = 设备编码(与 DB 中 device_code 一致) │ ├── xxx.wav │ └── 2025-01-01/ │ └── yyy.wav └── LT-5/ └── ... ``` 可选参数: ```bash --devices LT-2 LT-5 # 只训练指定设备 --epochs 100 # 训练轮数 --lr 0.00005 # 学习率 ``` ### 第 3 步:启动运行 ```bash ./start.sh # 前台运行(调试用) ./start.sh -d # 后台运行(生产用) ./start.sh stop # 停止 ./start.sh restart # 重启 ./start.sh status # 查看状态 ``` --- ## 模型更新(后期维护) | 方式 | 操作 | |------|------| | 自动热加载 | 替换 `models/{设备编码}/` 下的文件,60 秒内自动生效 | | API 上传 | `curl -X POST http://IP:8080/api/model/upload/LT-2 -F "model_file=@ae_model.pth"` | | API 触发重载 | `curl -X POST http://IP:8080/api/model/reload/LT-2` | | 查看状态 | `curl http://IP:8080/api/model/status` | ## 配置管理 API 系统启动后在 `:8080` 自动提供,支持 Web 端实时修改配置。 | 接口 | 方法 | 说明 | |------|------|------| | `/api/config` | GET | 获取全量配置 | | `/api/config/plants` | GET/POST | 水厂列表 / 创建 | | `/api/config/plants/{id}` | GET/PUT/DELETE | 单个水厂 CRUD | | `/api/config/streams` | GET/POST | RTSP 流列表 / 创建 | | `/api/config/streams/{id}` | PUT/DELETE | 单个流更新 / 删除 | | `/api/config/{section}` | GET/PUT | 系统配置读写(audio/prediction/push 等) | | `/api/model/status` | GET | 模型加载状态 | | `/api/model/reload/{code}` | POST | 重载指定设备模型 | | `/api/model/reload-all` | POST | 重载所有模型 | | `/api/model/upload/{code}` | POST | 上传模型文件并自动重载 | **可热更新**(30 秒自动生效):推送开关、告警阈值、投票参数、人体检测开关等。 **需重启生效**:新增/删除 RTSP 流、修改采样率。 --- ## 多水厂部署 每个水厂独立部署一个实例,各自拥有独立的 `pickup_config.db`。 ``` 服务器A: deploy_pickup/ + pickup_config.db(锡山) + models/(锡山设备模型) 服务器B: deploy_pickup/ + pickup_config.db(龙亭) + models/(龙亭设备模型) ``` ## 项目结构 ``` deploy_pickup/ ├── run_pickup_monitor.py # 主入口(采集 + 检测 + 推送) ├── start.sh # 启动/停止/重启脚本 ├── requirements.txt │ ├── config/ # 配置 │ ├── pickup_config.db # 运行时配置数据库 │ ├── config_manager.py # 配置读写 │ ├── config_api.py # REST API(:8080) │ ├── db_models.py # 表定义 │ └── auto_training.yaml # 训练参数 │ ├── predictor/ # 推理 │ ├── model_def.py # ConvAutoencoder(base_ch=16) │ ├── multi_model_predictor.py # 多设备模型管理 + 热加载 │ ├── config.py / datasets.py / utils.py │ ├── core/ # 运行时辅助 │ ├── alert_aggregator.py # 跨设备告警聚合 │ ├── anomaly_classifier.py # 异常类型分类 │ ├── pump_state_monitor.py # 泵状态 PLC 查询 │ ├── energy_baseline.py # 泵启停判断 │ └── human_detection_reader.py # 人体检测抑制 │ ├── auto_training/ # 训练(可独立运行) │ ├── standalone_train.py # ← 训练入口(就用这个) │ ├── incremental_trainer.py # 训练器核心 │ └── data_cleanup.py # 过期音频/日志清理(可选,手动运行) │ ├── models/{设备编码}/ # 模型(训练自动产出) ├── tool/migrate_yaml_to_db.py # YAML → DB 迁移 └── data/ # 运行时音频 ```