不忙抠图
官方脚本
可调用节点
v1.1.0
AI抠图去背景 | 基于BiRefNet通用分割模型,专精人像毛发与复杂边缘,本地离线CPU推理无需联网,批量处理图片,边缘自动去背景色污染,支持透明PNG/白底图/自定义底色/蒙版输出,右键菜单一键抠图,支持定时任务与节点联动,模型由不忙脚本盒子统一下载
脚本能力
直接启动支持
右键启动支持
快捷键启动不支持
超级复制启动不支持
定时任务支持
可被其他脚本调用是
依赖其他脚本否
图形化启动界面支持
基于 BiRefNet_lite 高精度二分类图像分割模型的本地 AI 抠图脚本:纯 CPU 推理,全程离线运行;支持通过“不忙脚本盒子”一键配置环境与模型;支持右键选中图片进行批量抠图和定时抠图

演示图展示「原图 → 蒙版 → 透明底」的效果
核心特性
- 全离线:模型和推理都在本机,图片不出你的电脑
- 一键安装:通过不忙脚本盒子自动安装、不需要自己装 Python、CUDA 或任何 AI 框架,全程自动处理
- 干净边缘:发丝、绒毛级别的边缘做了两步专门处理
- 四种输出:透明底 PNG、纯白底、自定义底色(电商/证件照常用)、单独蒙版
- 批量处理:一次可选中多张图片,逐张处理,单张失败不影响其他
- 三种入口:右键菜单、盒子卡片、定时任务,也能被其他脚本当作节点调用
- 支持格式:PNG、JPG/JPEG、BMP、WEBP、TIF/TIFF
安装方法
本脚本图形化窗口渲染、环境配置、模型下载均依赖不忙脚本盒子、仅建议使用盒子安装
- 打开 不忙脚本盒子
- 在脚本社区搜索不忙抠图
- 点击安装、等待安装完成
- 装好后在脚本列表里就能看到「不忙抠图」
首次安装耗时主要在下载模型,装好后再次运行无需等待。
使用方式
右键菜单抠图(最常用)
- 在资源管理器里选中一张或多张图片
- 右键 → 不忙抠图
- 盒子弹出的启动窗口里选好「输出」形式,点执行
- 结果默认输出到图片所在目录,文件名加后缀
卡片点击运行
在盒子里点「不忙抠图」卡片,同样弹出启动窗口。在「源图片」处选文件即可。
定时任务
脚本支持定时任务。因为是无人值守运行,建议把「输出目录」填成绝对路径(例如 D:\抠图结果)——定时任务没有右键上下文,留空会输出到源图所在目录。
输出文件名
| 输出形式 | 文件名后缀 |
|---|---|
| 透明PNG | _cutout.png |
| 白底图 | _cutout_white.png |
| 自定义底色 | _cutout_bg.png |
| 仅蒙版 | _cutout_mask.png |
例如 照片.jpg → 照片_cutout.png。
使用提示
- ⚠ 内存:单张推理峰值约 6.3 GB(不是笔误)。模型解码器要在 1024×1024 上跑 256 通道的
浮点特征图,单张就 1 GB。建议在 16 GB 内存的机器上使用;8 GB 机器请先关闭浏览器等
占内存的程序,否则会非常慢甚至失败。脚本启动时会检查可用内存并在不足时给出提示。 - 速度:6 核 CPU 上单张约 14 秒(含模型加载,首次会多几秒)。图片大小基本不影响
耗时(统一在 1024×1024 上推理),所以批量 10 张大约两分半。 - 超大图:模型工作在 1024×1024,6000px 级别的图会先缩小再放大蒙版,发丝级别的细节会有
损失。如果对超大图边缘要求很高,建议先裁剪到需要的主体区域再抠。 - 半透明物体:玻璃、纱质、烟这类主体内部就该半透明的东西,会被过渡带锐化压成较硬的
边。需要保留这种通透感时,把src/edges.py里的SHARPEN_LO/HI调回0.0/1.0即可关闭。 - EXIF:手机竖拍的照片会自动纠正方向,不会出现歪图。
作为节点被其他脚本调用(开发者)
本脚本声明了 [bmscriptsbox.node],可以被其他盒子脚本通过 POST /api/link 同步调用。
import json, sys, requests
payload = json.load(open(sys.argv[1], encoding="utf-8"))
env = payload["environment"]
r = requests.post(f"{env['api_base']}/api/link", json={
"script_id": "523b6d94-7955-48fa-9fb9-b0efb17370c5",
"data": {"target_paths": ["D:/图片/a.png", "D:/图片/b.jpg"]},
"params": {"output_mode": "透明PNG", "bg_color": "#FFFFFF", "output_dir": ""},
}, timeout=600)
body = r.json()
if not body.get("success"):
raise RuntimeError(body.get("message"))
result = body["result"] # 被调脚本写回的信封
if result.get("code") != 0:
raise RuntimeError(result.get("msg"))
print(result["results"]) # 输出文件路径列表
print(result["failed"]) # 失败的源文件列表
信封字段
| 字段 | 类型 | 说明 |
|---|---|---|
code |
int | 见下表 |
msg |
str | 人类可读的结果说明 |
results |
list | 成功输出的图片路径 |
failed |
list | 处理失败的源文件路径 |
业务错误码(与盒子合成的 -1/-2/-3 区分开)
| code | 含义 |
|---|---|
0 |
全部成功 |
1 |
部分成功(有失败项) |
2 |
全部失败 |
3 |
模型不可用(未下载 / 文件缺失) |
4 |
输入无效(没有待处理图片) |
环境要求
- Windows 10 / 11
- 不忙脚本盒子
- 内存:建议 16 GB(单张推理峰值约 6.3 GB)
- Python 3.12(盒子自动部署,无需手动安装)
- 必须 ≥ 3.12:
onnxruntime自 1.24 起已不再提供 CPython 3.10 的 wheel,
而盒子会按language_version锁定运行时次版本,因此 3.12 是本脚本的可用档位
- 必须 ≥ 3.12:
- 磁盘:模型约 214 MB + 运行环境约 200 MB
关于模型
模型为 BiRefNet_lite(Bilateral Reference for High-Resolution Dichotomous Image
Segmentation 的轻量版)通用抠图模型,通过盒子从 huggingface 下载
onnx-community/BiRefNet_lite-ONNX。
- 模型不包含在脚本包内,由盒子在安装时下载到本地并全局共享
- 原模型出处:ZhengPeng7/BiRefNet,MIT 许可
- 输入 1024×1024 静态尺寸;输出为 logits,需补 sigmoid(见
src/model.py的REPO_SPECS) - 导出差异提示:不同仓库的 ONNX 导出输出量纲可能不同(logits vs 概率图),
且preprocessor_config.json里的size可能过期。本脚本以 ONNX 图的实际
输入尺寸为权威,并按仓库登记后处理方式,换模型时务必同步REPO_SPECS。
本脚本已声明为节点,可被其他脚本通过「不忙脚本盒子」机制调用。完整配置见下方 TOML,其他脚本若需调用请严格按此配置构造请求。
bm-scripts-box-rc.toml
[bmscriptsbox]
[bmscriptsbox.info]
id = "523b6d94-7955-48fa-9fb9-b0efb17370c5"
name = "不忙抠图"
desc = "AI抠图去背景 | 基于BiRefNet通用分割模型,专精人像毛发与复杂边缘,本地离线CPU推理无需联网,批量处理图片,边缘自动去背景色污染,支持透明PNG/白底图/自定义底色/蒙版输出,右键菜单一键抠图,支持定时任务与节点联动,模型由不忙脚本盒子统一下载"
version = "1.1.0"
icon = "./imgs/cutout.png"
[bmscriptsbox.runtime]
language = "python"
language_version = ">=3.12"
entry = "main.py"
terminal = "always"
[bmscriptsbox.triggers.context_menu]
enabled = true
targets = ["files"]
filters = [".png", ".jpg", ".jpeg", ".bmp", ".webp", ".tif", ".tiff"]
[[bmscriptsbox.inputs]]
name = "target_paths"
label = "源图片"
type = "list"
pick = "files"
exts = [".png", ".jpg", ".jpeg", ".bmp", ".webp", ".tif", ".tiff"]
description = "要抠图的图片;右键菜单选中文件时会自动预填,也可在启动窗口里重新选"
# ====== 运行参数 ======
# output_mode 的 choices 必须与 src/box.py 的 OUTPUT_MODES 完全一致,
# 用 tools/check_rc.py 做集合比对,避免两处手抄漂移。
[[bmscriptsbox.params]]
name = "output_mode"
label = "输出"
type = "str"
default = "透明PNG"
choices = ["透明PNG", "白底图", "自定义底色", "仅蒙版"]
description = "透明PNG=RGBA 透明底;白底图=合成到纯白;自定义底色=按 bg_color 合成;仅蒙版=只输出 alpha 灰度图"
[[bmscriptsbox.params]]
name = "bg_color"
label = "底色"
type = "str"
default = "#FFFFFF"
when = { field = "output_mode", eq = "自定义底色" }
description = "十六进制颜色,如 #F5F5F5 或 #fff"
[[bmscriptsbox.params]]
name = "output_dir"
label = "输出目录"
type = "str"
default = ""
description = "留空=输出到原图所在目录;定时任务场景建议填绝对路径"
# ====== AI 模型(盒子安装时统一下载,脚本运行时问 /api/model/path 要路径)======
# preprocessor_config.json 必须一起下:脚本运行时读它拿归一化参数
# (do_rescale=true、rescale_factor=1/255、mean=[0.485,0.456,0.406]、
# std=[0.229,0.224,0.225] —— ImageNet 归一化),而不是把数字硬编码在代码里。
# 注意这与上一版的 IS-Net 完全不同(那边是 do_rescale=false、mean=128、std=256)。
#
# 但它的 size 字段**不作数**:那是 HF 处理器的提示,可能过期或写错。
# 输入尺寸以 ONNX 图的实际输入为准,见 src/infer.py 里的形状覆写逻辑。
#
# 不要下 onnx/model_fp16.onnx:x86 CPU 没有 fp16 加速,只会白占体积、拖慢加载。
[[bmscriptsbox.models]]
source = "modelscope"
repo_id = "onnx-community/BiRefNet_lite-ONNX"
files = ["onnx/model.onnx", "preprocessor_config.json"]
# ====== 盒子渲染启动窗口(params_form 与 terminal="always" 配套)======
[bmscriptsbox.params_form]
enabled = true
# ====== 定时任务:无人值守,仅凭 inputs + params 运行 ======
[bmscriptsbox.schedule]
enabled = true
# ====== 节点:可被其他脚本经 /api/link 调用 ======
[bmscriptsbox.node]
enabled = true
[[bmscriptsbox.outputs]]
name = "results"
type = "list"
description = "成功输出的图片文件路径列表"
[[bmscriptsbox.outputs]]
name = "failed"
type = "list"
description = "处理失败的源文件路径列表"
评论