在浏览器里抠图:4 个开源模型在 WebGPU 与 WebAssembly 上的实测对比

博客 · · SwordFishSoft

想做「不上传也能抠图」,模型就得在用户自己的电脑上跑。能在 Python 里抠得好的开源模型不少,但同时满足三个条件的就少多了:有能在浏览器里正确运行的 ONNX 文件,下载体积说得过去,许可证允许商用。

我们把过了这三道筛子的四个候选,放在同一组照片上,在同一个无头 Chrome 里分别走 WebGPU 和 WebAssembly 跑了一遍。本文给出实测数字和并排的抠图结果,也说明那些有名的方案为什么没进名单。我们给图片去背景工具选模型时,先在一张照片上做过同样的比较,这次是更完整的重测。

先看结论

模型(Hugging Face 仓库)许可证下载体积WebGPU 每张CPU(WASM)每张擅长失手的地方
BiRefNet-lite,512² 导出
studioludens/birefnet-lite-512
MIT98 MB(fp16)
192 MB(fp32,CPU 用)
1.1 秒1.6 秒商品、宠物、人像,四个里最稳定极细的毛(胡须);会丢掉被画面边缘切掉一半的次要主体
ISNet general,int8
xrds/isnet-general-onnx-int8
MIT44 MB0.32 秒2.2 秒GPU 上最快的通用模型;宁多勿少留下半透明的雾状残影,桌子、道具也一起抠出来
BEN2
onnx-community/BEN2-ONNX
MIT219 MB(只有 fp16)0.98 秒14.1 秒单一主体很干净我们那张合影:出现空洞和碎片;CPU 上太慢
MODNet
Xenova/modnet
Apache-2.026 MB0.14 秒0.44 秒人和动物,非常快人和动物以外的东西:茶壶被切成了碎片

耗时是四张照片(下面三张加一张合影)每张的中位数,先用一张图热身再计时,包含 JPEG 解码和管线自带的前后处理。环境:Apple M2 Max,无头 Chromium 153,Transformers.js 4.2.0 + onnxruntime-web 1.26.0-dev,WebAssembly 12 线程,2026-09-22 实测。

并排看

三张照片(黑色茶壶、柯基、手捧白花的女士)与四个模型在棋盘格背景上的抠图结果。MODNet 把茶壶切成了碎片,其余结果在这个尺寸下看起来差不多。
WebGPU 输出,棋盘格表示透明。照片均为 CC0:Image Catalog 的「Black Ceramic Teapot」「Female in Sunglasses Holding White Flowers」,Lottie's pets & stuff 的「Office dog portraits」,经 Flickr / Openverse 获取,长边缩到 1024 像素。

缩略图大小下,四个里有三个在三张照片上都还行,MODNet 的茶壶一眼就能看出失败了。差别要放大才看得出来:

各模型在柯基耳朵、以及花束与手臂交界处的局部放大。四个模型都没保住胡须;ISNet 在手臂旁留下了一块半透明区域。
按原分辨率 75% 裁出的局部:柯基的耳朵和胡须,花束与手臂的交界。

那张合影

我们还跑了第四张更难的照片:户外几个人围着一张摆满书的桌子,最左边还有一个人被画面切掉了一半。因为没能核实这张图的许可证,这里不展示,但数字已经说明问题:同一张图,前景占比从 18.7%(BEN2)到 39.8%(ISNet)不等。

「什么算主体」本身就是个判断题,没有哪个模型能对所有用途都判断对。这也是为什么好用的抠图工具应该让你在下载前先看清蒙版。

WebGPU 与 WebAssembly:结果一样,速度不同

每个模型在两个后端上、每张照片的前景占比,差异都在 0.2 个百分点以内。这让人放心,因为并不总是这样(见我们写的在 WebGPU 上静默输出废图的模型)。速度就是另一回事了:

写这篇文章时,我们的工具把 WebAssembly 限制在 4 线程,免得页面其余部分卡顿。在那个设置下的验收实测中,一张 1024×683 的照片,BiRefNet-lite 在 CPU 上用 1.8 秒,WebGPU 上 1.0 秒。2026 年 9 月 25 日更新:本站已不再发送跨源隔离的响应头,CPU 路径改为单线程,同一张照片在 CPU 上要 5.3 秒;WebGPU 不受影响。

怎么绕开 512×512 的蒙版

模型在 512×512 分辨率下预测蒙版,并不意味着你拿到的结果只有 512 像素。下面是我们的工具对 BiRefNet-lite 的输出做的处理,其中没有哪一步是这个模型专属的。

这些处理都不会让蒙版比模型预测的更精细,胡须该丢还是丢。它们做的是让图像的其余部分保持原画质,模型分辨率只影响边缘,不影响整张图。

没进名单的,以及原因

该选哪个

怎么复现

每个「模型 × 后端」组合,都通过 Transformers.js 的 background-removal 管线只加载一次:先用一张图热身,再逐张计时并保存 RGBA 结果。前景占比是 alpha 大于 127 的像素比例。WebGPU 和 WebAssembly 两趟共用一个浏览器配置目录,每个文件只下载一次。脚本是 60 行左右的 Playwright 加一个小 HTML 页面,唯一的非默认设置是:BEN2 的 fp16 图在 WebAssembly 上要用 graphOptimizationLevel: 'basic'。想要脚本的话,来信即可。

文中提到的工具: 图片去背景:免费出原分辨率,全程在你的浏览器里完成