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

6.0 KiB
Raw Blame History

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 门槛的决策依据)。

偏差说明:<模型是否齐全、走了什么降级、写在这里>