runes's picture
Upload README.md with huggingface_hub
d553b22 verified
|
Raw
History Blame Contribute Delete
3.04 kB
---
license: mit
base_model: ZhengPeng7/BiRefNet_lite
pipeline_tag: image-segmentation
tags:
- background-removal
- matting
- dichotomous-image-segmentation
- onnx
- webgpu
- onnxruntime-web
---
# BiRefNet_lite β€” WebGPU-ready ONNX (fp16)
[BiRefNet](https://github.com/ZhengPeng7/BiRefNet) (lite / Swin-Tiny variant), rebuilt so it
actually runs on **onnxruntime-web's WebGPU EP** in the browser. The stock ONNX exports
(e.g. `onnx-community/BiRefNet_lite-ONNX`) fail there three ways
(see [microsoft/onnxruntime#21968](https://github.com/microsoft/onnxruntime/issues/21968)):
1. The decoder contains `Concat` nodes with up to **1024 inputs** and `Split` nodes with
**32 outputs**, exceeding WebGPU's storage-buffers-per-shader limit.
2. The variadic `Sum` op has no WebGPU kernel; its CPU fallback sits exactly where the
unrolled deformable convolutions materialize ~784 MB tensors, which walks the 4 GB
wasm heap into `std::bad_alloc`.
3. The fp16 export defeats onnxruntime's in-browser constant folding (no CPU fp16
kernels), leaving hundreds of CPU-only `ConstantOfShape` islands.
This artifact is the **same weights** after offline graph surgery:
- ONNX Runtime BASIC-level offline optimization (constant fold: ~16k β†’ ~4k nodes,
eliminates every CPU-only shape op);
- wide `Concat`/`Split` fanouts rewritten into cascades capped at 6, so any shader needs
at most 7 storage buffers (safe even at the WebGPU minimum limit of 8);
- variadic `Sum` rewritten into `Add` chains;
- float16 conversion with `keep_io_types` β€” **graph I/O stays float32**, so you feed and
read plain `Float32Array`s.
Verified bit-exact against the source graph at fp32; after fp16, max sigmoid-space
deviation is ~2e-3. Measured ~700 ms/frame warm at 1024Γ—1024 on an RTX 4090
(Chrome, onnxruntime-web 1.27, `ort.webgpu.min.mjs` β€” use the JSEP build, not the
`.bundle` native-EP build).
## I/O
| | name | shape | dtype |
|---|---|---|---|
| input | `input_image` | `[1, 3, 1024, 1024]` | float32, RGB, ImageNet mean/std, squish-resized |
| output | `output_image` | `[1, 1, 1024, 1024]` | float32 **logits** β€” apply sigmoid |
## Usage (onnxruntime-web)
```js
const ort = (await import('https://cdn.jsdelivr.net/npm/onnxruntime-web@1.27.0/dist/ort.webgpu.min.mjs')).default;
ort.env.wasm.wasmPaths = 'https://cdn.jsdelivr.net/npm/onnxruntime-web@1.27.0/dist/';
const sess = await ort.InferenceSession.create(modelArrayBuffer, { executionProviders: ['webgpu'] });
const out = await sess.run({ input_image: new ort.Tensor('float32', chw, [1, 3, 1024, 1024]) });
// sigmoid(out.output_image.data[i]) = foreground alpha
```
Rebuilt by [`studio/tools/export-birefnet.py`](https://github.com/stevecastle) from the
Lowkey Studio project; the same script converts the other BiRefNet variants
(general / HR / matting / dynamic).
Credits: [ZhengPeng7/BiRefNet](https://github.com/ZhengPeng7/BiRefNet) (MIT) for the model;
[onnx-community](https://huggingface.co/onnx-community/BiRefNet_lite-ONNX) for the source ONNX export.