1.准备:认识通义千问
我们使用通义千问大语言模型来练习借助AI智能助手帮我们阅读代码。【点击标题直达~~】
通义千问是具有信息查询、语言理解、文本创作等多能力的AI助手。编程与技术支持能力是他的强项之一。
作为一个AI助手,通义千问就是你专属的、可随时触达的、24小时随时待命的贴心助教,可以帮助你解决很多学习中遇到的问题。
2.精读baseline
(1)框架结构
task_01中的baseline文生图代码框架结构如下:
(2)利用通义千问--分析代码的主体架构
整理baseline中的所有代码如下:
!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
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")
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: '<__dj__image>'
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/data-juicer/output/images", exist_ok=True)
with open("./data/data-juicer/output/result.jsonl", "r") as f:
for line in tqdm(f):
metadata = json.loads(line)
texts.append(metadata["text"])
file_names.append(metadata["image"][0])
df = pd.DataFrame({"text": texts, "file_name": file_names})
df.to_csv("./data/data-juicer/output/result.csv", index=False)
df
from transformers import CLIPProcessor, CLIPModel
import torch
model = CLIPModel.from_pretrained("openai/clip-vit-base-patch32")
processor = CLIPProcessor.from_pretrained("openai/clip-vit-base-patch32")
images = [Image.open(img_path) for img_path in df["file_name"]]
inputs = processor(text=df["text"].tolist(), images=images, return_tensors="pt", padding=True)
outputs = model(**inputs)
logits_per_image = outputs.logits_per_image # this is the image-text similarity score
probs = logits_per_image.softmax(dim=1) # we can take the softmax to get the probabilities
probs
from torch.utils.data import Dataset, DataLoader
class CustomDataset(Dataset):
def __init__(self, df, processor):
self.texts = df["text"].tolist()
self.images = [Image.open(img_path) for img_path in df["file_name"]]
self.processor = processor
def __len__(self):
return len(self.texts)
def __getitem__(self, idx):
inputs = self.processor(text=self.texts[idx], images=self.images[idx], return_tensors="pt", padding=True)
return inputs
dataset = CustomDataset(df, processor)
dataloader = DataLoader(dataset, batch_size=8)
for batch in dataloader:
outputs = model(**batch)
logits_per_image = outputs.logits_per_image
probs = logits_per_image.softmax(dim=1)
print(probs)
import torch
from diffusers import StableDiffusionPipeline
torch.manual_seed(1)
pipe = StableDiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v-1-4", torch_dtype=torch.float16)
pipe = pipe.to("cuda")
prompt = "二次元,一个紫色长发小女孩穿着粉色吊带漏肩连衣裙,在练习室练习唱歌,手持话筒"
negative_prompt = "丑陋、变形、嘈杂、模糊、低对比度"
guidance_scale = 4
num_inference_steps = 50
image = pipe(
prompt=prompt,
negative_prompt=negative_prompt,
guidance_scale=guidance_scale,
num_inference_steps=num_inference_steps,
height=1024,
width=1024,
).images[0]
image.save("example_image.png")
image
from PIL import Image
torch.manual_seed(1)
image = pipe(
prompt="二次元,日系动漫,演唱会的观众席,人山人海,一个紫色短发小女孩穿着粉色吊带漏肩连衣裙坐在演唱会的观众席,舞台上衣着华丽的歌星们在唱歌",
negative_prompt="丑陋、变形、嘈杂、模糊、低对比度",
cfg_scale=4,
num_inference_steps=50, height=1024, width=1024,
)
image.save("1.jpg")
torch.manual_seed(1)
image = pipe(
prompt="二次元,一个紫色短发小女孩穿着粉色吊带漏肩连衣裙坐在演唱会的观众席,露出憧憬的神情",
negative_prompt="丑陋、变形、嘈杂、模糊、低对比度,色情擦边",
cfg_scale=4,
num_inference_steps=50, height=1024, width=1024,
)
image.save("2.jpg")
torch.manual_seed(2)
image = pipe(
prompt="二次元,一个紫色短发小女孩穿着粉色吊带漏肩连衣裙坐在演唱会的观众席,露出憧憬的神情",
negative_prompt="丑陋、变形、嘈杂、模糊、低对比度,色情擦边",
cfg_scale=4,
num_inference_steps=50, height=1024, width=1024,
)
image.save("3.jpg")
torch.manual_seed(5)
image = pipe(
prompt="二次元,一个紫色短发小女孩穿着粉色吊带漏肩连衣裙,对着流星许愿,闭着眼睛,十指交叉,侧面",
negative_prompt="丑陋、变形、嘈杂、模糊、低对比度,扭曲的手指,多余的手指",
cfg_scale=4,
num_inference_steps=50, height=1024, width=1024,
)
image.save("4.jpg")
torch.manual_seed(0)
image = pipe(
prompt="二次元,一个紫色中等长度头发小女孩穿着粉色吊带漏肩连衣裙,在练习室练习唱歌",
negative_prompt="丑陋、变形、嘈杂、模糊、低对比度",
cfg_scale=4,
num_inference_steps=50, height=1024, width=1024,
)
image.save("5.jpg")
torch.manual_seed(1)
image = pipe(
prompt="二次元,一个紫色长发小女孩穿着粉色吊带漏肩连衣裙,在练习室练习唱歌,手持话筒",
negative_prompt="丑陋、变形、嘈杂、模糊、低对比度",
cfg_scale=4,
num_inference_steps=50, height=1024, width=1024,
)
image.save("6.jpg")
torch.manual_seed(7)
image = pipe(
prompt="二次元,紫色长发少女,穿着黑色连衣裙,试衣间,心情忐忑",
negative_prompt="丑陋、变形、嘈杂、模糊、低对比度",
cfg_scale=4,
num_inference_steps=50, height=1024, width=1024,
)
image.save("7.jpg")
torch.manual_seed(0)
image = pipe(
prompt="二次元,紫色长发少女,穿着黑色礼服,连衣裙,在台上唱歌",
negative_prompt="丑陋、变形、嘈杂、模糊、低对比度",
cfg_scale=4,
num_inference_steps=50, height=1024, width=1024,
)
image.save("8.jpg")
import numpy as np
from PIL import Image
images = [np.array(Image.open(f"{i}.jpg")) for i in range(1, 9)]
image = np.concatenate([
np.concatenate(images[0:2], axis=1),
np.concatenate(images[2:4], axis=1),
np.concatenate(images[4:6], axis=1),
np.concatenate(images[6:8], axis=1),
], axis=0)
image = Image.fromarray(image).resize((1024, 2048))
image
询问通义
你是一个优秀的python开发工程师,现在我们需要你帮我们分析这个代码的主体框架,你需要把代码按照工作流分成几部分,用中文回答我的问题。{此处替换前面的代码}
(3)利用通义千问--逐行解释代码
询问通义
你是一个优秀的python开发工程师,现在我们需要你帮我们逐行分析这个代码,用中文回答我的问题。{此处替换前面的代码}
我们发现与询问主体架构的结果相似,并没有得到我们理想的结果
调整话术,得到我们想要的结果:
你是一个优秀的python开发工程师,我们现在有一个python文件,需要你来进行分析,每一行代码都增加上中文语义备注。{此处替换前面的代码}
结果如下:
# 安装 simple-aesthetics-predictor 包
!pip install simple-aesthetics-predictor
# 以可编辑模式安装 data-juicer 包,并显示详细信息
!pip install -v -e data-juicer
# 卸载 pytorch-lightning 包
!pip uninstall pytorch-lightning -y
# 安装 peft, lightning, pandas, torchvision 包
!pip install peft lightning pandas torchvision
# 以可编辑模式安装 DiffSynth-Studio 包
!pip install -e DiffSynth-Studio
# 导入 ModelScope 数据集类
from modelscope.msdatasets import MsDataset
# 加载 ModelScope 的 lowres_anime 数据集,选择默认子集,训练集分割
# 并指定缓存目录
ds = MsDataset.load(
'AI-ModelScope/lowres_anime',
subset_name='default',
split='train',
cache_dir="/mnt/workspace/kolors/data"
)
# 导入 json 和 os 模块
import json, os
# 导入 SpecialTokens 类,用于处理特殊标记
from data_juicer.utils.mm_utils import SpecialTokens
# 导入 tqdm 进度条显示模块
from tqdm import tqdm
# 创建目录 ./data/lora_dataset/train,如果已存在则不报错
os.makedirs("./data/lora_dataset/train", exist_ok=True)
# 创建目录 ./data/data-juicer/input,如果已存在则不报错
os.makedirs("./data/data-juicer/input", exist_ok=True)
# 打开文件 ./data/data-juicer/input/metadata.jsonl 以写入模式
with open("./data/data-juicer/input/metadata.jsonl", "w") as f:
# 遍历数据集 ds,并显示进度条
for data_id, data in enumerate(tqdm(ds)):
# 从数据集中获取图像,并将其转换为 RGB 格式
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")
# 定义 DataJuicer 的配置字符串
data_juicer_config = """
# 全局参数
project_name: 'data-process'
dataset_path: './data/data-juicer/input/metadata.jsonl' # 数据集目录或文件路径
np: 4 # 处理数据集使用的子进程数量
text_keys: 'text'
image_key: 'image'
image_special_token: '<__dj__image>' # 特殊标记,用于图像替换
export_path: './data/data-juicer/output/result.jsonl' # 输出文件路径
# 处理流程
# 一系列处理操作及其参数
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 # 至少一个满足条件即可
"""
# 打开文件 data/data-juicer/data_juicer_config.yaml 以写入模式
with open("data/data-juicer/data_juicer_config.yaml", "w") as file:
# 将配置字符串写入文件
file.write(data_juicer_config.strip())
# 执行 DataJuicer 的数据处理命令
!dj-process --config data/data-juicer/data_juicer_config.yaml
# 导入 pandas 库
import pandas as pd
# 导入 os 和 json 模块
import os, json
# 导入 PIL 库的 Image 类
from PIL import Image
# 导入 tqdm 进度条显示模块
from tqdm import tqdm
# 创建目录 ./data/data-juicer/output/images,如果已存在则不报错
os.makedirs("./data/data-juicer/output/images", exist_ok=True)
# 初始化两个空列表,用于存储文本和文件名
texts, file_names = [], []
# 打开文件 ./data/data-juicer/output/result.jsonl 以读取模式
with open("./data/data-juicer/output/result.jsonl", "r") as f:
# 遍历文件中的每一行,并显示进度条
for line in tqdm(f):
# 解析 JSON 行
metadata = json.loads(line)
# 将文本添加到 texts 列表
texts.append(metadata["text"])
# 将图像路径添加到 file_names 列表
file_names.append(metadata["image"][0])
# 创建 Pandas DataFrame,包含文本和文件名两列
df = pd.DataFrame({"text": texts, "file_name": file_names})
# 将 DataFrame 保存为 CSV 文件
df.to_csv("./data/data-juicer/output/result.csv", index=False)
# 显示 DataFrame
df
# 导入 CLIP 模型和处理器
from transformers import CLIPProcessor, CLIPModel
# 导入 PyTorch 库
import torch
# 加载预训练的 CLIP 模型
model = CLIPModel.from_pretrained("openai/clip-vit-base-patch32")
# 加载预训练的 CLIP 处理器
processor = CLIPProcessor.from_pretrained("openai/clip-vit-base-patch32")
# 从 DataFrame 中读取图像路径,并打开图像
images = [Image.open(img_path) for img_path in df["file_name"]]
# 使用 CLIP 处理器处理文本和图像
inputs = processor(text=df["text"].tolist(), images=images, return_tensors="pt", padding=True)
# 使用 CLIP 模型计算输出
outputs = model(**inputs)
# 获取图像-文本相似度得分
logits_per_image = outputs.logits_per_image
# 计算概率分布
probs = logits_per_image.softmax(dim=1)
# 显示概率分布
probs
# 导入 PyTorch 的 Dataset 和 DataLoader 类
from torch.utils.data import Dataset, DataLoader
# 定义自定义数据集类
class CustomDataset(Dataset):
# 初始化函数
def __init__(self, df, processor):
# 从 DataFrame 中提取文本
self.texts = df["text"].tolist()
# 从 DataFrame 中提取图像路径,并打开图像
self.images = [Image.open(img_path) for img_path in df["file_name"]]
# 保存处理器
self.processor = processor
# 返回数据集的长度
def __len__(self):
return len(self.texts)
# 获取数据集中的单个项
def __getitem__(self, idx):
# 使用处理器处理文本和图像
inputs = self.processor(text=self.texts[idx], images=self.images[idx], return_tensors="pt", padding=True)
# 返回处理后的数据
return inputs
# 创建 CustomDataset 实例
dataset = CustomDataset(df, processor)
# 创建 DataLoader 实例
dataloader = DataLoader(dataset, batch_size=8)
# 遍历 DataLoader 中的每个批次
for batch in dataloader:
# 使用 CLIP 模型计算输出
outputs = model(**batch)
# 获取图像-文本相似度得分
logits_per_image = outputs.logits_per_image
# 计算概率分布
probs = logits_per_image.softmax(dim=1)
# 打印概率分布
print(probs)
# 导入 PyTorch 库
import torch
# 导入 StableDiffusionPipeline 模型
from diffusers import StableDiffusionPipeline
# 设置随机种子以保证结果可复现
torch.manual_seed(1)
# 加载预训练的 StableDiffusion 模型
pipe = StableDiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v-1-4", torch_dtype=torch.float16)
# 将模型移动到 CUDA 设备上
pipe = pipe.to("cuda")
# 定义提示(prompt)
prompt = "二次元,一个紫色长发小女孩穿着粉色吊带漏肩连衣裙,在练习室练习唱歌,手持话筒"
# 定义负面提示(negative prompt)
negative_prompt = "丑陋、变形、嘈杂、模糊、低对比度"
# 设置指导比例
guidance_scale = 4
# 设置推理步骤数
num_inference_steps = 50
# 使用 StableDiffusion 模型生成图像
image = pipe(
prompt=prompt,
negative_prompt=negative_prompt,
guidance_scale=guidance_scale,
num_inference_steps=num_inference_steps,
height=1024,
width=1024,
).images[0]
# 保存生成的图像
image.save("example_image.png")
# 显示生成的图像
image
# 导入 PIL 库的 Image 类
from PIL import Image
# 设置随机种子以保证结果可复现
torch.manual_seed(1)
# 使用 StableDiffusion 模型生成图像
image = pipe(
prompt="二次元,日系动漫,演唱会的观众席,人山人海,一个紫色短发小女孩穿着粉色吊带漏肩连衣裙坐在演唱会的观众席,舞台上衣着华丽的歌星们在唱歌",
negative_prompt="丑陋、变形、嘈杂、模糊、低对比度",
cfg_scale=4, # 注意这里的 cfg_scale 应该是 guidance_scale
num_inference_steps=50, height=1024, width=1024,
)
# 保存生成的图像
image.save("1.jpg")
# 设置随机种子以保证结果可复现
torch.manual_seed(1)
# 使用 StableDiffusion 模型生成图像
image = pipe(
prompt="二次元,一个紫色短发小女孩穿着粉色吊带漏肩连衣裙坐在演唱会的观众席,露出憧憬的神情",
negative_prompt="丑陋、变形、嘈杂、模糊、低对比度,色情擦边",
cfg_scale=4, # 注意这里的 cfg_scale 应该是 guidance_scale
num_inference_steps=50, height=1024, width=1024,
)
# 保存生成的图像
image.save("2.jpg")
# 设置随机种子以保证结果可复现
torch.manual_seed(2)
# 使用 StableDiffusion 模型生成图像
image = pipe(
prompt="二次元,一个紫色短发小女孩穿着粉色吊带漏肩连衣裙坐在演唱会的观众席,露出憧憬的神情",
negative_prompt="丑陋、变形、嘈杂、模糊、低对比度,色情擦边",
cfg_scale=4, # 注意这里的 cfg_scale 应该是 guidance_scale
num_inference_steps=50, height=1024, width=1024,
)
# 保存生成的图像
image.save("3.jpg")
# 设置随机种子以保证结果可复现
torch.manual_seed(5)
# 使用 StableDiffusion 模型生成图像
image = pipe(
prompt="二次元,一个紫色短发小女孩穿着粉色吊带漏肩连衣裙,对着流星许愿,闭着眼睛,十指交叉,侧面",
negative_prompt="丑陋、变形、嘈杂、模糊、低对比度,扭曲的手指,多余的手指",
cfg_scale=4, # 注意这里的 cfg_scale 应该是 guidance_scale
num_inference_steps=50, height=1024, width=1024,
)
# 保存生成的图像
image.save("4.jpg")
# 设置随机种子以保证结果可复现
torch.manual_seed(0)
# 使用 StableDiffusion 模型生成图像
image = pipe(
prompt="二次元,一个紫色中等长度头发小女孩穿着粉色吊带漏肩连衣裙,在练习室练习唱歌",
negative_prompt="丑陋、变形、嘈杂、模糊、低对比度",
cfg_scale=4, # 注意这里的 cfg_scale 应该是 guidance_scale
num_inference_steps=50, height=1024, width=1024,
)
# 保存生成的图像
image.save("5.jpg")
# 设置随机种子以保证结果可复现
torch.manual_seed(1)
# 使用 StableDiffusion 模型生成图像
image = pipe(
prompt="二次元,一个紫色长发小女孩穿着粉色吊带漏肩连衣裙,在练习室练习唱歌,手持话筒",
negative_prompt="丑陋、变形、嘈杂、模糊、低对比度",
cfg_scale=4, # 注意这里的 cfg_scale 应该是 guidance_scale
num_inference_steps=50, height=1024, width=1024,
)
# 保存生成的图像
image.save("6.jpg")
# 设置随机种子以保证结果可复现
torch.manual_seed(7)
# 使用 StableDiffusion 模型生成图像
image = pipe(
prompt="二次元,紫色长发少女,穿着黑色连衣裙,试衣间,心情忐忑",
negative_prompt="丑陋、变形、嘈杂、模糊、低对比度",
cfg_scale=4, # 注意这里的 cfg_scale 应该是 guidance_scale
num_inference_steps=50, height=1024, width=1024,
)
# 保存生成的图像
image.save("7.jpg")
# 设置随机种子以保证结果可复现
torch.manual_seed(0)
# 使用 StableDiffusion 模型生成图像
image = pipe(
prompt="二次元,紫色长发少女,穿着黑色礼服,连衣裙,在台上唱歌",
negative_prompt="丑陋、变形、嘈杂、模糊、低对比度",
cfg_scale=4, # 注意这里的 cfg_scale 应该是 guidance_scale
num_inference_steps=50, height=1024, width=1024,
)
# 保存生成的图像
image.save("8.jpg")
# 导入 NumPy 库
import numpy as np
# 导入 PIL 库的 Image 类
# 读取之前生成的图像并转换为 NumPy 数组
images = [np.array(Image.open(f"{i}.jpg")) for i in range(1, 9)]
# 沿着水平方向拼接图像
image = np.concatenate([
np.concatenate(images[0:2], axis=1),
np.concatenate(images[2:4], axis=1),
np.concatenate(images[4:6], axis=1),
np.concatenate(images[6:8], axis=1),
], axis=0)
# 将数组转换为图像并调整大小
image = Image.fromarray(image).resize((1024, 2048))
# 显示最终的组合图像
image
3.实战演练:基于话剧的连环画制作
(1)准备数据
【1】利用通义--具体场景描述语
可询问通义如下:
你是一个话剧专家,现在要编排一个话剧,话剧有8条场景描述语,现在你需要输出一个新的话剧的8条场景描述语,给出话剧8条场景描述语例子如下,
1、女主正在上课
2、开始睡着了
3、进入梦乡,梦到自己站在路旁
4、王子骑马而来
5、两人相谈甚欢
6、一起坐在马背上
7、下课了,梦醒了
8、又回到了学习生活中
得到8条场景描述语结果:
好的,让我们创造一个新的故事,它将包含8个不同的场景描述。以下是新的剧情描述:
1.女主在图书馆发现神秘古书
描述语:在一个安静的午后,女主角在图书馆的最深处发现了一本尘封已久的古书,她好奇地翻开,书页中散发出淡淡的光芒。
2.书中幻象浮现
描述语:当女主角翻阅古书时,书中突然出现了奇异的幻象,她仿佛被吸入了一个奇幻的世界。
3.穿越到了古代王国
描述语:女主角发现自己身处于一个古老而神秘的王国之中,周围是宏伟的宫殿和繁忙的市集,人们穿着古代服饰忙碌着。
4.遇见了神秘旅人
描述语:在探索这个新世界的过程中,女主角遇到了一位神秘而英俊的旅人,他正站在一座古老的桥上眺望远方。
5.共同踏上寻找宝藏之旅
描述语:两人决定结伴同行,踏上寻找传说中的宝藏的旅程,他们穿过茂密的森林,跨过湍急的河流。
6.遭遇险境,共度难关
描述语:在旅途中,他们遭遇了一系列挑战与困难,包括危险的野兽和复杂的谜题,但他们相互帮助,克服了所有障碍。
7.回到现实世界
描述语:随着太阳升起,女主角突然发现自己又回到了图书馆,手中依然拿着那本古书,但刚才的一切经历仿佛真实发生过。
8.分享奇遇记
描述语:女主角带着兴奋的心情向朋友们讲述了她在古书中所经历的奇妙冒险,大家围坐在一起,听着她讲述那个遥远世界的点点滴滴。
【2】利用通义--具体提示词
可查询可图优质咒语书,寻找自己想要的出图风格及其相对应的prompt&negative_prompt提示词【点击直达~~】
我通过查询咒语书,对涂鸦艺术风格感兴趣
除8条场景描述语外,加上对生图提示词的要求描述和例子,询问通义
你是一个文生图专家,我们现在要做一个实战项目,就是要编排一个文生图话剧 话剧由8张场景图片生成,你需要输出每张图片的生图提示词
具体的场景图片
1、女主在图书馆发现神秘古书
2、书中幻象浮现
3、穿越到了古代王国
4、遇见了神秘旅人
5、共同踏上寻找宝藏之旅
6、遭遇险境,共度难关
7、回到现实世界
8、分享奇遇记
生图提示词要求
1、风格统一
2、根据场景确定是使用全身还是上半身
3、人物描述
4、场景描述
5、做啥事情
例子:涂鸦艺术风格,一个黑色长发少女,坐在图书馆里,盯着书籍,深思,上半身,红色长裙
得到提示词结果:
了解了,基于您的要求和示例,我将为您创作出符合涂鸦艺术风格的生图提示词。下面是针对每个场景的具体提示词:
1.女主在图书馆发现神秘古书
涂鸦艺术风格,一个黑色长发少女,身穿黑色T恤搭配红色长裙,坐在图书馆的桌子旁,聚精会神地翻阅一本散发着奇异光芒的古书,上半身,背景是充满各种书籍和阅读者的图书馆一角。
2.书中幻象浮现
涂鸦艺术风格,同样的黑色长发少女,手持古书,面前浮现出一幅幅神秘的幻象,上半身,穿着带有奇幻图案的T恤,周围环绕着流动的色彩和模糊的古代景象。
3.穿越到了古代王国
涂鸦艺术风格,少女身着融合了现代与古代元素的服饰,站在一个繁华的古代市场中,好奇地环视四周,全身,背景是色彩斑斓的古代街道和各式各样的摊位。
4.遇见了神秘旅人
涂鸦艺术风格,少女与一位穿着奇特服装、带着宽边帽的神秘旅人交谈,两人并肩站在一条小巷内,上半身,背景是涂鸦覆盖的墙壁和远处的城市轮廓。
5.共同踏上寻找宝藏之旅
涂鸦艺术风格,少女与神秘旅人一同走在一条未知的路上,两人身着探险装备,全身,背景是茂密的森林和远方的山脉。
6.遭遇险境,共度难关
涂鸦艺术风格,少女与旅人背靠背,手持武器,准备迎战即将到来的挑战,全身,背景是幽暗的洞穴和闪烁的宝石。
7.回到现实世界
涂鸦艺术风格,少女突然发现自己回到了图书馆的座位上,手中还拿着那本古书,上半身,穿着现代校服,背景是图书馆的书架和阅读区域。
8.分享奇遇记
涂鸦艺术风格,少女与朋友们围坐在一起,兴奋地分享着她的奇幻经历,全身,背景是一间装饰着涂鸦的咖啡厅,桌上摆满了食物和饮料。
【3】精简整理结果
精简提示词之后的表格:
图片编号 | 场景描述 | prompt (正向提示词) | negative_prompt (反向提示词) |
图片1 | 女主在图书馆发现神秘古书 | 涂鸦艺术风格,一个黑色长发少女,坐在图书馆里,看散发奇异光芒的书,上半身,红色长裙 | 丑陋,变形,嘈杂,模糊,低对比度 |
图片2 | 书中幻象浮现 | 涂鸦艺术风格,一个黑色长发少女,拿着书,看到幻像,模糊古代景象,上半身,红色长裙 | 丑陋,变形,嘈杂,模糊,低对比度 |
图片3 | 穿越到了古代王国 | 涂鸦艺术风格,一个黑色长发少女,站在繁华古代市场中,环视,全身,古代元素服饰 | 丑陋,变形,嘈杂,模糊,低对比度 |
图片4 | 遇见了神秘旅人 | 涂鸦艺术风格,一个奇特神秘旅人,带着宽边帽,在小巷,与一个黑色长发少女交谈,上半身,古代城市轮廓背景 | 丑陋,变形,嘈杂,模糊,低对比度 |
图片5 | 共同踏上寻找宝藏之旅 | 涂鸦艺术风格,一个奇特神秘旅人,一个黑色长发少女,在未知路上,全身,身着探险装备 | 丑陋,变形,嘈杂,模糊,低对比度 |
图片6 | 遭遇险境,共度难关 | 涂鸦艺术风格,一个奇特神秘旅人,一个黑色长发少女,手持武器,准备迎接挑战,全身,背景是洞穴和宝石 | 丑陋,变形,嘈杂,模糊,低对比度 |
图片7 | 回到现实世界 | 涂鸦艺术风格,一个黑色长发少女,坐在图书馆里,惊觉回到现实,手中拿着古书,上半身,红色长裙 | 丑陋,变形,嘈杂,模糊,低对比度 |
图片8 | 分享奇遇记 | 涂鸦艺术风格,一个黑色长发少女,坐在咖啡厅里,和朋友分享奇遇,桌上摆满食物,全身,红色长裙 | 丑陋,变形,嘈杂,模糊,低对比度 |
(2)执行task_01baseline
找到task_01的baseline文件中生成图像的板块,依次替换8张图片的正向提示词和反向提示词,点击每个框左上角的执行按钮生成图片
若报错,可参考task_01中重新运行方法
【1】未精简版prompt结果
我修改prompt&negative_prompt成通义给出的全部结果{ 见3.(1).【2】}
出图如下:
【2】精简表格版prompt结果
我发现出图的最后一张风格 格格不入,所以我将prompt&negative_prompt修改成精简版{ 见3.(1).【3】}
出图如下:
【3】更改风格版prompt结果
我发现利用精简版的prompt还是出现了风格及其不统一的情况(如图2甚至变成了古风),所以我又上咒语书上寻找到了一个新的风格,更改每个prompt风格要求成超高清电影风格
出图如下:
这回的结果风格较上两个出图结果更加统一
(3)美学值打分
未精简版prompt美学值:
精简表格版prompt美学值:
更改风格版prompt美学值:
结果发现,美学值竟然在下降!
我们可以得到结论:
1.虽然完备的描述会使美学值较高,但极易发生产出图片风格不统一的情况;
2.美学值不仅与描述有关,还与风格的选择有关;
3.我们要想得到到较好的产出结果,还需借助AI工具(如通义千问)仔细打磨精炼关键词,并且选择适合剧情的产图风格。
4.作者心得
AIGC实在有趣,看着自己产出的不同图片成就感好强!
对task_01中baseline代码有了更加深刻的理解,我会继续努力的!