Files
meida/docs/开发任务包/T9-视觉算法SPIKE.md
T
xsl e511b6a66f 收尾两批并行开发的文档回写与任务包
- Sprint 执行计划 v1.1:§1.1 补第一批交付实据;T9 SPIKE 结论回写 Sprint 1 表
  (T-P0-16 通过 2.8ms;T-P0-12 有条件;T-P0-10 原型 6/6 + 真实照片重验前置);
  Sprint 2 表标注 T-P2-01~06 交付;新增 §9 两批交付记录
- 开发任务拆解 v1.5:交付回写 + 新风险登记(RTMPose 域差异、BiRefNet 异步化)
- 新增 开发任务包/:三批多 agent 并行的协作规程与 14 份任务契约
- 新增 前置开通清单-云资源与资质.md
- 清理已用毕的评审报告(文档评审 2026-08-13、项目整体评审 2026-08-14),
  README 中相应引用改为留痕表述
2026-08-14 21:07:20 +08:00

77 lines
6.0 KiB
Markdown
Raw 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.
# T9 · 算法验证 SPIKE·RTMPose 体型原型 + BiRefNet 抠图
> 对应任务:`T-P0-16`(RTMPose ONNX 单张耗时)、`T-P0-12`(BiRefNet 抠图质检 ≥90%)、`T-P0-10` 前置(体型测算原型)| 分支:`task/t9-vision-spike` | worktree:`/home/xsl/meida_backend-t9`
> 先读《README.md(协作规程)》,遵守全部纪律。**本任务是 SPIKE:产出是脚本 + 基准报告 + 结论,不是生产代码。**
## 1. 目标
用本地可跑的最小代价回答三个 Sprint 1 硬门槛的**可行性问题**,结论写进报告(不达标要换方案,不要硬做):
1. **RTMPose ONNX 在 CPU 上的单张推理耗时**(T-P0-16 验收:可接受即通过;开发机另有 RTX 5090,若 WSL 能用 GPU 也测一档,不行就只报 CPU——先探测 `nvidia-smi` 与 `onnxruntime` 的 CUDA 可用性,探测失败不折腾);
2. **BiRefNet ONNX 抠图的质量代理指标**(T-P0-12 的 ≥90% 质检通过率需要真实素材与人工标注,本 SPIKE 只建管线 + 代理指标 + 少量样图的主观核验,正式验收留给素材流水线);
3. **体型测算「掩膜宽度剖面法 + 关键点定高」原型**(TD-06):在合成人形图上跑通"关键点 → 定高 → 剖面宽度 → 肩/腰/臀比例 → H/A/V/O/X 初判",证明管线成立;**一致率 ≥80% 的正式验证需要人工标注数据(顾问轨),本任务不承诺**。
## 2. 已就绪的契约(协调提交已提供)
- **依赖**:`spike` extra 已加入 pyproject(`onnxruntime`、`opencv-python-headless`、`numpy`),你的 worktree venv 已 `uv sync --extra spike` 装好。**GPU 版 onnxruntime 不装**(CUDA 匹配成本高,CPU 基准已满足 T-P0-16 验收口径)。
- **目录**:`scripts/spikes/`(新建,归你)+ 模型缓存目录 `models/`(已在 `.gitignore`,**模型文件绝不入库**)。
- **样图**:用脚本合成(OpenCV 画人形剪影/几何人体,见 §3),不使用任何真实人脸/人体数据(合规红线:测试不碰真实个人数据)。
## 3. 实现要点
允许改动:`scripts/spikes/**`、测试(可选,本任务以报告为验收)。其余全禁改。
### 3.1 模型获取(本批唯一允许联网的环节)
- 优先 `HF_ENDPOINT=https://hf-mirror.com`(国内镜像)用 `huggingface_hub.snapshot_download` / `hf_hub_download` 下载 ONNX:
- RTMPose:`PINTO0309/PINTO_model_zoo` 里的 rtmpose(搜 `rtmpose` + onnx,选 **body 26/17 keypoint 的小模型**)或 `dhkim0115/rtmpose-onnx` 等社区导出;取不到就换 OpenMMLab 官方导出说明,**再不行降级:用 `opencv` 自带的 HOGDetector 作关键点占位并在报告声明**;
- BiRefNet:`zhengpeng7/birefnet` 的 ONNX 导出(或 `onnx-community/BiRefNet`);文件大(~1GB)下载慢的话选 **lite/general-lite** 变体,报告注明用的哪个;
- 下载脚本 `scripts/spikes/download_models.py`:带本地存在性检查 + 进度打印 + 失败重试一次;模型路径默认 `models/<name>.onnx`,支持 CLI 参数覆盖;
- **超时纪律**:单个模型下载超过 ~10 分钟即放弃并走降级路线,把时间花在报告上。
### 3.2 `scripts/spikes/rtmpose_benchmark.py`
- 加载 ONNX → 预处理(resize/归一化,按模型 meta)→ 推理 → 解码关键点(17 点 COCO 或 26 点,按模型);
- 输入:合成图 `scripts/spikes/assets/synthetic_person.png`(用 OpenCV 画:头圆 + 躯干梯形 + 四肢线段,肩/腰/臀位置可控——这也是 3.4 的输入);
- 耗时基准:预热 3 次 + 正式 20 次,报 **均值 / P95 / 单次最大**(`time.perf_counter`);
- 输出关键点坐标 JSON + 控制台表格。
### 3.3 `scripts/spikes/birefnet_matting.py`
- 加载 ONNX → 推理 → 后处理(sigmoid + resize 回原尺寸 + 二值化阈值 0.5)→ 保存掩膜图与抠图预览到 `scripts/spikes/out/`(out/ 也 gitignore,报告里只留指标);
- 代理质检指标(T-P2-07 质检的雏形口径,写清楚这是代理不是正式验收):
- 前景像素占比(应在 15%~60% 合理区间);
- 最大连通域占前景比(>0.9 视为"主体单一完整");
- 边缘羽化度(掩膜梯度带宽度均值);
- 抠图耗时(同 3.2 口径);
- 输入:合成人形图(与 3.2 同一张)+ 一张带渐变背景的变体。
### 3.4 `scripts/spikes/body_measure_prototype.py`(TD-06 原型)
- 用 3.2 的关键点(或合成图直接已知的真值框)定肩线/腰线/臀线高度 → 在 3.3 的掩膜上取对应高度的**宽度剖面** → 肩宽/腰宽/臀宽比值;
- 规则初判:肩/臀比 >1.05 → V 型;<0.95 → A 型;肩≈腰≈臀 → H;腰远小于肩臀 → X;中段最大 → O(阈值写成常量并注明"待顾问校准");
- 对合成图断言:**已知真值形状的分类正确**(合成图生成时就知道自己画的是 A 型还是 H 型——这就是最小可行的一致率验证)。
### 3.5 `scripts/spikes/REPORT.md`(**核心交付物**)
结构:结论先行(三问三答,每问给"通过 / 有条件通过 / 不达标需换方案")→ 各基准数字表 → 用的模型与版本 → 降级与偏差 → 对 Sprint 1 正式验证的建议(需要什么数据、多少标注量)。
## 4. 验收标准
1. `download_models.py` + 三个 spike 脚本可重复执行(模型已缓存时离线可跑);
2. RTMPose CPU 耗时基准有数字(或降级路径有声明);
3. 体型原型在合成图上分类正确;
4. `REPORT.md` 三问三答齐全,结论可决策;
5. `ruff check` / `ruff format --check` 对 `scripts/spikes/**` 全绿;无 pytest 强制要求(脚本里的断言跑一遍即可,在报告里贴输出)。
## 5. 提交信息
```
spike(vision): rtmpose latency, birefnet matting proxies, body-shape prototype
T-P0-16/12/10 可行性验证:CPU 基准 + 代理质检指标 + 合成图体型剖面法
原型 + REPORT.md 三问三答(Sprint 1 门槛的决策依据)。
偏差说明:<模型是否齐全、走了什么降级、写在这里>
```