首先说明下为什么图片生成文字容易乱码?
接下来看优化文字生成能力的大致流程:
第二步,使用数据训练模型,跟第一步是反着的过程。先训练一个布局模型,可以通过输入prompt→输出文本布局+内容。再把prompt和文本布局输入生图模型,最终生成带文字的图片。
大流程就是这样,再稍微把其中布局模型展开一下:
输入prompt输出文字内容+布局,用的是一个大语言模型(LLM),定义了一个输出的文本格式,包含文本内容和这些文本的坐标。同时还会根据文本和坐标数据,用文字渲染工具画张图片出来。
这张渲染出来的文字布局图会作为生图时的参考,用类似ControlNet的方式作用在生图过程中,最终生成图上的文字。
训练阶段:找一批带文字的图片,用OCR识别文字内容和位置,再渲染出一张白底黑字的图片,将图片描述和这张白底黑字图片一起进入GlyphControlNet网络训练。这个白底黑字的图片就是参考图,跟边缘轮廓/姿态等其他ControlNet的参考图作用和流程都一样。
推理阶段:分两部分输入,生图的Prompt和白底黑字参考图,这张参考图看起来是要用户自己另外准备的,可以直接画一张白底黑字的图,或者描述文字内容、行信息、大小位置布局,用工具生成白底黑字参考图,再和prompt一起去生成相应的带图的文字。
效果:文字能较准确生成,但没有控制字体样式和文本颜色的能力,泛化性会比较差。布局和位置需要额外输入,产品化实用性低一些。
疑问:controlNet23年2月出现,为什么11月才有人用于改进图片文字渲染,ControlNet作者自己不试试呢?
相对未针对性训练的生图模型,能生成合理清晰的文字,在给定图像补充文字上效果也不错,也能做到控制文本颜色了,但字体多样性差一些。
TextDiffuser有个问题,它第一阶段产生的文字mask是用单一字体渲染的结果,用这个mask引导生图,结果是生成的结果字形的多样性比较差,生成的文字倾向于规整,手写或艺术字很难出现,GlyphControl也有同样的问题。另外TextDiffuser布局转换器对用户输入prompt的理解能力也有限。
布局模型:
生图模型:
TextDiffuser2的多样性会好一些,字体形态多样。
AI图片生成文字主要有以下几种方案:
这些方案的核心思路都是:
目前TextDiffuser2的效果最好,既保证了文字的准确性,又能生成多样化的字体样式。Recraft借鉴了TextDiffuser2和GlyphControl。
为什么雷声大雨点小?
一个模型能同时理解和处理多种模态的数据输入。
先来看看人像视频,常见有两类:
基于扩散模型的方案,大体思路看起来是在原网络插入pose/人脸点位控制,跟ControlNet原理差不多,扩散模型本身除了SDUnet那套外,基本都会加入视频生成常见的spatial-attention和temporal-attention。
这是Transformer架构图,左边是encoder,右边是decoder,实际LLM大模型是只由右边decoder构成,这里面大部分是常用的FeedForward(前馈网络)/Add(残差连接)/Norm(层归一化),核心还是Multi-HeadAttention模块,我们来具体看看Multi-HeadAttention模块里做了什么。
假设一个字是一个token,输入是”我有一个玩”(用于推测下一个字”具“),5个字,每个字用一个向量表示,每个向量假设是9维(GPT3是12288维),也就是用9个数值表示这个字,那每个词顺序排下来,就组成了5行9列的输入矩阵,称他为X,每一行代表一个词。
这个输入矩阵经过Multi-HeadAttention模块运算,输出另一个同宽高的矩阵,接下来详细看看这个运算过程。
Multi-HeadAttention是由多个SelfAttention模块拼接而成,如果它只有一个head,就是一个SelfAttension模块。
在客户端上跑大模型,一定是未来的趋势。
那当前手机设备硬件条件如何?我们可以通过一些指标对手机和服务端的算力差距有个大概认识。
显存:一个模型能不能跑,取决于显存够不够,显存不够模型无法加载。
性能:而模型跑得快不快,取决于芯片性能怎样。
来看看上篇里的最后一个case:
黏土风格效果还可以,但人物动作总会跟原图不一致,一会双手放地板,一会侧身。图生图一般希望整体轮廓、人物姿态与原图一致,有没有办法控制?
我们可以给它加上ControlNet节点,用canny边缘检测,试试控制画面主体的轮廓结构:
这下就比较准确地还原了原图的姿势了。
通过这套架构,可以训练出每种控制方式对应的模型,生图过程中应用这个模型,输入对应的引导图,就能生成对应的图。
以下是ControlNet作者训练好的几种模型,以及用这些引导图生成的图片效果:sketch草稿、map法线贴图、depth深度图、canny边缘、line线、edge边缘、场景、Pose人物姿势
这里的canny可以替换成sketch、depth、pose等算法,搭配上对应的ControlNet模型,就能实现不同的控制方式。
扩散生图模型出现后,就有很多人探索怎样更好控制它的生成,显然如果只能用文字生图,可控性太差,最直观的还是能通过草图指引控制它画什么。
有很多人做过不同的研究,提出过多种方法,ControlNet的方法相对前人有很大优势,能稳定用在各种场景上,效果最佳,应用广泛。
整个生图的核心网络就是UNet。UNet最初是用于医学图像分割任务而提出来的,但它的特性展现了在图像其他领域的应用潜力,后续经过扩散模型的改进,很好应用在了图像生成上,所以StableDiffusion的UNet实际上在原UNet网络架构上做了一些改造。
我们先来看看原UNet网络架构:
先看ComfyUI这个默认的最简单的workflow:
为什么叫模型checkpoint?模型在微调训练过程中,会在关键节点保存模型参数的状态,这个保存点被称为checkpoint,SD有大量基于基座模型微调训练的模型,包括官方出的,比如SDv1.5是从v1.2的基础上调整得到的,SDXLTurbo也是基于SDXL1.0基础上训练的,这些模型都被称为checkpoint,这些checkpoint包含了生成图所需要的全部核心组件,包括VAE、CLIP、UNet的模型数据,可以直接使用。
在看图片生成这个逆天能力的时候,很好奇它是怎么做到的。要完全理解这里面的算法细节门槛挺高,但要了解基础原理概念还是简单的。
目前市面上文字生成图片基本上都基于Diffusion扩散模型,StableDiffusion自然也是,它最基本的原理是:根据文字指示,把一张随机生成的全是噪点的图片,一步步去掉噪点生成跟文字描述匹配的图片。
具体是怎样做到的?这里可以分步看两个问题:
先看第一个问题,从随机噪点图生成一张正常图片,通过训练和组合UNet模型可以做到。
UNet是个深度学习网络模型,模型细节不说,个人可以非常粗略地理解为,这个UNet模型里面的参数,记录了训练的图片的内容,但它不是精确存储,而是有一些映射和数学运算,做到可以识别提取图片特征,模糊地记忆图片的关键信息,混合存储。
这个模型训练出来后,如果你是用一张图片玩命训练它,那它最终恢复出来的就是这张图片(maybe)。如果你用1万张图片训练这个模型,那它恢复出来的会是这一万张图片内容随机组合的一张图片。