Datawhale X 魔搭 AI夏令营 第四期(精读代码,实战进阶)

利用ai理解代码,生成提示图

理解代码

1. 环境配置与依赖安装

这一部分通过pip命令来安装或卸载必要的Python包。这些命令用于设置项目运行所需的环境。

 
1# 安装simple-aesthetics-predictor
2!pip install simple-aesthetics-predictor
3
4# 安装data-juicer
5!pip install -v -e data-juicer
6
7# 卸载pytorch-lightning并安装peft, lightning, pandas, torchvision
8!pip uninstall pytorch-lightning -y
9!pip install peft lightning pandas torchvision
10
11# 安装DiffSynth-Studio
12!pip install -e DiffSynth-Studio

2. 数据集加载与预处理

这部分代码从ModelScope加载了一个名为lowres_anime的数据集,并将其转换为适合进一步处理的格式。

 
1from modelscope.msdatasets import MsDataset
2
3# 加载数据集
4ds = MsDataset.load('AI-ModelScope/lowres_anime', subset_name='default', split='train', cache_dir="/mnt/workspace/kolors/data")
5
6# 创建输出目录
7import json, os
8from data_juicer.utils.mm_utils import SpecialTokens
9from tqdm import tqdm
10
11os.makedirs("./data/lora_dataset/train", exist_ok=True)
12os.makedirs("./data/data-juicer/input", exist_ok=True)
13
14# 遍历数据集,保存图片和元数据
15with open("./data/data-juicer/input/metadata.jsonl", "w") as f:
16    for data_id, data in enumerate(tqdm(ds)):
17        image = data["image"].convert("RGB")
18        image.save(f"/mnt/workspace/kolors/data/lora_dataset/train/{data_id}.jpg")
19        metadata = {"text": "二次元", "image": [f"/mnt/workspace/kolors/data/lora_dataset/train/{data_id}.jpg"]}
20        f.write(json.dumps(metadata))
21        f.write("\n")

3. 使用Data-Juicer进行数据过滤

这部分使用Data-Juicer对图像数据进行过滤,确保它们满足一定的尺寸和长宽比要求。

 
1# 配置Data-Juicer
2data_juicer_config = """
3...
4"""
5
6# 写入配置文件
7with open("data/data-juicer/data_juicer_config.yaml", "w") as file:
8    file.write(data_juicer_config.strip())
9
10# 运行Data-Juicer处理
11!dj-process --config data/data-juicer/data_juicer_config.yaml

4. 处理过滤后的数据

这部分代码将处理后的数据整理成DataFrame,并利用CLIP模型计算文本-图像相似性得分。

 
1import pandas as pd
2import os, json
3from PIL import Image
4from tqdm import tqdm
5
6# 读取处理后的数据
7texts, file_names = [], []
8os.makedirs("./data/data-juicer/output/images", exist_ok=True)
9with open("./data/data-juicer/output/result.jsonl", "r") as f:
10    for line in tqdm(f):
11        metadata = json.loads(line)
12        texts.append(metadata["text"])
13        file_names.append(metadata["image"][0])
14
15# 创建DataFrame
16df = pd.DataFrame({"text": texts, "file_name": file_names})
17df.to_csv("./data/data-juicer/output/result.csv", index=False)
18
19# 利用CLIP模型计算文本-图像相似性
20from transformers import CLIPProcessor, CLIPModel
21import torch
22
23model = CLIPModel.from_pretrained("openai/clip-vit-base-patch32")
24processor = CLIPProcessor.from_pretrained("openai/clip-vit-base-patch32")
25
26# 加载图像和文本数据
27images = [Image.open(img_path) for img_path in df["file_name"]]
28inputs = processor(text=df["text"].tolist(), images=images, return_tensors="pt", padding=True)
29
30# 计算相似性得分
31outputs = model(**inputs)
32logits_per_image = outputs.logits_per_image
33probs = logits_per_image.softmax(dim=1)

5. 构建PyTorch数据集与数据加载器

这里定义了一个自定义的PyTorch数据集类,并创建了数据加载器以准备训练数据。

1from torch.utils.data import Dataset, DataLoader
2
3# 定义数据集类
4class CustomDataset(Dataset):
5    ...
6
7# 创建数据集实例
8dataset = CustomDataset(df, processor)
9dataloader = DataLoader(dataset, batch_size=8)
10
11# 遍历数据加载器
12for batch in dataloader:
13    ...

6. 图像生成

这部分代码使用StableDiffusionPipeline生成基于不同提示的二次元图像。

1import torch
2from diffusers import StableDiffusionPipeline
3
4# 初始化模型
5torch.manual_seed(1)
6pipe = StableDiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v-1-4", torch_dtype=torch.float16)
7pipe = pipe.to("cuda")
8
9# 生成图像
10prompt = "..."
11negative_prompt = "..."
12guidance_scale = 4
13num_inference_steps = 50
14
15image = pipe(
16    prompt=prompt,
17    negative_prompt=negative_prompt,
18    guidance_scale=guidance_scale,
19    num_inference_steps=num_inference_steps,
20    height=1024,
21    width=1024,
22).images[0]
23
24# 保存图像
25image.save("example_image.png")

7. 合并生成的图像

最后一步是将生成的多个图像合并成一个大的图像。

1import numpy as np
2from PIL import Image
3
4# 加载图像
5images = [np.array(Image.open(f"{i}.jpg")) for i in range(1, 9)]
6
7# 合并图像
8image = np.concatenate([
9    np.concatenate(images[0:2], axis=1),
10    np.concatenate(images[2:4], axis=1),
11    np.concatenate(images[4:6], axis=1),
12    np.concatenate(images[6:8], axis=1),
13], axis=0)
14image = Image.fromarray(image).resize((1024, 2048))
15
16# 显示图像
17image

生成提示词

将以下文案输给ai

你是一个文生图专家,我们现在要做一个实战项目,就是要编排一个文生图话剧 话剧由8张场景图片生成,你需要输出每张图片的生图提示词 具体的场景图片

1、女主正在上课

2、开始睡着了

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

4、王子骑马而来

5、两人相谈甚欢

6、一起坐在马背上

7、下课了,梦醒了

8、又回到了学习生活中

生图提示词要求 1、风格为古风 2、根据场景确定是使用全身还是上半身 3、人物描述 4、场景描述 5、做啥事情 例子: 古风,水墨画,一个黑色长发少女,坐在教室里,盯着黑板,深思,上半身,红色长裙

得到提示词

  1. 女主正在上课

    • 古风,工笔画,一个穿着淡紫色汉服的少女,上半身特写,坐在古色古香的书桌前,手执毛笔书写,窗外阳光斜照进教室。
  2. 开始睡着了

    • 古风,水彩画,同一个少女,侧脸特写,头枕着手臂,轻柔地闭着眼睛,嘴角挂着微笑,桌上散落着未完成的画卷和诗稿。
  3. 进入梦乡,梦到自己站在路旁

    • 古风,水墨画,少女全身站立姿态,身着浅蓝色长裙,手扶柳枝,站在一条铺满落叶的青石小径旁,远处有青山绿水。
  4. 王子骑马而来

    • 古风,工笔画,英俊少年骑着一匹白马缓缓而来,身着金色边饰的蓝袍,眼神坚定地望向少女,背景是夕阳下的宫殿。
  5. 两人相谈甚欢

    • 古风,水彩画,少女与少年并肩而坐于花丛之中,两人的脸上洋溢着笑容,少女手持扇子,少年正向她讲述着什么,四周开满了各色鲜花。
  6. 一起坐在马背上

    • 古风,水墨画,两人共同骑在马上,少年在前,少女在后,少女双手环抱少年腰间,两人向着远方的山峦驰骋,背景是一片广袤的草原。
  7. 下课了,梦醒了

    • 古风,水彩画,少女从梦中醒来,上半身特写,惊讶地看着周围熟悉的教室环境,桌上摊开着未完成的画卷,窗外天色已晚。
  8. 又回到了学习生活中

    • 古风,工笔画,少女重新回到书桌前,专心致志地研读古籍,手中握着毛笔,桌上堆满了书籍卷轴,窗外夜幕降临,星光点点。

修改提示词

torch.manual_seed(0)
image = pipe(
    prompt="古风,工笔画,一个穿着淡紫色汉服的少女,上半身特写,坐在古色古香的书桌前,手执毛笔书写,窗外阳光斜照进教室。",
    negative_prompt="丑陋、变形、嘈杂、模糊、低对比度",
    cfg_scale=4,
    num_inference_steps=50, height=1024, width=1024,
)
image.save("9.jpg")
torch.manual_seed(1)
image = pipe(
    prompt="古风,水彩画,同一个少女,侧脸特写,头枕着手臂,轻柔地闭着眼睛,嘴角挂着微笑,桌上散落着未完成的画卷和诗稿。",
    negative_prompt="丑陋、变形、嘈杂、模糊、低对比度",
    cfg_scale=4,
    num_inference_steps=50, height=1024, width=1024,
)
image.save("10.jpg")
torch.manual_seed(2)
image = pipe(
    prompt="古风,水墨画,少女全身站立姿态,身着浅蓝色长裙,手扶柳枝,站在一条铺满落叶的青石小径旁,远处有青山绿水",
    negative_prompt="丑陋、变形、嘈杂、模糊、低对比度,色情擦边",
    cfg_scale=4,
    num_inference_steps=50, height=1024, width=1024,
)
image.save("11.jpg")
torch.manual_seed(5)
image = pipe(
    prompt="古风,工笔画,英俊少年骑着一匹白马缓缓而来,身着金色边饰的蓝袍,眼神坚定地望向少女,背景是夕阳下的宫殿。",
    negative_prompt="丑陋、变形、嘈杂、模糊、低对比度,扭曲的手指,多余的手指",
    cfg_scale=4,
    num_inference_steps=50, height=1024, width=1024,
)
image.save("12.jpg")
torch.manual_seed(0)
image = pipe(
    prompt="古风,水彩画,少女与少年并肩而坐于花丛之中,两人的脸上洋溢着笑容,少女手持扇子,少年正向她讲述着什么,四周开满了各色鲜花",
    negative_prompt="丑陋、变形、嘈杂、模糊、低对比度",
    cfg_scale=4,
    num_inference_steps=50, height=1024, width=1024,
)
image.save("13.jpg")
torch.manual_seed(1)
image = pipe(
    prompt="古风,水墨画,两人共同骑在马上,少年在前,少女在后,少女双手环抱少年腰间,两人向着远方的山峦驰骋,背景是一片广袤的草原",
    negative_prompt="丑陋、变形、嘈杂、模糊、低对比度",
    cfg_scale=4,
    num_inference_steps=50, height=1024, width=1024,
)
image.save("14.jpg")
torch.manual_seed(7)
image = pipe(
    prompt="古风,水彩画,少女从梦中醒来,上半身特写,惊讶地看着周围熟悉的教室环境,桌上摊开着未完成的画卷,窗外天色已晚",
    negative_prompt="丑陋、变形、嘈杂、模糊、低对比度",
    cfg_scale=4,
    num_inference_steps=50, height=1024, width=1024,
)
image.save("15.jpg")
torch.manual_seed(0)
image = pipe(
    prompt="古风,工笔画,少女重新回到书桌前,专心致志地研读古籍,手中握着毛笔,桌上堆满了书籍卷轴,窗外夜幕降临,星光点点",
    negative_prompt="丑陋、变形、嘈杂、模糊、低对比度",
    cfg_scale=4,
    num_inference_steps=50, height=1024, width=1024,
)
image.save("16.jpg")

显示图片

import numpy as np
from PIL import Image


images = [np.array(Image.open(f"{i}.jpg")) for i in range(9, 17)]
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

最后导出图片

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

祺451

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值