Skip to the content.

BiRefNet 抠图的像素与资源合同

BiRefNetBackgroundRemover 在现有可选 Inference 模块内复用本地 CPU 会话,输出透明 PNG 和可选软蒙版。蒙版是模型估计,不是 alpha 真值;业务调用和部署步骤见 Inference README。换纯色背景由基础 ImageProcessor 继续处理,不在模型接口中新增另一套合成流程。

固定模型与加载边界

支持的 onnx-community/BiRefNet_lite-ONNX revision 为 de15b22ba131738a16dff04aab8bdf8dc32e3ac1,文件 onnx/model.onnx 为 224,005,088 字节,SHA-256 为 5600024376f572a557870a5eb0afb1e5961636bef4e1e22132025467d0f03333。转换权重的模型卡、原作者权重和实现许可声明 MIT。NuGet 不携带权重,运行时不 HTTP 下载、安装包或加载作者的远程 Python 代码。

工厂复用 VerifiedOnnxModel.ReadAsync:按固定长度读取、验证 SHA,再将同一个 bytes 快照交给 ONNX Runtime CPU 1.31.0,避免校验后重开路径加载不同文件。会话还必须只有 input_image float [1,3,1024,1024] 输入和 output_image float [1,1,1024,1024] 输出;其他模型、FP16 文件、错误大小、hash 或张量约定明确拒绝。

解码、预处理与软蒙版

源图仅由现有 ImageCodec 解码一次,沿用静态图片、编码字节、尺寸、像素和 EXIF 规范化规则。业务 RGB 基准为规范化解码得到的颜色;解码时已丢失的透明隐藏 RGB 不会恢复,低 alpha 的 8 位预乘转换也可能量化颜色。

模型输入先把源 RGBA 与白色合成,再按半像素坐标双线性缩放到固定 1024×1024,排列成 RGB NCHW 并使用 ImageNet 均值 [.485,.456,.406]、标准差 [.229,.224,.225]。先合成再插值,避免直接丢弃 alpha 后把透明黑色作为实体背景。该尺寸和归一化与作者 profile 对应;本实现的浮点双线性采样不宣称与 PIL 的抗锯齿/8 位中间量化位级相同。

输出是 logits。每个值必须有限,采用按正负分支的稳定 sigmoid,避免极大有限值的指数溢出;概率图以双线性缩回规范化源尺寸。最终每个像素只计算一次:

最终 alpha = round(源 alpha × 估计概率)

这里采用 MathF.Round 的默认中点到偶数规则,再限制到 8 位范围。

透明 PNG 使用源规范化 RGB 与这个 alpha,既不生成 RGB,也不反演前景颜色或消除原图已混入的背景色。原本完全透明的像素保持透明;模型不能借此恢复被遮挡或丢失的数据。白色推断底色、源边缘背景污染和低 alpha 量化仍可能影响边缘,不能承诺发丝或复杂背景质量。

新变透明的像素仍可保留源 RGB;展示时必须按 alpha 合成,忽略 alpha 的查看工具可能仍显示原背景。软蒙版与透明 PNG 的像素验证基于实际 alpha 通道,而非这类查看工具的 RGB 预览。

可选 softMaskPng 是最终有效 alpha 的不透明灰度 PNG,三个灰度通道逐像素等于结果 PNG 的 alpha。它已经包含源 alpha,使用时不应再乘一遍源 alpha;白色表示最终完全不透明、黑色表示透明,中间值为软边缘。它不另行阈值化,也不等同于未经源 alpha 约束的原始模型概率。

会话、取消与流

同一实例串行执行解码、推理、合成和编码。模型输入值、RunOptions、输出 OrtValue 及位图都由调用拥有并确定释放;源与输出流从当前位置使用,保持打开且须为不同的流对象。透明 PNG 与软蒙版按顺序写入,失败或取消可能留下部分输出,两份输出不是事务;宿主需要原子发布时应先写私有暂存文件。

取消在读取、逐行像素处理与编码阶段检查,并通过 RunOptions.Terminate 通知 ORT;仍等待该次 native Run 返回后再释放资源,不把取消任务等同于 native 已停止。释放实例先阻止新工作,再等待活跃调用结束并关闭会话;排队调用观察释放状态而不读取源。托管 gate 保持可供已有等待者恢复,避免释放后排队路径访问已销毁的同步对象。

资源边界

输入默认最多 32 MiB、单边 4096、4,000,000 像素;输出尺寸与 EXIF 规范化源尺寸相同。模型始终运行固定 1024 图,即使源图很小也不能按源像素数推断推理内存。托管部分包含固定约 12 MiB 输入 tensor、4 MiB 概率图、原尺寸的源/结果位图和可选灰度位图,以及编解码缓冲;模型 bytes 快照与原生激活、线程池另计。

CPU 默认 min(2, 逻辑CPU数),每实例只有一个活跃任务。宿主仍应以共享队列控制不同推理工具与实例的总并发,不能把单实例串行或图片像素限额当成全进程 CPU/内存硬配额。

ORT 的 CPU arena 与 memory-pattern 默认开启,可能保留较大的激活分配。本模型固定关闭两者,仍保留默认 tensor memory reuse、相同模型、1024 输入和顺序执行;这项策略用于控制重复请求的缓存工作集,不修改分割或 alpha 规则。

本机 CPU 2 线程的原生对照中,默认缓存策略在复用会话时达到 13,010,370,560 B 的测试进程峰值工作集。关闭两项缓存后,五次处理达到 6,870,069,248 B,约 6.40 GiB;同四个基准样本的 RGBA 与软蒙版逐像素一致,处理时间由约 10.2–12.7 s 增至 16.2–20.5 s。这是峰值内存与分配开销的取舍,不是模型变小。

独立 NuGet 发布消费者的一次 512×600 人像调用,创建会话 10.03 s、处理 17.93 s,进程峰值 6,532,874,240 B(6.08 GiB),调用后工作集 628,768,768 B(0.59 GiB)。宿主应按实测约 6.1–6.4 GiB 的单任务峰值另留余量,并串行安排此类重任务;不能根据 224 MB 权重、源图大小或线程数推断可在小内存容器运行。这组数据也不是对其他机器或模型的硬上限承诺。

验证依据与限制

轻量测试覆盖白色合成在双线性之前、NCHW/ImageNet 通道、正负极大 logits、非有限值拒绝、半像素边缘与狭长图、alpha 相乘、软蒙版精确一致、可选蒙版、直色 PNG 编码及取消检查。真实 CPU 测试覆盖公有领域人像、完全透明图、带透明度的人像边缘、EXIF90、源字节/栅格限制、排队取消和释放。

人像没有作者提供的 alpha 真值,验证的是实际模型执行、坐标、颜色来源与透明度合同,不据此计算质量置信度。纯色或不属于训练分布的画面可能被全部判为背景;ReviewRecommended 始终为 true。模型输出需要结合原图和软蒙版检查,不能据权重名称中的 lite 推断运行内存或准确率。

公有领域 Grace Hopper 肖像的独立调用产生 181,078 个非透明像素;白底合成视检确认主体与背景分离,帽沿与发梢仍有轻微原背景颜色污染。带 alpha 分区的同一人像仍有 162,768 个非透明像素,包含实际非空的半透明前景;所有输出 alpha 不超过源 alpha,灰度蒙版与最终 alpha 完全相同。纯透明图保持零 alpha,EXIF90 输出为 600×512。上述是有限样本观察,不能推广为精确发丝或复杂场景保证。