ControlNet如何为扩散模型添加额外模态的引导信息?

7367d9848c50c9b0af23506833d465e1.gif

©PaperWeekly 原创 · 作者 | 中森

单位 | IDEA研究院

研究方向 | 条件受控文本生成

这篇文章主要讨论以下三篇论文:

1. Sketch-Guided Text-to-Image Diffusion Models

2. GLIGEN: Open-Set Grounded Text-to-Image Generation

3. Adding Conditional Control to Text-to-Image Diffusion Models


59d539eed931179c7a36f14282add3d5.png

前言

最近笔者在研究院关注的方向主要是如何更好地让图像扩散生成模型更好地受控生成,比如考虑位置(bbox),关键点(key points),速写(sketch)等信息。

笔者认为更好地受控生成是扩散模型更好地与设计生产等环节深度结合,使得该项技术真正让用户有付费意愿的关键。其中最近一个月重点针对 sketch guidance 做了一些探索,有了一些心得,但突然合作的同事发现了一篇工作(上面的第三篇论文 ControlNet)不仅在这个方向上做得比较完善了还统一了其他各种模态信息,于是打算简单谈谈在这个方向上踩过的一些坑,解析一下相关工作在收尾时留作记录。

在开始前先感慨下第三篇论文作者 Lvmin Zhang 这位老哥,21 年本科毕业,那他 18 年大二时便一作发表了ACM Graphics 的高引(100+)论文,目前博一便已有 12 篇工作,真是了不起啊。以下是几张图让大家直观感受下这篇在外网火爆异常杀疯了的技术 ControlNet 的生成效果。

0f3875cc762f84e28c3c02dbf4421e51.png

▲ Credit: https://github.com/lllyasviel/ControlNet/discussions/12#discussioncomment-4948973

ae91291c8414f7eec2978924cb9ec979.png

Sketch-Guided Text-to-Image Diffusion Models

这篇是谷歌在 2022-12 月时发表的一篇论文,使用了 classifier guidance 的思路,设计了一个称为 latent edge predictor 的能量模型,能够在 Stable Diffusion 的 noisy latent vector 上预测目前该步生成的图片是否有我们 sketch 对应的边。用当前图像所预测出的边和我们参考的 sketch 里的边做 MSE 损失计算,我们可以用该损失的梯度来引导扩散生成的结果,使其生成结果拥有对应的边。

具体关于梯度信息如何引导扩散生成的方法,不了解的小伙伴可以参考我之前的笔记中森:浅谈扩散模型的有分类器引导和无分类器引导。而关于这篇文章里如何低成本地在噪声图像上训练一个有效的能量模型来做梯度引导,读者可以参考论文或者其前序论文<Label efficient semantic segmantation with diffusion models>.

但这篇论文笔者在复现的时候发现最大的问题在于边的生成(梯度引导)是不考虑文本信息且不存在任何交互的。这样独立引导造成的结果就是往往生成的图片带有了相应的边,但和边所对应的语义信息并没有贴合生成的边。举个例子,下图是笔者简单复现的模型对一张黑熊的 sketch 做引导生成的结果,注意右下角第三张图,边的信息被当作了树枝,但黑熊的生成并没有在那里。

论文作者自身也提及了该技术路线存在对于复杂场景(多目标,多主体,或者速写场景边的语义信息模糊,复杂)的生成效果不佳。那么一个很自然的想法就是将 sketch features 和 text features 做深度的融合并继续训练,使得生成的可控性提升

18b96f81bad74bf36ac6f14c46508ee2.png

▲ 黑熊的速写对应的生成图片

8f3ba08a4bc4f968c8575904232f3976.png

GLIGEN: Open-Set Grounded Text-to-Image Generation

在开始探讨笔者的思路和第三篇作者 Lvmin 思路差异前,笔者先简单提及一下在今年一月(23-01)的一篇文章。这篇文章以一个类似于 NLP 界 transformer-adapter 的 parameter efficient 的思路来微调 Stable-Diffusion 模型(即固定已有模型的参数,只训练在模型里额外添加的组件),并成功使得 SD 模型可以参考 bounding box 的位置信息,来对不同实体进行生成。

具体架构看下面两张图就十分清晰了,第一张图,我们将 bbox 的信息和其对应的词的 text embedding 拼接过一个全联接网络 MLP 后得到我们的融合表征 grounding tokens。这个表征会注入到 UNet 里 self-attn 和 cross-attn 之间,以一个新的架构 gated-self-attn 的方式添加进网络。

其中 gated self attn 的操作方式图片里也非常清晰了,即以 visual hidden states 作为 Queries, 而 visual hidden states 拼接 grounding tokens 作为 Keys and Valus.

baf62323ac022d292d03229c06fa20b7.png

▲ bbox和text的融合示意

a637e39a0935a5f93a326595dc921910.png

▲ Gated self attention

这篇论文不同于谷歌惯有的不开源不 demo,已经在网上放出了 demo,效果非常好。笔者认为它对我们的最大启示其实在于它论证了已有的预训练文生图大模型的高度可拓展性,并且在开源模型上添加各种模态控制信息做继续训练高度可行

笔者在做 sketch guidance 时读到这篇文章也觉得十分振奋,觉得这件事一定能做成,但没想到十来天后,便已经有同行做出了非常漂亮的工作和完善的探索。对于笔者这样的 NLP 从业人员半桶水来做图像的实验,果然进展还是偏慢,在下一节笔者将讨论笔者所做的尝试和一些心得。反思的同时挖掘作者做法的亮点向其学习。

5233bfce729f16cbc62b1e9ebe6e8425.png

Adding Conditional Control to Text-to-Image Diffusion Models

这篇文章笔者认为意义重大,目前作者尚未发布完整版的论文(论文仍有部分章节未完成,但放出了核心方法,实验的模态数据和预训练的权重作为 DEMO),但根据论文,这篇文章在一个框架下统一了 SD 模型添加各种模态做受控生成的方法,包括但不限于 Edge Map, Sketch, Depth Info, Segmentation Map, Human Pose, Normal Maps 等

下面笔者将根据其实验方法分析

4.1 如何添加可训练参数

其实关于如何在已有的模型基础上添加可训练参数,达到在新任务上的效果迁移,无论是 NLP 的 transformer 时代还是 CV 里的 Diffusion 时代都有不少工作。其中在 NLP 方向上,常见的有添加可训练的 soft prompt tokens(aka prefix tuning),adapters,平行模型等。

关于在 Diffusion Models 上添加新组件的有把 Video 的 3D 用 2D 文生图参数启动但是额外添加一个卷积维度,有需要添加输入端额外维度的依赖在输入端添加新通道,有类似于 GLIGEN 的在 self/cross attention 间添加注意力模块的融合方式,当然也有额外添加一个 encoder 添加模型之类的工作。

但是 ControlNet 的做法不同,具体来说,对于预训练好的模型(比如作者使用 SD1.5-UNet 里 Encoder 和 MidLayer 的 ResNet 和 Transformer 层)里的一层结构, 作者固定了其参数,并将该层的输入额外添加了一个全联接映射后的条件 c,输入到一个和该层结构一致的复制网络里,再映射一次后重新添加回原结构里的输出。

按照作者的解释来看,这样做的好处有两个:一个是最大程度的保留原模型的生成能力,另一个是新添加的组件将以 0 值初始化所以在优化的初始阶段该模型的输出与原模型等价。

作者的安排十分有意思。笔者在做相关实验时会联想到学术界已经形成的一些共识来设计实验:比如由去年八月份论文 prompt to prompt 提出后,文生图里图片布局几何关系很大程度上由 cross-attn 时文本对不同位置的像素点的激活程度所决定。所以笔者初始时会思考是否可以直接将 text embedding 添加融合模块与 sketch info(或其余模态的信息)交互,微调整个模型使其学会兼顾新的模态信息。

笔者也会思考是否直接像 GLIGEN 的方式直接在 attn 层附近添加融合模块会取得好的效果。但论文作者没有如此安排。

论文作者的思路更加类似于《Plug-and-Play Diffusion Features for Text-Driven Image-to-Image Translation》这篇论文的思路。即对于一张模型生成的图片,其 UNet 的 decoder 一定已经包含了其生成的一些空间信息,语义信息等。直接抽取 decoder 相关的特征,添加到当前的生成能够影响当前生成的布局语义等。这是笔者觉得非常有意思的一点。

e3abca67ad8305cb86f878ebbd4d13b8.png

▲ ControlNet的核心架构区别

4.2 如何融合模态信息

上面笔者简单提及了一下像笔者这样的路人研究者会如何朴素地思考添加额外引导信息的一些可能方式,但是笔者尚未提及这些额外的引导信息是如何与现有模块融合的。融合模块该如何设计,引导信息如何添加是这篇论文成败的关键。

作者在这方面所使用的方法也十分特别。如果笔者根据代码及论文总结得无误的话,作者是用统一架构处理所有不同输入来指导生成的。如笔者这样的路人研究者会思考不同的输入信息其本质差异较大,或许需要不同的处理方式。比如 sketch VS edge 实际差异很大。对于一栋建筑所提取的 canny edge 必然是忠实于图像里建筑本身的几何关系,空间位置等。但 sketch 的抽象属性会出现形状不符合,空间位置不对齐,相对比例不准确等一系列问题。

所以笔者甚至考虑针对 edge 和 sketch 要引入不同的训练目标损失,以类似风格迁移评估整体相似程度的方式来处理 sketch 模态信息的输入。但事实是,论文作者以一个架构一个方法便整合了所有不同模态的输入处理,这是方法论层次上的碾压。 如同 NLP里有专注做命名实体识别,关系抽取,指代消融,概括段落等任务,但 ChatGPT 出来以后这些任务全部都被整合到一个模型一个框架里一样。

那作者提出的架构为何可以做到这一点, 笔者抛砖引玉提出几个可能的关键因素:

1. 输入数据的量级。作者所针对的每一个模态,都可以通过已有模型的基础上快速获得大量数据(比如 canny filter 对 edge 的提取,midas 对深度图的提取等)。类似于 InstructPix2Pix 这篇工作,针对当前任务造出一个百万级别大小的训练数据,可能是微调模型使其学到隐式关系的关键。

2. 作者提出的架构和对额外模态的输入形式使得一个通用架构成为可能。在上面介绍结构时,笔者提到作者是针对 UNet 的前半部分里的每一层做额外信息添加和复制训练的。其中当然就包括了 Resnet 的卷积层。即无论什么模态的信息,作者的架构都可以把它作为图像通过 UNet 的 encoder 对其进行多尺度的信息特征的提取。大量参数(对 Encoder+MidLayer 的复制)加上大量训练数据加上适配的网络架构可能是其成功的关键。

3. 对信息的添加及添加位置的选定。前面两个原因笔者认为可能是较为直接的关键因素。但第三个原因笔者不确定其重要程度,或许可以留待作者的消融实验看看是否有相关讨论。如果直观上来理解,在 UNet 的 encoder 阶段添加模态信息引导使得 Decoder 生成时考虑到相关添加信息当然符合直觉。但为何作者没有选定(只)在 Transformer 层这样的模态信息制导生成的关键位置添加模块,而是一视同仁且是在每一层的结尾做信息融合。笔者暂时没有一个很好的回答。

4.3 如何drop text info来增加对condition info的依赖

这一点是笔者在做语言模型,VAE 时观察到的一些现象。举个例子,在这几年的语言大模型训练时,作者通常会训练一系列语言任务来“挑战“大模型,使其能够学到重要的特征。这是个很基础的思想在对比学习在各种神经网络训练里都会出现。对于已经预训练好的 stable diffusion 模型来说,其本身已经可以通过文本的制导,生成高精度的准确图像并且训练时拟合的损失已经很低了。

换句话说,额外的模态信息在功能上是和文本有重合的,如何让模型不对输入的额外模态信息完全忽略导致训练崩塌或许是个作者没有提及但实验时会碰到的情况。笔者在训练 sketch guidance 时便发现了这个情况。笔者初期采用的方式是对 text info 进行 dropout,但作者采用的方式更为直接,是以类似 Classifier-free-guidance 的方式直接对整个 text info 进行忽略,使得模型不得不从模态信息里提取相关特征以辅助训练。

b242c5ede209853fa4d228b2d65dd179.png

末尾

写在最后。笔者在研究院里是 NLP 中心下的一个算法工程师。笔者所在的 NLP 中心关注的是 AIGC 方向的生成,比如扩散模型比如最近大火的 ChatGPT。笔者马上要被抽调去做回老本行 NLP 的 ChatGPT 相关内容了,后续可能更新扩散模型方向的内容会开始减少,但笔者将持续关注多模态生成尤其是类似于 BLIP-V2 这样融合语言与图像方向的工作。欢迎做相关方向研究的同行私信一起讨论。

更多阅读

eaee1e0645711f9ec998866eb585f90a.png

25d72e56fc2d195cd4df672eea0d1a30.png

3cc77c1125c2cb5164c6739dce8456c0.png

664444d41ebdbfb56c735562493f9719.gif

#投 稿 通 道#

 让你的文字被更多人看到 

如何才能让更多的优质内容以更短路径到达读者群体,缩短读者寻找优质内容的成本呢?答案就是:你不认识的人。

总有一些你不认识的人,知道你想知道的东西。PaperWeekly 或许可以成为一座桥梁,促使不同背景、不同方向的学者和学术灵感相互碰撞,迸发出更多的可能性。 

PaperWeekly 鼓励高校实验室或个人,在我们的平台上分享各类优质内容,可以是最新论文解读,也可以是学术热点剖析科研心得竞赛经验讲解等。我们的目的只有一个,让知识真正流动起来。

📝 稿件基本要求:

• 文章确系个人原创作品,未曾在公开渠道发表,如为其他平台已发表或待发表的文章,请明确标注 

• 稿件建议以 markdown 格式撰写,文中配图以附件形式发送,要求图片清晰,无版权问题

• PaperWeekly 尊重原作者署名权,并将为每篇被采纳的原创首发稿件,提供业内具有竞争力稿酬,具体依据文章阅读量和文章质量阶梯制结算

📬 投稿通道:

• 投稿邮箱:hr@paperweekly.site 

• 来稿请备注即时联系方式(微信),以便我们在稿件选用的第一时间联系作者

• 您也可以直接添加小编微信(pwbot02)快速投稿,备注:姓名-投稿

cc381c5de95ae51ae1138358f6c35f94.png

△长按添加PaperWeekly小编

🔍

现在,在「知乎」也能找到我们了

进入知乎首页搜索「PaperWeekly」

点击「关注」订阅我们的专栏吧

·

·

8abea10e0fd80b630c12d9b6852671b7.jpeg

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从贝叶斯定理到大语言模型,重新理解文本生成技术

2019年&#xff0c;我们在做智能写作的时候&#xff0c;面临的最大的挑战就是AI给的数据效果和预期偏差太远。特别是做扩写的时候&#xff0c;发现生成的文字很容易跑偏。 当时&#xff0c;我们做了很多算法和模型研究。几乎爬取了全网的自媒体文章&#xff0c;然后训练一批模型…

阿里搞出脱口秀版GPT!与鸟鸟激辩一小时,话痨到停不下来…

杨净 发自 凹非寺量子位 | 公众号 QbitAI 连社恐的鸟鸟&#xff0c;现在都变成话痨了…… &#xff08;这到底是人性的扭曲&#xff0c;还是道德的沦丧&#xff09; 最近有一种很新的脱口秀&#xff1a;不花钱、一对一、而且任意话题随便and随时聊。 结果一小时跟鸟鸟聊天下来&…

因资金短缺,全职开发者自述:这款开源软件可能没有未来了!

整理 | 苏宓 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 参与开源、贡献开源&#xff0c;虽有一腔热血&#xff0c;但迫于现实的生存而放弃的开发者依然不在少数。 7 月 4 日&#xff0c;知名开源 JPEG 图像编解码器 libjpeg-turbo 发布公告&#xff0c;官宣 …

入狱 10 月、网暴不断,并挣扎在温饱线!超 90 亿次下载的开源项目,背后是这样的 9 年...

“我本可以默默地停止这项工作&#xff0c;但我还是想给开源最后一次机会。” 整理 | 郑丽媛 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 「阳光之下&#xff0c;必有黑暗」。 当互联网企业争相拥抱开源&#xff0c;当开源成为技术创新的重要途径时&#xff0…

Prompt工程师指南[应用篇]:Prompt应用、ChatGPT|Midjouney Prompt Engineering

1.ChatGPT Prompt Engineering 主题&#xff1a; 与 ChatGPT 对话 Python 笔记本 ChatGPT介绍 ChatGPT是OpenAI训练的一种新型模型&#xff0c;可以进行对话交互。该模型经过训练&#xff0c;可以按照提示中的指令&#xff0c;在对话上下文中提供适当的回应。ChatGPT 可以帮…

锁分实锤!B站三体动画评分只有…好文!拆解追溯GPT-3.5各项能力起源;餐饮店后厨AI解决方案PreciTaste… | ShowMeAI资讯日报

&#x1f440;日报合辑 | &#x1f3a1;AI应用与工具大全 | &#x1f514;公众号资料下载 | &#x1f369;韩信子 &#x1f4e2; 分析了三体动画近万条评分数据&#xff0c;扒下B站最后一块遮羞布… https://www.bilibili.com/video/BV1JM411m7HU/ 命运多舛的《三体》动画终于…

提示工程师指南4-ChatGPT Prompt Engineering

ChatGPT Prompt Engineering 在这个部分&#xff0c;我们将介绍 ChatGPT 的最新提示工程技术&#xff0c;包括技巧、应用、限制、论文和额外的阅读材料。 主题&#xff1a; 与 ChatGPT 对话 Python 笔记本 请注意&#xff0c;本部分正在紧密开发中。 文章目录 ChatGPT Promp…

cmd输出中文乱码

解决cmd中文乱码问题 解决方法&#xff1a; 1. chcp 直接输入chcp命令&#xff0c;查看当前cmd的编码格式 活动代码页&#xff1a;936指GBK 2. 设置活动代码页为&#xff1a;UTF-8 编码格式 方法一&#xff1a;直接执行 chcp 65001 执行完后&#xff0c;使用 chcp 可查看当前…

chatgpt赋能python:Python转码详解:解决乱码问题

Python转码详解&#xff1a;解决乱码问题 在使用Python进行编程的过程中&#xff0c;经常会遇到乱码的问题。这种情况往往发生在不同操作系统和应用程序之间交互数据时。本文将介绍Python如何进行转码以解决乱码问题。 什么是转码&#xff1f; 当我们将文本从一个编码格式转…

chatgpt赋能python:Python中文字符乱码问题及解决方法

Python中文字符乱码问题及解决方法 Python作为一种高级编程语言&#xff0c;已经被广泛应用于数据分析、机器学习等领域&#xff0c;尤其是在处理中文文本方面具有很大的优势。然而&#xff0c;在实际使用中&#xff0c;我们有时会遇到一些令人头痛的问题&#xff0c;比如中文…

QMessageBox显示中文为乱码

如图&#xff0c;想要输出这些信息&#xff0c;但是展示为乱码 解决办法&#xff1a; 在cpp文件的最顶端加上#pragma execution_character_set("utf-8")&#xff0c;然后重新构建并运行就可以啦&#xff01;

处理中文乱码和中文部分乱码

文章转自&#xff1a;http://book.51cto.com/art/201112/306309.htm 在网络操作中&#xff0c;关于中文乱码很多初学者都感到非常困难&#xff0c;如何解决乱码&#xff1f;不要没有目的胡乱转码&#xff0c;笔者访问了几个初学者&#xff0c;他们对于这个问题常用的方法就是一…

PHP界面显示中文乱码

在写一个表单提交的项目中&#xff0c;遇到了PHP界面输出无法显示中文界面。 后来查阅相关资料&#xff0c;得出解决途径。 代码如下&#xff1a; <!DOCTYPE html> <html> <head> <title>123</title> </head> <body><?php he…

中文乱码问题

解决中文乱码问题&#xff0c;出现于解压后中文文件名&#xff0c;中文应用程序即exe 常见的中文乱码及解决一. zip压缩包解压之后中文文件名称乱码1. 系统区域改成中文简体2. 用winar打开的时候&#xff0c;选择名称加密&#xff1a;简体中文 二. 中文应用程序&#xff08;以.…

零代码编程:用ChatGPT爬取网页数据遇到乱码怎么办?

今天用ChatGPT写了一段代码&#xff0c;爬取中文网站数据&#xff0c;提示词如下&#xff1a; 写一段Python程序&#xff0c;爬取网页数据并保存到excel表格。 具体步骤&#xff1a; 打开网站https://www.zhenfund.com/Case/?id3&#xff0c;解析源代码&#xff1b; 定位 …

解决各种中文乱码问题

tomcat出现中文乱码问题有以下几种情况&#xff1a; 1.通过cmd启动tomcat出现中文乱码&#xff08;tomcat日志输出编码与cmd编码不一致&#xff09; cmd启动tomcat出现中文乱码 乱码原因&#xff1a;这是由于windows下的cmd的默认编码是GBK编码&#xff0c;Tomcat控制台默认输…

Python 乱码原理及其解决办法

最近在爬虫过程中爬下来的HTML文件中出现了不认识的字符&#xff0c;也就是“乱码”&#xff08;之前也遇到了系统之间文件显示“乱码”的问题&#xff09;&#xff0c;花了点时间学习Python编码相关的问题&#xff0c;主要参考了以下几位的文章&#xff1a;Unicode编码底层描述…

别研究 ChatGPT 了,来看个国产好项目

今天我要给大家推荐一个近期荣获 GVP 称号的项目—— Eoapi&#xff0c;界面简洁的同时满足我的核心诉求。&#xff08;项目作者是我的朋友&#xff0c;大家都支持一下~&#xff09; 简单介绍 Eoapi 是纯国产的开源项目&#xff0c;可以说是 Postman 的好兄弟&#xff0c;该有…

Android小项目——新闻APP

前言&#xff1a; 在公司学习了一段时间Android知识&#xff0c;决定做一个小项目&#xff0c;目的是学会运用所学的基础知识&#xff0c;在这里记录一下开发历程&#xff0c;大家可以把它看成一款入门级练手的 Demo 应用吧~ 项目概述&#xff1a; 类型&#xff1a; 新闻APP&am…