我用AI给图片「脱衣服」的那些天:从0到1开发本地背景移除工具

906 阅读4分钟

序章

网上不是没一键抠图网站,而是——每个都踩过雷

  1. 排队 30 秒,结果弹出“今日免费次数已用完”
  2. 高清图传上去,回来一张 0.5 MP 的“马赛克”
  3. 背景倒是没了,头发被吃掉一半,鼠标还被偷偷加了 3 个水印
  4. 最离谱的:一张 4 MB 的产品图,上传完告诉我“服务器繁忙,请稍后再试”——刷新后,图没了,隐私也没了

“算了,老子自己跑模型!” ——这句怒吼,就是整个项目的起点。

技术选型

核心技术栈

  • React:UI框架(毕竟我只会这个)
  • Vite:构建工具(比Webpack快到飞起,谁用谁知道)
  • ONNX Runtime Web:在浏览器中运行AI模型的黑科技
  • RMBG-1.4模型:来自Bria AI的背景移除模型,效果比某些收费软件还好
  • Stable Diffusion XL:AI图像生成功能,让用户可以"无中生有"

为什么选择本地运行?

Privacy is the new luxury(隐私是新的奢侈品)。当我看到某在线抠图网站的隐私政策时,我的内心是崩溃的:

"我们有权使用您上传的图片用于AI训练..."

于是我下定决心:必须让所有计算都在用户本地完成!就算用户上传「不可描述」的图片,也只有他自己知道。

虽然项目已经部署到GitHub Page(在线体验),但由于模型文件高达200MB+,在线加载会非常缓慢(实测首次加载需30秒以上)。强烈建议克隆代码到本地运行(npm run dev),既能获得更快的加载速度(本地读取文件仅需3-5秒),还能避免网络传输带来的隐私风险。

开发血泪史

1. 模型加载

以下是第一次加载ONNX模型的场景:

// 理想很丰满
const model = await ort.InferenceSession.create('model.onnx');

// 现实很骨感
Uncaught (in promise) Error: Failed to load model: 404 Not Found

经过排查发现,问题出在模型文件的加载路径上。我们的解决方案是将模型文件放在项目特定目录,并通过vite.config.js配置正确的加载路径。同时,使用rollup-plugin-copy插件在构建时自动将WASM文件复制到dist目录,确保生产环境能正确加载相关资源。

2. 图像处理:像素级的「找茬游戏」

预处理图片时,我天真地以为:

"不就是把图片转成张量吗?so easy!"

结果被现实狠狠打脸。图片缩放、通道转换、归一化...每一步都可能让输出变成「抽象画」。最后不得不祭出「暴力调试法」:

// 为了调试,我打印了每个像素值
console.log('Pixel R:', r, 'G:', g, 'B:', b);
// 然后控制台就炸了...

3. 性能优化

最初版本处理一张图片需要10秒+,用户体验堪比PPT。目前已实现的优化手段:

  • 优化ONNX Runtime配置,启用图优化和内存管理
  • 采用高效的图像预处理算法,减少不必要的像素操作
  • 固定模型输入尺寸为1024px,在质量和速度间取得平衡

这些优化让处理时间降到了5秒以内,虽然离"丝滑流畅"还有距离,但已经是肉眼可见的进步!

功能亮点:不止于「抠图」

1. 摄像头快照抠图

目前实现的是摄像头快照功能:打开摄像头预览,摆好姿势后拍照,然后对拍摄的照片进行背景移除。虽然不是真正的"实时"处理,但胜在操作简单,适合快速抠图需求。效果如下: example3.png

2. AI图像生成集成

代码中已初步集成了三种AI图像生成API的接口封装(Hugging Face、Replicate、Stability AI),但目前处于开发测试阶段,尚未完全实现"生成+抠图一条龙"功能。大致效果如下: example2.png

没有API Key的用户可以使用本地Canvas生成的简单图形作为演示,这部分主要用于验证界面交互流程。

结语:前端的未来

当浏览器能运行越来越复杂的AI模型,当WebGPU释放出惊人算力,前端工程师将不再只是「页面仔」,而是「全栈AI开发者」。

最后,放个项目地址求Star:rmbg-tool

PS:如果你也想入门前端AI开发,我的建议是:先跑通一个demo,再慢慢优化。