Hi,大家好,我是半亩花海。最近在继续学习Datawhale X 魔搭举办的2024 年AI第四期 夏令营的AIGC文生图方向,本次Task2的主要学习内容是借助通义千问、文心一言等大模型 工具**(无广)** 进行精读baseline 代码,并进行新项目的实战进阶 。
一、精读baseline
在跑task1的baseline时,根据教程指示我们能顺畅通关,但对baseline的代码的某一个模块、某一行究竟是干啥的可能还是不清楚,下面我们就借助AI助手 从**"分析代码的主题架构"** 和**"逐行代码解析"**两个角度来精读这个代码。
1. 框架与代码结构
(1)框架结构
我们可以先看拿下这个文生图代码的框架结构,如下图所示。
(2)代码结构
现在我们先把我们baseline中的所有代码整理出来,代码结构如下。
python
!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
2. 分析代码的主题架构
(1)输入的Prompt
我使用的是通义千问 工具:通义tongyi.ai_你的全能AI助手 (aliyun.com)。
你是一个优秀的python开发工程师,现在我们需要你帮我们分析这个代码的主体框架,你需要把代码按照工作流分成几部分,用中文回答我的问题。
{此处替换前面的代码}
(2)返回的结果
这段代码可以分为以下几个主要的工作流程部分:
1. 环境准备与依赖安装
这部分通过 !pip 命令来安装或卸载所需的Python包,包括 simple-aesthetics-predictor , data-juicer , peft , lightning , pandas , torchvision , 和 DiffSynth-Studio 。
2. 数据集加载与处理
- 数据集加载: 从ModelScope加载 lowres_anime 数据集到变量 ds 。
- **数据转换与存储:**遍历数据集,将图像转换为RGB格式并保存,同时创建包含图像路径和描述文本的元数据,并写入JSONL文件。
3. 数据过滤与清洗
- 配置DataJuicer: 创建配置文件 data_juicer_config.yaml ,定义数据预处理规则,如图像尺寸和宽高比过滤。
- 执行数据处理: 使用 dj-process 命令根据配置文件对数据进行预处理,生成过滤后的结果。
4. 数据整理与分析
- **整理输出数据:**读取处理后的数据,将其转换为Pandas DataFrame,并保存为CSV文件。
- **CLIP模型应用:**使用CLIP模型计算图像和文本之间的相似度得分,得到概率分布。
5. 定制数据集与数据加载
- 定义定制数据集类: 创建一个 CustomDataset 类继承自 Dataset ,用于处理DataFrame中的数据,使其可用于PyTorch模型训练。
- 创建数据加载器: 使用 DataLoader 从定制数据集中批量加载数据。
6. 图像生成与实验
- 加载StableDiffusionPipeline: 从 diffusers 库加载图像生成模型,并设置参数。
- **生成图像:**使用不同的提示和负向提示生成多个二次元风格的图像,保存为PNG文件。
7. 图像合并展示
- **图像合并:**读取生成的所有图像,将它们合并成一张大图,便于查看所有生成的结果。
这些步骤共同完成了一个从数据加载、数据处理、模型应用到图像生成的完整工作流程。
3. 逐行解释代码
(1)输入的问题
你是一个优秀的python开发工程师,现在我们需要你帮我们逐行分析这个代码,用中文回答我的问题。
{此处替换前面的代码}
(2)返回的结果
这段代码包含了多个部分,包括环境设置、数据集处理、模型使用和图像生成。下面是对每段代码的中文注释说明:
python# 使用pip安装simple-aesthetics-predictor库 !pip install simple-aesthetics-predictor # 使用pip安装data-juicer库,-v显示详细信息,-e表示editable mode(即开发模式) !pip install -v -e data-juicer # 卸载pytorch-lightning库,-y自动同意卸载提示 !pip uninstall pytorch-lightning -y # 安装peft、lightning、pandas和torchvision库 !pip install peft lightning pandas torchvision # 安装DiffSynth-Studio库,-e表示editable mode(即开发模式) !pip install -e DiffSynth-Studio
python# 导入ModelScope数据集加载工具 from modelscope.msdatasets import MsDataset # 加载ModelScope的'lowres_anime'数据集,subset_name='default'表示默认子集,split='train'表示训练集 # cache_dir指定数据集的缓存目录 ds = MsDataset.load( 'AI-ModelScope/lowres_anime', subset_name='default', split='train', cache_dir="/mnt/workspace/kolors/data" )
python# 导入json和os模块,以及tqdm进度条库 import json, os from data_juicer.utils.mm_utils import SpecialTokens from tqdm import tqdm # 创建文件夹,如果已经存在则不会创建,exist_ok=True表示如果文件夹已存在则不抛出错误 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: # 遍历数据集,将图像转换为RGB格式并保存到磁盘 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")
python# 定义data_juicer配置字符串 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' # 输出文件路径 # 过滤流程 # 图像尺寸过滤,最小宽度和高度为1024像素 # 图像长宽比过滤,最小和最大比例为0.5和2.0 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()) # 调用data_juicer的处理脚本,--config指定配置文件 !dj-process --config data/data-juicer/data_juicer_config.yaml
python# 导入pandas库和其它模块 import pandas as pd import os, json from PIL import Image from tqdm import tqdm # 创建输出文件夹 os.makedirs("./data/data-juicer/output/images", exist_ok=True) # 读取处理后的数据集,将文本和图像路径提取到列表中 texts, file_names = [], [] 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]) # 将数据转换为DataFrame并保存为CSV文件 df = pd.DataFrame({"text": texts, "file_name": file_names}) df.to_csv("./data/data-juicer/output/result.csv", index=False)
python# 导入CLIP模型和处理器 from transformers import CLIPProcessor, CLIPModel import torch # 加载预训练的CLIP模型和处理器 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 probs = logits_per_image.softmax(dim=1) # 打印概率 probs
python# 定义自定义数据集类,继承自PyTorch的Dataset类 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)
python# 导入StableDiffusionPipeline模型 import torch from diffusers import StableDiffusionPipeline # 设置随机种子确保结果可复现 torch.manual_seed(1) # 加载预训练的StableDiffusion模型 pipe = StableDiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v-1-4", torch_dtype=torch.float16) pipe = pipe.to("cuda") # 定义生成图像的prompt和negative_prompt 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")
python# 使用不同的prompt生成更多图像并保存 # 以下是多个示例,每个示例都有不同的prompt和可能的negative_prompt # 注意:由于每次调用pipe时都会使用相同的随机种子,这会导致生成的图像相同,除非修改随机种子 # 下面的代码展示了如何改变随机种子以获得不同的生成结果 ...
python# 使用numpy和PIL库将生成的图像组合成一个大图像 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
请注意,最后一行的 image 变量定义没有执行显示图像的命令,如果在Jupyter Notebook或类似的环境中,通常会自动显示图像。如果需要在脚本中显示图像,可以使用 matplotlib.pyplot.imshow() 函数。此外,代码中使用 torch.manual_seed() 设置随机种子以确保在每次运行时生成的图像相同,这对于调试和演示很有帮助,但在实际应用中可能需要去掉或改变种子值以获得不同的生成结果。
4. 向AI追问代码
(1)追问的问题
在刚刚逐行解析结果页后面继续追问,如图,通义千问给了我们更加细致的问题解释,大家可以举一反三,多操作一下。
我对其中image = pipe( prompt=prompt, negative_prompt=negative_prompt, guidance_scale=guidance_scale, num_inference_steps=num_inference_steps, height=1024, width=1024, ).images[0]代码还有疑问,对每个参数有疑问,给我再详细介绍一下。
(2)返回的结果
这段代码看起来像是在使用一个深度学习模型,尤其是像Stable Diffusion这样的文本到图像的生成模型,通过Hugging Face的Diffusers库调用来生成图像。让我详细解释一下每个参数:
1. prompt
这是用于生成图像的文本描述。模型将基于这个描述生成图像。例如,你可以写"一只猫坐在图书馆里",模型会尝试生成符合这一描述的图像。
2. negative_prompt
负面提示告诉模型应该避免什么。例如,如果你不希望图像中有任何人类存在,你可以设置 negative_prompt="humans" 。这有助于细化生成的图像,确保它更贴近你的正面提示。
3. guidance_scale
这个参数控制着模型遵循 prompt 的程度。较高的 guidance_scale 值意味着模型会更严格地根据 prompt 生成图像,而较低的值则允许更多的随机性和创意自由。
4. num_inference_steps
这个参数定义了生成图像过程中迭代的次数。更多的步骤通常会导致更精细和更复杂的图像,但也会增加计算时间和资源需求。
5. height 和 width
这些参数确定输出图像的尺寸。例如,在这里设置为 1024 ,意味着生成的图像将是1024x1024像素。
在代码中, pipe (管道)可能指的是预配置的扩散模型管道,如`StableDiffusionPipeline`。`pipe`方法接受上述参数,并返回一个包含生成图像的对象。`.images[0]`则从返回的结果中提取出第一张生成的图像。
整个调用可以总结为:使用特定的 prompt 和可选的 negative_prompt ,以及一系列的生成参数,调用预训练的模型来生成一张指定尺寸的图像。
如果你正在使用Hugging Face的Diffusers库,那么 pipe 方法可能看起来像这样:
pythonpython from diffusers import StableDiffusionPipeline import torch pipe = StableDiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5", torch_dtype=torch.float16) pipe = pipe.to("cuda") prompt = "a photo of an astronaut riding a horse on mars" negative_prompt = "ugly, low quality" image = pipe(prompt=prompt, negative_prompt=negative_prompt, guidance_scale=7.5, num_inference_steps=50, height=1024, width=1024).images[0]
请注意,上述代码示例中的参数值(如 guidance_scale 和 num_inference_steps )是随意设定的,具体数值应根据你的需求和实验来调整。
最后,希望大家养成使用AI的习惯,擅用AI,帮你的工作和学习事半功倍。
二、实战演练一一基于话剧的连环画制作
1. 数据准备
(1)提示词prompt
python
你是一个文生图专家,我们现在要做一个实战项目,就是要编排一个文生图话剧
话剧由8张场景图片生成,你需要输出每张图片的生图提示词
具体的场景图片
1、女主正在上课
2、开始睡着了
3、进入梦乡,梦到自己站在路旁
4、王子骑马而来
5、两人相谈甚欢
6、一起坐在马背上
7、下课了,梦醒了
8、又回到了学习生活中
生图提示词要求
1、风格为古风
2、根据场景确定是使用全身还是上半身
3、人物描述
4、场景描述
5、做啥事情
例子:
古风,水墨画,一个黑色长发少女,坐在教室里,盯着黑板,深思,上半身,红色长裙
(2)返回结果
为了确保这些场景符合您的要求,我将为每一张图片编写相应的生图提示词,考虑到风格、人物和场景的细节。以下是针对您所描述的每个场景的提示词:
1. 女主正在上课
古风,工笔画,一个身穿蓝色汉服的长发女子,专注地坐在教室里,手握毛笔在纸上书写,上半身特写,周围是木质的桌椅和竹简书卷。
2. 开始睡着了
古风,淡雅水彩,同一个女子,头轻轻靠在手臂上,嘴角挂着微笑,似乎在梦中,上半身特写,背景是教室的一角,窗外是夕阳的余晖。
3. 进入梦乡,梦到自己站在路旁
古风,细腻的线描,女子身着华丽的唐装,站在一条青石铺成的小径旁,四周是繁花似锦的桃林,全身展现,她正凝视着远方。
4. 王子骑马而来
古风,浓墨重彩,一位英俊的男子,身披战袍,骑在一匹雄壮的白马之上,正向女子缓缓靠近,背景是壮观的山川,全身展现。
5. 两人相谈甚欢
古风,精致的工笔,女子与王子并肩而坐于凉亭之中,他们正面对面交谈,眼中闪烁着喜悦的光芒,上半身特写,凉亭外是碧波荡漾的湖面。
6. 一起坐在马背上
古风,流动的线条,女子侧坐在王子的马背上,双手轻扶着王子的腰,两人共赏沿途的风景,全身展现,背景是绵延起伏的山脉和飘渺的云雾。
7. 下课了,梦醒了
古风,淡雅水彩,女子惊醒,眼神中带着一丝迷茫,手中还握着毛笔,上半身特写,教室里的同学们已开始收拾东西准备离开。
8. 又回到了学习生活中
古风,细致的工笔,女子再次坐在教室里,身边堆满了书籍和文房四宝,她低头认真阅读,上半身特写,窗外是晴朗的天空和绿树。
这些提示词应该能够帮助生成一系列连贯且富有故事性的场景插图。如果您有任何具体的要求或者需要调整的地方,请随时告诉我!
结合AI内容,自己在AI结果上做一些调整 ,最终整理出来两种场景表格对比,如下所示。
① 表格一场景及其内容
|----------|---------------|----------------------------------------------------------------|------------------|
| 图片编号 | 场景描述 | 正向提示词 | 反向提示词 |
| 图片1 | 女主正在上课 | 古风,工笔画,一个身穿蓝色汉服的长发女子,专注地坐在教室里,手握毛笔在纸上书写,上半身特写,周围是木质的桌椅和竹简书卷 | 丑陋,变形,嘈杂,模糊,低对比度 |
| 图片2 | 开始睡着了 | 古风,淡雅水彩,同一个女子,头轻轻靠在手臂上,嘴角挂着微笑,似乎在梦中,上半身特写,背景是教室的一角,窗外是夕阳的余晖 | 丑陋,变形,嘈杂,模糊,低对比度 |
| 图片3 | 进入梦乡,梦到自己站在路旁 | 古风,细腻的线描,女子身着华丽的唐装,站在一条青石铺成的小径旁,四周是繁花似锦的桃林,全身展现,她正凝视着远方 | 丑陋,变形,嘈杂,模糊,低对比度 |
| 图片4 | 王子骑马而来 | 古风,浓墨重彩,一位英俊的男子,身披战袍,骑在一匹雄壮的白马之上,正向女子缓缓靠近,背景是壮观的山川,全身展现 | 丑陋,变形,嘈杂,模糊,低对比度 |
| 图片5 | 两人相谈甚欢 | 古风,精致的工笔,女子与王子并肩而坐于凉亭之中,他们正面对面交谈,眼中闪烁着喜悦的光芒,上半身特写,凉亭外是碧波荡漾的湖面 | 丑陋,变形,嘈杂,模糊,低对比度 |
| 图片6 | 一起坐在马背上 | 古风,流动的线条,女子侧坐在王子的马背上,双手轻扶着王子的腰,两人共赏沿途的风景,全身展现,背景是绵延起伏的山脉和飘渺的云雾 | 丑陋,变形,嘈杂,模糊,低对比度 |
| 图片7 | 下课了,梦醒了 | 古风,淡雅水彩,女子惊醒,眼神中带着一丝迷茫,手中还握着毛笔,上半身特写,教室里的同学们已开始收拾东西准备离开 | 丑陋,变形,嘈杂,模糊,低对比度 |
| 图片8 | 又回到了学习生活中 | 古风,细致的工笔,女子再次坐在教室里,身边堆满了书籍和文房四宝,她低头认真阅读,上半身特写,窗外是晴朗的天空和绿树 | 丑陋,变形,嘈杂,模糊,低对比度 |
② 表格二场景及其内容
|----------|---------------|---------------------------------------------------------|------------------|
| 图片编号 | 场景描述 | 正向提示词 | 反向提示词 |
| 图片1 | 女主正在上课 | 古风,水墨画,一个黑色长发少女,坐在教室里,盯着黑板,深思,上半身,红色长裙 | 丑陋,变形,嘈杂,模糊,低对比度 |
| 图片2 | 开始睡着了 | 古风,水墨画,一个黑色长发少女,坐在教室里,趴在桌子上睡着了,上半身,红色长裙 | 丑陋,变形,嘈杂,模糊,低对比度 |
| 图片3 | 进入梦乡,梦到自己站在路旁 | 古风,水墨画,一个黑色长发少女,站在路边,上半身,红色长裙 | 丑陋,变形,嘈杂,模糊,低对比度 |
| 图片4 | 王子骑马而来 | 古风,水墨画,一个英俊少年,骑着白马,上半身,白色衬衫 | 丑陋,变形,嘈杂,模糊,低对比度 |
| 图片5 | 两人相谈甚欢 | 古风,水墨画,一个英俊少年,白色衬衫,一个黑色长发少女,红色长裙,两个人一起聊天,开心,上半身 | 丑陋,变形,嘈杂,模糊,低对比度 |
| 图片6 | 一起坐在马背上 | 古风,水墨画,一个英俊少年,白色衬衫,一个黑色长发少女,红色长裙,两个人一起骑着马,全身 | 丑陋,变形,嘈杂,模糊,低对比度 |
| 图片7 | 下课了,梦醒了 | 古风,水墨画,一个黑色长发少女,坐在教室里,下课铃声响了,同学们开始走动,从睡梦中醒来,深思,上半身,红色长裙 | 丑陋,变形,嘈杂,模糊,低对比度 |
| 图片8 | 又回到了学习生活中 | 古风,水墨画,一个黑色长发少女,坐在教室里,盯着黑板,认真上课,上半身,红色长裙 | 丑陋,变形,嘈杂,模糊,低对比度 |
(3)执行Task1的baseline
链接如下:从零入门AI生图原理&实践。
- 双击进入baseline文件
- 找到生成图像的板块
- 依次替换8张图片的正向提示词和反向提示词
- 执行生成图片部分的按钮
(4)结果展示
① 表格一结果展示
具体场景如下:
② 表格二结果展示
具体场景如下:
三、总结与感悟
这个实战项目揭示了深度学习在图像处理和生成领域的专业实践,对学习AIGC的初学者意义重大,我认为有以下关键点。
-
图像与数据处理 :通过 data-juicer 等工具自动化数据预处理,包括过滤和标准化图像,提升了数据质量和模型训练效率。
-
跨模态匹配评估:利用CLIP模型进行图像-文本对齐性评估,体现了深度学习在理解和连接不同数据类型(图像与文本)的强大能力。
-
定制化数据集封装 :创建 CustomDataset 类,使数据能够被深度学习模型有效读取和处理,这是模型训练和验证的关键步骤。
-
图像生成与控制 :使用 StableDiffusionPipeline 生成特定风格的图像,通过参数调整(如 guidance_scale ),实现了对生成图像的细节和质量的精细控制。
总的来说,此AIGC相关项目展示了从数据处理 到模型应用 再到结果展示 的完整工作流程,突显了深度学习在创意生成任务中的灵活性和强大功能,通过结合图像与数据处理、跨模态理解和生成技术,体现了深度学习技术在推动创意内容生产上的前沿应用。