把当前离线模型封装为可替换、可观测、可回放的软件流水线。第一版预录视频流水线已经在 app/ 中实现;设备到位后需要新增实时视频源和多人跟踪。
python -m app.cli `
--input "path/to/video.mp4" `
--output-dir outputs/demo默认主路线是部署对齐、固定训练 300 轮的 RTMPose + ST-GCN++。默认权重位于
results/sliding_window_e300_b64/rtmpose_stgcnpp/fold_*/best.pt。当前实现包括:逐帧姿态、
真实连续帧缓冲、四折模型概率集成、姿态质量门控、至少 3/4 折同意、
连续窗口确认、冷却状态和四类输出文件。
| 输出 | 内容 |
|---|---|
annotated.mp4 |
关键点、当前跌倒概率和状态 |
windows.jsonl |
每个窗口的时间、四折概率、有效姿态率和状态 |
events.jsonl |
仅记录确认后的跌倒事件 |
summary.json |
输入信息、速度、漏检率、窗口和事件统计 |
flowchart LR
A["视频源<br/>文件/摄像头/RTSP"] --> B["帧缓冲与时间戳"]
B --> C["人体姿态估计<br/>YOLO-Pose 或 RTMPose"]
C --> D["姿态质量检测"]
D -->|"有效"| E["COCO-17 归一化"]
D -->|"无姿态"| F["重试/后端回退"]
F --> E
F -->|"仍失败"| G["UNKNOWN"]
E --> H["滑动窗口<br/>64/96/128 真实帧"]
H --> I["ST-GCN++ / CTR-GCN"]
I --> J["概率平滑与连续确认"]
J --> K["状态机"]
K --> L["事件记录与报警接口"]
stateDiagram-v2
[*] --> NORMAL
NORMAL --> SUSPECTED: 概率超过阈值
SUSPECTED --> NORMAL: 后续窗口恢复
SUSPECTED --> CONFIRMED: 连续 N 个窗口超过阈值
CONFIRMED --> COOLDOWN: 已生成报警事件
COOLDOWN --> NORMAL: 冷却结束且姿态恢复
NORMAL --> UNKNOWN: 连续无有效姿态
UNKNOWN --> NORMAL: 姿态恢复
UNKNOWN --> SENSOR_ERROR: 超时
UNKNOWN 与 NORMAL 必须区分。看不到人体不代表没有跌倒。
姿态帧:
{
"timestamp_ms": 1720000000123,
"track_id": 1,
"backend": "yolo_pose",
"keypoints": [[123.4, 56.7, 0.91]],
"valid_joint_count": 15,
"quality": 0.82
}keypoints 实际固定为 17 个 [x, y, confidence]。
分类窗口:
{
"window_start_ms": 1720000000000,
"window_end_ms": 1720000002560,
"track_id": 1,
"route": "rtmpose_stgcnpp",
"fall_probability": 0.78,
"pose_valid_ratio": 0.94,
"decision": "SUSPECTED"
}报警事件:
{
"event_id": "fall-20260722-000001",
"camera_id": "camera-01",
"track_id": 1,
"started_at": "2026-07-22T10:20:30.120+08:00",
"confirmed_at": "2026-07-22T10:20:31.080+08:00",
"status": "CONFIRMED",
"fall_probability": 0.86,
"route": "dual_stgcnpp_average",
"pose_quality": 0.89,
"evidence_video": "events/fall-20260722-000001.mp4"
}| 参数 | 初始值 | 说明 |
|---|---|---|
| 窗口 | 64 个真实连续帧 | 后续对比 96、128 帧 |
| 步长 | 16 帧 | 约 75% 重叠 |
| 单窗口阈值 | 0.5 | 设备验证集到位后校准 |
| 连续确认 | 3 个窗口 | 降低单窗口误报 |
| 姿态最低有效率 | 0.5 | 低于此值标记低质量 |
| 最少同意模型 | 3/4 折 | 抑制单折高概率造成的误报 |
| 完全无姿态 | UNKNOWN |
触发重试或后端回退 |
| 报警冷却 | 10 秒 | 防止重复报警 |
| 证据缓存 | 报警前 5 秒、后 10 秒 | 便于复核 |
这些是系统原型参数,不是最终实验结论。固定 8 段端到端冒烟测试中, 4/4 个跌倒片段被确认,4/4 个 ADL 片段未报警;该小样本测试不是无偏准确率, 设备到位后仍必须基于完整现场验证集调整。
app/
├─ sources/ 视频文件、USB 摄像头、RTSP 适配器
├─ pose/ 姿态后端统一接口
├─ inference/ 归一化、窗口和 GCN 推理
├─ decision/ 平滑、状态机和质量回退
├─ events/ JSON、视频证据和报警适配器
└─ cli.py 预录视频/摄像头命令行入口
下一实现阶段是增加 USB/RTSP 视频源、多人跟踪、事件前后环形视频缓存和现场验证集评估。