Files
AnyImage/openspec/changes/simplify-ai-model-tiers/validation.md
nan e8129fe495 Implement BiRefNet and HAT Sharper models with background removal capabilities
- Added validation documentation for AI model tiers.
- Introduced `background.py` for background removal logic, including inference functions for alpha and foreground extraction.
- Created `onnx_birefnet.py` to handle BiRefNet model sessions and alpha inference.
- Developed tests for background models, ensuring proper dispatch and session reuse.
- Added tests for BiRefNet ONNX model to validate alpha output and error handling for invalid values.
- Implemented model export scripts for BiRefNet and HAT Sharper, ensuring proper weight compression and licensing.
- Created `deform_sampling.py` for deformable convolution operations used in BiRefNet.
- Added utility functions for compressing ONNX weights without altering graph arithmetic.
- Introduced a reference plane node for depth field adjustments in geometry processing.
2026-09-10 20:50:44 +08:00

95 lines
9.8 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.
# 实施验证
## 基线与入口
开始实施时 `git status --short` 仅有本 change 未跟踪,生产代码无已有未提交修改。
- Geometry:Operator → Geometry Job → ModelManager → MoGe-2 / MoGe-3 ONNX;保留 MoGe-3 三步细化。
- Upscale:Operator → Upscale Job → `models/upscale.py` → ONNX 分块 → Lanczos 2× 与源 Alpha 合成。
- 背景移除:Operator 当前硬编码 BEN2;Job 调用 `models/ben2.py`,HDR 已使用 Alpha-only 返回,输入准备复用 `common`。
- 模型入口:`preferences.py`、`properties.py`、`server/model_catalog.py`、`server/model_manager.py`;背景资源分类当前为 `ben2`。
- 资产入口:`uv run model prepare` / `uv run model sync` → `tools/models/cli.py`;上传为逐文件 `rclone copyto`。
- 当前生产源码未发现 DA3 实现;本地及 R2 残余仍需枚举。历史 OpenSpec 记录不作为现行调用链。
衔接 `add-moge3-model`、`add-pisa-sr-two-times-upscale`、`add-ben2-hdr-support`、`organize-tool-cli`,模型成员以本 change 为准。
## BiRefNet 来源
| 模型 | 官方权重与源码仓库 | 固定 revision |
|---|---|---|
| Lite | ZhengPeng7/BiRefNet_lite | aa62cd87eafb9cc43056d08ef3615a14628b831d |
| HR-matting | ZhengPeng7/BiRefNet_HR-matting | 5d6b6f8adcb5b417c871b1d84ceaae9871355b7f |
两款模型卡标注 MIT,正式导出结构检查通过,许可证随模型发布。
Lite 固定权重 SHA-256:`4417d89795250e698c3cb0ae8df15743810065f646f48a694fdfa7ca052d0815`;HR:`a5a4de698739ea5e0e8bbab28e1b293dde95092b87a442d566cbc585c53cef55`。许可证固定到 BiRefNet revision `ebcc0bc8ec7fe919cec829f2dea656b3078acddc`,1,066 bytes,SHA-256 `92a7089e0915fc32bc40067560b398f1e6a7a5958abd7d04eda393629a5acefb`。
数值测试开始前固定 Alpha 容差(激活后、浮点范围 0–1):FP32 ONNX 对原始 FP32 实现的 MAE ≤ 0.0002、P99 ≤ 0.002、Max ≤ 0.01;压缩权重资产 MAE ≤ 0.002、P99 ≤ 0.02、Max ≤ 0.1。所有输出必须有限、尺寸准确、处于 0–1。容差不得根据测得误差放宽。
固定样图使用作者官方演示中的 Helicopter、Jewelry、My_Love、My_MiSheng、Windmill,另补发丝、毛绒及薄纱覆盖;记录来源与逐图结果。性能测量使用同一批源图、同一 Runtime/设备并分开运行模型。
补充 Alpha Matting Evaluation 官方测试集中的 `net.png`(薄网纱)和 `plasticbag.png`(透明塑料);来源 `https://www.alphamatting.com/datasets.php`,仅用于本地评估。
Lite 通过七图 CPU / DirectML 对照的正式资产:112,968,598 bytes,SHA-256 `6e2a9844c57b080e95a402722ddcae5660e6f254a04d3e003347f06f587b71fe`。FP16 权重存储与完全无损的静态常量压缩,FP32 运算。最大误差 0.041951,符合预设门槛。CPU 热推理约 2.85 秒;同输入 BEN2 CPU 约 3.84–3.90 秒,Lite 下载成本更低且 CPU 更快。正式 DirectML 与端到端结果见下表。
HR 的 DirectML 最后一层解码器有稳定偏差;用户于 2026-09-10 确认保留 HR,暂时仅支持 CPU。正式资产使用原始 GridSample 结构和 FP16 权重存储,不采用失败的分块或混合精度实验。HR 选项、实际 Job 设备和缓存键均明确使用 CPU。
## 公共背景编排
`models/background.py`、`get_background` / `release_background` 与资源分类 `background` 已统一。保留 `onnx_ben2.py` 专用适配器。三款模型已通过静态、多帧、连续 Alpha、源 Alpha 合成和缓存切换测试;既有 HDR RGB 保持、取消和失败清理测试通过。
## 正式背景模型验收
正式导出命令:`uv run --script tools/models/birefnet_export.py --variant lite --destination models/birefnet-lite`;HR 使用 `--variant hr-matting --destination models/birefnet-hr-matting`。导出器固定上游代码、权重与许可证。Lite 重复导出哈希完全相同。
| 模型 | ONNX bytes | SHA-256 |
|---|---:|---|
| Lite | 112968598 | `6e2a9844c57b080e95a402722ddcae5660e6f254a04d3e003347f06f587b71fe` |
| HR-matting | 529467341 | `b3abc34843a4d96f669ca9fb1a2a16b3417ab8b91c987573fdbda36d20514133` |
ORT 1.24.4;DirectML 使用 RTX 5070 Ti。Lite 正式资产的七图 CPU / DirectML 误差通过既定门槛;最终 DirectML 记录确认实际加载 DmlExecutionProvider。HR 七图 CPU 与原始 FP32 对照全部通过,最差 MAE 0.000001987、P99 0.000020504、Max 0.000103504;输出均为有限的 2048×2048 连续 Alpha,生产适配器恢复源图尺寸。
| 模型 / 设备 | 加载秒 | 七图热推理秒 | 峰值工作集 GB | 峰值进程提交 GB |
|---|---:|---:|---:|---:|
| Lite / DirectML | 2.728 | 0.05895–0.05961 | 0.802 | 6.729 |
| BEN2 / DirectML | 1.154 | 0.11591–0.11801 | 0.604 | 6.519 |
| HR / CPU | 4.318 | 21.718–23.437 | 19.278 | 22.596 |
Lite 与 BEN2 用同一七图、同一 Runtime 配置串行运行,每图三次,表中取每图最后一次。HR 每图两次,CPU 配置为八线程。工作集与提交量来自 Windows 进程计数器,不将其表述为独立显存测量。Lite 满足体积更小且热推理更快的默认门槛;其加载和峰值内存并不全面优于 BEN2。
视觉检查 `.model-cache/birefnet/quality-1.png`、`quality-2.png`:三款均能提取人物、猫、直升机和风车细杆;HR 更明显保留薄网纱和透明塑料的中间透明度,猫须细节更完整。普通珠宝场景 HR 会残留叶片背景,Lite / BEN2 的主体分离更干净。第三档表示高分辨率 matting 用途,不保证对所有主体都更好。源图与逐图 Alpha/PNG、耗时/误差 JSON 保存在 `.model-cache/birefnet`。
## 集成与回归
- 三类各三款,共九款;默认集合为 MoGe S、Lite、WDN。默认值由目录统一提供,偏好读取集中于 `preferences.py`。保留模型沿用原 Blender 枚举编号,有效 BEN2 / x4plus / MoGe 选择保留,退役偏好归一到默认,直接提交退役 Job 键报错。
- `uv run model prepare` 成功,九款模型共 13 文件全部通过大小和 SHA-256 校验。
- 真实 JobServer:Lite 连续两次、BEN2、HR CPU、HAT 连续两次全部成功,Alpha 源尺寸/有限范围及 HAT RGBA 准确 2× 输出检查通过。Lite 第二次加载 0 ms;HR 完整 Job 24.08 秒;HAT 两次完整 Job 3.41 / 0.60 秒。服务关闭后全部资源键为空。记录:`.model-cache/tier-job-validation/results.json`。
- `uv run pytest -q --tb=short`:1227 passed,51 subtests passed,178.55 秒,正常退出。随后补齐退役偏好持久化归一,对应偏好与初始化测试再次通过:23 passed、2 subtests passed。曾因本地 bpy 安装缺少资源而失败,重新安装锁定的 bpy 4.5.3 后通过;渲染测试明确启用 Cycles。`pyproject.toml`、`uv.lock`、Manifest 未改变,新增模型导出依赖位于隔离脚本,正式 Runtime 无新增依赖。
- 实施过程中另有节点源文件、节点测试和 `.blend` 资产并行修改;保留这些变化,本任务未修改对应节点逻辑。
## 镜像与退役清单
`uv run model sync` 正常完成。三款新模型共六个文件从 `https://models.omoolab.xyz` 实际地址回读,大小、SHA-256 和就绪检查全部通过;回读资产依次通过 Lite DirectML、HR CPU、HAT DirectML 生产适配器推理,关闭后缓存为空。完整 URL、大小、哈希与执行结果见 `mirror-validation.json`。
精确清理清单见 `retirement.json`:19 个本地模型/专用缓存目录、12 个 R2 对象。每个本地绝对路径已检查属于其声明的模型或缓存根目录。全部逐项删除并复查不存在,失败项为零;镜像保留的 13 文件大小与删除前一致,项目模型目录只剩九款。用户目录保留的 BEN2、WDN、x4plus 哈希复核通过。结果见 `retirement-results.json`。
清理后的 `uv run model prepare` 再次成功,九款模型共 13 文件大小和 SHA-256 全部通过。OpenSpec strict 校验通过,本次修改的 `git diff --check` 通过。
## HAT Sharper 正式导出
`uv run --script tools/models/hat_export.py --destination .model-cache/hat-sharper-export --checkpoint <已验证官方权重>` 成功退出。
- 上游:XPixelGroup/HAT,revision `1638a9a822581657811867bf670717f8371fc3e5`。
- Checkpoint SHA-256:`5800b67136006eb8cab3b4ed7c8d73b6a195bb18e6cc709b674f9aa069c00271`,严格加载 `params_ema`。
- ONNX:45,874,438 bytes,SHA-256 `032d8b03c704220a08d91465a822aca252c1d6e63db20c3cf23c5fb67f3d2366`,与原实验资产完全相同。
- Apache 2.0 许可证随资产保存,完整资产小于 60 MB。结构检查通过。
- 导出时去除 BasicSR 训练注册器,初始化使用等价 PyTorch 工具;官方 forward 保持不变。FP16 initializer 在 FP32 图计算前 Cast 恢复。
正式资产 ORT 1.24.4、CPU / DirectML 各 4 张 256×256 样图(bread、village、indoor、indoor_grain)逐图对照全部通过;每图执行两次。最差 MAE 0.000190、P99 0.000613、Max 0.007376,全部有限。CPU 加载 1.19 秒、热推理 14.43–14.90 秒;本次 DirectML 热推理 0.787–0.811 秒。性能为当前机器本次运行记录,不将历史不同负载下的耗时作为同条件对照。
详细记录:`.model-cache/hat-sharper-export/numerics.json`;复测脚本 `.model-cache/validate_hat_formal.py`;原始 PyTorch 参考与样图见 `.model-cache/hat-validation` 和原实验临时目录。
HAT 拼接验收:321×163 自然屋顶纹理、跨缝细线、渐变 Alpha,另有 7×5 和 1×1 小图。原始 PyTorch 整图使用与分块一致的反射边界,DirectML 用 256 tile / 48 border,均缩至最终 2×。检查整图参考、分块结果和 8 倍差异图,未见拼接直线。细线图接缝带 MAE 为 0.223(8-bit),与整图 MAE 0.213 接近。
对照图和逐图记录:`.model-cache/hat-sharper-export/seams/*-comparison.png`、`results.json`;脚本 `.model-cache/hat_seams.py`。参考图不是不同构图或不同缩放的替代品。