AI 抠图是怎么工作的:U2-Net、实际边界,以及怎样得到更干净的结果
现代 AI 抠图用的是一种显著性检测网络——最常见的是 U2-Net——它对图像中最显眼的物体预测出一张像素级的掩码。这张掩码驱动输出 PNG 的透明度。被摄体轮廓清晰、光照充足、与背景对比强烈时,效果几乎是即时且令人信服的。被摄体和背景混在一起,或者有头发毛发这类精细结构时,掩码质量会明显下降。
AI 抠图对产品图、人像和干净背景上的物体真的很有用,而且已经快到能在浏览器里跑起来。当被摄体复杂时,把结果当成起点而不是终稿。批量处理电商产品图和证件照时,它帮你去掉了最琐碎的部分;对复杂棚拍照片,它给你一张不错的粗掩码去修。理解模型的置信度,就知道什么时候可以信输出、什么时候花五分钟收拾一下。
模型到底是怎么工作的:显著性物体检测
抠图是被当作显著性物体检测问题来解的。网络并不抽象地理解“背景”是什么——它从训练数据中学会识别画面里视觉上最显眼的那一个物体。输出是一张显著性图:一张灰度图,每个像素的值是从 0(一定是背景)到 1(一定是前景)的置信度。
2020 年发布的 U2-Net 用一个双层嵌套 U 结构实现了这一点。外层的 U-Net 捕捉全局上下文——被摄体在画面中的位置;每一级内部的 RSU(Residual U-blocks)捕捉局部细粒度结构。这个架构正是 U2-Net 能在保留高层次被摄体范围理解的同时,还能在手指和飞散的发丝这类小细节周围产出锐利边界的原因。
推理时,显著性图会被阈值化成二值掩码。高于阈值的值在输出 PNG 中变得完全不透明;低于阈值的完全透明。一些实现直接用连续的显著性图作为 Alpha 通道,这样合成时边缘更柔顺,但放到不透明背景上可能看起来不对。
模型擅长处理什么
U2-Net 是在 DUTS-TR 上训练的,那是一份包含几万张带像素级显著性标注图像的数据集。这份数据集偏向常见的摄影主题:人、动物、干净背景上的物体、食物和产品。对这些类别,模型不用微调就相当准确。
产品摄影是最有力的使用场景。在白色或灰色棚背上拍摄的一个包、一双鞋或一件消费电子设备,对比强烈、边缘清晰,也和训练数据接近。这些图片的抠图结果通常干净到可以直接交付,无需人工修补。
证件照和人像摄影在脸和肩膀部分也不错,尤其是头发不太细碎、背景相对均匀的时候。虚化背景下的中景人像能受益于模型对人体轮廓的全局理解。
模型不擅长的地方
- 细碎的头发和皮毛:网络逼近的是发团的外轮廓,而不是一根一根地描每一缕。极细的碎发会从掩码里丢失,边缘常常看起来有一点被剪掉。
- 透明或半透明被摄体:玻璃、网状织物、烟、水在显著性图里几乎看不见,因为模型检测的是不透明度和对比度,而这两者对透明物都很低。
- 伪装色和低对比:颜色与背景高度接近的被摄体会让全局上下文线索失效。棕色地毯上的棕色狗、白色沙发上的白色猫,都是失败模式。
- 多个显著物体:U2-Net 是为单被摄体显著性训练的。当多个物体在视觉权重上竞争时,掩码常常把它们都包进来,或者随意挑一个。
- 杂乱或细节丰富的背景:Bokeh 和渐变没问题,但一个和被摄体纹理同频的细密纹理背景会导致边界溢出。
使用 rembg 库
- 安装 rembg
运行 `pip install rembg`。首次调用时,rembg 会下载 U2-Net 模型权重(约 176 MB)并缓存到 `~/.u2net/`。后续运行使用缓存的权重。
- 对单张图片抠图
最简单的调用是 `rembg i input.jpg output.png`。输出总是带 Alpha 的 PNG。`-m` 参数选择模型——`u2net` 通用、`u2net_human_seg` 人像、`isnet-general-use` 是更新的、通常更锐利的通用模型。
- 批量处理一个目录
运行 `rembg p ./input_dir ./output_dir` 处理目录里的每张图片。每张独立处理,能受益于多核机器。`-w` 参数启用观察模式,文件加入时自动处理。
- 后处理 Alpha 通道
对头发和皮毛,可以用 `--alpha-matting` 和 `--alpha-matting-foreground-threshold` 走一遍 Alpha 抠像细化柔边,代价是处理更慢。对干净的产品图,默认掩码通常已经够用。
rembg 里的 U2-Net 模型变体
| 模型标志 | 适用场景 | 说明 |
|---|---|---|
| u2net | 通用物体、产品 | 最快,标准质量,权重 176 MB |
| u2net_human_seg | 人像和人 | 在人体分割上微调过,头发周围更锐利 |
| u2netp | 资源受限环境 | 更小的模型(4 MB),复杂被摄体上质量明显更低 |
| isnet-general-use | 通用,更高质量 | 更新架构,通常边界细节更好,速度更慢 |
输出格式与合成
抠图的输出总是带 Alpha 通道的 PNG——没有 JPEG 对应版本,因为 JPEG 不支持 Alpha。如果下游流程需要 JPEG,就必须先把掩码后的被摄体合成到一个纯色背景上,再编码为 JPEG。把透明 PNG 直接存成 JPEG 会用黑色填充透明区域,这几乎永远不是你想要的。
在网页上,带 Alpha 的 WebP 是比 PNG 更小的替代,所有现代浏览器都支持。把 rembg 输出转成无损 WebP 能保留精确的 Alpha 通道;转成质量 90 及以上的有损 WebP 只在边缘引入轻微伪影,但相比 PNG 能砍掉 40 到 60 的体积。
合成到新背景时,让被摄体和新背景在光照方向和色温上匹配。冷调棚灯下拍的人物贴到暖调日落场景里,无论掩码多好都一眼假。掩码只是活儿的一半。
常见问题
- AI 抠图用的是什么模型?
- 大多数工具用 U2-Net 或它的变体。U2-Net 是一种为显著性物体检测设计的卷积神经网络架构,输出一张像素级置信度图,用作透明度掩码。
- 为什么抠图后头发周围看起来毛糙?
- 细头发丝处在或低于网络能可靠分割的空间分辨率。人像请用 `u2net_human_seg` 模型,并在 rembg 里启用 `--alpha-matting` 做 Alpha 抠像以获得更细的边缘恢复。
- AI 抠图对透明物体有效吗?
- 效果不好。玻璃、烟、网这类透明和半透明被摄体对比度和不透明度都低,对显著性检测几乎不可见。掩码会把它们当作背景。
- AI 抠图输出什么格式?
- 永远是带 Alpha 通道的 PNG。JPEG 不支持透明,所以任何声称输出透明 JPEG 的工具要么是合成到一个纯色背景上,要么就是输出了无效数据。
- 可以不用服务器,直接在浏览器里抠图吗?
- 可以。ONNX Runtime Web 能通过 WebAssembly 或 WebGL 在浏览器里跑量化的 U2-Net 模型。已经有多个开源项目发布了浏览器兼容的 U2-Net ONNX 权重。性能比服务端推理慢,但对单张图片足够快。