The short version
Background removal used to mean uploading the photo to a server with a GPU. It no longer has to. A segmentation model small enough to download once (44 MB) can run inside the browser: on a machine with WebGPU it takes well under a second per photo; without it, the same model runs on the CPU in 15–25 seconds. The photo never leaves the device either way. The model is good at people, products and animals against a distinct background, and bad at hair on hair, glass, and anything the photographer also could not see the edge of.
What the model is
The tool uses ISNet, the network from Highly Accurate Dichotomous Image Segmentation (Qin et al., ECCV 2022). “Dichotomous” means the task is binary: for every pixel, foreground or not. ISNet was trained on the DIS5K dataset — five thousand high-resolution images with painstaking pixel-level masks of things like bicycles, chairs and trees, chosen precisely because their thin structures defeat earlier models. It produces, for a 1024 × 1024 input, a 1024 × 1024 map of probabilities; the tool thresholds that map, feathers the edge and applies it as the alpha channel of a PNG.
The weights are distributed under Apache-2.0. The site hosts them itself, split into three parts so the download can resume, and caches them in the browser after the first use: the second photo does not download anything.
Why “in the browser” is possible now
Two pieces had to exist. ONNX Runtime Web executes a trained model in JavaScript, with the arithmetic done either by WebAssembly on the CPU or — since 2023 — by WebGPU, the browser API that exposes the graphics card for general computation. A segmentation forward pass is a few hundred billion multiply-adds; that is what GPUs are built for, and what a single CPU thread is not.
The numbers on this site’s own tool, same 1024-pixel input:
| Path | Where it runs | Time per photo |
|---|---|---|
| WebGPU | Chrome / Edge 113+, Safari 26+ on a laptop or desktop with any modern GPU | under 1 second |
| WebAssembly | any browser, one thread | 15–25 seconds |
The WebAssembly path is single-threaded on purpose. Multi-threaded WASM requires the page to be cross-origin isolated, a header setting that blocks every third-party script — including the ad code that pays for the site. Single-threaded is slower but keeps the page free; the work is moved to a Web Worker so the interface stays responsive while it grinds.
Memory is the other constraint: the runtime plus model plus activations need about 200 MB free. Phones with 4 GB of RAM manage it on the CPU path; some older phones cannot allocate the buffer at all, and the tool says so rather than crashing the tab.
Where it fails, honestly
- Hair against a similar background. Dark hair on a dark wall, blonde hair against a beige curtain. The model sees no edge because there is none in the pixels. The mask either eats the hair or keeps a halo of wall.
- Transparent and reflective things. Glass, water, a wine glass in front of the subject. Segmentation is binary; a glass is neither foreground nor background, and the result is a hard edge through it.
- Motion blur. A blurred edge has no single correct boundary.
- Multiple subjects. The model keeps everything it considers “the subject”; with two people it usually keeps both, with a person and a large dog it may keep one.
- Very small subjects. The input is 1024 px on the long side; a person who is 60 px tall in a wide shot becomes a few dozen pixels of mask and comes out blobby.
For clean product shots, portraits with a plain wall, pets on a floor, and logos on paper it is reliable — those are what the training set is full of.
What to do with the result
The output is a PNG with real transparency. That is the right format to drop onto a slide, a listing, or another photo, and the wrong one to send by e-mail — a 12-megapixel PNG cut-out is 20–30 MB. If the destination needs a small file and does not need transparency, convert it to JPEG on a white background; if it needs transparency and a smaller size, WebP with alpha is a third the size of PNG. Compress handles both.