新一代“垫图”神器,IP-Adapter的完整应用解读

news2024/11/15 4:34:29

导读

不用训练lora,一张图就能实现风格迁移,还支持多图多特征提取,同时强大的拓展能力还可接入动态prompt矩阵、controlnet等等,这就是IP-Adapter,一种全新的“垫图”方式,让你的AIGC之旅更加高效轻松。

都是“垫图”,谁能还原你心中的图

“垫图”这个概念大家肯定都不陌生,此前当无法准确用prompt描述心中那副图时,最简单的办法就是找一张近似的,然后img2img流程启动,一切搞定。

可img2img简单的同时,也有它绕不过去的局限性,比如对prompt的还原度不足、生成画面多样性弱,特别是当需要加入controlnet来进行多层控制时,参考图、模型、controlnet的搭配就需要精心挑选,不然出图效果常常让人当场裂开…

但现在,我们有了新的“垫图”神器——IP-Adapter,在解读它之前,先来直观的感受一下它的效果。

效果可以说相当炸,那IP-Adapter就是终极答案了么?它的泛化性如何?兼容性是否足够?对prompt支持怎么样?当真的要接入现实工作中它还有什么拓展的能力呢?让我们一一来看。

IP-Adapter的核心优势,只画你关心的事

IP-Adapter和img2img虽然在操作上都是“垫图”,但它们的底层实现可以说是毫无关系。

用个不严谨但好理解的例子,“IP-Adapter”和“img2img”就是两位画师,现在给出prompt要求它俩画一个男人,在不提供参考图的情况下,它们大概都会画成图1的模样,但是当我们加上参考图2的时候,两者的区别就显现了。

img2img相当于直接盖在参考图上开始临摹,虽然知道要画个男人,但会在老虎的基础上去修改,始终会很别扭,中间不免出现老虎和男人混淆的情况,画出一些强行混合不知所谓的图来。因为在这个流程中,参考图更为重要,一切是在它基础上画出来的,结果也更倾向于参考图。

IP-Adapter则不是临摹,而是真正的自己去画,它始终记得prompt知道自己要画个男人,中间更像请来了徐悲鸿这样的艺术大师,将怎么把老虎和人的特点融为一体,讲解得偏僻入里,所以过程中一直在给“男人”加上“老虎”的元素,比如金黄的瞳仁、王字型的抬头纹、虎纹的须发等等。此时,prompt更为重要,因为这才是它的始终目标。

当然这些都是在一定的参数范围内,超过了阈值,那必然是要走极端的,照着参考图去copy了。但即便这样也可以看到img2img只是1:1的复制,而IP-Adapter有更多prompt的影子。

把简单的“垫图”,拓展得大有前途

在理解IP-Adapter的逻辑之后,会发现它带来的改变可不只是“垫图”,这里先展示一下它在我们工作中的实例,然后再和大家一步步的去拆解它。

以上这些效果实现很简单,只需要添加两层controlnet,一层用来提供IP-Adapter,一层利用canny用来对需要添加的商品进行绘制、固化即可。

如果只是在webui中应用,那到这里其实已经ok了。但这次我们要更进一步,利用新工具,去实现更有创造力的能力。

以下重点想分享的更多是工程搭建的能力和效果(具体的方法,我们会放到以后详细的讲解):

① 一张图就是一个lora,大大降低了训练的成本

② 多参考图接入,提供更丰富的生成结果

③ 利用对prompt的强注意力,提供prompt matrix丰富结果

④ 基于comfyui的工作流部署,实现多步骤自动化生成

以往要想实现一个具体的设计风格,需要针对性的训练lora,背后涉及训练素材的搜集、打标、模型训练、效果检验等多个环节,通常要花一两天,并且结果还存在很强的不确定性。

但现在,通过IP-Adapter这一个步骤,在几分钟内就直观的看到结果,大大节省了时间,敏捷程度简直天壤之别。

当我们拥有这些特征,几乎就得到一个“即时lora”,而需要付出的成本只是去找几张符合预期的参考图。

同时IP-Adapter还能一次读取多张参考图,让生成的结果拥有更丰富的多样性和随机性,这是在img2img流程中无法实现的,也是两者之间区别最大的地方。

此刻,让我们把思路再打开一些,因为IP-Adapter对prompt的强注意力,prompt中的信息能更直观的反应在结果中。于是我们可以在继承img风格的同时,通过替换prompt里面的关键词,指向不同的结果,形成prompt的组合矩阵,更进一步的拓展生成结果的多样性。

更进一步,再加入不同的controlnet和批量素材读取,来实现对生成结果的可控引导,以及利用批量读取能力,来提供更加丰富的模板。一套”0成本即时lora + controlnet可控生成 + prompt matrix多样生成“的自动化流程就搭建完成了。

这个流程我们已经用在项目中,至于效果,大家的反馈概括为一句话就是——一键三连。

下面这张图就是上述流程部署在实际工作中的样子,载体是comfyui,它和webui都是基于stable diffusion能力,但和webui的网页化界面不同,它将SD的能力分解成不同的节点,通过节点关联搭建来实现各种功能。所以更加开放、自由、多源,并且可以实现流程的自动化,极大的提升了实际应用中的效率,下一期我们会专门针对它来进行解读。

到这里,关于IP-Adapter背后的原理和应用就整理完了,它有非常多的优点,但也非常需要结合实际的场景来应用,还是那个观念,没有最好的方法,只有适合的方法。

希望大家用的开心,有什么想法建议,十万吨的欢迎,我们下期再见。


这里是枯燥的分割线

有点无聊,但也很有得聊

看过它的表现的效果之后,再从底层原理看看IP-Adapter到底有什么特别。

我们知道stable diffustion是扩散模型,它的核心作用机制就是对噪音的处理,prompt可以看做是我们的目标,通过不断的去噪过程,向着目标越来越靠近,最终生成出预期的图片。

IP-Adapter则是将图片单独提出作为一种提示特征,相比以往那种只是单纯的把图像特征和文本特征抽取后拼接在一起的方法,IP-Adapter通过带有解耦交叉注意力的适配模块,将文本特征的Cross-Attention 和图像特征的Cross-Attention区分开来,在Unet的模块中新增了一路Cross-Attention模块,用于引入图像特征。

相当于将原本SD中img和prompt拼合成一个向量的做法分开来, img和prompt都会单独的组成向量, 然后交给unet层, 这样img中的特征就可以更好的被保留下来,从而实现对图像特征更显性的继承和保留。

本质上IP-Adapter就是txt2img的流程,流程中prompt还是最关键的,只是中间利用IP-Adapter强化了参考图的提示作用。

作为对比,img2img是直接将参考图传入unet,去替换了原始的随机噪音,这样所有的生成结果都是建立在它的基础上,于是有了前面人和老虎混杂的现象就比较好理解了。

最后的最后,我们通过伪码看一下它俩的底层区别

结构上:

img2img使用unet架构,包括一个编码器(下采样)和一个解码器(上采样)

IP-Adapter包括一个图像编码器和包含解耦交叉注意力机制的适配器

# img2img
class UNet(nn.Module):
    # ... (U-Net architecture code)

# IP-Adapter
class IPAdapter(nn.Module):
    def __init__(self, image_encoder, text_to_image_model):
        # ... (initialization code)


流程上:

img2img通过编码/解码器,需要通过一系列上采样、下采样

IP-Adapter通过图像编码器,文本提示和图像特征通过适配模块与预训练的文本到图像模型进行交互

# img2img
encoded = unet_encoder(img2img_input)
decoded = unet_decoder(encoded)

# IP-Adapter
image_features = image_encoder(ip_adapter_input[1])
adapted_features = adapter_module(ip_adapter_input[0], image_features)


输出上:

img2img是输出一个转换后的图像

IP-Adapter是根据文本和图像提示生成的图片

# img2img
output_image = img2img_model(img2img_input)

# IP-Adapter
generated_image = ip_adapter_model(ip_adapter_input)


以上,真的结束了。see you soon

作者:京东零售 何云深

来源:京东云开发者社区 转载请注明来源

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1312532.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

14个最经典的git命令,你知道吗?

1 学习14个Git命令,因为你将会在99%的时间里使用它们 必须了解的命令整理 1,git init 初始化一个新的Git仓库。 这将在当前目录中创建一个名为".git"的子目录,Git会将所有仓库的元数据存储在其中。 2,git clone 克…

使用Python绘制二元函数图像详解

概要 在数据科学、数学建模和机器学习中,经常需要可视化二元函数的图像以更好地理解函数的行为。Python提供了丰富的绘图库,如Matplotlib和NumPy,使得绘制二元函数图像变得简便而灵活。本文将介绍如何使用Python创建并美化二元函数图像&…

pandas读取Excel表指定数值 计算总和

题目要求:在一个文件夹里面有424个Excel表格,每个表格中都是统一的,如下图。要求计算所有表格中金额的总和。 上代码: import os import glob import pandas as pd# 指定文件夹路径 folder_path C:\\Users\\Administrator\\Desk…

Salesforce“卷土重来”:对中国CRM市场影响在哪?

于本土CRM而言,Salesforce是一面镜子,也更是催化剂。 长期来看,Salesforce的加入,从某种程度上将会加速中国CRM赛道的合理价值曲线的走向,通过带动外界对于CRM整个赛道的关注和热度,进而加速本土CRM的成长…

Java学习-连接Mysql数据库

1.先在Mysql里面构建一个表格 例子:名字为user1,两列分别为name、score 2.正确导入了MySQL的JDBC驱动程序 2.1 下载驱动包(与自己的服务器版本匹配) 官网地址:Maven Repository: mysql mysql-connector-java 8.0.29 …

JVM调优:参数(学习笔记)

一、jvm的运行参数 标准参数 -help、-version、-D参数 jvm的标准参数,一般都是很稳定的,在未来的JVM版本中不会改变,可以使用java -help 检索出所有的标准参数。 通过以下命令查看: 命令:java -help 可以看到我们经常…

C与C++编程语言的区别和联系

一、引言 C和C是两种广泛使用的编程语言,它们都在软件开发领域有着广泛的应用。虽然C是从C语言演化而来的,但两者之间存在一些重要的区别和联系。本文将详细介绍这两种编程语言的相同点和不同点,并通过实际例子进行说明。 二、C与C的相同点 …

如何查看Linux中glibc的Version

用ldd --version ldd --version 运行libc.so 你没有看错,libc.so是一个可执行程序。 但前提是你要找到它。因为它并不在PATH所包含的目录下。 ppdell:~$ ldd which cat | grep libclibc.so.6 > /lib/x86_64-linux-gnu/libc.so.6 (0x00007f0e6fb34000)ppdell:~…

GPT-4.5 要来了!谷歌大模型 Gemini 确实给够压力

GPT-4 还没用明白,GPT-4.5 就要发布了。 最近,OpenAI 泄露了 GPT-4.5 的发布页面,除了进一步增强复杂推理和跨模态理解,GPT-4.5 增加了一个更加强大的功能——3D。 3D 功能的进一步支持,也就意味着多模态最后一块版图…

国产Apple Find My「查找」认证芯片-伦茨科技ST17H6x芯片

深圳市伦茨科技有限公司(以下简称“伦茨科技”)发布ST17H6x Soc平台。成为继Nordic之后全球第二家取得Apple Find My「查找」认证的芯片厂家,该平台提供可通过Apple Find My认证的Apple查找(Find My)功能集成解决方案。…

基于ssm毕业生跟踪调查反馈系统的设计与实现论文

面向工程教育专业认证的毕业生跟踪调查反馈系统 摘要 随着信息互联网购物的飞速发展,一般企业都去创建属于自己的管理系统。本文介绍了面向工程教育专业认证的毕业生跟踪调查反馈系统的开发全过程。通过分析企业对于面向工程教育专业认证的毕业生跟踪调查反馈系统…

内销开发信的跟进策略?开发信的关键要素?

如何写吸引人的内销开发信?优秀内贸开发信模板推荐? 在当今竞争激烈的市场中,内销开发信扮演着关键的角色,是吸引客户、拓展市场的重要工具。然而,发送一封内销开发信并不是终点,而是一个开始。蜂邮EDM将探…

基于Modis的遥感数据的地表温度的获取解决方案----以京津唐为例

1.背景与技术路线 地表温度(LST)是区域和全球尺度地表物理过程中的一个关键因子,也是研究地表和大气之间物质交换和能量交换的重要参数。许多应用如干旱、高温、林火、地质、水文、植被监测,全球环流和区域气候模型等都需要获得 LST。本方案以北京为例采用星载传感器的红外通道…

docker-harbor仓库

Docker 镜像 容器 仓库 仓库:保存镜像 私有:自定义用户的形式登录仓库,拉取或者上传镜像(内部管理的用户) Harbor:是VMware公司开发的,开源的企业级的docker register项目 帮助用户快速的搭建…

ZeroSSL-ip证书配置

1.申请证书 Free SSL Certificates and SSL Tools - ZeroSSL 2.填入公网 IP 地址 3.选择90天免费 SSL 4.自动生成CSR 5.选择文件验证方式 使用80端口,建立对应的文件并进行访问测试 6. 进行认证 7.下载证书并进行配置 8.合并ssl证书 对于 Nginx 服务器,需要将 ca_bundle.crt…

ARM开发

ARM课程介绍 课程特点 ARM开发 --> Linux移植 --> 驱动开发 前后联系:ARM和系统移植为驱动开发学习做准备工作 所需知识:C语言基础及STM32需要的硬件知识 课程要求 目标:学习程序运行原理、硬件的控制原理 会看原理图、芯片手册、学习…

使用docker安装nginx访问web

文章目录 一、拉取nginx镜像二、相关准备2.1、新建目录2.2、nginx配置文件2.3、前端代码 三、启动容器四、验证4.1、服务器上curl验证4.2、浏览器上验证4.3、问题排查 五、其它命令5.1、停止容器5.2、删除容器5.3、重启容器5.4、将nginx配置文件copy到宿主机中 六、最后 一、拉…

“追求卓越·数创未来”CITE2024深圳电子展,火爆招商中

展望2023年下半年及2024年,IDC预测,随着全球经济回暖,手机、智能家电、智能汽车等下游消费电子市场需求复苏,芯片库存持续去化,价格趋于平稳;而随着需求侧增长驱动供给侧产能逐步释放,供需错配或…

vue chrome debugger 无效

昨天晚上debbger可以正常运行的,但是早上起来突然间所有的debugger都不会被命中,重装了vscode,也清了浏览器缓存,可是这个bitch还是不行!整整折腾了一早上,就是无法解决,没办法只能找找资料 ,搜…

基础算法(3):排序(3)插入排序

1.插入排序实现 插入排序的工作原理是:通过构建有序序列,对于未排序数据,在已经排序的序列从后向前扫描,找到位置并插入,类似于平时打扑克牌时,将牌从大到小排列,每次摸到一张牌就插入到正确的位…