--- base_model: ZhengPeng7/BiRefNet_lite base_model_relation: quantized license: mit pipeline_tag: image-segmentation library_name: mlx tags: - mlx - moonbox - birefnet - background-removal - dichotomous-image-segmentation --- # BiRefNet-lite MLX MLX builds of [BiRefNet-lite](https://huggingface.co/ZhengPeng7/BiRefNet_lite), made by Moonbox for Apple Silicon Macs. Each precision is a folder; keep a folder's files together. Only the parts listed below are converted: the rest of the pipeline comes from the original repository unless the section below says otherwise. ## Files The last column is how far each build is from the original PyTorch model on the same inputs (see the section below for what was measured). | Precision | File | Size | sha256 | Checked against the original | |---|---|---|---|---| | bf16 | [`bf16/config.json`](https://huggingface.co/moonbox-ai/BiRefNet_lite-MLX/blob/main/bf16/config.json) | 0.1 kB | `7a4673b5400f` | MAE <= 0.0002, mask IoU >= 0.9987 | | bf16 | [`bf16/mlx_model.py`](https://huggingface.co/moonbox-ai/BiRefNet_lite-MLX/blob/main/bf16/mlx_model.py) | 20.1 kB | `bd3cb5681703` | MAE <= 0.0002, mask IoU >= 0.9987 | | bf16 | [`bf16/model.safetensors`](https://huggingface.co/moonbox-ai/BiRefNet_lite-MLX/blob/main/bf16/model.safetensors) | 88.6 MB | `7370536fcead` | MAE <= 0.0002, mask IoU >= 0.9987 | | fp16 | [`fp16/config.json`](https://huggingface.co/moonbox-ai/BiRefNet_lite-MLX/blob/main/fp16/config.json) | 0.1 kB | `22466f2eeac0` | MAE <= 0.00002, mask IoU >= 0.9998 | | fp16 | [`fp16/mlx_model.py`](https://huggingface.co/moonbox-ai/BiRefNet_lite-MLX/blob/main/fp16/mlx_model.py) | 20.1 kB | `bd3cb5681703` | MAE <= 0.00002, mask IoU >= 0.9998 | | fp16 | [`fp16/model.safetensors`](https://huggingface.co/moonbox-ai/BiRefNet_lite-MLX/blob/main/fp16/model.safetensors) | 88.6 MB | `dedef2f909b6` | MAE <= 0.00002, mask IoU >= 0.9998 | | 8bit | [`8bit/config.json`](https://huggingface.co/moonbox-ai/BiRefNet_lite-MLX/blob/main/8bit/config.json) | 0.2 kB | `f4f927311626` | MAE <= 0.0002, mask IoU >= 0.9978 | | 8bit | [`8bit/mlx_model.py`](https://huggingface.co/moonbox-ai/BiRefNet_lite-MLX/blob/main/8bit/mlx_model.py) | 20.1 kB | `bd3cb5681703` | MAE <= 0.0002, mask IoU >= 0.9978 | | 8bit | [`8bit/model.safetensors`](https://huggingface.co/moonbox-ai/BiRefNet_lite-MLX/blob/main/8bit/model.safetensors) | 63.1 MB | `f9f7b19cdb93` | MAE <= 0.0002, mask IoU >= 0.9978 | | 6bit | [`6bit/config.json`](https://huggingface.co/moonbox-ai/BiRefNet_lite-MLX/blob/main/6bit/config.json) | 0.2 kB | `e4cb180964ec` | MAE <= 0.0003, mask IoU >= 0.9986 | | 6bit | [`6bit/mlx_model.py`](https://huggingface.co/moonbox-ai/BiRefNet_lite-MLX/blob/main/6bit/mlx_model.py) | 20.1 kB | `bd3cb5681703` | MAE <= 0.0003, mask IoU >= 0.9986 | | 6bit | [`6bit/model.safetensors`](https://huggingface.co/moonbox-ai/BiRefNet_lite-MLX/blob/main/6bit/model.safetensors) | 56.3 MB | `c40decce0ca3` | MAE <= 0.0003, mask IoU >= 0.9986 | | 4bit | [`4bit/config.json`](https://huggingface.co/moonbox-ai/BiRefNet_lite-MLX/blob/main/4bit/config.json) | 0.2 kB | `d3e54b90201b` | MAE <= 0.0010, mask IoU >= 0.9845 | | 4bit | [`4bit/mlx_model.py`](https://huggingface.co/moonbox-ai/BiRefNet_lite-MLX/blob/main/4bit/mlx_model.py) | 20.1 kB | `bd3cb5681703` | MAE <= 0.0010, mask IoU >= 0.9845 | | 4bit | [`4bit/model.safetensors`](https://huggingface.co/moonbox-ai/BiRefNet_lite-MLX/blob/main/4bit/model.safetensors) | 49.4 MB | `dde1b2de46ff` | MAE <= 0.0010, mask IoU >= 0.9845 | ## How to run BiRefNet-lite ported to MLX. Each folder holds `model.safetensors`, `config.json` and `mlx_model.py`, the port (only `mlx`, `numpy` and `pillow` needed): ```python import numpy as np, mlx_model from PIL import Image model = mlx_model.load("fp16") rgb = np.array(Image.open("in.jpg").convert("RGB")) alpha = mlx_model.matte(model, rgb) # HxW uint8; the input is resized to 1024x1024 as in handler.py Image.fromarray(np.dstack([rgb, alpha])).save("cutout.png") ``` The port runs the released configuration (Swin-T at full and half resolution, ASPP-deformable decoder) with the BatchNorms folded into the convolutions and torchvision's `deform_conv2d` written out in MLX. The quantized folders quantize the Swin linears whose input width is a multiple of 64 (group size 64); the convolutions, the first Swin stage and the norms stay bf16, so they save less than the bit width suggests. | Precision | Size | MAE vs PyTorch fp32 (worst image) | Mask IoU (worst) | |---|---|---|---| | `fp16/` | 88.7 MB | 0.00002 | 0.9998 | | `bf16/` | 88.7 MB | 0.0002 | 0.9987 | | `8bit/` | 63.1 MB | 0.0002 | 0.9978 | | `6bit/` | 56.3 MB | 0.0003 | 0.9986 | | `4bit/` | 49.5 MB | 0.0010 | 0.9845 | About 0.75 s per image (1024x1024) on an Apple M5 at every precision. ## How these were made From [BiRefNet-lite](https://huggingface.co/ZhengPeng7/BiRefNet_lite) at revision `aa62cd87ea`: the original weights loaded in MLX and stored as bf16 or fp16, or quantized with MLX's affine quantization (`8bit`, `6bit`, `4bit`, group size 64; layers MLX can't quantize, such as convolutions and norms, stay bf16). Every build was checked against the original before upload; the `sha256` column above is what the files must hash to. ## License MIT. These files are a derivative of the original model and carry its license: it is copied in this repository, and it governs your use of these files. The original model card follows unchanged. --- # Original model card