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

打印 上一主题 下一主题

主题 859|帖子 859|积分 2577

目录

相识AI生图技术
1.AI生图前言
 2.AI生图历史
3.通过魔搭社区探索AI生图前沿
 Part1:磨刀准备一一认识通义千问(AI智能助手)
Part2:精读baseline——从零入门AI生图
1.分析代码的主体框架
安装和卸载依靠包(!pip下令)
加载数据集
3.数据预处置惩罚
4. 使用 Data-Juicer 进行数据处置惩罚
 5.数据整理与训练
6.图像天生
7.合并图像
Part3:实战演练
结果展示
相识AI生图技术

1.AI生图前言

AIGC(AI-Generated Content)是通过人工智能技术自动天生内容的生产方式,很早就有专家指出,AIGC将是未来人工智能的重点方向,也将改造相干行业和领域生产内容的方式。
   小常识:警惕Deepfake技术
  Deepfake技术是一种使用人工智能技术天生的伪造媒体,特殊是视频和音频。它们能够学习真实数据的特性,并天生新的、逼真的数据。
  Deepfake技术固然在多个领域展现出其创新潜力,但其滥用也带来了一系列严肃的危害。在政治领域,Deepfake大概被用来制造假新闻或操纵舆论,影响推选效果和政治稳固。经济上,它大概粉碎企业形象,引发市场恐慌,甚至操纵股市。法律体系也面临挑战,由于伪造的证据大概误导司法判定。此外,深度伪造技术还大概加剧身份盗窃的风险,成为恐怖分子的新工具,煽惑暴力和社会动荡,威胁国家安全。
  由此衍生的Deepfake攻防技术 从零入门CV图像比赛(Deepfake攻防)
   2.AI生图历史

20世纪70年代,艺术家哈罗德·科恩(Harold Cohen)发明AARON,可通过机械臂输出作画。
现代的AI生图模子大多基于深度神经网络根本上训练,最早可追溯到2012年吴恩达训练出的能天生“猫脸”的模子。使用卷积神经网络(CNN)训练,证明白深度学习模子能够学习到图像的复杂特性。
2015年,谷歌推出了“深梦”(Deep Dream)图像天生工具,类似一个高级滤镜,可以基于给定的图片天生梦幻版图片
2021 年 1 月 OpenAI 推出DALL-E模子(一个深度学习算法模子,是GPT-3 语言处置惩罚模子的一个衍生版本),能直接从文本提示“按需创造”风格多样的图形设计
一般来说,AI生图模子属于多模态呆板学习模子,通过海量的图库和文本形貌的深度神经网络学习,最终的目标是可以根据输入的指示(不管是文本还是图片还是任何)天生符合语义的图片
AI生图模子 每每可以照猫画虎绘制出类似的画作,在2022年8月AI生图真正走进了大众的视野,让各个领域无法忽视
3.通过魔搭社区探索AI生图前沿


Kolors(可图)模子(点击即可跳转魔搭模子介绍页) 是快手开源的文本到图像天生模子,该模子具有对英语和汉语的深刻明白,并能够天生高质量、逼真的图像。
   Kolors(可图)模子(点击即可跳转魔搭模子介绍页)代码开源链接:https://github.com/Kwai-Kolors/Kolors
  模子开源链接:https://modelscope.cn/models/Kwai-Kolors/Kolors
  技术陈诉链接:https://github.com/Kwai-Kolors/Kolors/blob/master/imgs/Kolors_paper.pdf
  魔搭研习社最佳实践分析:https://www.modelscope.cn/learn/575?pid=543
   Part1:磨刀准备一一认识通义千问(AI智能助手)

Part2:精读baseline——从零入门AI生图

文生图代码的框架结构:

baseline中的所有代码整理出来,代码结构如下: 
  1. !pip install simple-aesthetics-predictor
  2. !pip install -v -e data-juicer
  3. !pip uninstall pytorch-lightning -y
  4. !pip install peft lightning pandas torchvision
  5. !pip install -e DiffSynth-Studio
  6. from modelscope.msdatasets import MsDataset
  7. ds = MsDataset.load(
  8.     'AI-ModelScope/lowres_anime',
  9.     subset_name='default',
  10.     split='train',
  11.     cache_dir="/mnt/workspace/kolors/data"
  12. )
  13. import json, os
  14. from data_juicer.utils.mm_utils import SpecialTokens
  15. from tqdm import tqdm
  16. os.makedirs("./data/lora_dataset/train", exist_ok=True)
  17. os.makedirs("./data/data-juicer/input", exist_ok=True)
  18. with open("./data/data-juicer/input/metadata.jsonl", "w") as f:
  19.     for data_id, data in enumerate(tqdm(ds)):
  20.         image = data["image"].convert("RGB")
  21.         image.save(f"/mnt/workspace/kolors/data/lora_dataset/train/{data_id}.jpg")
  22.         metadata = {"text": "二次元", "image": [f"/mnt/workspace/kolors/data/lora_dataset/train/{data_id}.jpg"]}
  23.         f.write(json.dumps(metadata))
  24.         f.write("\n")
  25. data_juicer_config = """
  26. # global parameters
  27. project_name: 'data-process'
  28. dataset_path: './data/data-juicer/input/metadata.jsonl'  # path to your dataset directory or file
  29. np: 4  # number of subprocess to process your dataset
  30. text_keys: 'text'
  31. image_key: 'image'
  32. image_special_token: '<__dj__image>'
  33. export_path: './data/data-juicer/output/result.jsonl'
  34. # process schedule
  35. # a list of several process operators with their arguments
  36. process:
  37.     - image_shape_filter:
  38.         min_width: 1024
  39.         min_height: 1024
  40.         any_or_all: any
  41.     - image_aspect_ratio_filter:
  42.         min_ratio: 0.5
  43.         max_ratio: 2.0
  44.         any_or_all: any
  45. """
  46. with open("data/data-juicer/data_juicer_config.yaml", "w") as file:
  47.     file.write(data_juicer_config.strip())
  48. !dj-process --config data/data-juicer/data_juicer_config.yaml
  49. import pandas as pd
  50. import os, json
  51. from PIL import Image
  52. from tqdm import tqdm
  53. texts, file_names = [], []
  54. os.makedirs("./data/data-juicer/output/images", exist_ok=True)
  55. with open("./data/data-juicer/output/result.jsonl", "r") as f:
  56.     for line in tqdm(f):
  57.         metadata = json.loads(line)
  58.         texts.append(metadata["text"])
  59.         file_names.append(metadata["image"][0])
  60. df = pd.DataFrame({"text": texts, "file_name": file_names})
  61. df.to_csv("./data/data-juicer/output/result.csv", index=False)
  62. df
  63. from transformers import CLIPProcessor, CLIPModel
  64. import torch
  65. model = CLIPModel.from_pretrained("openai/clip-vit-base-patch32")
  66. processor = CLIPProcessor.from_pretrained("openai/clip-vit-base-patch32")
  67. images = [Image.open(img_path) for img_path in df["file_name"]]
  68. inputs = processor(text=df["text"].tolist(), images=images, return_tensors="pt", padding=True)
  69. outputs = model(**inputs)
  70. logits_per_image = outputs.logits_per_image  # this is the image-text similarity score
  71. probs = logits_per_image.softmax(dim=1)  # we can take the softmax to get the probabilities
  72. probs
  73. from torch.utils.data import Dataset, DataLoader
  74. class CustomDataset(Dataset):
  75.     def __init__(self, df, processor):
  76.         self.texts = df["text"].tolist()
  77.         self.images = [Image.open(img_path) for img_path in df["file_name"]]
  78.         self.processor = processor
  79.     def __len__(self):
  80.         return len(self.texts)
  81.     def __getitem__(self, idx):
  82.         inputs = self.processor(text=self.texts[idx], images=self.images[idx], return_tensors="pt", padding=True)
  83.         return inputs
  84. dataset = CustomDataset(df, processor)
  85. dataloader = DataLoader(dataset, batch_size=8)
  86. for batch in dataloader:
  87.     outputs = model(**batch)
  88.     logits_per_image = outputs.logits_per_image
  89.     probs = logits_per_image.softmax(dim=1)
  90.     print(probs)
  91. import torch
  92. from diffusers import StableDiffusionPipeline
  93. torch.manual_seed(1)
  94. pipe = StableDiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v-1-4", torch_dtype=torch.float16)
  95. pipe = pipe.to("cuda")
  96. prompt = "二次元,一个紫色长发小女孩穿着粉色吊带漏肩连衣裙,在练习室练习唱歌,手持话筒"
  97. negative_prompt = "丑陋、变形、嘈杂、模糊、低对比度"
  98. guidance_scale = 4
  99. num_inference_steps = 50
  100. image = pipe(
  101.     prompt=prompt,
  102.     negative_prompt=negative_prompt,
  103.     guidance_scale=guidance_scale,
  104.     num_inference_steps=num_inference_steps,
  105.     height=1024,
  106.     width=1024,
  107. ).images[0]
  108. image.save("example_image.png")
  109. image
  110. from PIL import Image
  111. torch.manual_seed(1)
  112. image = pipe(
  113.     prompt="二次元,日系动漫,演唱会的观众席,人山人海,一个紫色短发小女孩穿着粉色吊带漏肩连衣裙坐在演唱会的观众席,舞台上衣着华丽的歌星们在唱歌",
  114.     negative_prompt="丑陋、变形、嘈杂、模糊、低对比度",
  115.     cfg_scale=4,
  116.     num_inference_steps=50, height=1024, width=1024,
  117. )
  118. image.save("1.jpg")
  119. torch.manual_seed(1)
  120. image = pipe(
  121.     prompt="二次元,一个紫色短发小女孩穿着粉色吊带漏肩连衣裙坐在演唱会的观众席,露出憧憬的神情",
  122.     negative_prompt="丑陋、变形、嘈杂、模糊、低对比度,色情擦边",
  123.     cfg_scale=4,
  124.     num_inference_steps=50, height=1024, width=1024,
  125. )
  126. image.save("2.jpg")
  127. torch.manual_seed(2)
  128. image = pipe(
  129.     prompt="二次元,一个紫色短发小女孩穿着粉色吊带漏肩连衣裙坐在演唱会的观众席,露出憧憬的神情",
  130.     negative_prompt="丑陋、变形、嘈杂、模糊、低对比度,色情擦边",
  131.     cfg_scale=4,
  132.     num_inference_steps=50, height=1024, width=1024,
  133. )
  134. image.save("3.jpg")
  135. torch.manual_seed(5)
  136. image = pipe(
  137.     prompt="二次元,一个紫色短发小女孩穿着粉色吊带漏肩连衣裙,对着流星许愿,闭着眼睛,十指交叉,侧面",
  138.     negative_prompt="丑陋、变形、嘈杂、模糊、低对比度,扭曲的手指,多余的手指",
  139.     cfg_scale=4,
  140.     num_inference_steps=50, height=1024, width=1024,
  141. )
  142. image.save("4.jpg")
  143. torch.manual_seed(0)
  144. image = pipe(
  145.     prompt="二次元,一个紫色中等长度头发小女孩穿着粉色吊带漏肩连衣裙,在练习室练习唱歌",
  146.     negative_prompt="丑陋、变形、嘈杂、模糊、低对比度",
  147.     cfg_scale=4,
  148.     num_inference_steps=50, height=1024, width=1024,
  149. )
  150. image.save("5.jpg")
  151. torch.manual_seed(1)
  152. image = pipe(
  153.     prompt="二次元,一个紫色长发小女孩穿着粉色吊带漏肩连衣裙,在练习室练习唱歌,手持话筒",
  154.     negative_prompt="丑陋、变形、嘈杂、模糊、低对比度",
  155.     cfg_scale=4,
  156.     num_inference_steps=50, height=1024, width=1024,
  157. )
  158. image.save("6.jpg")
  159. torch.manual_seed(7)
  160. image = pipe(
  161.     prompt="二次元,紫色长发少女,穿着黑色连衣裙,试衣间,心情忐忑",
  162.     negative_prompt="丑陋、变形、嘈杂、模糊、低对比度",
  163.     cfg_scale=4,
  164.     num_inference_steps=50, height=1024, width=1024,
  165. )
  166. image.save("7.jpg")
  167. torch.manual_seed(0)
  168. image = pipe(
  169.     prompt="二次元,紫色长发少女,穿着黑色礼服,连衣裙,在台上唱歌",
  170.     negative_prompt="丑陋、变形、嘈杂、模糊、低对比度",
  171.     cfg_scale=4,
  172.     num_inference_steps=50, height=1024, width=1024,
  173. )
  174. image.save("8.jpg")
  175. import numpy as np
  176. from PIL import Image
  177. images = [np.array(Image.open(f"{i}.jpg")) for i in range(1, 9)]
  178. image = np.concatenate([
  179.     np.concatenate(images[0:2], axis=1),
  180.     np.concatenate(images[2:4], axis=1),
  181.     np.concatenate(images[4:6], axis=1),
  182.     np.concatenate(images[6:8], axis=1),
  183. ], axis=0)
  184. image = Image.fromarray(image).resize((1024, 2048))
  185. image
复制代码
1.分析代码的主体框架


  • 安装和卸载依靠包(!pip下令)

    使用!pip 下令来安装或卸载 Python 包。包括:

    • 卸载 pytorch-lightning(使用 -y 自动确认卸载)。
    • simple-aesthetics-predictor, data-juicer, peft, lightning, pandas, torchvision, 和 DiffSynth-Studio 的安装。

  • 加载数据集

    使用 ModelScope 的 MsDataset 类加载名为 AI-ModelScope/lowres_anime 的数据集,并指定子集名称为 default 和分割为 train,缓存目录设置为 /mnt/workspace/kolors/data。
   

  • PIL.Image: 用于图像处置惩罚。
  • torch: 深度学习库PyTorch的核心模块。
  • torchvision.models, torchvision.transforms, torchvision.datasets: 用于处置惩罚图像数据和构建模子。
  • torch.nn, torch.nn.functional: 用于构建神经网络。
  • torch.optim: 用于优化算法。
  • torch.autograd.Variable: 用于自动求导。
  • Dataset: 用于自定义数据集。
  • timm: 用于加载预训练模子。
  • time: 用于计时。
  • pandas, numpy: 用于数据处置惩罚。
  • cv2: 用于图像处置惩罚。
  • tqdm_notebook: 用于表现进度条。
  3.数据预处置惩罚

        将数据集中的图像转换为 RGB 模式,并生存到指定目录。
        创建包罗图像路径和文本形貌的元数据文件 metadata.jsonl。
        编写并生存 data_juicer_config.yaml 配置文件,用于后续的数据过滤和处置惩罚。
   

  • torch.manual_seed(0): 设置随机种子,确保效果可复现。
  • torch.backends.cudnn.deterministic = False: 关闭确定性,提高训练速度。
  • torch.backends.cudnn.benchmark = True: 启用基准测试,自动选择最优算法。
  4. 使用 Data-Juicer 进行数据处置惩罚

   

  • AverageMeter: 用于计算和存储平均值和当前值,方便在训练和验证过程中跟踪损失和准确率。
  • ProgressMeter: 用于打印训练和验证过程中的进度,表现当前批次和总批次数。
  • validate: 验证函数,计算模子在验证集上的准确率和损失。使用torch.no_grad()确保在验证过程中不计算梯度。
  • predict: 推测函数,计算模子在测试集上的推测效果。使用torch.no_grad()确保在推测过程中不计算梯度。
  • train: 训练函数,计算模子在训练集上的损失和准确率,并进行梯度更新。使用model.train()确保模子处于训练模式。
   5.数据整理与训练

        1.读取 result.jsonl 文件中的数据,并将其转换为 Pandas DataFrame,然后生存为 CSV 文件,并且将图片生存到./data/lora_dataset_processed/train文件夹下。
        2.下载模子download_models(["Kolors", "SDXL-vae-fp16-fix"])
        3.在前面模子的根本上,执行Lora微调训练
        4.加载微调后的模子
6.图像天生



  • 设置正向提示词,反向提示词,执行次数,图片尺寸
  • 设置随机种子,控制图片是否可以重复天生,并将图像生存为 .jpg 文件。
7.合并图像

        末了,将天生的多个图像合并成一个大图像,并调解大小。
 执行过程(通义千问):


  1. # 安装 Data-Juicer 和 DiffSynth-Studio
  2. !pip install simple-aesthetics-predictor # 安装simple-aesthetics-predictor
  3. !pip install -v -e data-juicer # 安装data-juicer
  4. !pip uninstall pytorch-lightning -y # 卸载pytorch-lightning
  5. !pip install peft lightning pandas torchvision # 安装 peft lightning pandas torchvision
  6. !pip install -e DiffSynth-Studio # 安装DiffSynth-Studio
  7. # 从魔搭数据集中下载数据集AI-ModelScope/lowres_anime
  8. from modelscope.msdatasets import MsDataset  #引入数据集模块msdatasets
  9. ds = MsDataset.load(
  10.     'AI-ModelScope/lowres_anime',
  11.     subset_name='default',
  12.     split='train',
  13.     cache_dir="/mnt/workspace/kolors/data" # 指定缓存目录
  14. ) # 从魔搭数据集中下载数据集AI-ModelScope/lowres_anime,赋值给参数ds
  15. # 生成数据集
  16. import json, os # 导入json和os模块
  17. from data_juicer.utils.mm_utils import SpecialTokens # 导入SpecialTokens
  18. from tqdm import tqdm # 导入tqdm进度条管理
  19. os.makedirs("./data/lora_dataset/train", exist_ok=True) # 创建文件夹./data/lora_dataset/train
  20. os.makedirs("./data/data-juicer/input", exist_ok=True) # 创建文件夹./data/data-juicer/input
  21. with open("./data/data-juicer/input/metadata.jsonl", "w") as f:
  22.     for data_id, data in enumerate(tqdm(ds)): # 遍历数据集ds
  23.         image = data["image"].convert("RGB") # 将数据集的图片转换为RGB
  24.         image.save(f"/mnt/workspace/kolors/data/lora_dataset/train/{data_id}.jpg") # 保存数据集的图片
  25.         metadata = {"text": "二次元", "image": [f"/mnt/workspace/kolors/data/lora_dataset/train/{data_id}.jpg"]} # 生成当前图片的索引数据
  26.         f.write(json.dumps(metadata)) # 将索引数据写入文件./data/data-juicer/input/metadata.jsonl
  27.         f.write("\n")
  28. # 配置data-juicer,并进行数据筛选过滤
  29. # 配置过滤的规则
  30. data_juicer_config = """
  31. # global parameters
  32. project_name: 'data-process' # 名称
  33. dataset_path: './data/data-juicer/input/metadata.jsonl'  # 你前面生成的数据的索引文件
  34. np: 4  # 线程数
  35. text_keys: 'text' # 文件./data/data-juicer/input/metadata.jsonl的描述的字段名
  36. image_key: 'image' # 文件./data/data-juicer/input/metadata.jsonl的图片字段名
  37. image_special_token: '<__dj__image>'
  38. export_path: './data/data-juicer/output/result.jsonl' # 筛选通过的图片结果保存的的索引文件
  39. # process schedule
  40. # a list of several process operators with their arguments
  41. # 过滤的规则
  42. process:
  43.     - image_shape_filter: # 图片尺寸过滤
  44.         min_width: 1024 # 最小宽度1024
  45.         min_height: 1024 # 最小高度1024
  46.         any_or_all: any # 符合前面条件的图片才会被保留
  47.     - image_aspect_ratio_filter: # 图片长宽比过滤
  48.         min_ratio: 0.5 # 最小长宽比0.5
  49.         max_ratio: 2.0 # 最大长宽比2.0
  50.         any_or_all: any # 符合前面条件的图片才会被保留
  51. """
  52. # 保存data-juicer配置到data/data-juicer/data_juicer_config.yaml
  53. with open("data/data-juicer/data_juicer_config.yaml", "w") as file:
  54.     file.write(data_juicer_config.strip())
  55. # data-juicer开始执行数据筛选
  56. !dj-process --config data/data-juicer/data_juicer_config.yaml
  57. # 通过前面通过data-juicer筛选的图片索引信息./data/data-juicer/output/result.jsonl,生成数据集
  58. import pandas as pd # 导入pandas
  59. import os, json # 导入os和json
  60. from PIL import Image # 导入Image
  61. from tqdm import tqdm # 导入tqdm进度条管理
  62. texts, file_names = [], [] # 定义两个空列表,分别存储图片描述和图片名称
  63. os.makedirs("./data/lora_dataset_processed/train", exist_ok=True) # 创建文件夹./data/lora_dataset_processed/train
  64. with open("./data/data-juicer/output/result.jsonl", "r") as file: # 打开前面data-juicer筛选的图片索引文件./data/data-juicer/output/result.jsonl
  65.     for data_id, data in enumerate(tqdm(file.readlines())): # 遍历文件./data/data-juicer/output/result.jsonl
  66.         data = json.loads(data) # 将json字符串转换为对象
  67.         text = data["text"] # 获取对象中的text属性,也就是图片的描述信息
  68.         texts.append(text) # 将图片的描述信息添加到texts列表中
  69.         image = Image.open(data["image"][0]) # 获取对象中的image属性,也就是图片的路径,然后用这个路径打开图片
  70.         image_path = f"./data/lora_dataset_processed/train/{data_id}.jpg" # 生成保存图片的路径
  71.         image.save(image_path) # 将图片保存到./data/lora_dataset_processed/train文件夹中
  72.         file_names.append(f"{data_id}.jpg") # 将图片名称添加到file_names列表中
  73. data_frame = pd.DataFrame() # 创建空的DataFrame
  74. data_frame["file_name"] = file_names # 将图片名称添加到data_frame中
  75. data_frame["text"] = texts # 将图片描述添加到data_frame中
  76. data_frame.to_csv("./data/lora_dataset_processed/train/metadata.csv", index=False, encoding="utf-8-sig") # 将data_frame保存到./data/lora_dataset_processed/train/metadata.csv
  77. data_frame # 查看data_frame
  78. # 下载可图模型
  79. from diffsynth import download_models # 导入download_models
  80. download_models(["Kolors", "SDXL-vae-fp16-fix"]) # 下载可图模型
  81. # DiffSynth-Studio提供了可图的Lora训练脚本,查看脚本信息
  82. !python DiffSynth-Studio/examples/train/kolors/train_kolors_lora.py -h
  83. # 执行可图Lora训练
  84. import os
  85. cmd = """
  86. python DiffSynth-Studio/examples/train/kolors/train_kolors_lora.py \ # 选择使用可图的Lora训练脚本DiffSynth-Studio/examples/train/kolors/train_kolors_lora.py
  87.   --pretrained_unet_path models/kolors/Kolors/unet/diffusion_pytorch_model.safetensors \ # 选择unet模型
  88.   --pretrained_text_encoder_path models/kolors/Kolors/text_encoder \ # 选择text_encoder
  89.   --pretrained_fp16_vae_path models/sdxl-vae-fp16-fix/diffusion_pytorch_model.safetensors \ # 选择vae模型
  90.   --lora_rank 16 \ # lora_rank 16 表示在权衡模型表达能力和训练效率时,选择了使用 16 作为秩,适合在不显著降低模型性能的前提下,通过 LoRA 减少计算和内存的需求
  91.   --lora_alpha 4.0 \ # 设置 LoRA 的 alpha 值,影响调整的强度
  92.   --dataset_path data/lora_dataset_processed \ # 指定数据集路径,用于训练模型
  93.   --output_path ./models \ # 指定输出路径,用于保存模型
  94.   --max_epochs 1 \ # 设置最大训练轮数为 1
  95.   --center_crop \ # 启用中心裁剪,这通常用于图像预处理
  96.   --use_gradient_checkpointing \ # 启用梯度检查点技术,以节省内存
  97.   --precision "16-mixed" # 指定训练时的精度为混合 16 位精度(half precision),这可以加速训练并减少显存使用
  98. """.strip()
  99. os.system(cmd) # 执行可图Lora训练
  100. # 加载lora微调后的模型
  101. from diffsynth import ModelManager, SDXLImagePipeline # 导入ModelManager和SDXLImagePipeline
  102. from peft import LoraConfig, inject_adapter_in_model # 导入LoraConfig和inject_adapter_in_model
  103. import torch # 导入torch
  104. # 加载LoRA配置并注入模型
  105. def load_lora(model, lora_rank, lora_alpha, lora_path):
  106.     lora_config = LoraConfig(
  107.         r=lora_rank, # 设置LoRA的秩(rank)
  108.         lora_alpha=lora_alpha, # 设置LoRA的alpha值,控制LoRA的影响权重
  109.         init_lora_weights="gaussian", # 初始化LoRA权重为高斯分布
  110.         target_modules=["to_q", "to_k", "to_v", "to_out"], # 指定要应用LoRA的模块
  111.     )
  112.     model = inject_adapter_in_model(lora_config, model) # 将LoRA配置注入到模型中
  113.     state_dict = torch.load(lora_path, map_location="cpu") # 加载LoRA微调后的权重
  114.     model.load_state_dict(state_dict, strict=False) # 将权重加载到模型中,允许部分权重不匹配
  115.     return model # 返回注入LoRA后的模型
  116. # 加载预训练模型
  117. model_manager = ModelManager(
  118.     torch_dtype=torch.float16, # 设置模型的数据类型为float16,减少显存占用
  119.     device="cuda", # 指定使用GPU进行计算
  120.     file_path_list=[
  121.         "models/kolors/Kolors/text_encoder", # 文本编码器的路径
  122.         "models/kolors/Kolors/unet/diffusion_pytorch_model.safetensors", # UNet模型的路径
  123.         "models/kolors/Kolors/vae/diffusion_pytorch_model.safetensors" # VAE模型的路径
  124.     ]
  125. )
  126. # 初始化图像生成管道
  127. pipe = SDXLImagePipeline.from_model_manager(model_manager) # 从模型管理器中加载模型并初始化管道
  128. # 加载并应用LoRA权重到UNet模型
  129. pipe.unet = load_lora(
  130.     pipe.unet,
  131.     lora_rank=16, # 设置LoRA的秩(rank),与训练脚本中的参数保持一致
  132.     lora_alpha=2.0, # 设置LoRA的alpha值,控制LoRA对模型的影响权重
  133.     lora_path="models/lightning_logs/version_0/checkpoints/epoch=0-step=500.ckpt" # 指定LoRA权重的文件路径
  134. )
  135. # 生成图像
  136. torch.manual_seed(0) # 设置随机种子,确保生成的图像具有可重复性。如果想要每次生成不同的图像,可以将种子值改为随机值。
  137. image = pipe(
  138.     prompt="二次元,一个紫色短发小女孩,在家中沙发上坐着,双手托着腮,很无聊,全身,粉色连衣裙", # 设置正向提示词,用于指导模型生成图像的内容
  139.     negative_prompt="丑陋、变形、嘈杂、模糊、低对比度", # 设置负向提示词,模型会避免生成包含这些特征的图像
  140.     cfg_scale=4, # 设置分类自由度 (Classifier-Free Guidance) 的比例,数值越高,模型越严格地遵循提示词
  141.     num_inference_steps=50, # 设置推理步数,步数越多,生成的图像细节越丰富,但生成时间也更长
  142.     height=1024, width=1024, # 设置生成图像的高度和宽度,这里生成 1024x1024 像素的图像
  143. )
  144. image.save("1.jpg") # 将生成的图像保存为 "1.jpg" 文件
  145. # 图像拼接,展示总体拼接大图
  146. import numpy as np  # 导入numpy库,用于处理数组和数值计算
  147. from PIL import Image  # 导入PIL库中的Image模块,用于图像处理
  148. images = [np.array(Image.open(f"{i}.jpg")) for i in range(1, 9)]  # 读取1.jpg到8.jpg的图像,转换为numpy数组,并存储在列表images中
  149. image = np.concatenate([  # 将四组图像在垂直方向上拼接
  150.     np.concatenate(images[0:2], axis=1),  # 将第1组(images[0:2])的两张图像在水平方向上拼接
  151.     np.concatenate(images[2:4], axis=1),  # 将第2组(images[2:4])的两张图像在水平方向上拼接
  152.     np.concatenate(images[4:6], axis=1),  # 将第3组(images[4:6])的两张图像在水平方向上拼接
  153.     np.concatenate(images[6:8], axis=1),  # 将第4组(images[6:8])的两张图像在水平方向上拼接
  154. ], axis=0)  # 将四组拼接后的图像在垂直方向上拼接
  155. image = Image.fromarray(image).resize((1024, 2048))  # 将拼接后的numpy数组转换为图像对象,并调整大小为1024x2048像素
  156. image  # 输出最终生成的图像对象,用于显示图像
复制代码
Part3:实战演练

  1. 你是一个文生图专家,我们现在要做一个实战项目,就是要编排一个文生图话剧
  2. 话剧由8张场景图片生成,你需要输出每张图片的生图提示词
  3. 具体的场景图片
  4. 1、女主正在上课
  5. 2、开始睡着了
  6. 3、进入梦乡,梦到自己站在路旁
  7. 4、王子骑马而来
  8. 5、两人相谈甚欢
  9. 6、一起坐在马背上
  10. 7、下课了,梦醒了
  11. 8、又回到了学习生活中
  12. 生图提示词要求
  13. 1、风格为古风
  14. 2、根据场景确定是使用全身还是上半身
  15. 3、人物描述
  16. 4、场景描述
  17. 5、做啥事情
  18. 例子:
  19. 古风,水墨画,一个黑色长发少女,坐在教室里,盯着黑板,深思,上半身,红色长裙
复制代码
 询问通义,联合AI内容进行微调
结果展示




免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

千千梦丶琪

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表