AI绘画的目标与挑战

大家接触AI绘画,不能仅仅把自己的目标放在尝试各种工具上。那样虽然可以学会一些工具的使用,但是做不出好的图画,做不出有深度的研究。在尝试这些工具的同时,可以考虑以下问题:

0.AI绘画与计算机科学研究的关系

AI绘画属于计算机视觉领域中图像生成子类的研究成果。

计算机视觉(computer vision)旨在让机器像人一样处理视觉对象。

与之类似的词汇是机器视觉(machine vision), 但是机器视觉更偏重于计算机视觉技术的工程应用,而计算机视觉则更偏向学术的算法研究。简单的说,计算机视觉相当于设计API,机器视觉相当于调用API开发软件。如果只是就图像内容应如何理解的一般性讨论,则两个词可以混用。

计算机视觉的顶级会议有CVPR、ICCV、和ECCV,此外ICLR也有不少计算机视觉论文。顶级期刊有IJCV和TPAMI等。近来计算机是的会议非常火爆,CVPR年投稿量从2020年就超过1万篇,录用量在2022年也超过了2000。由于计算机视觉的主流解决方案是以深度学习(deep learning)为代表的机器学习方法,所以你可能也听说这些会议是所谓算法圈的会议、机器学习圈的会议,这只是研究内容与研究方法之间的区别。

计算机视觉大致包含以下内容:

  1. 图像理解(图像分类、目标识别、图像分割)
  2. 图像生成(超分辨率、文本to图像、图像去噪、风格迁移,视频生成)
  3. 图像检索(以图搜图、以文搜图,视频搜索)
  4. 图像序列(目标跟踪、图像序列分类、步态识别)
  5. 多模态(与NLP结合,与专业领域知识结合等)

目前的AI绘画技术,核心以stable diffusion深度学习模型为代表的text2image图像生成技术。同时包含多模态(图生图、文生图、文生视频等)、图像理解(目标识别、图像分割)、图像生成(超分辨率、图像去噪、风格迁移)等等内容。所以你越是深入了解AI绘画技术,掌握的计算机视觉技术也就越多,对现在代表先进生产力的深度学习/人工智能技术的理解也越深入。

1.如何确保独特的画面内容/画面风格?

1.1 什么是画面内容

画面内容指的是图像或艺术作品中所呈现的物体、人物、景观等可识别的元素和主题。它关注的是图像中具体的对象和场景。

计算机视觉领域的一个研究方向:对象识别,就是旨在让计算机能够自动识别和理解图像中的对象。对象识别技术通过分析图像中的像素信息和特征,使用机器学习算法或深度学习模型,对图像中的不同对象进行分类和标识。

计算机视觉的图像理解三大任务:

  1. 图像分类(Image Classification)
  2. 目标识别:目标定位(Object Localization)-- 目标检测(Object Detection)
  3. 图像分割:语义分割(Semantic Segmentation)-- 实例分割(Instance Segmentation)--全景分割(Panoptic Segmentation)

关于这些概念的具体描述请见:https://divis.cn/archives/2469

关于此领域的最新进展:如何评价Meta/FAIR 最新工作Segment Anything? - 知乎 https://www.zhihu.com/question/593888697

现在机器在图像分类领域已经超过了人类,但在目标识别和图像分割的部分领域还达不到人类的准确率。但技术正在不断向前发展。

1.2 什么是画面风格

画面风格通常指的是图像或艺术作品所呈现出的视觉特征和风格特点。不同的画面风格可以通过色彩、构图、线条、光影等方面表现出独特的视觉效果和情感氛围。例如,一幅描绘荒凉沙漠的画面,可以采用黄色调和大量的负空间来表现荒凉和寂寞的感觉,这样的画面风格可以更好地突出画面所展现的主题内容。

需要指出的是,画面风格不仅仅指美术绘画,也可以是摄影、建筑、设计图等一系列可以用图片格式存储的数据所呈现出来的人类主观感受。

现实主义(Realism)风格绘画:19世纪兴起的法国画派,追求真实和客观的呈现,力求准确地描绘现实世界中的细节和形象。代表作如让-弗朗索瓦·米勒《拾穗者》 ,古斯塔夫·库尔贝,村里的年轻女士们。

像素画(pixel art),最早是为了适配20世纪七八十年代的8位、16位计算机的低分辨率图形,尽管技术限制已经被超越,但像素画作为一种新的艺术风格被保留至今。(图片来源:https://www.zcool.com.cn/tag/ZMTU3MDcy.html

建筑师的设计风格:安藤忠雄,外号“清水混凝土诗人”,使用原本厚重、粗糙的清水混凝土,转化为一种精致细腻的质感,可以使人获得了一种独特的体验。

电路设计图:电路设计图是有着规范化的符号规制所设计出来的特定图形。其独特风格也令其带有赛博朋克意味的美学审美。如何绘画电路设计图,即在特定符号规制下进行准确的内容输出,也是现今AIGC领域的挑战之一。

1.3 为什么要通过AI模型训练来实现特定画面内容/风格的生成?

现在主流的AI绘画模型,有stable diffusion, DallE2, middlejourney等等。

我们现在用的,也是大多数从事AIGC研究的,是开源的stable diffusion模型。

但无论是是哪一种模型,其生成结果都是对训练数据的排列组合。

所以,首先我们必须确定的一点是,AI绘画模型不能创造自己没“看”过的画面内容/风格。它只是在训练数据集基础上做排列组合。

在AI绘画火热的初期(2022年末),由于专门的训练集还太少,AI绘画模型不会描述吃面这个行为,因为早期训练集大部分采用的是西方文化背景的imageNet, coco等数据集,缺少使用筷子这样的数据训练。于是总是让人物做出直接用手伸进汤里抓面之类的奇葩举动。但在使用了专门数据训练后,这一现象大幅改观。摘自:https://news.gamme.com.tw/1751939

虽然AI绘画模型在训练时都使用了1000万以上的图文对进行训练,貌似见多识广,但其“看”过的数据还是远远小于人类社会拥有的各类图文数据,甚至因为训练数据集的偏向性也闹过很多笑话:例如不会画手、画男人的精细度远远小于画女人等等。

也许有一天会有一个超大模型将所有人类数据都融入其中,但显然在可预见的未来内,无论时算力、成本还是政治因素都无法做到这一点。

所以在现阶段为了应对人类多样化的需求,依然需要使用各种训练数据,通过迁移学习的方式让AI绘画模型“看”过特定图画风格从而更好地生成这一类图形,或者与其他风格混搭探索其他可能性。

2.SD模型的结构和训练方法

2.1 SD模型的结构

stable diffusion模型(下简称SD模型)在huggingface上基本运行流程如上图所示。其中包含四个模块:

  1. clip (token和text encoder

clip模型是以一个非常强大的、具有zero shot能力的图像分类器,其主要结构包括在GPT2基础上开发的text encoder(文本编码器)和image encoder(图像编码器)两部分。SD模型为了实现对于文本的解析,只使用了clip的text encoder实现文本嵌入。

当然,为了让text encoder(文本编码器)起作用,少不了用clip的token模块将输入文本编码为特征向量,然后才能让text encoder做文本嵌入。这个token模块是传统NLP模型必备的功能,一般不特别说明。

  1. UNet

UNet是一种经典的图像分割模型,最早诞生于2015年,目标是做医疗图像的语义分割任务。在Stable Diffusion模型中,UNet被用作图像生成的解码器,负责将潜在向量转换为生成的图像。通过使用UNet结构,Stable Diffusion模型能够更好地学习和生成图像的细节和结构,从而提高生成质量。UNet在图像生成任务中常用于重建模型,用于从低维潜在空间中生成高分辨率、逼真的图像。

  1. VAE(Image decoder)

最后的模块是Image decoder模块,用来将latent还原成图像。这个模块来自于VAE,VAE是变分自编码器(Variational Autoencoder)的缩写,它是一种生成模型和降维技术,常用于学习数据的潜在表示和生成新的样本简单地说,VAE可以讲UNet计算出的基于输入文本的潜在特征(conditioned latents)还原成与原始训练图片相似的样本。

  1. scheduler

SD模型通过一个scheduler模块控制预测噪声或者其反向过程,并将其预测的latent(潜在特征,或者翻译为隐信息)输入UNet进行基于文本的图像潜在特征推理。所以scheduler是扩散模型的核心控制逻辑,用来控制对UNet推理次数等内容。

所以你会发现,SD模型是个缝合怪,将之前许多特定用途的模型(图像分类器clip, 图像分割模型UNet,变分自编码器VAE)组合成了一个text2image的模型。事实上机器学习领域的研究都大抵如此,站在前人肩膀上,将已有模型拆分改造再加上一些独特构思,以实现自己的目标为最终要务。

2.2 SD模型的训练过程

模型的训练根据需求的不同规格也很不相同。

这是本人训练SD模型的过程截图,可以看到模型主要包括clip(text_encoder)、vae、unet三个部分,三部分的参数总起来为1.0Billion个。

如果是要把整个模型所有模块都训练(包括clip, UNet, VAE),通常需要准备10万以上的图文对(就是图片与其内容的描述文本),然后使用100张左右的A100显卡对数据和模型进行训练。例如,如果要给模型添加新概念,例如只训练衣服相关图像及其描述文字,则只有10万以上的图文对模型才能逐渐有显示出效果。

但通常情况下,如果我们只是训练为了让模型能多识别一些内容和风格,则不需要训练text_encoder,只训练unet即可。

以下仅介绍核心模块UNet的训练过程:

(这一部分图片摘自:https://zhuanlan.zhihu.com/p/597732415

具体的训练过程,主要是让SD模型中的UNet学习如何去噪。

假定我们现在有一张金字塔的图片,我们用random函数生成从强到弱各个强度的噪声,比如图中0~3共计4个强度的噪声。我们选中其中的噪声1,并将其加到图片里。

然后按照这种方法,再选另一张照片,选择另一个噪声2,加载进去获得另一张噪声图片。

依次类推,不断重复给不同照片添加随机照片的工作。最后我们会得到这样一组数据:

噪声强度(Noise Amount)、加噪后的图片(Noisy Image) 以及噪声图(Noise Sample)

训练的时候我们的unet只要在已知噪声强度的条件下,学习如何从加噪后的图片中计算出噪声图就可以了。即:

输入:噪声强度(Noise Amount)、加噪后的图片(Noisy Image)

输出:噪声图(Noise Sample)

注意,我们并不直接输出无噪声的原图,而是让unet去预测原图上所加过的噪声。

2.3 SD模型的生成图片的原理

假设我们现在已经按照上面的步骤训练好了一个unet,这就意味着它就可以成功从一个加噪的图片中推断出噪声了

  

知道噪声强度的情况下,给unet输入一张有噪图,unet就输出有噪图上面加过的噪声是什么.

有噪图 减去 噪声 就能还原出 原图。

但是在UNet内部的噪声图可能是100万张图不断地加噪叠加以后的结果,所以只减去一次噪声还原出来的还是另一张噪声图。我们需要不断重复这个过程。

这个PPT给的例子比较简单,重复了两次去噪就呈现了一张很好的图片。实际可能要很多很多次。

这个生成图片是接近训练集分布的,它和训练集保有相同的像素规律。比如你用一个艺术家数据集去训练,它就会遵循美学的颜色分布,你用真实世界的训练集去训练,它的结果就会尽量遵循真实世界的规律。现在,你已经了解了Diffusion模型的基本规律了,这不仅仅适用于Stable Diffusion,也适用于OpenAI的Dall-E 2和Google的Imagen。

关于SD模型原理的更多可以参考:零基础读懂Stable Diffusion(II):怎么训练 - 曾飞飞的文章 - 知乎 https://zhuanlan.zhihu.com/p/597732415

2.4 SD模型的主要训练方法

Textual Inversion

Textual Inversion(也称为 Embedding)是一种使用文本提示来训练模型的方法。它根据模型引用给定的图像并选择最匹配的图像。你做的迭代越多越好,能够在保持图像质量的同时,快速生成大量图像。这种方法对计算资源要求较低,适用于需要快速生成大量高质量图像的场景。

特点:

  • 生成的模型文件小,大约几十KB
  • 通常适用于转换图像风格
  • 使用时不需要加载模型,只需要在提词中embeddings中的关键tag
  • 本地训练时对计算资源要求不高
  • 可以通过生成的PT文件覆盖在原有基础上继续训练
  • 模型关键字尽量是不常见的词语
  • 推荐训练人物

训练时关键参数设定:

  • learning_rate: 0.05:10, 0.02:20, 0.01:60, 0.005:200, 0.002:500, 0.001:3000, 0.0005
  • number of vectors per token:按图片数量设置(图片数量小于10设置为2,10-30张设置范围2~3,40-60张设置范围5~6,60-100张设置范围8-12,大于100张设置范围12~16)
  • max_train_steps: 3000(起步3000步)

Hypernetwork

Hypernetwork 是一种使用神经网络来生成模型参数的方法。它可以用来从模型内部找到更多相似的东西,使得生成为近似内容图像, 如果你想训练人脸或特定的风格,并且如果你用Hypernetwork生成的 "一切 "看起来都像你的训练数据,那么Hypernetwork是一个不错的选择。你不能生成混合训练的图像,比如一组非常不同风格各异的猫。不过,你可以使用超网络进行绘画,将不同的训练数据纳入一个图像,改变图像的整个输出。

特点:

  • 生成的模型文件比Embedding大,大约几十MB
  • 通常训练艺术风格
  • 推荐训练画风

训练时关键参数设定:

  • learning_rate: 0.000005:1000,0.0000025:10000,0.00000075:20000,0.0000005:30000,0.00000025:-1
  • prompt template file: 对应风格类型文件可以编辑只留下一个 [fileword],[name] 在那里,删除多余的描述

Dreambooth

Dreambooth 是一种使用少量图像来训练模型的方法,是一种基于深度学习的图像风格转换技术。它可以将一张图片的风格应用到另一张图片上,以生成新的图像,Dreambooth 的一个优点是它可以生成高质量的艺术作品,而无需用户具备专业艺术技能

特点:

  • 模型文件很大,2-4GB
  • 适于训练人脸,宠物和物件
  • 使用时需要 加载模型
  • 可以进行模型融合,跟其他模型文件融合成新的模型
  • 本地训练时需要高显存,>=12GB
  • 推荐训练人物*画风

训练时关键参数:

  • 高学习率和过多的训练步骤将导致过度拟合(换句话说,无论提示如何,模型只能从训练数据生成图像)。
  • 低学习率和过少的步骤会导致学习不足,这是因为模型无法生成训练过的概念。
  • 物件:400步,2e-6
  • 人脸:1500步,1e-62e-6
  • Training Steps Per Image (Epochs):(根据你图片的数量设定,大概值为你想训练的总步数/图片数量)
  • Sanity Sample Prompt: 是否过度训练参数设定,我们可以加上一些特征从而去判断训练过程中是否出现过度拟合如填入 person of XX red hair (说明:XX替换为你的关键字,我们在这里加入了红头发的特征,如果出训练输出图像出现了非红头发此时我们就知道过度拟合了,训练过度了)

Lora

Lora是一种使用少量图像来训练模型的方法。与 Dreambooth 不同,LoRA 训练速度更快:当 Dreambooth 需要大约二十分钟才能运行并产生几个 GB 的模型时,LoRA 只需八分钟就能完成训练,并产生约 5MB 的模型,推荐使用kohya_ss GUI 进行lora训练。

特点:

  • 模型大小适中,8~140MB
  • 使用时只需要加载对应的lora模型,可以多个不同的(lora模型+权重)叠加使用
  • 可以进行lora模型其他模型的融合
  • 本地训练时需要显存适中,>=7GB
  • 推荐训练人物

摘自:Stable Diffusion训练方法对比 - maxx的文章 - 知乎 https://zhuanlan.zhihu.com/p/610628741

3 当前主流的SD模型工作流

当前业界有许多人试图通过SD模型实现游戏美术建模、海报设计、设计稿生成等等美术设计工作的效率提升。

目前主流pipline是这样的:

先到https://civitai.com/上找一个好的底层模型:

然后再使用自己的训练图像,使用对训练数据量需求较小的dreambooth方法或者lora方法,训练一个自己的模型。这样可操作空间更大。

关于使用Lora方法的介绍:https://zhuanlan.zhihu.com/p/626260866

比较多做法是:底层模型+lora小模型-->特定风格图像

例如:用AI绘画做游戏美术生成:利用AI在独立游戏项目中大干快上 - HkingAuditore的文章 - 知乎 https://zhuanlan.zhihu.com/p/626004957

当然,训练模型只是工作的一部分。通常还需要一些方法可控地、精细地绘制图画,也就是怎么利用好模型。这些下一节再讨论。

4.如何可控地绘制精细的图画?

3.1 主要问题描述

在当前技术条件下,虽然用一次text2image操作也可以实现不错的效果,但是对细节的掌控往往不能靠简单的prompt就一次达成。

例子:

此图是一副较为精细的杂志封面效果的AI生成图,我在知乎看到的,摘自其使用平台和模型如下:

  • Platform: Stable Diffusion automatic1111 WebUI
  • Model:BreakDomain_m2150
  • VAE:vae-ft-mse-840000-ema-pruned. Ckpt

prompt如下:

suit style, tailored suits, dress shirts, ties, pocket squares, dress shoes, cufflinks, formal attire

虽然其此图效果已经不错,在人物姿态、画风、色彩、布局等方面都挺好。但是也存在一些问题:

  1. 封面上的文字都是不可读的(目前stable diffusion暂时还做不到生成图中文字的可读性,StabilityAI推出的全新开源模型DeepFloyd IF可以做到这一点,详见https://zhuanlan.zhihu.com/p/625873367
  2. 对于一些细节无法直接通过prompt的直接描述来调控,比如人物的姿势,手的姿势,包包的形态。
  3. 难以进行部分修改,当你想要保留此图的一部分内容,然后调控另一部分,不仅不可能,还会导致整幅图重绘出现你想要的东西没出来,不想失去的东西却没了的问题。

以上所有问题的主要原因在于自然语言还是无发对于图像细节进行精确描述导致的。目前的主要解决方案是:

3.2 基于自然语言的改进策略

目前stable diffusion提供像区域提词器方法一遍让用户可以再图像的不同部分进行提示。简单的说,用户需要激活Regional Prompter,然后对每一个区域给出对应的prompt,具体请参考https://stable-diffusion-art.com/regional-prompter/

a man and a woman, a man with black hair

BREAK

a man and a woman, a woman with blonde hair

3.3 基于图生图的改进策略(主流)

但更主流的方式是使用图生图的机制。

  1. 全局指导
    1. 使用草稿图指导img2img生成
      1. 手画扫描
      2. 或直接用PS等绘图软件绘制草稿图
      3. 使用reference-only插件引入全局参考图
    1. 在草稿图中,使用基于语义分割的颜色标签,对画面内容赋予对应内容的色块,然后重绘成想要的内容
    2. 使用stable diffusion的pose插件(例如controllnet)控制人物姿态、位置等信息
    3. 先使用3D建模软件摆出简单造型,然后再放到SD模型中使用img2img方式重绘
      1. 可以操纵3D人物模型摆Pose的软件(例如blender, poser, Daz Studio, clip studio pro)
      2. 直接的3D建模软件 (3Dmax, Maya,甚至一些游戏开发软件如虚幻4)
上图摘自我很喜欢的一篇教程,建议看看:https://aigarlic.fanbox.cc/posts/5928584
  1. 局部重绘
    1. 使用AUTOMATIC1111 webUI的img2img功能,利用mask(遮罩层)盖住不想重绘的部分,然后重绘剩余部分(https://stable-diffusion-art.com/inpainting_basics/
    2. 使用PS等软件将对局部简单修改(例如给人物手里拿个扇子),然后使用img2img方法重绘。也可以用这种方法向画面中添加可识别的文字,详见:https://stable-diffusion-art.com/text-effect/
    3. 也有一些针对局部重绘的改进,重点优化对象是拼贴内容与全局的统一性https://zhuanlan.zhihu.com/p/624584749

  1. 图像放大
    1. 使用AUTOMATIC1111 webUI中的Extras功能,对图像进行分辨率放大,这通常依赖专业的upscaler模型https://stable-diffusion-art.com/ai-upscaler

总而言之,我们的目标是要学会训练自己的模型(使用dreambooth方法或lora方法),然后在这个基础上能够精细出图。