From ca971306eb9106439c5dd0308cea3c8ce7a74cc6 Mon Sep 17 00:00:00 2001 From: QiuSW Date: Wed, 22 Jul 2026 20:49:41 +0800 Subject: [PATCH] docs(t303): record demo fall false negative --- docs/03-tech-stack.md | 2 +- docs/04-architecture.md | 1 + docs/current-state.md | 6 ++--- .../review/2026-07-22-demo1-fall-diagnosis.md | 26 +++++++++++++++++++ progress.md | 9 +++++++ 5 files changed, 40 insertions(+), 4 deletions(-) create mode 100644 docs/review/2026-07-22-demo1-fall-diagnosis.md diff --git a/docs/03-tech-stack.md b/docs/03-tech-stack.md index b341a23..78f7a3e 100644 --- a/docs/03-tech-stack.md +++ b/docs/03-tech-stack.md @@ -25,7 +25,7 @@ | 模型工件 | 固定输入尺寸的 ONNX Pose 模型 | 已定 | Go 不直接加载 `.pt`;模型由已验收 V1 权重导出并记录哈希。 | | 推理运行时 | `github.com/yalue/onnxruntime_go` v1.31.0 + ONNX Runtime CPU DLL | Spike 已验证 | Windows 上以显式 DLL 路径加载锁定的 1×3×640×640 Pose ONNX,已完成一次真实录像首帧推理;该包装器的 C API 为 26,V2 构建必须启用 CGO/MinGW,并在发布包锁定匹配 DLL 的来源与 SHA-256。 | | 视频输入 | 受控的 `ffmpeg.exe` 子进程输出 `bgr24` 原始帧 | 回放已验证 | Go 回归命令已完整读取 317 帧本地录像;避免未配置的 GoCV/OpenCV 开发绑定。T-304 必须随应用锁定 FFmpeg/FFprobe 的版本、哈希与 RTSP 重连行为。 | -| 图像预处理与 Pose 解析 | Go 实现的 BGR→RGB、CHW、640 letterbox、NMS、17 点及坐标还原 | 合成契约与无报警回放已验证 | 采用 Ultralytics 的 114 补边、双线性缩放后转 uint8 的语义;Go 首帧输出两个人,与 V1 对应结果的 box 坐标差在已记录的 6 像素容差内。仍需经同意的真实正例录像完成事件级确认。 | +| 图像预处理与 Pose 解析 | Go 实现的 BGR→RGB、CHW、640 letterbox、NMS、17 点及坐标还原 | 合成契约与本机漏检回放已验证 | 采用 Ultralytics 的 114 补边、双线性缩放后转 uint8 的语义;Go 首帧输出两个人,与 V1 对应结果的 box 坐标差在已记录的 6 像素容差内。`demo/1.mp4` 是真实摔倒但在现有 V1 配置下漏检,不能称为“无报警反例”;仍需经同意、符合固定俯视大厅/走廊边界的正例录像完成事件级确认。 | | 演示 UI | `github.com/lxn/walk`(Windows 原生控件) | Spike 已验证 | 双 Tab 骨架可在 `CGO_ENABLED=0` 编译,避免 Fyne/OpenGL 首次编译的高复杂度;正式版仍须实现浅灰蓝底、白色卡片,红色仅表示确认摔倒。 | | 测试 | `go test ./...` + V1 回归录像 | 已定 | V2 行为必须与 V1 基线对照。 | diff --git a/docs/04-architecture.md b/docs/04-architecture.md index d6a1e1c..a775b5d 100644 --- a/docs/04-architecture.md +++ b/docs/04-architecture.md @@ -108,6 +108,7 @@ RECOVERING | 俯视关键点不稳 | 1.6 米俯视、遮挡或远距离会影响膝踝 | 全身可见前提、ROI、质量拒绝和现场回归;必要时再采集数据。 | | RTSP 断流 | 网络抖动或摄像头重连 | 视频源显式状态、指数退避重连、断流不报警。 | | 多人交叉换 ID | 当前 V1 使用贪心中心点匹配,未做全局最优匹配 | 固定机位、稀疏人员演示中记录为已知限制;多人密集场景在有回归素材后再评估升级。 | +| 域外倒地漏检 | Pose 模型可能在室外斜视、字幕遮挡或与部署机位差异很大的倒地画面中失去人体/关键点 | `demo/1.mp4` 已出现该现象;不以降低事件阈值伪造修复。仅用符合固定俯视大厅/走廊、全身大部分可见边界的经同意录像做验收;若业务要覆盖域外画面,另立模型数据适配任务。 | | 同一事件重复报警 | CONFIRMED 状态持续多帧 | 每个事件 ID 仅执行一次报警副作用,恢复后才允许新事件。 | | Go 行为漂移 | ONNX 预后处理与 Python 不同 | 导出后跑同一录像,比较关键点、事件数量、确认时间和截图。 | | 模型误解 | Pose 指标被误当摔倒指标 | 文案仅说明姿态模型;事件级指标单独记录。 | diff --git a/docs/current-state.md b/docs/current-state.md index 7cb414d..100f679 100644 --- a/docs/current-state.md +++ b/docs/current-state.md @@ -11,11 +11,11 @@ - V1 代码:已建立安全配置、显式 Replay/Stream 视频源、Pose、轻量跟踪、质量/几何证据、倒地领域规则、按 ID 四态事件机及 `v1/pipeline.py` 事件管线;运行事件带非敏感 `config_version`,缺帧/低质量/断流会中断证据确认。新增 `v1/view_model.py`(Qt-free 监控视图状态与设置草稿三份隔离)、`v1/gui.py` 薄 PyQt5 双 Tab 外壳与 `v1/app.py` 装配(`FrameWorker` 只发出已判定的 `FrameAnalysis`,窗口只渲染)。新增 `v1/alerts.py`:按 `event_id` 去重,对首次 CONFIRMED 保存带标注截图、追加 JSONL 事件行,并经可注入 `AlertSink`(Windows 侧 `QtAlertSink` 提供声音与一次性弹窗)触发一次声音/弹窗。新增 `v1/camera.py`(RTSP URL 构建 + 有界连接测试抓帧)与 `config.py` 的结构化来源(host/端口/通道/账号/密码,凭证百分号编码)、`write_local_camera_source`;设置页新增摄像头连接分组、测试连接与预览,以及传输协议/连接超时/低延迟三项抓流调优(由 `config` 存值、`app` 开流前写入 `OPENCV_FFMPEG_CAPTURE_OPTIONS`)。真实海康流已用 `VideoSource(STREAM)` 连通(1920×1080)。 - V2 代码:T-303 已落地 `internal/pose`(Ultralytics 114 letterbox、BGR→RGB/CHW、YOLO Pose NMS、17 点及坐标还原)与 `internal/fall`(中心点跟踪、质量/几何证据、策略、四态状态机和事件 ID);`cmd/regression` 使用 FFmpeg 顺序回放本机录像并将 ONNX Pose 接入事件引擎。`cmd/ui-spike` 仍只是可编译的 Windows Walk 双 Tab 外壳。RTSP 重连、UI 实时渲染、声音、弹窗、截图和发布打包尚未实现,不能作为客户演示版。 - 非代码设计工件:docs/ui/silver-pose-ui-ux-spec.md、docs/ui/2026-07-20-html-prototype-plan.md、docs/ui/silver-pose-v1-prototype.html 与 docs/ui/silver-pose-v2-prototype.html 已建立。v2 HTML 是符合正式浅色 Windows 规范的当前视觉参考:浅灰蓝底、白色卡片,红色只表示确认摔倒、其弹窗和事件证据;文件名中的 v2 只表示原型设计修订,不能理解为 Go V2 实现已开始。v1 HTML 保留为历史深色对照。两者均使用顶部双 Tab、设置草稿与状态交互,且画面、事件和时间都是模拟数据,不连接真实摄像头、模型或网络,也不改变 Phase 1 任务顺序。 -- 测试:`python -m compileall -q v1 demo` 已通过(含 `gui.py`、`app.py`、`alerts.py`、`camera.py` 语法);`./init.ps1` 当前运行 V1 测试为 88 passed、1 skipped。T-303 的 `CGO_ENABLED=1 go test ./...` 通过。对同一 317 帧本机录像,V1 回放得到 253 个有人帧、263 人次、0 个 CONFIRMED;Go 回放得到 255 个有人帧、265 人次、0 个 CONFIRMED。人次差异来自 OpenCV/FFmpeg 解码像素不同,二者的无报警事件结论一致;Go 合成正例契约和 V1 状态机均在 1.81 秒时产生一个 CONFIRMED。Walk UI Spike 以 `CGO_ENABLED=0 go build ./cmd/ui-spike` 编译通过。这些不表示摔倒识别准确率或完整 Go 客户演示已验收。`init.ps1` 会检查运行时依赖、编译旧基线并运行 V1 测试,但不会安装软件包。 +- 测试:`python -m compileall -q v1 demo` 已通过(含 `gui.py`、`app.py`、`alerts.py`、`camera.py` 语法);`./init.ps1` 当前运行 V1 测试为 88 passed、1 skipped。T-303 的 `CGO_ENABLED=1 go test ./...` 通过。对同一 317 帧本机录像,V1 回放得到 253 个有人帧、263 人次、0 个 CONFIRMED;Go 回放得到 255 个有人帧、265 人次、0 个 CONFIRMED。该录像经用户确认是摔倒正例,二者的 0 事件是漏检,不是“无报警反例”通过:V1 在 2.400–2.467 秒仅有 3 帧横向候选,随后倒地人体的 Pose 置信度降至 0.012,并在 3.000 秒帧以 0.01 推理仍无任何人体姿态。它是室外斜视且有字幕遮挡,超出当前固定俯视大厅/走廊验收边界;降低检测阈值至 0.10 仍为 0 事件。人次差异来自 OpenCV/FFmpeg 解码像素不同,不能据此声称 Go 已完成真实正例一致性。Go 合成正例契约和 V1 状态机均在 1.81 秒时产生一个 `CONFIRMED`。Walk UI Spike 以 `CGO_ENABLED=0 go build ./cmd/ui-spike` 编译通过。这些不表示摔倒识别准确率或完整 Go 客户演示已验收。`init.ps1` 会检查运行时依赖、编译旧基线并运行 V1 测试,但不会安装软件包。 - 模型:`demo/best.pt` 可加载为 YOLO Pose,类别 `person`,`kpt_shape=[17, 3]`;与 `D:\PythonP\fall_detection\best.pt` 哈希一致。 - 当前标准启动:`./init.ps1`。 - 当前标准验证:`python -m compileall -q demo`。 -- 当前 blocker:T-303 缺少经同意的、可在本机回放的正例摔倒录像及其 V1 基线;因此尚不能证明同一真实正例录像在 Go 中也确认且延迟为 1–3 秒。Go/V1 无报警回放和纯领域正例契约均已通过,但不能替代录像级正例。ONNX Runtime DLL、FFmpeg/FFprobe 仍须在 T-304 以版本、来源和哈希纳入发布包;现场录像和事件工件保持本机不提交。 +- 当前 blocker:T-303 缺少一段经同意、无敏感信息且符合固定俯视大厅/走廊、全身大部分可见边界的本机正例摔倒录像及其 V1 确认事件/延迟基线;因此尚不能证明同一真实正例录像在 Go 中也确认且延迟为 1–3 秒。`demo/1.mp4` 虽是真实摔倒,但已诊断为 Pose 漏检,不能作为此项验收正例。合成领域正例契约不能替代录像级正例。ONNX Runtime DLL、FFmpeg/FFprobe 仍须在 T-304 以版本、来源和哈希纳入发布包;现场录像和事件工件保持本机不提交。 全局环境的 `pip check` 存在其他项目的包冲突,因此它不是 Silver Pose 的验收命令。`init.ps1` 只检查本项目实际导入的 OpenCV、NumPy、Ultralytics 与 PyQt5,并在命令非零退出时失败。 @@ -25,7 +25,7 @@ | --- | --- | --- | | `demo/` | 已有 | 旧 Python GUI、Pose 模型与样例视频;当前单帧规则不适合作为正式事件逻辑。 | | `v1/` | 已验收 | Python V1 正式实现、现场验收记录与发布工具。 | -| `v2/` | T-303 部分完成 | Go ONNX 后处理、事件引擎和本机录像无报警回归已实现;尚不是完整 V2。 | +| `v2/` | T-303 部分完成 | Go ONNX 后处理、事件引擎和本机摔倒漏检回放已实现;尚不是完整 V2。 | | `docs/` | 已有 | Harness Coding 文档、任务和计划。 | | `tests/` | 不适用 | V1 测试将在 `v1/tests/` 下创建。 | | `artifacts/` | 待创建 | 本地事件截图和 JSONL,不提交。 | diff --git a/docs/review/2026-07-22-demo1-fall-diagnosis.md b/docs/review/2026-07-22-demo1-fall-diagnosis.md new file mode 100644 index 0000000..2f2c2bc --- /dev/null +++ b/docs/review/2026-07-22-demo1-fall-diagnosis.md @@ -0,0 +1,26 @@ +# `demo/1.mp4` 摔倒漏检诊断 + +日期:2026-07-22 +状态:已诊断;不作为当前 V2 正例验收通过证据。 + +## 结论 + +用户确认本机未跟踪文件 `demo/1.mp4` 为真实摔倒视频。以当前 V1 锁定模型与默认事件配置回放得到 0 个 `CONFIRMED`,这表示漏检,不能再写作“无报警反例”。根因在 Pose 检出/关键点阶段,不在 Go 移植的状态机、跟踪连续性或 1.8 秒确认窗本身。 + +视频为室外斜视画面,画面含大面积字幕;它不符合产品当前固定俯视大厅/走廊、全身大部分可见的验收边界。 + +## 可复查证据 + +V1 使用 `demo/best.pt`、检测置信度 `0.25`、肩髋关键点门限 `0.4`、`require_rapid_drop=false`、`require_lower_body=false`、水平角 `45°`、确认窗 `1.8 s` 回放 317 帧: + +- 第 72–74 帧(2.400–2.467 s)横向姿态进入 `SUSPECT`,共 3 帧,即约 0.10 s。 +- 第 75 帧倒地人的最高 Pose 框分仅为 `0.012`;到第 90 帧(3.000 s),即使用 `conf=0.01` 推理也没有该画面的任何人体 Pose 输出。 +- 将检测阈值下调到 `0.15` 和 `0.10` 后,横向候选仍只在第 72–74 帧,事件数仍为 0。 +- Go 回放同一视频同样产生 0 个事件,但这只能说明当前回放的事件结果一致为漏检,不能证明真实正例事件一致性。 + +## 工程决策 + +1. 不通过缩短确认窗、降低质量阈值或放宽跟踪来把这段素材“调成报警”;在 Pose 已丢失时,这类改动既不构成根治,也会增加部署场景误报风险。 +2. `demo/1.mp4` 保留为本机、域外摔倒漏检风险样本,不提交、不计入 T-303 的正例通过项。 +3. T-303 仍需一段经同意、符合部署边界的本机正例录像,先在 V1 产生 1–3 秒确认事件和延迟记录,再与 Go 逐段对比。 +4. 若客户需求扩展到室外斜视、强遮挡或网络视频画面,须单独收集标注数据并重新训练/评估 Pose 检测模型;这超出当前事件规则迁移任务的范围。 diff --git a/progress.md b/progress.md index af6bc0f..64a69ea 100644 --- a/progress.md +++ b/progress.md @@ -496,3 +496,12 @@ - 阻塞:无客户或正例录像被提交;仓库也没有经同意的正例回放素材。因此不能把合成契约或无报警录像表述为真实正例的 Go/V1 等价,也不能把 T-303 标为 DONE。 - 决策:保持 T-303 为 DOING;回归命令接受本机路径,不把录像、截图、事件 JSONL、RTSP 地址或凭证写进仓库。解码器差异造成同一无报警录像的人次计数轻微差异,事件而非逐帧检测人次是当前验收基线。 - 下一步:提供或指定一段经同意、无敏感信息的本机正例录像及其 V1 输出后,运行同一命令比对确认事件与 1–3 秒延迟;通过后才可完成 T-303,继而领取 T-304。 + +## 【2026-07-22】T-303 回归素材性质更正与 `demo/1.mp4` 漏检诊断 + +- 状态:DOING(更正此前将该视频称作“无报警回放”的错误;T-303 尚未完成)。 +- 变更:更新 `docs/03-tech-stack.md`、`docs/04-architecture.md`、`docs/current-state.md`,并新增 `docs/review/2026-07-22-demo1-fall-diagnosis.md`。不改模型、不调阈值、不提交视频或诊断帧。 +- 验证:用户确认 `demo/1.mp4` 为真实摔倒。V1 锁定模型和默认事件配置回放 317 帧为 0 个 `CONFIRMED`,因此这是漏检而非无报警通过。第 72–74 帧(2.400–2.467 s)仅有 3 帧横向候选并处于 `SUSPECT`;第 75 帧目标最高 Pose 框分为 0.012,第 90 帧以 `conf=0.01` 推理仍无任何人体 Pose。检测阈值降至 0.15、0.10 均仍为 0 事件。Go 同一回放也为 0 事件,但不能作为真实正例一致性通过证据。 +- 阻塞:缺少一段经同意、符合固定俯视大厅/走廊和全身大部分可见边界的本机正例录像,且该录像须先在 V1 产生可记录的 1–3 秒确认事件,才能完成 Go/V1 真实正例对比。 +- 决策:`demo/1.mp4` 作为本机域外摔倒漏检风险样本,不纳入 T-303 正例验收;不以缩短确认窗或单纯降低阈值伪造修复。若要覆盖室外斜视、字幕遮挡等场景,另立模型数据适配/评估任务。 +- 下一步:取得符合部署边界的正例录像及 V1 基线后执行 T-303 的真实正例回归。