序章
网上不是没一键抠图网站,而是——每个都踩过雷:
- 排队 30 秒,结果弹出“今日免费次数已用完”
- 高清图传上去,回来一张 0.5 MP 的“马赛克”
- 背景倒是没了,头发被吃掉一半,鼠标还被偷偷加了 3 个水印
- 最离谱的:一张 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. 摄像头快照抠图
目前实现的是摄像头快照功能:打开摄像头预览,摆好姿势后拍照,然后对拍摄的照片进行背景移除。虽然不是真正的"实时"处理,但胜在操作简单,适合快速抠图需求。效果如下:
2. AI图像生成集成
代码中已初步集成了三种AI图像生成API的接口封装(Hugging Face、Replicate、Stability AI),但目前处于开发测试阶段,尚未完全实现"生成+抠图一条龙"功能。大致效果如下:
没有API Key的用户可以使用本地Canvas生成的简单图形作为演示,这部分主要用于验证界面交互流程。
结语:前端的未来
当浏览器能运行越来越复杂的AI模型,当WebGPU释放出惊人算力,前端工程师将不再只是「页面仔」,而是「全栈AI开发者」。
最后,放个项目地址求Star:rmbg-tool
PS:如果你也想入门前端AI开发,我的建议是:先跑通一个demo,再慢慢优化。