Datawhale X 魔搭 AI夏令营-从零入门AI生图原理&实践-Task2学习笔记(附失败尝试)

Task2的任务是对baseline的代码有一个更加细致的理解,然后我们会学习如何借助AI来提升我们的自学习能力,从而帮助大家在后面的学习工作中如何从容迎接各种挑战。授人以鱼不如授人以渔,你可以从中学大模型的提问技巧来实现快速学习,学会如何制作一个话剧连环画。

先看成果,美吧?:

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

让LLM解释task1中跑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

LLM的回复:

这段代码的主体框架可以划分为以下几个部分:

1. 环境准备与依赖安装

  • 使用!pip命令安装所需的Python库,包括simple-aesthetics-predictor(尽管代码中未直接使用),data-juicer(可能是一个自定义库或本地开发库),pytorch-lightning的卸载和peftlightningpandastorchvision的安装,以及DiffSynth-Studio的安装(可能是另一个自定义或实验性库)。

2. 数据加载与预处理

  • modelscopeMsDataset加载数据集(这里是AI-ModelScope/lowres_anime),并转换为RGB格式,保存到本地文件系统中。
  • 创建并写入一个JSONL格式的元数据文件,每个条目包含图像路径和文本标签(这里是"二次元")。
  • 配置data-juicer以处理这些数据,通过过滤图像尺寸和长宽比,准备进一步的数据处理。

3. 使用data-juicer处理数据

  • 运行data-juicerdj-process命令,根据提供的配置文件对图像进行过滤和处理。
  • 读取处理后的结果,将结果(包括文本和图像路径)保存到CSV文件中。

4. 使用CLIP模型评估图像与文本的相似性

  • 加载预训练的CLIP模型和处理器。
  • 使用处理后的数据(文本和图像)创建自定义的DatasetDataLoader
  • 遍历数据加载器,使用CLIP模型计算每个图像与其对应文本之间的相似度分数。

5. 使用Stable Diffusion模型生成图像

  • 加载Stable Diffusion模型并设置随机种子以确保结果的可重复性。
  • 定义多个不同的文本提示(prompt)和负面提示(negative_prompt),使用Stable Diffusion模型生成多个二次元风格的图像,并保存到本地文件。
  • 展示了如何使用不同的随机种子和提示来生成多样化的图像。

6. 图像拼接与展示

  • 读取之前生成的多个图像,将它们拼接成一个大的图像,并展示。

总结

这段代码的主要工作流包括数据准备、使用data-juicer进行数据预处理、使用CLIP模型评估图像与文本的相似性、以及使用Stable Diffusion模型根据文本提示生成图像。最后,它还展示了如何将这些生成的图像拼接成一个单一的图像进行展示。这个流程结合了数据处理、模型评估和图像生成等多个方面,展示了在自然语言处理和图像生成领域的综合应用。

# 安装必要的Python库  
!pip install simple-aesthetics-predictor  
!pip install -v -e data-juicer  # 安装data-juicer,假设它是一个可编辑的包  
!pip uninstall pytorch-lightning -y  # 卸载pytorch-lightning  
!pip install peft lightning pandas torchvision  # 安装其他必要的库  
!pip install -e DiffSynth-Studio  # 假设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")  # 转换图片为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的配置信息  
data_juicer_config = """  
# ... (配置内容省略,与上文相同)  
"""  
  
# 将配置信息写入文件  
with open("data/data-juicer/data_juicer_config.yaml", "w") as file:  
    file.write(data_juicer_config.strip())  
  
# 运行data-juicer处理数据  
!dj-process --config data/data-juicer/data_juicer_config.yaml  
  
# 读取处理后的结果并保存到CSV文件  
import pandas as pd  
# ... (代码省略,与上文相同,读取result.jsonl并保存到CSV)  
  
# 使用CLIP模型评估图像与文本的相似度  
from transformers import CLIPProcessor, CLIPModel  
import torch  
# ... (代码省略,加载模型、处理图像和文本、计算相似度)  
  
# 自定义数据集类以用于DataLoader  
from torch.utils.data import Dataset, DataLoader  
class CustomDataset(Dataset):  
    # ... (代码省略,定义CustomDataset类)  
  
# 使用自定义数据集和DataLoader  
dataset = CustomDataset(df, processor)  
dataloader = DataLoader(dataset, batch_size=8)  
# ... (代码省略,遍历dataloader并计算相似度)  
  
# 使用StableDiffusionPipeline生成图像  
from diffusers import StableDiffusionPipeline  
import torch  
# ... (代码省略,多次使用StableDiffusionPipeline生成不同图像并保存)  
  
# 将多个生成的图像合并为一个图像  
import numpy as np  
from PIL import Image  
# ... (代码省略,加载图像、合并图像、调整大小)

图片编号

场景描述

正向提示词

反向提示词

图片1

女主正在上课

古风,水墨画,一个黑色长发少女,坐在教室里,盯着黑板,深思,上半身,红色长裙

丑陋,变形,嘈杂,模糊,低对比度

图片2

开始睡着了

古风,水墨画,一个黑色长发少女,坐在教室里,趴在桌子上睡着了,上半身,红色长裙

丑陋,变形,嘈杂,模糊,低对比度

图片3

进入梦乡,梦到自己站在路旁

古风,水墨画,一个黑色长发少女,站在路边,上半身,红色长裙

丑陋,变形,嘈杂,模糊,低对比度

图片4

王子骑马而来

古风,水墨画,一个英俊少年,骑着白马,上半身,白色衬衫

丑陋,变形,嘈杂,模糊,低对比度

图片5

两人相谈甚欢

古风,水墨画,一个英俊少年,白色衬衫,一个黑色长发少女,红色长裙,两个人一起聊天,开心,上半身

丑陋,变形,嘈杂,模糊,低对比度

图片6

一起坐在马背上

古风,水墨画,一个英俊少年,白色衬衫,一个黑色长发少女,红色长裙,两个人一起骑着马,全身

丑陋,变形,嘈杂,模糊,低对比度

图片7

下课了,梦醒了

古风,水墨画,一个黑色长发少女,坐在教室里,下课铃声响了,同学们开始走动,从睡梦中醒来,深思,上半身,红色长裙

丑陋,变形,嘈杂,模糊,低对比度

图片8

又回到了学习生活中

古风,水墨画,一个黑色长发少女,坐在教室里,盯着黑板,认真上课,上半身,红色长裙

丑陋,变形,嘈杂,模糊,低对比度

 执行Task1的30分钟速通Baseline 

从零入门AI生图原理&实践 - 飞书云文档 (feishu.cn)

———————————————————————————————————————————

我的尝试,把prompt搞得太复杂和抽象,结果画出来效果很差。小马的妈妈和孩子画出来居然是人类。模型是个直肠子,要说得清晰直白才能懂。

需要特别指出的是:世界上没有失败!只有正面反馈和负面反馈。生命不息,画画不止!吸取教训,继续前行!

Step 1. 让LLM为故事编写8个场景,供文生图用。

Step2.把生成的场景,改写为提示词。

于是,每个场景的提示词就get 了

场景一:小马与妈妈的对话

  • 描述:清晨,阳光洒在草原上,小马站在家门口,望着不远处潺潺流动的小河,显得有些犹豫。妈妈站在一旁,温柔地抚摸着小马的头,眼神中充满鼓励,两人正在进行着关于过河的对话。

场景二:遇见老牛

  • 描述:小马决定先问问别人的意见,它遇到了正在河边悠闲吃草的老牛。老牛低头看着小马,笑着说:“河水很浅,只到我的小腿肚,你完全可以放心过去。”老牛的形象显得沉稳而可靠。

场景三:松鼠的警告

  • 描述:正当小马准备过河时,一只焦急的松鼠从树上跳下来,大声喊道:“别过去!河水深得很,我的朋友就是被冲走的!”松鼠的表情惊恐,双手合十,试图阻止小马。

场景四:小马的困惑

  • 描述:小马站在河边,眉头紧锁,左右为难。它回头望向家的方向,又看看眼前的河流,心中充满了疑惑和不安。背景可以是微风轻拂的河岸,增添一丝迷茫的氛围。

场景五:妈妈的鼓励

  • 描述:小马回到家,向妈妈讲述了自己的经历。妈妈微笑着,用温暖的手握住小马的手说:“孩子,你要自己去试一试,才知道河水到底有多深。”妈妈的眼神中充满了信任和支持。

场景六:小马尝试过河

  • 描述:小马鼓起勇气,小心翼翼地踏入河中。河水起初只没过它的脚踝,但随着它向前迈进,水位逐渐升高,但并未如松鼠所说那般危险。小马的表情从紧张转为坚定。

场景七:成功过河

  • 描述:小马终于到达了对岸,回头望向自己刚刚走过的河流,脸上洋溢着胜利的喜悦。阳光洒在它身上,显得格外耀眼。对岸的景色宁静而美好,象征着克服困难的喜悦。

场景八:小马与妈妈的重逢

  • 描述:小马兴奋地跑回家,向妈妈报告自己成功过河的消息。妈妈张开双臂迎接它,两人紧紧拥抱在一起,周围是温暖的阳光和盛开的花朵,象征着成长与爱的力量。

图片编号

场景描述

正向提示词

反向提示词

图片1

小马与妈妈的对话

  • 画面构图:晨光中的草原,背景是初升的太阳,光线柔和。小马低头望向河流,妈妈站在其旁,一手轻抚小马背部,一手轻握其前蹄,眼神充满爱意与鼓励。
  • 色彩与氛围:温暖的橙黄色调,强调温馨与希望的氛围。
  • 关键词:晨光、草原、小马犹豫、妈妈鼓励、温柔对话

丑陋,变形,嘈杂,模糊,低对比度

图片2

遇见老牛
  • 画面构图:老牛悠闲地站在河边,低头啃食青草,小马好奇地靠近,抬头仰望老牛。
  • 色彩与氛围:自然色调,河水清澈,反射蓝天白云。
  • 关键词:老牛沉稳、小马询问、河水浅、微笑交流

丑陋,变形,嘈杂,模糊,低对比度

图片3

松鼠的警告
  • 画面构图:松鼠从树枝跃下,急切地挥动双手,面部表情惊恐,小马惊讶地后退一步。
  • 色彩与氛围:松鼠鲜艳的色彩与背景形成对比,增加紧张感。
  • 关键词:松鼠惊恐、高声警告、河水深、阻止小马

丑陋,变形,嘈杂,模糊,低对比度

图片4

小马的困惑
  • 画面构图:小马独自站在河边,背对着家,面向河流,眉头紧锁,眼神迷茫。
  • 色彩与氛围:微风轻拂,河面泛起涟漪,天空略显阴沉,反映内心的困惑。
  • 关键词:小马困惑、左右为难、微风河岸、迷茫氛围

丑陋,变形,嘈杂,模糊,低对比度

图片5

妈妈的鼓励
  • 画面构图:室内或家门前,妈妈蹲下身,双手握住小马的前蹄,眼神坚定而充满信任。
  • 色彩与氛围:室内光线柔和,窗外透进温暖阳光,营造温馨鼓励的氛围。
  • 关键词:妈妈温暖、信任眼神、鼓励话语、双手紧握

丑陋,变形,嘈杂,模糊,低对比度

图片6

小马尝试过河
  • 画面构图:小马小心翼翼踏入河中,河水逐渐上升,小马表情从紧张转为坚定。
  • 色彩与氛围:河水深浅变化用不同蓝色调表现,小马身影在光线下逐渐清晰,展现勇气与成长。
  • 关键词:小马勇敢、河水深浅变化、表情转变、成长瞬间

丑陋,变形,嘈杂,模糊,低对比度

图片7

成功过河

  • 画面构图:小马站在对岸,回望河流,脸上洋溢着胜利的喜悦,阳光洒满全身。
  • 色彩与氛围:明亮温暖的色调,强调成功的喜悦与成就感。
  • 关键词:小马成功、阳光照耀、喜悦表情、对岸美景

丑陋,变形,嘈杂,模糊,低对比度

图片8

小马与妈妈的重逢
  • 画面构图:小马兴奋地跑向妈妈,妈妈张开双臂迎接,两人紧紧相拥,周围是盛开的花朵和温暖的阳光。
  • 色彩与氛围:绚烂的色彩,花朵与阳光交相辉映,传递出幸福与爱的力量。
  • 关键词:小马兴奋、妈妈拥抱、花朵盛开、温暖阳光、成长与爱

丑陋,变形,嘈杂,模糊,低对cong

修改提示词后,成果展示:

————————————————————————-——————

尝试二。小改prompt。“”古风,水墨“”改为“”超写实”,得到的效果是:

后面几张人种都变了,中国人变歪果人了,o(╥﹏╥)o

——————————————————————————————————————————

尝试三:再加详细prompt。加了人种,肤色,年龄。

效果也不惊人如人意,很难精确控制。人物一致性不好。

  • 28
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值