147 lines
3.6 KiB
Markdown
147 lines
3.6 KiB
Markdown
# 冷藏展示柜食品批次计时报警
|
|
|
|
这是一个独立项目,用于单摄像头监控冷藏展示柜和同画面垃圾桶,记录每个展示区域内食品批次的放置时长,并发现 3 小时到期后的违规行为。
|
|
|
|
## 已确认业务规则
|
|
|
|
- 摄像头同时看到展示柜和垃圾桶。
|
|
- 展示柜初始布局为横向 4 列、竖向 2 行。
|
|
- 布局后期可以通过配置调整。
|
|
- 每个区域可以放多份食品,但这些食品按同一批次计时。
|
|
- 同一区域不允许混批,必须清空后才能放入新批次。
|
|
- 食品放入区域时记录开始时间。
|
|
- 区域清空时记录结束时间。
|
|
- 未满 3 小时清空视为正常消耗。
|
|
- 超过 3 小时清空后必须在确认窗口内看到垃圾桶投放动作。
|
|
- 超过 3 小时的食品拿出后又放回展示柜,触发报警。
|
|
|
|
## 当前实现范围
|
|
|
|
当前版本先实现纯业务状态机,不依赖摄像头模型。后续视觉模块只需要输出标准观察数据:
|
|
|
|
```json
|
|
{
|
|
"ts": "2026-04-27T10:00:00+08:00",
|
|
"zone_counts": {
|
|
"r1c1": 3,
|
|
"r1c2": 0
|
|
},
|
|
"trash_deposit": false
|
|
}
|
|
```
|
|
|
|
程序会输出 JSONL 事件,例如:
|
|
|
|
- `batch_started`
|
|
- `batch_consumed`
|
|
- `batch_pending_disposal`
|
|
- `batch_discarded`
|
|
- `mixed_batch_violation`
|
|
- `overdue_return_violation`
|
|
- `missing_disposal_violation`
|
|
|
|
## 配置
|
|
|
|
示例配置在 `config/example.toml`。
|
|
|
|
默认阈值:
|
|
|
|
- 最大放置时间:`10800` 秒,也就是 3 小时
|
|
- 垃圾桶投放确认窗口:`120` 秒
|
|
|
|
## 区域标定
|
|
|
|
项目现在有正式管理页,前端默认 `23000`,后端默认 `19080`。
|
|
|
|
```bash
|
|
scripts/run_manage_api.sh
|
|
```
|
|
|
|
另开一个终端:
|
|
|
|
```bash
|
|
scripts/run_web.sh
|
|
```
|
|
|
|
打开:
|
|
|
|
```text
|
|
http://127.0.0.1:23000
|
|
```
|
|
|
|
管理页支持:
|
|
|
|
- 配置 RTSP 地址和阈值
|
|
- 从 RTSP 拉取一帧截图
|
|
- 标定 `r1c1` 到 `r2c4` 的 8 个格口
|
|
- 标定垃圾桶区域
|
|
- 直接保存标定结果到项目配置文件
|
|
- 查看事件汇总和最近 JSONL 事件
|
|
|
|
项目仍保留 `tools/calibrator` 作为轻量单页标定工具,但正式使用建议走 `23000` 管理页。
|
|
|
|
## 管理 API
|
|
|
|
默认后端:
|
|
|
|
```text
|
|
http://127.0.0.1:19080
|
|
```
|
|
|
|
主要接口:
|
|
|
|
- `GET /api/manage/health`
|
|
- `GET /api/manage/config`
|
|
- `PUT /api/manage/config`
|
|
- `POST /api/manage/snapshot`
|
|
- `PUT /api/manage/calibration`
|
|
- `GET /api/manage/summary`
|
|
- `GET /api/manage/events`
|
|
|
|
## 运行识别计时进程
|
|
|
|
管理页只负责配置和查看数据。要产生数据,还需要启动运行进程:
|
|
|
|
```bash
|
|
scripts/run_runtime.sh
|
|
```
|
|
|
|
运行进程会:
|
|
|
|
1. 按配置读取 RTSP。
|
|
2. 用 `ffmpeg` 周期抓取小尺寸 RGB 帧。
|
|
3. 按标定区域做占用变化检测。
|
|
4. 判断垃圾桶区域是否有明显投放动作。
|
|
5. 调用批次计时状态机。
|
|
6. 写入 `logs/events.jsonl`,管理页会读取这个文件。
|
|
|
|
当前视觉版本是可运行的启发式版本:
|
|
|
|
- 每个格口输出 `0/1` 占用状态,不识别单份数量。
|
|
- 启动后的前几帧用于建立空柜基线,默认 `3` 帧。
|
|
- 如果启动时格口里已经有食品,系统会把它当作基线,后续要等画面变化后才会产生计时事件。
|
|
- 真实生产精度后续应接食品检测模型。
|
|
|
|
可选运行参数可以放在配置文件的 `[runtime]` 中:
|
|
|
|
```toml
|
|
[runtime]
|
|
sample_interval_seconds = 5.0
|
|
frame_width = 640
|
|
frame_height = 360
|
|
capture_timeout_seconds = 12.0
|
|
baseline_frames = 3
|
|
sample_stride_pixels = 8
|
|
occupancy_mean_delta = 24.0
|
|
occupancy_texture_delta = 18.0
|
|
trash_motion_delta = 18.0
|
|
trash_motion_cooldown_seconds = 8
|
|
diagnostics_path = "logs/runtime_diagnostics.jsonl"
|
|
```
|
|
|
|
## 本地测试
|
|
|
|
```bash
|
|
PYTHONPATH=src python3 -m unittest discover -s tests -v
|
|
```
|