Datawhale X 魔搭 AI夏令营-第四期 AIGC-Task 2

张春  金牌会员 | 2024-10-28 19:24:36 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 689|帖子 689|积分 2067

目录
认识AI助手——通义千问
操纵指南
主要功能模块
精读baseline代码
分析代码的主体架构
逐行解释代码
其他疑问-向AI追问
进行实战——基于话剧的连环画制作
提示词准备
执行Task1的30分钟速通Baseline
修改提示词
生成图片
测试美学打分
更多尝试——scepter webui

认识AI助手——通义千问

操纵指南

        注册/登录账号【通义的注册与登录步骤类似,不必要额外注册】

主要功能模块


  • 对话,支持文字输入,文件上传等模式,我们本次课程主要使用当前模块;
  • 服从,各种学习办公小工具;
  • 智能体,通义的智能体应用市场,大家可以根据本身的需求找到许多有意思的小应用。

精读baseline代码

先看一下baseline代码的框架结构:

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
复制代码
分析代码的主体架构

输入Prompt
   你是一个良好的python开发工程师,现在我们必要你帮我们分析这个代码的主体框架,你需
  要把代码按照工作流分成几部分,用中文答复我的问题。{此处替换前面的代码}
  返回的结果
   这段代码可以分为以下几个主要的工作流程部分:
   1. 情况准备与依赖安装
这一部分通过命令行指令安装所需的Python包和库:
- 使用 `!pip install` 命令来安装或卸载所需的库。
- 安装的库包罗 `simple-aesthetics-predictor`, `data-juicer`, `peft`, `lightning`, `pandas`, `torchvision`, 和 `DiffSynth-Studio`。
  2. 数据集加载与预处置惩罚
这部分代码从 ModelScope 加载了一个名为 `lowres_anime` 的数据集,并将其保存到指定目录下:
- 使用 `MsDataset.load()` 方法加载数据集。
- 遍历数据会合的每条数据,将图像转换为 RGB 模式并保存到磁盘上。
- 将每条数据的元数据(包罗文本形貌和图像路径)写入 JSONL 文件中。
  3. 数据清洗与过滤
在这一步,使用 `data-juicer` 对数据进行进一步的处置惩罚:
- 创建一个 YAML 设置文件,定义数据处置惩罚的参数,如图像尺寸过滤和宽高比过滤。
- 使用 `dj-process` 命令行工具根据设置文件对数据进行处置惩罚。
  4. 数据整理与特征提取
这部分代码读取颠末处置惩罚的数据,并利用 CLIP 模型盘算图像与文本之间的相似度:
- 从处置惩罚后的输出文件中读取数据并创建 DataFrame。
- 使用 CLIP 模型和处置惩罚器来盘算图像和文本的相似度得分。
  5. 数据集构建
这里构建了一个 PyTorch 数据集类,并创建了 DataLoader 以供后续训练使用:
- 定义了一个自定义的 `CustomDataset` 类继续自 `torch.utils.data.Dataset`。
- 使用 `DataLoader` 从自定义的数据会合加载批次数据。
  6. 图像生成
这部分代码利用 `diffusers` 库中的 `StableDiffusionPipeline` 生成二次元风格的图像:
- 加载预训练模型。
- 设置随机种子以确保生成结果的一致性。
- 通过调用 `pipe` 方法并传递不同的提示来生成多张图像。
- 保存生成的图像到磁盘。
  7. 图像拼接展示
最后,代码将生成的多个图像拼接成一张大图以便展示:
- 使用 NumPy 将图像数组拼接在一起。
- 使用 PIL 的 `Image.fromarray` 方法创建最终的拼接图像,并调解其大小。
  综上所述,这段代码实现了从数据集加载到数据处置惩罚,再到特征提取、数据集构建,以及最终的图像生成与展示的完备流程。
  逐行解释代码

输入Prompt
   你是一个良好的python开发工程师,现在我们必要你帮我们逐行分析这个代码,用中文答复我的问题。{此处替换前面的代码}
  返回的结果
  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  # 输出最终生成的图像对象,用于显示图像
复制代码

其他疑问-向AI追问

可以向AI追问不懂的问题,比方:
   我对其中{替换成你的问题}还是不太明白,给我再具体介绍一下
  用好AI,可以帮助我们更高效地学习。

进行实战——基于话剧的连环画制作

提示词准备

  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助手的答复,按以下格式整理出场景表格

图片编号
场景形貌
正向提示词
反向提示词
........................
执行Task1的30分钟速通Baseline

Datawhale X 魔搭 AI夏令营-第四期 AIGC-Task 1-CSDN博客
修改提示词


  • 双击进入baseline文件
  • 找到生成图像的板块
  • 依次替换8张图片的正向提示词和反向提示词

生成图片

测试美学打分

更多尝试——scepter webui

更多内容:(下篇帖子再具体说说)
Scepter与WebUI,一站式生成编辑工具箱_哔哩哔哩_bilibili
拜拜~┏(^0^)┛

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

使用道具 举报

0 个回复

倒序浏览

快速回复

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

本版积分规则

张春

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

标签云

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