模型说明
本站的 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 |
技术细节
| 项 | MODNet(默认) | BiRefNet(高清) |
|---|---|---|
| 输入尺寸 | 等比缩放到短边 512,长宽再对齐到 32 的倍数 | 固定 512×512,整图一次推理(不做瓦片切分) |
| 输入张量名 | input | input_image |
| 输出张量名 | output | output_image |
| 输出形式 | 导出里已带 sigmoid,值域直接是 0–1 | 未激活的 logits,需过 sigmoid 得到 0–1 的 alpha |
| 预处理 | 归一化 (x/255 − 0.5) / 0.5 → [−1, 1] | 直接 resize 到 512×512(不做 letterbox),ImageNet 均值方差归一化 |
| 授权 | Apache-2.0 | MIT |
MODNet 的长宽必须对齐到 32。这不是随手定的:模型结构里有多次下采样与拼接,
16 的倍数都会在拼接节点报「维度不匹配」。这两个数抄自模型的 preprocessor_config.json,并实测验证过。
遮罩分辨率上限是 512×512。源图比这大时,边缘精度受遮罩分辨率限制, 而不是受模型能力限制。结果面板下方会有一条附注说明这件事。
output_image(不是常见的 logits)。
代码里做了容错:注册表里的名字对不上时会退到「唯一输出」或按形状推断。
关于 WebGPU:不是所有模型都适合跑在 GPU 上
界面底部会显示当前实际使用的后端。这里有一条不那么显然、但非常重要的规则。
- MODNet:WebGPU 前景占比 35.90%,CPU 端 47.41% —— 主体边缘被啃掉一大片
- BiRefNet:WebGPU 47.08%,CPU 端 47.08% —— 两端完全一致
- MobileSAM 编码器:两个后端的输出统计逐位一致(WebGPU 快约 4.6 倍)
这也是本项目踩出来的一条通用经验:只验证「没有报错」是不够的,必须验证真实像素。 上面这组数据是靠把两条路径的成品 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 |
解码器一次给出三个候选遮罩、配三个分数,程序取分数最高的那个。点得越多,分数越能说明「这一块就是主体」—— 所以补点比换模型管用。
裁剪与旋转:不用模型
裁剪、任意角度旋转、翻转、切片都是确定性的几何变换,交给 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 上,而它在国内直连不通——
表现不是报错,而是连接一直挂着,直到超时。对一个所有计算都在本机完成的工具来说,
卡在第一步下载上最冤,所以下载有两道保险:
-
多个源依次尝试。每个 huggingface 地址都配了镜像(
hf-mirror.com), 镜像在前、官方在后。镜像站是反向代理,仓库路径与官方一一对应,换域名即可, 不会出现「加了新模型忘了配镜像」。镜像挂了就自动落到官方源,反之亦然。 - 每个源限时 10 秒。只限到「拿到响应头」为止,不等整个文件下完 —— 几十兆的权重在慢网上下几分钟很正常,一刀切会误杀。但不限时也不行: 连不通的地址既不报错也不返回,不限时的话备用源永远轮不到。
- 记住了哪个源能用。成功的源写进 localStorage,下次打开直接从它开始, 不用每个文件都先在连不上的源上白等一轮。隐私模式下读写失败就退回默认顺序, 不影响正确性。
缓存也按工具分开:放大、抠图、点选抠图各占一个桶,清理任何一个都不会牵连另外两个。
放大模型(4.9 MB)与 ONNX Runtime 本体(/ort/)随站点一起部署,不走外网。