Files
xsl 446d7a9391 spike(vision): rtmpose latency, birefnet matting proxies, body-shape prototype
T-P0-16/12/10 可行性验证:CPU 基准 + 代理质检指标 + 合成图体型剖面法
原型 + REPORT.md 三问三答(Sprint 1 门槛的决策依据)。

偏差说明:模型齐全未触发降级(rtmpose-s/m + birefnet_lite fp32 全部首选
候选成功,hf-mirror 实测 4~12MB/s);huggingface_hub 不在 spike extra 且
禁新增依赖,改用 stdlib urllib 直连 resolve 端点(同 HTTP 语义);PINTO
model zoo 无法脚本化定位小模型、dhkim0115 仓不存在,姿态模型改用
bukuroo/RTMPose-ONNX;BiRefNet 官方仓无 ONNX,用 onnx-community 导出;
GPU 档未测(CPU 版 ORT 无 CUDA EP,按文档不折腾);BiRefNet 单张>3s 正式
次数自适应降为 10 并在输出注明;RTMPose 在合成剪影上置信度低(域差异),
体型断言按文档允许走真值定高路径,关键点路径仅统计参考一致率。
2026-08-14 20:21:39 +08:00

10 KiB
Raw Permalink Blame History

T9 · 视觉算法 SPIKE 报告(RTMPose 体型原型 + BiRefNet 抠图)

分支 task/t9-vision-spike | 2026-08-14 | 对应任务 T-P0-16 / T-P0-12 / TD-06 前置 测试机:Intel Core Ultra 7 265K(WSL 分配 16 vCPU、54GB 内存),onnxruntime 1.28.0(CPU 版)、opencv-python-headless 5.0.0、numpy 2.5.2 所有输入均为 OpenCV 合成人形图(synthetic.py 确定性生成),未使用任何真实人脸/人体数据(合规红线)。


一、三问三答(结论先行)

Q1 RTMPose ONNX 在 CPU 上的单张推理耗时是多少?(T-P0-16)

结论:通过。 RTMPose-s 单张纯推理 2.2ms(P95 2.6ms / 最大 2.7ms),含预处理与解码的全链路 2.8ms(P95 3.3ms / 最大 3.5ms);RTMPose-m 全链路 5.9ms。CPU 单张耗时对服务端批量/异步处理完全无压力,T-P0-16 验收口径(可接受即通过)满足。GPU 档未测:开发机有 RTX 5090(nvidia-smi 可见),但 venv 装的是 CPU 版 onnxruntime(无 CUDAExecutionProvider),按任务文档约定不装 GPU 版、只报 CPU 档。

Q2 BiRefNet ONNX 抠图的质量与成本如何?(T-P0-12 初步)

结论:有条件通过。 管线成立:BiRefNet_lite fp32 在合成图上前景占比 24.4%(区间 15%~60% 内)、最大连通域占前景 1.0(单一主体)、边缘羽化带约 1px、纯色与渐变背景结果一致。条件/风险有二:① 单张全链路 约 3.1s(CPU,1024×1024 输入),同步接口不可接受,必须走异步任务或降档(见 §四);② 本 SPIKE 的指标是代理口径(合成图 + 几何指标),T-P0-12 的「质检通过率 ≥90%」必须用真实素材 + 人工标注验证,合成图结果不能外推到正式验收。

Q3 「关键点定高 + 掩膜宽度剖面」体型测算原型是否成立?(TD-06 前置)

结论:通过(原型口径)。 管线端到端跑通:定高 → 掩膜剖面取宽 → 肩/腰/臀比值 → 规则初判。真值定高路径 6/6 变体(H/A/V/O/X 全类别 + 中性 STD)分类硬断言全部通过;掩膜测宽与几何真值偏差仅 ±1px(一个变体腰线 +3px);关键点(RTMPose)定高路径参考一致率 6/6。两点保留:① COCO-17 无腰点,腰线取肩臀中点是代理,对真实人体(腰臀比例分布)是否成立待验证;② RTMPose 在合成剪影上置信度极低(见 §三),KP 路径在真实照片上的可用性未验证;≥80% 一致率的正式验证需要顾问轨人工标注(本任务不承诺)。


二、基准数字表

2.1 RTMPose CPU 单张耗时(预热 3 + 正式 20,time.perf_counter)

模型 链路 均值 P95 单次最大
rtmpose-s(20.9MB,输入 256×192) 纯模型 session.run 2.2ms 2.6ms 2.7ms
rtmpose-s 全链路(resize+归一化+推理+SimCC 解码) 2.8ms 3.3ms 3.5ms
rtmpose-m(51.8MB,输入 256×192) 纯模型 5.2ms 5.7ms 5.8ms
rtmpose-m 全链路 5.9ms 6.2ms 6.5ms
  • 预处理+解码开销约 0.6~0.7ms(全链路 − 纯模型),与模型规模无关。
  • 耗时口径说明:RTMPose 是 top-down 模型,本基准以「合成图已知完美人体框、整图缩放」为输入,即纯姿态网络耗时;生产链路还需前置一个人体检测器(见 §四建议)。

2.2 BiRefNet_lite 抠图代理质检指标(预热 3 + 正式 10,单张 >3s 自适应降档并注明)

输入 前景占比 最大连通域/前景 连通域数 边缘羽化带 均值耗时 P95 最大
纯色背景 0.2444 1.0000 1 0.97px 3097ms 3128ms 3131ms
渐变背景 0.2443 1.0000 1 1.02px 3097ms 3131ms 3139ms
  • 前景占比处于 15%~60% 合理区间,主体单一完整(>0.9 阈值达成,实际 1.0)。
  • 羽化带 ≈1px:对高对比合成图边缘干净利落,真实照片(毛发/半透明)会显著变宽,该值应作为正式质检的分档特征而非固定阈值。
  • 两背景变体指标几乎一致 → 对背景明暗变化不敏感(该结论仅限合成域)。

2.3 体型测算原型(合成图,掩膜 = BiRefNet_lite)

变体 期望 真值定高(硬断言) 关键点定高(参考) 掩膜测宽 肩/腰/臀(px) 保真度偏差(px)
STD(中性) H H ✓ H ✓ 131/111/131 +1/+1/+1
H H H ✓ H ✓ 127/121/125 +1/+1/+1
A A A ✓ A ✓ 99/103/147 +1/+1/+1
V V V ✓ V ✓ 155/107/119 +1/+1/+1
X X X ✓ X ✓ 131/81/135 +1/+3/+1
O O O ✓ O ✓ 115/143/123 +1/+1/+1
  • 真值定高 6/6 断言通过;关键点定高一致率 6/6(100%)(参考值,样本为合成图)。
  • 阈值(首版经验值,待顾问校准):肩/臀 >1.05 → V;<0.95 → A;腰 <0.80×min(肩,臀) → X;腰 >1.02×max(肩,臀) → O;否则 H。判定顺序 O → X → V → A → H。

三、RTMPose 在合成剪影上的关键点质量(重要发现)

RTMPose 关键点在合成剪影上定位偏差可用但置信度极低:rtmpose-s 肩线偏差 +12px、臀线偏差 −28.5px(画布高 512px),但平均置信度仅 0.003(SimCC 分布近乎平坦)。已排除预处理口径因素(RGB/BGR、0-255/0-1 归一化四种组合结果几乎一致),结论是域差异:模型在真实人像上训练,对无纹理几何剪影没有信心。对本 SPIKE 的处理:

  • 断言路径用「真值定高」(任务文档明确允许:"用 3.2 的关键点(或合成图直接已知的真值框)定肩线/腰线/臀线高度"),KP 路径仅统计参考一致率;
  • 对 Sprint 1 的含义:RTMPose 的关键点质量必须在真实照片上重新验证,合成图不能作为其可用性依据;体型管线的关键点依赖是当前最大不确定性。

四、对 Sprint 1 正式验证的建议

  1. T-P0-16(RTMPose 耗时):CPU 数字已可决策(s 档 3ms 级全链路)。还需要补两件事:① 生产链路要前置人体检测器(RTMPose 是 top-down),建议补测 YOLOv8n-ONNX 或 RTMO 一体化模型的 CPU 耗时;② 若上传链路要同步姿态,当前 CPU 数字已够;无需 GPU。
  2. T-P0-12(抠图质检 ≥90%):需要 200~500 张真实全身照(覆盖多背景/光线/姿态),人工标注粗前景 GT,指标建议 IoU ≥0.90 或边界 F-measure,先定义「单张通过」标准再统计通过率。成本决策点:若 CPU 3.1s/张不可接受,候选降档(按优先级)——任务异步化(现有 task 架构,零成本)→ BiRefNet fp16 / 512×512 变体(候选已在 download_models.py 链里)→ GPU EP。
  3. TD-06(体型测算 ≥80% 一致率):需要顾问轨 ≥100 人体型标注(H/A/V/O/X 五类尽量均衡)+ 每人至少一张标准站姿全身照;阈值校准建议用分位数/ROC 而非拍脑袋值;前置依赖是 RTMPose 在真实照片上的关键点质量验证(§三)。腰线代理(肩臀中点)需在标注数据上复核落点。
  4. 数据合规:真实人体照片进入验证集前需走用户授权/合成替代评估;本 SPIKE 已验证「合成图 + 真值」开发范式可行,阈值调参阶段可继续用合成图,终验必须真实分布。

五、使用的模型与版本(models/manifest.json)

用途 模型 仓库 @ revision 变体 大小
姿态(基准主档) rtmpose-s.onnx bukuroo/RTMPose-ONNX @ a6e9fb8a RTMPose-s body COCO-17 SimCC,输入 256×192 20.9MB
姿态(对比档) rtmpose-m.onnx bukuroo/RTMPose-ONNX @ a6e9fb8a RTMPose-m 同上 51.8MB
抠图 birefnet_lite.onnx onnx-community/BiRefNet_lite-ONNX @ de15b22b fp32,输入 1024×1024,ImageNet 归一化 213.6MB

下载通道:https://hf-mirror.com(国内镜像优先,实测 4~12MB/s,总 ~290MB,未触发 10 分钟超时纪律)。

六、降级路径与偏差说明

  • 实现并验证的降级链(本次全部未触发,代码路径已在脚本中就位):姿态 bukuroo rtmpose-s → (失败)cv2.HOG 关键点占位;抠图 BiRefNet_lite fp32 → fp16 → briaai/RMBG-1.4 → (仍失败)Otsu 二值化占位。脚本对每级失败均打印 [降级] 日志并在输出 JSON 记 model_source。
  • 偏差 1(依赖):任务文档建议用 huggingface_hub.snapshot_download,但该包不在 spike extra 且本批禁止新增依赖(协作规程 §4.2),改用 stdlib urllib 直连 {endpoint}/{repo}/resolve/main/{file}(同一 HTTP 语义,支持 30x 与 Range 断点续传)。已在脚本 docstring 声明。
  • 偏差 2(模型选型):文档首选 PINTO0309/PINTO_model_zoo 的 rtmpose,但该仓库为巨型混合仓库(API 兄弟列表无法按"body 17/26 keypoint 小模型"脚本化定位);dhkim0115/rtmpose-onnx 经 API 探查不存在;最终选社区导出 bukuroo/RTMPose-ONNX(17 点 COCO、SimCC、256×192,符合文档"body 小模型"要求)。BiRefNet 官方仓 ZhengPeng7/BiRefNet 只有 safetensors 无 ONNX,采用 onnx-community 的 ONNX 导出(文档列举的备选之一)。
  • 偏差 3(GPU 档):nvidia-smi 可见 RTX 5090,但 venv 的 onnxruntime 为 CPU 构建(providers 无 CUDA),按任务文档「不装 GPU 版 ORT、探测失败不折腾」只报 CPU 档。
  • 口径调整:BiRefNet 单张 >3s,正式次数由 20 自适应降为 10(脚本内 adaptive_note 字段注明);RTMPose 基准严格按预热 3 + 正式 20。

七、复现方式(worktree 根目录)

.venv/bin/python scripts/spikes/download_models.py      # 联网下载(已缓存则秒过,唯一联网环节)
.venv/bin/python scripts/spikes/rtmpose_benchmark.py    # Q1:耗时基准 + 关键点
.venv/bin/python scripts/spikes/birefnet_matting.py     # Q2:代理质检指标
.venv/bin/python scripts/spikes/body_measure_prototype.py  # Q3:体型分类硬断言

输出:数字与 JSON 落在 scripts/spikes/out/(已 gitignore),掩膜/抠图预览同目录可人工核验。