Textual Inversion、DreamBooth、LoRA、InstantID:从低成本进化到零成本实现IP专属的AI绘画模型

本文主要是介绍Textual Inversion、DreamBooth、LoRA、InstantID:从低成本进化到零成本实现IP专属的AI绘画模型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

2023年7月份国内有一款定制写真AI工具爆火。一款名为妙鸭相机的AI写真小程序,成功在C端消费者群体中出圈,并在微信、微博和小红书等平台迅速走红,小红书上的话题Tag获得了330多万的浏览量,相关微信指数飙升到了1800万以上。

其他能够提供类似功能例如:LensaAI,Midjourney,DALL-E3,Stable Diffusion,Tiamat。只不过LensaAI和妙鸭相机对于定制图像生成更加专精一些。

这背后用到技术演化,就是Textual Inversion、DreamBooth、LoRA、InstantID这四类,从一开始需要样本数据微调,到2024年1月发布InstantID不需要样本数据微调。

本文跟朋友们分享相关技术。

欢迎关注留言!

Stable Diffusion 简称 SD。

Textual Inversion

为了更好理解Textual Inversion算法,我先回顾下SD词嵌入向量的使用方式。
也可以看我以前的文章。

当我在SD AI上画画时,我会先输入一个提示。这个提示会被一个叫做“tokenizer”的工具拆分成很多小部分,每个小部分都有一个独特的标识,叫做“token_id”。接着,这些“token_id”会在一个已经准备好的词库里找到对应的词嵌入向量。这些词嵌入向量就像是我们提示的“翻译”,让机器能更好地理解。

然后,我会把这些词嵌入向量放在一起,传给CLIP的文本编码器。这个编码器会帮我把这些向量变成一种更容易理解的形式,也就是文本表征。有了这个文本表征,我就可以用一个叫做“交叉注意力机制”的工具来控制我的图像生成了。简单来说,就是我想画什么,机器就能帮我画出什么。
在这里插入图片描述
理解了 SD 词嵌入向量的使用,再来学习 Textual Inversion 这个算法就会非常简单。

Textual Inversion 算法的本质是学习一个全新的词嵌入向量,用于指代定制化的内容。其核心思想便是,对于一个给定的物体或者风格,去学习一个全新的词嵌入向量,并绑定一个符号比如 S*,为其分配一个新的 token_id。这样,每次文生图的时候只需要带上 S*,就能生成我们想要定制化的物体或者风格。

**重点在于,这个过程不需要对整个AI模型进行调整或重新训练,只是在它的词汇库中添加了一个新的词汇而已。**这样做的好处是可以保留AI模型原有的理解能力和创造力,同时又增加了一些个性化的元素。

需要3到5张展示特定概念(比如你的猫)的图片来训练AI。

论文地址:https://arxiv.org/pdf/2208.01618.pdf
https://arxiv.org/pdf/2208.01618.pdf
https://arxiv.org/pdf/2208.01618.pdf
https://arxiv.org/pdf/2208.01618.pdf

Textual Inversion 的训练其实挺简单的,分两步走。

首先,你得给你想要的关键词,比如 S*,配一个新的“身份证”,我们叫它 token_id。然后,给这个新“身份证”初始化一个词嵌入向量。举个例子,如果原来的词库里已经有 20000 个词了,那 S* 的“身份证”就是第 20001 号。

接下来,找个已经训练好的 AI 画画模型,比如 Stable Diffusion 或者 DALL-E 3。在训练的时候,CLIP 文本编码器和 UNet 这些模型的“技能”都不变,就固定在那里。然后,用你提供的 3-5 张图片,按照模型的标准训练方法来训练。这个过程中,只有你给 S* 新初始化的那个词嵌入向量在“学习”。

训练完了,你就得到了一个定制化的词嵌入向量,它能帮你表达出训练图片里的物体或者风格。

这里有两点要注意:
一是这个词嵌入向量是和你选的 AI 绘画模型绑在一起的;
二是 Textual Inversion 还可以同时优化好几个新增的词嵌入向量。

如果你想更深入了解,可以点击链接去看看 Textual Inversion 的训练代码。

https://github.com/huggingface/diffusers/blob/main/examples/textual_inversion/textual_inversion.py

DreamBooth

DreamBooth 论文:https://arxiv.org/abs/2208.12242

Textual Inversion 在训练时,能学习的参数并不多,大概只有512或768个浮点数那么点儿。所以,它在定制化生成方面的能力就有点儿局限。在市场上,如果你想要更个性化的生成效果,大家通常更喜欢用 DreamBooth。

说到 DreamBooth 这个名字,其实挺有意思的。Google 团队打了个比方,说它就像一个摄影棚,你进去拍照后,不仅仅是一张公开可用的图片,还能把你拍的东西放到你梦想的任何场景里。用 DreamBooth 的时候,你上传3~5张图,再加个新的描述词,就能定制一个物体或者一种风格了。后面我放了些图片,你可以看看 DreamBooth 的生成效果有多酷。
https://arxiv.org/abs/2208.12242
https://arxiv.org/abs/2208.12242

在这里插入图片描述

我来给你讲讲这个方案是怎么一回事吧。其实步骤很简单,就两步。

首先,你得挑个不常见的词作为关键词,比如说“CSS”。这个和Textual Inversion有点儿不同,那里的词得绑定全新的词嵌入向量,但这里不用。

然后呢,你得找个已经训练好的AI绘画模型,比如Stable Diffusion或者DALL-E 3。在训练过程中,UNet模型的权重是要打开的。接下来,就按照对应的AI绘画模型的标准训练方法,在你给的3-5张图片上训练一下。

你可能会有个疑问:就用这么几张图去调整UNet那么多参数,模型会不会变得太“偏执”了?比如说,如果你用了3-5张自己小狗的照片去训练,那模型是不是就只会画这一种样式的小狗了?没错,确实会有这个问题。这样训练出来的模型,不管你的prompt是“a CSS dog”还是“a dog”,它都只会画出你训练用的那种小狗。

不过别担心,论文作者已经想到了解决办法,那就是保留损失(preservation loss)。具体操作就是,先用AI绘画模型生成一批小狗的图片,然后在训练DreamBooth的时候,也把这批图像加进去一起训练。这样一来,模型就不会那么“偏执”了。

哦对了,训练DreamBooth的时候,CLIP文本编码器也是可以打开的。实践证明,这样做可以让定制化图像生成的效果更好。

总的来说,Textual Inversion和DreamBooth的区别就在于:前者只是优化一两个词嵌入向量,而后者则是对整个AI绘画模型进行微调。

如果你想更深入了解,可以点击链接去看看 DreamBooth 的训练代码。

https://github.com/huggingface/diffusers/blob/main/examples/dreambooth/train_dreambooth.py

更多内容关注这个用户,以后大部分内容都迁移到这里:欢迎关注

每天学点新技术,生活工作更自如!

我是 李孟聊AI,独立开源软件开发者,SolidUI作者,对于新技术非常感兴趣,专注AI和数据领域,如果对我的文章内容感兴趣,请帮忙关注点赞收藏,谢谢!

这篇关于Textual Inversion、DreamBooth、LoRA、InstantID:从低成本进化到零成本实现IP专属的AI绘画模型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/638931

相关文章

C++中unordered_set哈希集合的实现

《C++中unordered_set哈希集合的实现》std::unordered_set是C++标准库中的无序关联容器,基于哈希表实现,具有元素唯一性和无序性特点,本文就来详细的介绍一下unorder... 目录一、概述二、头文件与命名空间三、常用方法与示例1. 构造与析构2. 迭代器与遍历3. 容量相关4

C++中悬垂引用(Dangling Reference) 的实现

《C++中悬垂引用(DanglingReference)的实现》C++中的悬垂引用指引用绑定的对象被销毁后引用仍存在的情况,会导致访问无效内存,下面就来详细的介绍一下产生的原因以及如何避免,感兴趣... 目录悬垂引用的产生原因1. 引用绑定到局部变量,变量超出作用域后销毁2. 引用绑定到动态分配的对象,对象

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

Python实现字典转字符串的五种方法

《Python实现字典转字符串的五种方法》本文介绍了在Python中如何将字典数据结构转换为字符串格式的多种方法,首先可以通过内置的str()函数进行简单转换;其次利用ison.dumps()函数能够... 目录1、使用json模块的dumps方法:2、使用str方法:3、使用循环和字符串拼接:4、使用字符

Linux下利用select实现串口数据读取过程

《Linux下利用select实现串口数据读取过程》文章介绍Linux中使用select、poll或epoll实现串口数据读取,通过I/O多路复用机制在数据到达时触发读取,避免持续轮询,示例代码展示设... 目录示例代码(使用select实现)代码解释总结在 linux 系统里,我们可以借助 select、

Linux挂载linux/Windows共享目录实现方式

《Linux挂载linux/Windows共享目录实现方式》:本文主要介绍Linux挂载linux/Windows共享目录实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录文件共享协议linux环境作为服务端(NFS)在服务器端安装 NFS创建要共享的目录修改 NFS 配

通过React实现页面的无限滚动效果

《通过React实现页面的无限滚动效果》今天我们来聊聊无限滚动这个现代Web开发中不可或缺的技术,无论你是刷微博、逛知乎还是看脚本,无限滚动都已经渗透到我们日常的浏览体验中,那么,如何优雅地实现它呢?... 目录1. 早期的解决方案2. 交叉观察者:IntersectionObserver2.1 Inter

Spring Gateway动态路由实现方案

《SpringGateway动态路由实现方案》本文主要介绍了SpringGateway动态路由实现方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随... 目录前沿何为路由RouteDefinitionRouteLocator工作流程动态路由实现尾巴前沿S