Datawhale X 魔搭 AI夏令营第四期 | AIGC文生图——精读baseline 实战进阶 Task2笔记

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 方法可能看起来像这样:

python 复制代码
python
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相关项目展示了从数据处理模型应用 再到结果展示 的完整工作流程,突显了深度学习在创意生成任务中的灵活性和强大功能,通过结合图像与数据处理、跨模态理解和生成技术,体现了深度学习技术在推动创意内容生产上的前沿应用。

相关推荐
engchina9 分钟前
如何在 Python 中忽略烦人的警告?
开发语言·人工智能·python
paixiaoxin1 小时前
CV-OCR经典论文解读|An Empirical Study of Scaling Law for OCR/OCR 缩放定律的实证研究
人工智能·深度学习·机器学习·生成对抗网络·计算机视觉·ocr·.net
OpenCSG1 小时前
CSGHub开源版本v1.2.0更新
人工智能
weixin_515202491 小时前
第R3周:RNN-心脏病预测
人工智能·rnn·深度学习
Altair澳汰尔1 小时前
数据分析和AI丨知识图谱,AI革命中数据集成和模型构建的关键推动者
人工智能·算法·机器学习·数据分析·知识图谱
机器之心2 小时前
图学习新突破:一个统一框架连接空域和频域
人工智能·后端
AI视觉网奇2 小时前
人脸生成3d模型 Era3D
人工智能·计算机视觉
call me by ur name2 小时前
VLM--CLIP作分类任务的损失函数
人工智能·机器学习·分类
吃个糖糖2 小时前
34 Opencv 自定义角点检测
人工智能·opencv·计算机视觉
禁默2 小时前
2024年图像处理、多媒体技术与机器学习
图像处理·人工智能·microsoft