前语
关于一款数字时代的图片修改东西而言,抠图东西扮演着越来越重要的人物。它能轻松地将图画中的方针与布景进行分离,为用户供给快捷高效的修改体会。
在过去,抠除图画布景往往是一件杂乱又繁琐的作业,而完成一个 AI 主动抠图东西也并非易事,因为它需求不少服务器的算力耗费以及很多训练模型的成本。
而现在,我将展现在仅运用 1核1G运存 的超低服务器资源下,能够完成多么令人惊叹的抠图东西!如下所示,只需上传图片,便可主动抠除布景。在线体会
因为带宽也很小(仅 1M )所以在线体会建议不要上传太大的图画。
接下来,我将带你学习怎么布置,经过简略几步即可完成这款强大的 AI 抠图东西。同时,我也将用通俗易懂的文字带你剖析 AI 抠图东西背面的作业原理,协助你更好地理解其背面的算法和逻辑。废话不多说,让咱们开端吧!
开端布置
首先咱们需求运用 Rembg 这个库,它是根据 U^2-Net 模型构建的一个用于图画布景去除的 Python 东西。
为了让开发者快速掌握它,咱们并不需求学习 Python(除非自己训练模型),咱们只需求会一点 docker 的运用,然后运转以下命令:
docker run -d -p 5000:5000 --restart always danielgatis/rembg s
运转结束后会发动一个服务容器,映射在 5000 端口,此时拜访 http://(服务器IP):5000
就能够看到相似这样的界面:
祝贺你,现已成功布置好了 AI 抠图东西,是不是 so easy ~
在第一次提交图画处理时,程序会主动下载所需模型到服务器上。标准预训练模型(u2net)为 176 MB 大小,而其精简版预训练模型(u2netp)则仅为 4.7 MB 大小,越小的模型耗费的内存就越少,在本例中正是运用了精简版模型,才得以在如此低配的服务器上良好地运转,限制其出产速度的反而是网络带宽。
这儿的 Model 选项为抠图所指定的预训练模型,常用的几种有:
- u2net:适用于一般用例的预训练模型。
- u2netp:u2net 模型的轻量级版本。
- silueta:一个社区精简版,与 u2net 效果相同,但大小缩减到 43Mb。
- u2net_human_seg:适用于人体切割的预训练模型。
- isnet-anime:动漫人物的高精度切割。
怎么运用
前面咱们布置好了服务,那么该怎样结合到项目中运用呢?有两种方法。
调用 API 接口(不引荐)
拜访 http://(服务器IP):5000/api
就能够看到一个 Swagger 构建的文档,程序供给了两个接口,都是接纳一个图画然后回来其去除布景的图画成果,区别在于:
- GET 方法接纳的是 URL 参数,传递的是一个网络可拜访的图画链接
- POST 方法则是接纳 file 参数,传递的是前端表单提交的二进制流文件
但是,我要说但是了,这种运用方法虽然运用简略,但经过测试,在服务端会有必定程度的内存泄露问题,因为本文主打一个低配服务器布置教程,不必要的内存耗费是无法承受的,所以并不引荐运用此方法。
经过 websocket 调用(引荐)
在前端项目中,咱们需求装置依赖:
npm i @gradio/client
然后引入并在项目中初始化一下 socket 服务:
import { client } from '@gradio/client'
const app = await client('http://(服务器IP):5000/')
接着咱们写一个简略的上传按钮,例如:
<input type="file" onChange="selectFile" />
在选择文件的事情回调 selectFile
中,将文件传递给服务接口便可取得抠图成果:
const selectFile = async (file) => {
const result = await app.predict("/predict", [file, "u2netp", ""]); // u2netp 可改为其它模型
console.log(result?.data[0]); // 这儿为回来的图画
};
成功后回来的是 Base64 格式数据,能够直接设置在 img
标签的 src
特点上以显现在页面中,假如要点击下载的效果能够参阅如下方法:
function DlBase64 (base64Data, fileName) => {
const link = document.createElement('a')
link.href = base64Data
link.download = fileName
link.click()
}
在实践事例中运用 Vue 代码完成,详细代码可参阅:Github – ImageCutout.vue
AI抠图原理
早在 2015 年,德国图画处理研究所(Institut fr Informatik)的研究人员就提出了一种图画切割使命处理方法,它是为了处理医学领域中的器官、细胞等图画的切割问题,后成为了一种经典的深度学习模型。因为其网络结构形状相似于字母 U,遂取名为 U-Net 模型。
简略来说,这个模型会先对图画进行卷积和池化,再对特征图进行上采样或反卷积操作,左右对称的特征图拼接后再进行卷积和上采样,这个进程重复4次,终究得到输入图画的切割图。
卷积算法是一种常用的数字信号处理技术,是深度学习中卷积神经网络(CNN)的核心操作,能够看做是一个窗口滑动点乘运算,对输入信号或图画不同方位进行加权求和,从而提取出不同方位的特征信息。
池化从某种程度上来说,相似于图片紧缩,只不过紧缩是直接删去一些不重要的信息、或是丢失必定图画质量来到达与原始图画相同或近似的意图。而池化则是一种降维处理,它的意图不是单纯的减小尺寸,而是为了进步计算效率,从而提取出更重要的特征信息。
而上采样则是将特征图反卷积,提升分辨率。所以这个处理结构也被提出者称为:编码器-解码器结构。
因为 U-Net 模型首要处理的是医学图画上的切割问题,这类图画通常有着较为简略的特征和结构,所以在处理杂乱图画上则存在一些问题,无法直接使用于天然图画切割等场景,这时候就该 U^2-Net 登场了。
在 U-Net 模型基础上,秦雪彬等人提出了 U^2-Net 模型(他们发布的论文在上一年被国际顶级学会 ICPR 评选为 2020 模式识别最佳论文),该模型经过改善 U-Net 结构和特征融合方法,在几乎不增加计算成本的前提下,进步了图画切割使命的准确性和效果。并且值得一提的是,它在功能表现上相同很优秀,因此能广泛使用于计算机视觉领域的各种使用中。
结尾
到这儿,相信你现已学会怎么在自己服务器上布置一款 AI 抠图东西了,是不是等不及要亲自尝试一番了呢?假如想了解关于文中提到的在线图片规划器,也欢迎拜访我的开源项目:迅排规划,相关介绍能够查阅这篇文章:
开源在线图片规划器,支撑PSD解析、AI抠图等,根据Puppeteer生成图片
以上就是文章的全部内容了,感谢看到这儿!假如觉得写得不错,对你有所协助或启示,别忘了点赞收藏重视“一键三连”~ 我也会持续更新更多实用的前端知识与技巧。