模型说明

本站的 AI 功能都基于开源模型,授权均为 MIT / BSD / Apache 类的宽松许可,可商用。

AI 放大:Real-ESRGAN

采用 Real-ESRGAN General x4v3,4 倍超分。Real-ESRGAN 由 Xintao Wang 等人提出,目标是处理真实场景中的退化图像(压缩痕迹、轻微模糊、噪点), 而不只是理想条件下的超分。

项值
模型体积4.9 MB
放大倍率4×
输入尺寸固定 128×128,大图会切成瓦片逐块处理
授权BSD-3-Clause(模型权重)
ONNX 导出Qualcomm AI Hub

因为输入是固定 128×128,大图会被切成 128 的瓦片逐块推理,再把结果拼回去。 拼接处需要一定的重叠与融合,否则会出现网格状接缝 —— 这是超分类应用的通用做法。

AI 抠图:MODNet 与 BiRefNet

自动抠图提供三档模型,在界面上直接选。默认是体积最小的 MODNet —— MODNet 由 Zhanghan Ke 等人提出,是专门为人像抠图 训练的轻量网络,参数量小一个数量级,但发丝、半透明这类人像高频边缘处理得干净。 BiRefNet(Bilateral Reference Network)由 Peng Zheng 等人提出, 是通用二分图像分割模型,人和物都能抠。

三档怎么选

这不是单纯的「画质高低」,而是「下多少」与「能抠什么」的取舍:

档位什么时候用体积
MODNet
默认
抠人像就用这个。下载量小一个数量级。它有两条已知边界:一是「专为人像训练」, 抠商品、Logo 这类非人像主体时掉得比较厉害(界面上会提示换档);二是固定走 CPU 推理 —— 这个模型在 WebGPU 上精度不足,实测前景占比从 47.4% 掉到 35.9%,主体边缘被啃掉一大片, 所以干脆不给它用 GPU(原因见下文「关于 WebGPU」)。 24 MB(fp32)
BiRefNet Lite
高清
非人像主体、或对细节要求高时用这个。不挑主体类型,发丝、毛绒和复杂结构都稳。 94 MB(fp16)
183 MB(fp32)
BiRefNet
兼容备用
只有设备不支持 WebGPU 时才会用到。效果和 Lite 基本一样,但文件大得多、速度慢不少。 452 MB
每一档的体积为什么有两个数。同一档模型按后端分两套权重:WebGPU 上取 fp16, WASM 上取 fp32。界面上显示的是你当前设备实际会下的那个 —— 否则在 CPU 上看到「94 MB」 却下载了 183 MB,会让人以为哪里出了错。默认档是例外:它固定走 CPU,所以只有 fp32 一个数。
默认档为什么挑最小的。94 MB 的下载量对新用户是很高的门槛,而人像又是最高频的使用场景。 默认档因此选了 24 MB 的 MODNet —— 只有高清档的四分之一:先把「第一次能不能等到」解决掉,再谈「一次抠得完不完美」。 特意没用更小的量化版(6 MB)—— 实测它在人像上无损,但抠物体时会整片碎掉,用一半体积换「非人像彻底不能用」,不值。

技术细节

项MODNet(默认)BiRefNet(高清)
输入尺寸 等比缩放到短边 512,长宽再对齐到 32 的倍数 固定 512×512,整图一次推理(不做瓦片切分)
输入张量名inputinput_image
输出张量名outputoutput_image
输出形式 导出里已带 sigmoid,值域直接是 0–1 未激活的 logits,需过 sigmoid 得到 0–1 的 alpha
预处理 归一化 (x/255 − 0.5) / 0.5 → [−1, 1] 直接 resize 到 512×512(不做 letterbox),ImageNet 均值方差归一化
授权Apache-2.0MIT

MODNet 的长宽必须对齐到 32。这不是随手定的:模型结构里有多次下采样与拼接, 16 的倍数都会在拼接节点报「维度不匹配」。这两个数抄自模型的 preprocessor_config.json,并实测验证过。

遮罩分辨率上限是 512×512。源图比这大时,边缘精度受遮罩分辨率限制, 而不是受模型能力限制。结果面板下方会有一条附注说明这件事。

输出张量名踩过坑。BiRefNet 有多个 ONNX 导出,不同导出者给输出起的名字不一样。 实测确认这两个 revision 都叫 output_image(不是常见的 logits)。 代码里做了容错:注册表里的名字对不上时会退到「唯一输出」或按形状推断。

关于 WebGPU:不是所有模型都适合跑在 GPU 上

界面底部会显示当前实际使用的后端。这里有一条不那么显然、但非常重要的规则。

WebGPU 会静默算错。ONNX Runtime 的 WebGPU 后端在 GPU 上以半精度执行中间激活, 对归一化层密集的网络会引入可观误差,而且不报错 —— 张量形状正常、数值是有限值, 只有结果本身是错的。实测(Intel Gen-12LP + ONNX Runtime 1.30.0,同一张 1440×2456 人像):
  • MODNet:WebGPU 前景占比 35.90%,CPU 端 47.41% —— 主体边缘被啃掉一大片
  • BiRefNet:WebGPU 47.08%,CPU 端 47.08% —— 两端完全一致
  • MobileSAM 编码器:两个后端的输出统计逐位一致(WebGPU 快约 4.6 倍)
给 MODNet 换 fp32 权重也救不了 —— WebGPU 上跑 fp32 是 35.90%,跑 fp16 是 35.85%,几乎相同, 说明损失来自执行路径而不是权重精度。所以代码里给每个模型标了「WebGPU 是否可信」, MODNet 被显式排除在外,永远走 CPU;BiRefNet 与 MobileSAM 则可以放心用 GPU。

这也是本项目踩出来的一条通用经验:只验证「没有报错」是不够的,必须验证真实像素。 上面这组数据是靠把两条路径的成品 PNG 逐像素对撞才发现的 —— 有 27.8% 的像素差了 32/255 以上, 而整个过程没有任何异常抛出。

点选抠图:MobileSAM

点选抠图走的是另一条路:不猜你要什么主体,完全听你的。 用的是 MobileSAM —— MobileSAM 把 Segment Anything(SAM)的图像编码器换成轻量版 TinyViT,整体从 600 MB 压到 40 MB 出头, 而分割质量基本持平。

它被拆成两个模型:一个图像编码器把整图编码成特征,一个遮罩解码器 根据提示点算出遮罩。这个拆分正是点选体验的关键 —— 编码只做一次,之后每点一下都只跑解码器。 所以第一下点击慢,后面每一下都快。

项值
总体积42.6 MB(编码器 26.9 MiB + 解码器 15.7 MiB)
编码器输入input_image,固定 1024×1024,HWC 排布(无 batch 维),像素值 0–255
非正方形怎么办等比缩放后居中补黑边到 1024×1024,取遮罩时再反向映射回原图(不会拉扯主体)
解码器输入图像特征 + 提示点坐标(乘 1024)+ 点标签 + orig_im_size
解码器输出masks(1024×1024 原生遮罩)与 iou_predictions(分数量)
归一化写在计算图里,调用方不用管
授权Apache-2.0

解码器一次给出三个候选遮罩、配三个分数,程序取分数最高的那个。点得越多,分数越能说明「这一块就是主体」—— 所以补点比换模型管用。

为什么没有直接用现成的 sam-web 组件。它把 ONNX Runtime 的 wasm 路径硬编码到了 jsDelivr CDN,而且自带一份独立的运行时:会和本站自托管的 ONNX Runtime 各编译一份 wasm, 还额外请求外网。所以这里按同一套张量规格自己接了一遍,复用本站已有的运行时 —— 请求不出去,体积也不翻倍。

裁剪与旋转:不用模型

裁剪、任意角度旋转、翻转、切片都是确定性的几何变换,交给 Canvas 就够了,也就不需要任何下载。 有一个容易误解的点:旋转不是「转完把四角涂黑」 —— 画布会跟着旋转后的外接框一起放大, 所以四角始终有内容,没有被切掉或填色。裁剪框的坐标因此是「旋转之后」的坐标系, 拖动时所见即所得,不用反算角度。

「自动拉正」也是纯算法,没有模型:把图缩到 480 像素做灰度,算 Sobel 梯度, 只保留梯度够强的像素(平坦区域的方向是噪声),再把每条边缘的朝向折到「离最近的横竖轴偏了多少度」, 按梯度强度投票成直方图,峰值就是整张图的主导倾斜角。

把横竖两个方向折到同一区间是这一步的关键:文档、桌面、建筑同时有大量水平边和垂直边, 不折的话直方图会出现两个峰,哪个都代表不了整体倾斜。局限也在这里 —— 画面里没有明显直线时(风景照、纯色背景的产品图),结果就是噪声。所以检测会返回一个置信度, 只有够高时才自动应用;偏角超过 15° 也直接放弃,那更像刻意旋转而不是拍歪。

权重从哪来

模型来源
Real-ESRGAN x4v3 提交在仓库 public/models/ 下,随站点一起部署
MODNet Xenova/modnet,HuggingFace
BiRefNet Lite studioludens/birefnet-lite-512,HuggingFace
BiRefNet naddy24/birefnet-512-webgpu,HuggingFace
MobileSAM(编码器 + 解码器) Acly/MobileSAM,HuggingFace

HuggingFace 上的地址是可变的,所以代码里钉死了具体的 commit revision —— 保证今天跑通的模型明天还是同一个。升级模型等于改这个 revision 常量。 这几份权重体积加起来远超静态托管能接受的范围,因此都不进仓库,改由浏览器在首次使用时拉取并缓存 (见「浏览器端推理」)。

下载源与网络兜底

这些权重都挂在 huggingface.co 上,而它在国内直连不通—— 表现不是报错,而是连接一直挂着,直到超时。对一个所有计算都在本机完成的工具来说, 卡在第一步下载上最冤,所以下载有两道保险:

全部源都失败时会明确告诉你,而不是让进度条一直转。提示是 「模型权重下载失败:官方源和国内镜像都没连上。请检查网络或代理后重试」—— 此时值得查的只剩自己的网络环境。

缓存也按工具分开:放大、抠图、点选抠图各占一个桶,清理任何一个都不会牵连另外两个。 放大模型(4.9 MB)与 ONNX Runtime 本体(/ort/)随站点一起部署,不走外网。