Files
silver_pose/docs/adr/2026-07-22-t302-go-spike-decision.md

33 lines
2.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# T-302 · Go 推理、视频与 Windows UI Spike 决策
- 状态:已接受,作为 T-303/T-304 的实施前提
- 日期:2026-07-22
- 范围:仅验证 Windows 开发环境的单帧推理、录像解码和 UI 技术路线;不等于 V2 行为验收或客户演示验收。
## 结论
1. Pose 运行时采用 `github.com/yalue/onnxruntime_go` v1.31.0,CPU 路径,且启动时必须显式指定 `onnxruntime.dll`。包装器当前使用 ONNX Runtime C API 26,构建机须固定 Go、`CGO_ENABLED=1` 和 MinGW;运行端不依赖 Python,但必须随发布物携带版本、来源和 SHA-256 都已锁定的匹配 DLL。
2. 视频接入采用受控 `ffmpeg.exe` 子进程。它解码录像或 RTSP 为 `bgr24` 原始帧;T-304 将锁定 `ffmpeg.exe`/`ffprobe.exe` 的版本和哈希,并实现来源状态、超时、取消与重连。当前不采用 GoCV,因为此机没有可用的 OpenCV/GoCV 开发绑定。
3. Windows UI 采用 `github.com/lxn/walk`。它提供原生窗口、顶部 Tab 和控件,UI Spike 在 `CGO_ENABLED=0` 下可编译。正式 UI 继续使用文档中的浅灰蓝底、白色卡片和“红色只表示 CONFIRMED”的语义;Walk 只在 UI 线程渲染,不能调用解码、ONNX 或状态机。
## 验证证据
命令行 Spike 使用 `demo/1.mp4` 的第一帧(848×480),从 FFmpeg 获取准确的 1,221,120 字节 BGR 帧,转为 1×3×640×640 的 1,228,800 个 `float32` 输入;锁定 `v2/assets/best.onnx` 输出为 1×56×8400 的 470,400 个值。实际运行输出:
```text
SPIKE_OK frame=848x480 input=1228800 output=470400 max=685.7795
```
`go test ./...` 在 `CGO_ENABLED=1` 下通过,且 `go build ./cmd/ui-spike` 在 `CGO_ENABLED=0` 下通过。最小测试覆盖 BGR 尺寸拒绝、letterbox 后 RGB/CHW 布局、Pose 输入长度拒绝和 UI 视觉令牌。
开发机的 ONNX Spike 暂时使用 Go 模块缓存内的 `test_data/onnxruntime.dll`,仅用于证明接口可执行;它不是允许交付的 DLL 来源,也未被拷入仓库。
## 拒绝的路线
- **GoCV/OpenCV**:未配置 Windows 开发库、`pkg-config` 或 CGO 绑定,无法据实声称可用于 V2。
- **Fyne**:初次 Windows 构建进入 OpenGL/CGO 编译并在 120 秒内未完成,且遗留编译进程;对于当前“稳定现场演示”的目标,引入的 UI 图形链复杂度不合适。随后已停止这些精确的临时进程,没有修改用户文件。
## 不在本任务中的内容
当前 Go letterbox 是最小 Spike(nearest-neighbour)。它尚未完成或证明与 V1 等价的缩放/补边、NMS、关键点解析、坐标还原、人员跟踪、事件状态机、RTSP 断流、声音、弹窗、截图和打包。T-303 必须以同一录像的关键点、事件数量、非报警案例和确认延迟证明 V1/V2 等价;T-304 才可形成部署与现场演示闭环。