AI大模型教程
一起来学习

Datawhale AI夏令营第四期魔搭-AIGC文生图方向Task3笔记

Datawhale AI夏令营第四期魔搭-AIGC文生图方向Task3笔记

作者: 福州大学 我是一个温柔的刀客

2024/8/16

小伙伴们在经过前两轮的学习过程中是否开始对各种各样的英文概念迷糊了呢? 接下来我将用简单的语言来说明一下这个项目到底是干啥的:

首先,我们这个项目属于人工智能领域,AIGC(人工智能自动生成)分支方向,使用的模型是Stable Diffusion(稳定扩散深度学习模型),它使用了CV(计算机视觉)中常用的DL(深度学习)算法,同时我们采用Lora(低秩矩阵调整法)方法对模型进行微调,此外,我们在一种GUI(图形用户界面)–ComfyUI平台进行微调操作,就可以不用关注底层的代码原理了!

现在感觉是否思路清晰了一些呢? 让我们开启今天的学习吧!!!

1. 初识ComfyUI

1.1 什么是ComfyUI

ComfyUI 是GUI的一种,是基于节点工作的用户界面,主要用于操作图像的生成技术,ComfyUI 的特别之处在于它采用了一种模块化的设计,把图像生成的过程分解成了许多小的步骤,每个步骤都是一个节点。这些节点可以连接起来形成一个工作流程,这样用户就可以根据需要定制自己的图像生成过程。

GUI 是 “Graphical User Interface”(图形用户界面)的缩写。简单来说,GUI 就是你在电脑屏幕上看到的那种有图标、按钮和菜单的交互方式。与早期的命令行界面(CLI)不同,GUI让用户可以通过鼠标点击、拖拽等动作来执行命令,而不是需要记住和输入文本命令。GUI的设计涉及计算机科学、人机交互、视觉艺术和心理学等多个领域,旨在创建用户友好的界面,提高用户体验,降低使用门槛。GUI在现代操作系统(如Microsoft Windows、macOS、Linux的桌面环境)和各种软件应用中普遍应用。

这是官方对于ComfyUI的解释, 是不是依然感觉有些晦涩难懂?

没关系! 利用task2中的工具[通义千问](通义tongyi.ai_你的全能AI助手 (aliyun.com)), 我们可以获得更为通俗易懂的解释: 😉

ComfyUI 是一个开源的图形用户界面(GUI)工具,主要用于简化 Stable Diffusion 这一机器学习模型的使用过程。Stable Diffusion 是一种生成式AI模型,能够根据文本描述生成相应的图像,比如你输入“一只在海边画画的猫”,它就能尝试生成这样一幅画。

ComfyUI 的主要作用是让非技术背景的用户也能轻松地使用 Stable Diffusion 模型,而不需要深入理解背后的复杂算法或编写代码。它的界面设计得像一个工作流编辑器,用户可以通过拖拽和连接不同的节点来构建自己的图像生成流程。

工作原理大致如下:

节点和连线:ComfyUI 使用节点代表不同的功能,比如文本输入节点、图像生成节点、参数调整节点等。用户通过连线将这些节点连接起来,形成一个处理流程。

配置参数:每个节点都有可配置的参数,用户可以根据需要调整,比如生成图像的尺寸、使用的模型版本、生成图像的数量等。

执行流程:用户构建好流程后,点击运行,ComfyUI 就会按照设定的顺序执行各个节点的功能,最终输出结果。

结果反馈:生成的图像会在界面上显示出来,用户可以查看效果,并根据需要修改流程或参数重新生成。

通过这种方式,ComfyUI 降低了使用 AI 图像生成技术的门槛,使得更多的人能够探索和利用这一前沿技术进行创作或研究。

1.2 ComfyUI核心模块

核心模块由模型加载器、提示词管理器、采样器、解码器构成.

🚀CLIP:CLIP(Contrastive Language-Image Pre-training)(对比语言-图像预训练)是一个由OpenAI开发的深度学习模型,用于理解和生成图像与文本之间的关联。CLIP模型的核心能力在于它能够学会将图像和描述图像的文本配对,即使是在训练过程中未曾见过的数据上,也能做出准确的匹配。

基本工作原理: 多模态数据集(指包含两种或多种不同类型数据的数据集,这些数据类型可以是文本、图像、音频、视频、传感器数据等)–对比学习(优化损失函数)–零样本学习zero-shot learning(对新的图像和文本进行分类或描述)

🚢OpenAI: OpenAI是一家致力于研究、开发并应用友好型人工智能(AI)的非营利组织,后来转变为一个混合性质的营利与非营利结构,旨在平衡财务回报与科研目标。OpenAI成立于2015年12月,由一群科技企业家和投资者共同创立,其中包括埃隆·马斯克(Elon Musk)、萨姆·奥特曼(Sam Altman)、彼得·泰尔(Peter Thiel)等知名人物。

OpenAI的一些著名研究成果包括:

  • GPT系列模型:Generative Pre-trained Transformer,是自然语言处理领域的重要进展,能够生成连贯且高质量的文本,以及完成各种NLP任务,如翻译、问答、摘要等。
  • DALL·E和DALL·E 2:能够根据文本描述生成图像的AI系统。
  • CLIP:一种用于理解和生成图像与文本之间关联的模型。
  • MuZero:一种无需规则就能掌握复杂游戏的AI系统,比如围棋、国际象棋和电子游戏。

🚠Stable Diffusion: Stable Diffusion是一个深度学习模型,主要用于生成图像,它基于扩散模型(Diffusion Models)的概念。扩散模型是一种概率模型,其核心思想是在前向过程中逐渐添加噪声使数据模糊,然后在后向过程中学习如何逐步去除噪声并恢复原始数据。Stable Diffusion 特别之处在于它的高效性和可访问性,它能够在普通的GPU上运行,而不需要像某些其他生成模型那样需要大量的计算资源。

Stable Diffusion 模型最初由 Stability AI 开发,它是对潜在扩散模型的一种改进,通过使用潜在变量来加速训练过程和减少计算需求。模型在大规模的数据集上进行了预训练,能够根据文本提示生成各种复杂和逼真的图像。

Stable Diffusion 的工作流程大致如下:

  1. 文本编码:将文本提示转换为向量表示。
  2. 噪声注入:开始时,模型接收随机噪声作为输入。
  3. 去噪过程:模型学习如何逐步减少噪声,并在每个步骤中引入文本向量的影响,从而生成与文本相关的图像。
  4. 图像生成:最终输出是一个与给定文本描述相匹配的新图像。

由于其开源性质和相对较低的硬件要求,Stable Diffusion 成为了研究人员和爱好者中非常流行的选择,用于艺术创作、图像生成和其他创意项目。

1.3 ComfyUI图片生成流程

2. 20分钟速通安装ComfyUI

在这里,我们依旧选择使用魔搭社区提供的Notebook和免费的GPU算力体验来体验ComfyUI:

2.1 下载脚本代码文件

下载安装ComfyUI的执行文件task1中微调完成Lora文件:

Python
git lfs install
git clone https://www.modelscope.cn/datasets/maochase/kolors_test_comfyui.git
mv kolors_test_comfyui/* ./
rm -rf kolors_test_comfyui/
mkdir -p /mnt/workspace/models/lightning_logs/version_0/checkpoints/
mv epoch=0-step=500.ckpt /mnt/workspace/models/lightning_logs/version_0/checkpoints/   


2.2 进入ComfyUI的安装文件

2.3 一键执行安装程序并且进入预览界面


3. 浅尝ComfyUI工作流

3.1 不带LoRA的工作流样例

Step1: 下载工作流脚本

​ [这里是不带LoRA的脚本代码]

复制上述的代码到 Vscode或者你自己的python的 IDE中粘贴, 另存为桌面上, 命名为:Kolars_example.

3.2 带LoRA的工作流样例

​ [这里是带LoRA的脚本代码]

复制上述的代码到 Vscode或者你自己的python的 IDE中粘贴, 另存为桌面上, 命名为 Kolars_with_lora_example.

1. 这里的Lora是我们Task1微调训练出来的文件
2. 地址是:/mnt/workspace/models/lightning_logs/version_0/checkpoints/epoch=0-step=500.ckpt
3. 大家如有有其他的Lora文件,可以在下面截图Lora文件地址区域更换成自己的地址

4.一些资源网站

名称 链接地址
在魔搭使用ComfyUI,玩转AIGC! https://modelscope.cn/headlines/article/429
ComfyUI的官方地址 https://github.com/comfyanonymous/ComfyUI
ComfyUI官方示范 https://comfyanonymous.github.io/ComfyUI_examples/
别人的基础工作流示范 https://github.com/cubiq/ComfyUI_Workflowshttps://github.com/wyrde/wyrde-comfyui-workflows
工作流分享网站 https://comfyworkflows.com/
推荐一个比较好的comfyui的github仓库网站 https://github.com/ZHO-ZHO-ZHO/ComfyUI-Workflows-ZHO?tab=readme-ov-file

5.Lora微调

5.1 Lora简介

5.2 Lora微调的优势

5.3 Lora详解

Python
import os
cmd = """
python DiffSynth-Studio/examples/train/kolors/train_kolors_lora.py  # 选择使用可图的Lora训练脚本DiffSynth-Studio/examples/train/kolors/train_kolors_lora.py
  --pretrained_unet_path models/kolors/Kolors/unet/diffusion_pytorch_model.safetensors  # 选择unet模型
  --pretrained_text_encoder_path models/kolors/Kolors/text_encoder  # 选择text_encoder
  --pretrained_fp16_vae_path models/sdxl-vae-fp16-fix/diffusion_pytorch_model.safetensors  # 选择vae模型
  --lora_rank 16  # lora_rank 16 表示在权衡模型表达能力和训练效率时,选择了使用 16 作为秩,适合在不显著降低模型性能的前提下,通过 LoRA 减少计算和内存的需求
  --lora_alpha 4.0  # 设置 LoRA 的 alpha 值,影响调整的强度
  --dataset_path data/lora_dataset_processed  # 指定数据集路径,用于训练模型
  --output_path ./models  # 指定输出路径,用于保存模型
  --max_epochs 1  # 设置最大训练轮数为 1
  --center_crop  # 启用中心裁剪,这通常用于图像预处理
  --use_gradient_checkpointing  # 启用梯度检查点技术,以节省内存
  --precision "16-mixed" # 指定训练时的精度为混合 16 位精度(half precision),这可以加速训练并减少显存使用
""".strip()
os.system(cmd) # 执行可图Lora训练   

参数详情表:

5.4 UNet、VAE和文本编码器的协作关系

  • UNet:负责根据输入的噪声和文本条件生成图像。在Stable Diffusion模型中,UNet接收由VAE编码器产生的噪声和文本编码器转换的文本向量作为输入,并预测去噪后的噪声,从而生成与文本描述相符的图像.
  • VAE:生成模型,用于将输入数据映射到潜在空间,并从中采样以生成新图像。在Stable Diffusion中,VAE编码器首先生成带有噪声的潜在表示,这些表示随后与文本条件一起输入到UNet中.
  • 文本编码器:将文本输入转换为模型可以理解的向量表示。在Stable Diffusion模型中,文本编码器使用CLIP模型将文本提示转换为向量,这些向量与VAE生成的噪声一起输入到UNet中,指导图像的生成过程.

6. 如何准备一个高质量的数据集

当我们进行图片生成相关的工作时,选择合适的数据集是非常重要的。如何找到适合自己的数据集呢,这里给大家整理了一些重要的参考维度,希望可以帮助你快速找到适合的数据集:

6.1 明确你的需求和目标

  • 关注应用场景:确定你的模型将被应用到什么样的场景中(例如,艺术风格转换、产品图像生成、医疗影像合成等)。
  • 关注数据类型:你需要什么样的图片?比如是真实世界的照片还是合成图像?是黑白的还是彩色的?是高分辨率还是低分辨率?
  • 关注数据量:考虑你的任务应该需要多少图片来支持训练和验证。

6.2数据集来源整理

以下渠道来源均需要考虑合规性问题,请大家在使用数据集过程中谨慎选择。

来源类型 推荐
公开的数据平台 魔搭社区内开放了近3000个数据集,涉及文本、图像、音频、视频和多模态等多种场景,左侧有标签栏帮助快速导览,大家可以看看有没有自己需要的数据集。
其他数据平台推荐:
ImageNet:包含数百万张图片,广泛用于分类任务,也可以用于生成任务。
Open Images:由Google维护,包含数千万张带有标签的图片。
Flickr:特别是Flickr30kK和Flickr8K数据集,常用于图像描述任务。
CelebA:专注于人脸图像的数据集。
LSUN (Large-scale Scene Understanding):包含各种场景类别的大规模数据集。
使用API或爬虫获取 如果需要特定类型的内容,可以利用API从图库网站抓取图片,如Unsplash、Pexels等。使用网络爬虫技术从互联网上抓取图片,但需要注意版权问题。
数据合成 利用现有的图形引擎(如Unity、Unreal Engine)或特定软件生成合成数据,这在训练某些类型的模型时非常有用。最近Datawhale联合阿里云天池,做了一整套多模态大模型数据合成的学习,欢迎大家一起交流。从零入门多模态大模型数据合成
数据增强 对于较小的数据集,可以通过旋转、翻转、缩放、颜色变换等方式进行数据增强。
购买或定制 如果你的应用是特定领域的,比如医学影像、卫星图像等,建议从靠谱的渠道购买一些数据集。

魔搭社区数据集:

附录:代码块

[这里是不带LoRA的脚本代码]:

      
{
  "last_node_id": 15,
  "last_link_id": 18,
  "nodes": [
    {
      "id": 11,
      "type": "VAELoader",
      "pos": [
        1323,
        240
      ],
      "size": {
        "0": 315,
        "1": 58
      },
      "flags": {},
      "order": 0,
      "mode": 0,
      "outputs": [
        {
          "name": "VAE",
          "type": "VAE",
          "links": [
            12
          ],
          "shape": 3
        }
      ],
      "properties": {
        "Node name for S&R": "VAELoader"
      },
      "widgets_values": [
        "sdxl.vae.safetensors"
      ]
    },
    {
      "id": 10,
      "type": "VAEDecode",
      "pos": [
        1368,
        369
      ],
      "size": {
        "0": 210,
        "1": 46
      },
      "flags": {},
      "order": 6,
      "mode": 0,
      "inputs": [
        {
          "name": "samples",
          "type": "LATENT",
          "link": 18
        },
        {
          "name": "vae",
          "type": "VAE",
          "link": 12,
          "slot_index": 1
        }
      ],
      "outputs": [
        {
          "name": "IMAGE",
          "type": "IMAGE",
          "links": [
            13
          ],
          "shape": 3,
          "slot_index": 0
        }
      ],
      "properties": {
        "Node name for S&R": "VAEDecode"
      }
    },
    {
      "id": 14,
      "type": "KolorsSampler",
      "pos": [
        1011,
        371
      ],
      "size": {
        "0": 315,
        "1": 222
      },
      "flags": {},
      "order": 5,
      "mode": 0,
      "inputs": [
        {
          "name": "kolors_model",
          "type": "KOLORSMODEL",
          "link": 16
        },
        {
          "name": "kolors_embeds",
          "type": "KOLORS_EMBEDS",
          "link": 17
        }
      ],
      "outputs": [
        {
          "name": "latent",
          "type": "LATENT",
          "links": [
            18
          ],
          "shape": 3,
          "slot_index": 0
        }
      ],
      "properties": {
        "Node name for S&R": "KolorsSampler"
      },
      "widgets_values": [
        1024,
        1024,
        1000102404233412,
        "fixed",
        25,
        5,
        "EulerDiscreteScheduler"
      ]
    },
    {
      "id": 6,
      "type": "DownloadAndLoadKolorsModel",
      "pos": [
        201,
        368
      ],
      "size": {
        "0": 315,
        "1": 82
      },
      "flags": {},
      "order": 1,
      "mode": 0,
      "outputs": [
        {
          "name": "kolors_model",
          "type": "KOLORSMODEL",
          "links": [
            16
          ],
          "shape": 3,
          "slot_index": 0
        }
      ],
      "properties": {
        "Node name for S&R": "DownloadAndLoadKolorsModel"
      },
      "widgets_values": [
        "Kwai-Kolors/Kolors",
        "fp16"
      ]
    },
    {
      "id": 3,
      "type": "PreviewImage",
      "pos": [
        1366,
        468
      ],
      "size": [
        535.4001724243165,
        562.2001106262207
      ],
      "flags": {},
      "order": 7,
      "mode": 0,
      "inputs": [
        {
          "name": "images",
          "type": "IMAGE",
          "link": 13
        }
      ],
      "properties": {
        "Node name for S&R": "PreviewImage"
      }
    },
    {
      "id": 12,
      "type": "KolorsTextEncode",
      "pos": [
        519,
        529
      ],
      "size": [
        457.2893696934723,
        225.28656056301645
      ],
      "flags": {},
      "order": 4,
      "mode": 0,
      "inputs": [
        {
          "name": "chatglm3_model",
          "type": "CHATGLM3MODEL",
          "link": 14,
          "slot_index": 0
        }
      ],
      "outputs": [
        {
          "name": "kolors_embeds",
          "type": "KOLORS_EMBEDS",
          "links": [
            17
          ],
          "shape": 3,
          "slot_index": 0
        }
      ],
      "properties": {
        "Node name for S&R": "KolorsTextEncode"
      },
      "widgets_values": [
        "cinematic photograph of an astronaut riding a horse in space |nillustration of a cat wearing a top hat and a scarf  |nphotograph of a goldfish in a bowl |nanime screencap of a red haired girl",
        "",
        1
      ]
    },
    {
      "id": 15,
      "type": "Note",
      "pos": [
        200,
        636
      ],
      "size": [
        273.5273818969726,
        149.55464588512064
      ],
      "flags": {},
      "order": 2,
      "mode": 0,
      "properties": {
        "text": ""
      },
      "widgets_values": [
        "Text encoding takes the most VRAM, quantization can reduce that a lot.nnApproximate values I have observed:nfp16 - 12 GBnquant8 - 8-9 GBnquant4 - 4-5 GBnnquant4 reduces the quality quite a bit, 8 seems fine"
      ],
      "color": "#432",
      "bgcolor": "#653"
    },
    {
      "id": 13,
      "type": "DownloadAndLoadChatGLM3",
      "pos": [
        206,
        522
      ],
      "size": [
        274.5334274291992,
        58
      ],
      "flags": {},
      "order": 3,
      "mode": 0,
      "outputs": [
        {
          "name": "chatglm3_model",
          "type": "CHATGLM3MODEL",
          "links": [
            14
          ],
          "shape": 3
        }
      ],
      "properties": {
        "Node name for S&R": "DownloadAndLoadChatGLM3"
      },
      "widgets_values": [
        "fp16"
      ]
    }
  ],
  "links": [
    [
      12,
      11,
      0,
      10,
      1,
      "VAE"
    ],
    [
      13,
      10,
      0,
      3,
      0,
      "IMAGE"
    ],
    [
      14,
      13,
      0,
      12,
      0,
      "CHATGLM3MODEL"
    ],
    [
      16,
      6,
      0,
      14,
      0,
      "KOLORSMODEL"
    ],
    [
      17,
      12,
      0,
      14,
      1,
      "KOLORS_EMBEDS"
    ],
    [
      18,
      14,
      0,
      10,
      0,
      "LATENT"
    ]
  ],
  "groups": [],
  "config": {},
  "extra": {
    "ds": {
      "scale": 1.1,
      "offset": {
        "0": -114.73954010009766,
        "1": -139.79705810546875
      }
    }
  },
  "version": 0.4
}

    

[这里是带LoRA的脚本代码]:

      
{
  "last_node_id": 16,
  "last_link_id": 20,
  "nodes": [
    {
      "id": 11,
      "type": "VAELoader",
      "pos": [
        1323,
        240
      ],
      "size": {
        "0": 315,
        "1": 58
      },
      "flags": {},
      "order": 0,
      "mode": 0,
      "outputs": [
        {
          "name": "VAE",
          "type": "VAE",
          "links": [
            12
          ],
          "shape": 3
        }
      ],
      "properties": {
        "Node name for S&R": "VAELoader"
      },
      "widgets_values": [
        "sdxl.vae.safetensors"
      ]
    },
    {
      "id": 10,
      "type": "VAEDecode",
      "pos": [
        1368,
        369
      ],
      "size": {
        "0": 210,
        "1": 46
      },
      "flags": {},
      "order": 7,
      "mode": 0,
      "inputs": [
        {
          "name": "samples",
          "type": "LATENT",
          "link": 18
        },
        {
          "name": "vae",
          "type": "VAE",
          "link": 12,
          "slot_index": 1
        }
      ],
      "outputs": [
        {
          "name": "IMAGE",
          "type": "IMAGE",
          "links": [
            13
          ],
          "shape": 3,
          "slot_index": 0
        }
      ],
      "properties": {
        "Node name for S&R": "VAEDecode"
      }
    },
    {
      "id": 15,
      "type": "Note",
      "pos": [
        200,
        636
      ],
      "size": {
        "0": 273.5273742675781,
        "1": 149.5546417236328
      },
      "flags": {},
      "order": 1,
      "mode": 0,
      "properties": {
        "text": ""
      },
      "widgets_values": [
        "Text encoding takes the most VRAM, quantization can reduce that a lot.nnApproximate values I have observed:nfp16 - 12 GBnquant8 - 8-9 GBnquant4 - 4-5 GBnnquant4 reduces the quality quite a bit, 8 seems fine"
      ],
      "color": "#432",
      "bgcolor": "#653"
    },
    {
      "id": 13,
      "type": "DownloadAndLoadChatGLM3",
      "pos": [
        206,
        522
      ],
      "size": {
        "0": 274.5334167480469,
        "1": 58
      },
      "flags": {},
      "order": 2,
      "mode": 0,
      "outputs": [
        {
          "name": "chatglm3_model",
          "type": "CHATGLM3MODEL",
          "links": [
            14
          ],
          "shape": 3
        }
      ],
      "properties": {
        "Node name for S&R": "DownloadAndLoadChatGLM3"
      },
      "widgets_values": [
        "fp16"
      ]
    },
    {
      "id": 6,
      "type": "DownloadAndLoadKolorsModel",
      "pos": [
        201,
        368
      ],
      "size": {
        "0": 315,
        "1": 82
      },
      "flags": {},
      "order": 3,
      "mode": 0,
      "outputs": [
        {
          "name": "kolors_model",
          "type": "KOLORSMODEL",
          "links": [
            19
          ],
          "shape": 3,
          "slot_index": 0
        }
      ],
      "properties": {
        "Node name for S&R": "DownloadAndLoadKolorsModel"
      },
      "widgets_values": [
        "Kwai-Kolors/Kolors",
        "fp16"
      ]
    },
    {
      "id": 12,
      "type": "KolorsTextEncode",
      "pos": [
        519,
        529
      ],
      "size": {
        "0": 457.28936767578125,
        "1": 225.28656005859375
      },
      "flags": {},
      "order": 4,
      "mode": 0,
      "inputs": [
        {
          "name": "chatglm3_model",
          "type": "CHATGLM3MODEL",
          "link": 14,
          "slot_index": 0
        }
      ],
      "outputs": [
        {
          "name": "kolors_embeds",
          "type": "KOLORS_EMBEDS",
          "links": [
            17
          ],
          "shape": 3,
          "slot_index": 0
        }
      ],
      "properties": {
        "Node name for S&R": "KolorsTextEncode"
      },
      "widgets_values": [
        "二次元,长发,少女,白色背景",
        "",
        1
      ]
    },
    {
      "id": 3,
      "type": "PreviewImage",
      "pos": [
        1366,
        469
      ],
      "size": {
        "0": 535.400146484375,
        "1": 562.2001342773438
      },
      "flags": {},
      "order": 8,
      "mode": 0,
      "inputs": [
        {
          "name": "images",
          "type": "IMAGE",
          "link": 13
        }
      ],
      "properties": {
        "Node name for S&R": "PreviewImage"
      }
    },
    {
      "id": 16,
      "type": "LoadKolorsLoRA",
      "pos": [
        606,
        368
      ],
      "size": {
        "0": 317.4000244140625,
        "1": 82
      },
      "flags": {},
      "order": 5,
      "mode": 0,
      "inputs": [
        {
          "name": "kolors_model",
          "type": "KOLORSMODEL",
          "link": 19
        }
      ],
      "outputs": [
        {
          "name": "kolors_model",
          "type": "KOLORSMODEL",
          "links": [
            20
          ],
          "shape": 3,
          "slot_index": 0
        }
      ],
      "properties": {
        "Node name for S&R": "LoadKolorsLoRA"
      },
      "widgets_values": [
        "/mnt/workspace/models/lightning_logs/version_0/checkpoints/epoch=0-step=500.ckpt",
        2
      ]
    },
    {
      "id": 14,
      "type": "KolorsSampler",
      "pos": [
        1011,
        371
      ],
      "size": {
        "0": 315,
        "1": 266
      },
      "flags": {},
      "order": 6,
      "mode": 0,
      "inputs": [
        {
          "name": "kolors_model",
          "type": "KOLORSMODEL",
          "link": 20
        },
        {
          "name": "kolors_embeds",
          "type": "KOLORS_EMBEDS",
          "link": 17
        },
        {
          "name": "latent",
          "type": "LATENT",
          "link": null
        }
      ],
      "outputs": [
        {
          "name": "latent",
          "type": "LATENT",
          "links": [
            18
          ],
          "shape": 3,
          "slot_index": 0
        }
      ],
      "properties": {
        "Node name for S&R": "KolorsSampler"
      },
      "widgets_values": [
        1024,
        1024,
        0,
        "fixed",
        25,
        5,
        "EulerDiscreteScheduler",
        1
      ]
    }
  ],
  "links": [
    [
      12,
      11,
      0,
      10,
      1,
      "VAE"
    ],
    [
      13,
      10,
      0,
      3,
      0,
      "IMAGE"
    ],
    [
      14,
      13,
      0,
      12,
      0,
      "CHATGLM3MODEL"
    ],
    [
      17,
      12,
      0,
      14,
      1,
      "KOLORS_EMBEDS"
    ],
    [
      18,
      14,
      0,
      10,
      0,
      "LATENT"
    ],
    [
      19,
      6,
      0,
      16,
      0,
      "KOLORSMODEL"
    ],
    [
      20,
      16,
      0,
      14,
      0,
      "KOLORSMODEL"
    ]
  ],
  "groups": [],
  "config": {},
  "extra": {
    "ds": {
      "scale": 1.2100000000000002,
      "offset": {
        "0": -183.91309381910426,
        "1": -202.11110769225016
      }
    }
  },
  "version": 0.4
}

    

关注我,主页更多人工智能知识学习哟!

完结撒花

文章来源于互联网:Datawhale AI夏令营第四期魔搭-AIGC文生图方向Task3笔记

赞(0)
未经允许不得转载:5bei.cn大模型教程网 » Datawhale AI夏令营第四期魔搭-AIGC文生图方向Task3笔记

Datawhale AI夏令营第四期魔搭-AIGC文生图方向Task1笔记

(赛题链接:可图Kolors-LoRA风格故事挑战赛_创新应用大赛_天池大赛

(学习链接:‌‍​‍​​​​‬⁠‍​‬‌‌​​​‌​⁠​​​‌​‍​​​‬​​‬‬‬​​​‍​⁠​‍​从零入门AI生图原理&实践

想知道如何得到美美的图吗?

想知道如何免费AI出自己想象的画面吗?

AIGC文生图满足你的需求!

速通指南

一、开通阿里云PAI-DSW试用

二、在魔搭社区进行授权

注:新用户需要先注册 & 绑定阿里云账号

三、在魔搭社区创建PAI实例!(点击即可跳转)

四、30 分钟体验一站式 baseline!

1.输入终端

git lfs install
git clone https://www.modelscope.cn/datasets/maochase/kolors.git

调整prompt,设置你想要的图片风格,依次修改8张图片的描述(DIY自己喜欢的图片吧

 五、关闭PAI实例!!!!(点击即可跳转)

文生图的介绍、历史和概念

一、介绍

AIGC文生图是指利用人工智能技术,特别是深度学习技术,通过输入文本描述(即“提示词”或“关键词”)来自动生成对应图像的过程。这种技术融合了自然语言处理、计算机视觉等多个领域的知识,使得机器能够理解和生成复杂的视觉内容。

二、历史

发展阶段

发展介绍

早期探索

(20世纪60年代-20世纪90年代)

文生图的概念最早出现于计算机视觉和图像处理的早期研究中。

早期的图像生成技术主要依赖于规则和模板匹配,通过预定义的规则将文本转换为简单的图形。

然而,由于计算能力和算法的限制,这一阶段的技术能力非常有限,生成的图像质量较低,应用场景也非常有限。

基于统计模型的方法

(2000年代)

进入2000年代,随着统计模型和机器学习技术的发展,文生图技术开始得到更多关注。

研究者们开始利用概率图模型和统计语言模型来生成图像。尽管这一阶段的技术在生成图像的多样性和质量上有了一定提升,但由于模型的复杂性和计算资源的限制,生成的图像仍然较为粗糙,不够逼真。

深度学习的崛起

(2010年代)

2010年代是文生图技术发展的一个重要转折点。随着深度学习,尤其是卷积神经网络(CNN)和生成对抗网络(GAN)的发展,文生图技术取得了突破性进展。2014年,Goodfellow等人提出的GAN模型通过生成器和判别器的对抗训练,极大地提升了图像生成的质量。随后,各类变种GAN模型被提出,如DCGAN、Pix2Pix等,使得文生图技术在生成逼真图像方面达到了前所未有的高度。

大规模预训练模型

(2020年代)

进入2020年代,大规模预训练模型如OpenAI的CLIP、DALL-E以及Stable Diffusion等的出现,标志着文生图技术进入了一个新的时代。

CLIP通过大规模的文本和图像配对数据训练,能够理解和生成高度一致的文本和图像;DALL-E和Stable Diffusion进一步提升了生成图像的创意和细节表现能力,使得通过简单的文本描述生成高质量、复杂图像成为可能。

这些技术的应用范围从艺术创作、广告设计到辅助医疗诊断,展现了广泛的商业价值和社会影响力。

三、知识概念

Lora

Stable Diffusion中的Lora(LoRA)模型是一种轻量级的微调方法,它代表了“Low-Rank Adaptation”,即低秩适应。Lora不是指单一的具体模型,而是指一类通过特定微调技术应用于基础模型的扩展应用。在Stable Diffusion这一文本到图像合成模型的框架下,Lora被用来对预训练好的大模型进行针对性优化,以实现对特定主题、风格或任务的精细化控制。

Baseline代码的解读

1.环境安装

!pip install simple-aesthetics-predictor

!pip install -v -e data-juicer

!pip uninstall pytorch-lightning -y
!pip install peft lightning pandas torchvision

!pip install -e DiffSynth-Studio

安装和配置一些与AI生成内容(AIGC),特别是与图像生成相关的库和框架。

2.下载数据集


from modelscope.msdatasets import MsDataset

ds = MsDataset.load(
    'AI-ModelScope/lowres_anime',
    subset_name='default',
    split='train',
    cache_dir="/mnt/workspace/kolors/data"
)

import json, os
from data_juicer.utils.mm_utils import SpecialTokens
from tqdm import tqdm

os.makedirs("./data/lora_dataset/train", exist_ok=True)
os.makedirs("./data/data-juicer/input", exist_ok=True)
with open("./data/data-juicer/input/metadata.jsonl", "w") as f:
    for data_id, data in enumerate(tqdm(ds)):
        image = data["image"].convert("RGB")
        image.save(f"/mnt/workspace/kolors/data/lora_dataset/train/{data_id}.jpg")
        metadata = {"text": "二次元", "image": [f"/mnt/workspace/kolors/data/lora_dataset/train/{data_id}.jpg"]}
        f.write(json.dumps(metadata))
        f.write("n")

该代码片段中,使用modelscope.msdatasets库来加载一个名为AI-ModelScope/lowres_anime的数据集,这个数据集包含了一些低分辨率的动漫图片是图像生成或图像到文本/文本到图像的转换任务时,准备数据以便进行后续处理或训练的一个常见步骤。

3.处理数据集,保存数据处理结果

data_juicer_config = """
# global parameters
project_name: 'data-process'
dataset_path: './data/data-juicer/input/metadata.jsonl'  # path to your dataset directory or file
np: 4  # number of subprocess to process your dataset

text_keys: 'text'
image_key: 'image'
image_special_token: ''

export_path: './data/data-juicer/output/result.jsonl'

# process schedule
# a list of several process operators with their arguments
process:
    - image_shape_filter:
        min_width: 1024
        min_height: 1024
        any_or_all: any
    - image_aspect_ratio_filter:
        min_ratio: 0.5
        max_ratio: 2.0
        any_or_all: any
"""
with open("data/data-juicer/data_juicer_config.yaml", "w") as file:
    file.write(data_juicer_config.strip())

!dj-process --config data/data-juicer/data_juicer_config.yaml


import pandas as pd
import os, json
from PIL import Image
from tqdm import tqdm


texts, file_names = [], []
os.makedirs("./data/lora_dataset_processed/train", exist_ok=True)
with open("./data/data-juicer/output/result.jsonl", "r") as file:
    for data_id, data in enumerate(tqdm(file.readlines())):
        data = json.loads(data)
        text = data["text"]
        texts.append(text)
        image = Image.open(data["image"][0])
        image_path = f"./data/lora_dataset_processed/train/{data_id}.jpg"
        image.save(image_path)
        file_names.append(f"{data_id}.jpg")
data_frame = pd.DataFrame()
data_frame["file_name"] = file_names
data_frame["text"] = texts
data_frame.to_csv("./data/lora_dataset_processed/train/metadata.csv", index=False, encoding="utf-8-sig")
data_frame

定义了data_juicer的配置文件,用于处理图像数据集。使用dj-process命令来应用,将处理后的结果保存到一个新的JSONL文件中。最后,读取处理后的JSONL文件,将图像保存到新的文件夹中,并将元数据信息提取到Pandas DataFrame中,最终将DataFrame保存为CSV文件。

4.lora微调

# 下载模型
from diffsynth import download_models
download_models(["Kolors", "SDXL-vae-fp16-fix"])

#模型训练
import os

cmd = """
python DiffSynth-Studio/examples/train/kolors/train_kolors_lora.py 
  --pretrained_unet_path models/kolors/Kolors/unet/diffusion_pytorch_model.safetensors 
  --pretrained_text_encoder_path models/kolors/Kolors/text_encoder 
  --pretrained_fp16_vae_path models/sdxl-vae-fp16-fix/diffusion_pytorch_model.safetensors 
  --lora_rank 16 
  --lora_alpha 4.0 
  --dataset_path data/lora_dataset_processed 
  --output_path ./models 
  --max_epochs 1 
  --center_crop 
  --use_gradient_checkpointing 
  --precision "16-mixed"
""".strip()

os.system(cmd)

使用diffsynth库的download_models函数下载了两个模型:KolorsSDXL-vae-fp16-fix

然后,构建了一个命令行字符串,用于执行DiffSynth-Studio中的train_kolors_lora.py脚本来训练一个lora)模型。

5.加载微调好的模型

from diffsynth import ModelManager, SDXLImagePipeline
from peft import LoraConfig, inject_adapter_in_model
import torch


def load_lora(model, lora_rank, lora_alpha, lora_path):
    lora_config = LoraConfig(
        r=lora_rank,
        lora_alpha=lora_alpha,
        init_lora_weights="gaussian",
        target_modules=["to_q", "to_k", "to_v", "to_out"],
    )
    model = inject_adapter_in_model(lora_config, model)
    state_dict = torch.load(lora_path, map_location="cpu")
    model.load_state_dict(state_dict, strict=False)
    return model


# Load models
model_manager = ModelManager(torch_dtype=torch.float16, device="cuda",
                             file_path_list=[
                                 "models/kolors/Kolors/text_encoder",
                                 "models/kolors/Kolors/unet/diffusion_pytorch_model.safetensors",
                                 "models/kolors/Kolors/vae/diffusion_pytorch_model.safetensors"
                             ])
pipe = SDXLImagePipeline.from_model_manager(model_manager)

# Load LoRA
pipe.unet = load_lora(
    pipe.unet,
    lora_rank=16, # This parameter should be consistent with that in your training script.
    lora_alpha=2.0, # lora_alpha can control the weight of LoRA.
    lora_path="models/lightning_logs/version_0/checkpoints/epoch=0-step=500.ckpt"
)

加载预训练的模型(ModelManager),创建一个SDXLImagePipeline,并向该管道的unet部分注入一个lora模型。

6.生成图片

torch.manual_seed(0)
image = pipe(
    prompt="二次元,一个紫色短发小女孩,在家中沙发上坐着,双手托着腮,很无聊,全身,粉色连衣裙",
    negative_prompt="丑陋、变形、嘈杂、模糊、低对比度",
    cfg_scale=4,
    num_inference_steps=50, height=1024, width=1024,
)
image.save("1.jpg")

就可以通过正反描述词来绘制自己想要的图片啦!!!

我の想法

这个真实一个超级有意思的方向哦,可以通过描述,文生图来构建画面,快来试试吧!!

文章来源于互联网:Datawhale AI夏令营第四期魔搭-AIGC文生图方向Task1笔记

相关推荐: llamafile本地安装配置并部署及远程测试大语言模型详细实战教程

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老 导航 檀越剑指大厂系列:全面总结…

赞(0)
未经允许不得转载:5bei.cn大模型教程网 » Datawhale AI夏令营第四期魔搭-AIGC文生图方向Task1笔记

Datawhale AI夏令营第四期魔搭-AIGC文生图方向Task1笔记

不用写一行代码,只需要跟着步骤点点点,就可以完成task01!

本笔记可视作学习手册速通指南的扩充版本。

灰色的备注是关于该步骤的解释和拓展,可以先跳过,等走完所有步骤再回头看!

 第一步 搭建代码环境

1.1 阿里云PAI-DSW申请

阿里云PAI-DSW(Data Science Workshop)是一个云端的开发工具平台,就像是你租用了一台非常强大的远程电脑主机。这台“主机”提供了你需要的一切工具和资源来创建和训练AI模型,不用担心你自己的电脑性能是否足够强大。

在本次比赛中,PAI-DSW的作用是:

训练模型: 使用PAI-DSW的计算能力,你可以训练你的LoRA模型,让它学会如何生成各种风格的图片。

管理项目: 在PAI-DSW上,你可以组织和管理你的项目文件和数据,包括代码的存放以及模型和输出的存储等。

所以,我们第一步需要进入阿里云PAI-DSW官网来开通领取5000算力时,为接下来环境的搭建等后续工作做准备。

点击任一红色箭头指向的蓝色链接
阿里云免费试用 – 阿里云

 

弹出窗口,打开支付宝扫码,点击授权

 

标回到原窗口,再次点击“立即试用”—>勾选—>“立即试用”题

 

显示此界面即可关闭该网页

1.2 授权魔搭社区

魔搭社区(ModelScope)是阿里云推出的AI模型开源社区,旨在为开发者提供一站式的模型体验、下载、调优、训练、推理和部署服务。社区涵盖了广泛的AI模型和数据集,支持多模态(包括文本、图像、声音等)和多领域(如智能语音、图像处理、自然语言处理等)的应用​。

魔搭社区类似于阿里云PAI-DSW这台性能强大的主机的操作系统。你可以在魔搭社区中创建和管理你的项目,进行模型训练等。

魔搭社区的作用:

创建PAI实例: 在魔搭社区中创建你的PAI实例,设置工作环境。

Notebook功能支持: 魔搭社区与阿里云合作,提供由阿里云支持的Notebook功能,方便你进行代码编写和模型训练。

上传和分享模型: 将你训练好的LoRA模型上传到魔搭社区,分享给评委和其他参赛者。

发布作品: 在魔搭社区的讨论区发布你的8图故事作品,展示你的图像风格和故事情节。

所以,接下来,我们来到魔搭社区官网,绑定阿里云PAI-DSW。

点击任一红色箭头指向的蓝色链接
魔搭社区

 

如果没有登录过就点击“登录/注册”,然后回到教程点击刚刚的蓝色链接
魔搭社区

 

点击“去授权”

 

点击“复制”—>“去授权”

 

点击“同意授权”

 

粘贴刚刚复制的UID,点击“确定”

 

1.3 报名参赛

本夏令营和比赛紧密结合,通过实时提交结果返回成绩来检验自己的学习成果

可图Kolors-LoRA风格故事挑战赛,旨在通过生成图片来讲述连贯的故事,并培养大家的AI实践能力,与本赛道密切相关。

下一步是报名参赛,由于第一步已经注册登录阿里云,所以省去再次登录等步骤。

可图Kolors-LoRA风格故事挑战赛_创新应用大赛_天池大赛-阿里云天池的赛制

 

 

关闭窗口即可,无需组建或加入团队

1.4 创建PAI实例

PAI实例可以看作是操作系统中的一个账户,如果要和这个系统交互,那么系统中至少有一个账户。每个账户都有自己独立的工作空间和资源,互不干扰。

在本次比赛中,创建PAI实例的作用是:

训练模型: 使用PAI实例的计算资源来训练你的LoRA模型,让它学会生成各种风格的图片。

管理项目: 在PAI实例中存储和管理你的代码、数据和模型文件,确保所有项目文件都井井有条。

确保资源独立: 确保本比赛项目和其他项目互不干扰,以后需要用到PAI,可以创建新的实例,而不需要基于本比赛项目的实例。

回到魔搭界面,如果已经关闭可以点击蓝色链接跳转
魔搭社区

 

点击“创建实例”

 

这里要改选成第二个,其他地方不用改动

 

往下滑,点击“下一步”,然后点击“创建实例”

 

自动跳转回该界面,等待约2-3分钟,状态变为“运行中”,点击其右侧的“打开”

 

跳转至该界面,已经成功一半了!

第二步 30分钟体验一站式Baseline

正如一开始所说,你不需要写一行代码,因为代码已经现成完整、可以直接运行。

我们以后的学习将会围绕看懂代码,修改一点点代码,优化代码性能以达到更好的更满意的结果。

但是接下来,你只需要跟着步骤一步一步动动鼠标跑通Baseline,就可以得到你的第一个结果!

2.1 下载赛题数据和Baseline 

点击Terminal

在使用阿里云PAI-DSW进行AI文生图比赛时,你需要通过终端(Terminal)执行一些命令来获取和准备必要的资源。这些命令的主要作用如下:

为什么需要在终端输入 git lfs installgit clone 命令?

1. git lfs install

作用: git lfs(Git Large File Storage)是一个用于处理大文件的Git扩展工具。执行 git lfs install 是为了安装和配置这个工具,使其能够在Git中处理大文件。

原因: 在AI模型和数据集中,通常包含一些较大的文件,例如图像或模型参数。这些文件可能会超过普通Git仓库的处理能力。git lfs 可以帮助你管理和下载这些大文件,确保你的项目能够顺利运行。

2. git clone https://www.modelscope.cn/datasets/maochase/kolors.git

作用: git clone 命令用于从远程仓库下载整个项目到本地计算机。这个命令会将位于ModelScope上的Kolors数据集代码和相关文件复制到你的PAI实例中。

原因: 你需要这个数据集来训练你的LoRA模型。通过 git clone 下载数据集,可以确保你拥有最新版本的数据和代码,以便开始进行训练和开发。

这些步骤是为了准备你的工作环境,确保你可以顺利进行模型训练和项目开发。

复制如下代码并按Enter

git lfs install
git clone https://www.modelscope.cn/datasets/maochase/kolors.git

2.2 进入Baseline 

双击进入文件夹

 

双击该文件

 

2.3 准备工作

在参加AI文生图比赛的过程中,安装 Data-Juicer 和 DiffSynth-Studio 是准备工作的关键步骤。这两个工具分别负责数据处理和模型训练,确保你能够顺利地从原始数据到生成最终的图像。

Data-Juicer 是一个专门用于数据处理和转换的工具。它的主要功能是简化数据的提取、转换和加载过程。

 

使用 Data-Juicer 来整理和转换数据,使数据适合用于训练。这一步骤确保你的数据能够被正确读取和处理,提高模型训练的效果。

DiffSynth-Studio 是一个用于高效微调和训练大模型的工具。它提供了优化的训练环境和功能,帮助你在基础模型上进行微调。

使用 DiffSynth-Studio 来微调和训练你的LoRA模型。它提供的高效训练环境和功能帮助你在基础模型的基础上进行优化,使其能够生成各种风格的图片

等待10分钟

 

点击此按钮重启Kernel,腾出内存空间

2.4 运行剩余Baseline

静静等待半个小时…

 

大功告成!

 

还差一点点…

第三步 提交结果

回到Terminal

 

 

复制以下代码到Terminal并按Enter

mkdir /mnt/workspace/kolors/output & cd 
cp /mnt/workspace/kolors/models/lightning_logs/version_0/checkpoints/epoch=0-step=500.ckpt /mnt/workspace/kolors/output/
cp /mnt/workspace/kolors/1.jpg /mnt/workspace/kolors/output/

 

双击output文件夹

 

分别保存output文件夹下的两个文件

标题

 

填写内容,上传文件,点击“创建”

代码的具体解析待续.. 

 

文章来源于互联网:Datawhale AI夏令营第四期魔搭-AIGC文生图方向Task1笔记

赞(0)
未经允许不得转载:5bei.cn大模型教程网 » Datawhale AI夏令营第四期魔搭-AIGC文生图方向Task1笔记
分享到: 更多 (0)

AI大模型,我们的未来

小欢软考联系我们