利用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、做啥事情 例子: 古风,水墨画,一个黑色长发少女,坐在教室里,盯着黑板,深思,上半身,红色长裙
得到提示词
-
女主正在上课
- 古风,工笔画,一个穿着淡紫色汉服的少女,上半身特写,坐在古色古香的书桌前,手执毛笔书写,窗外阳光斜照进教室。
-
开始睡着了
- 古风,水彩画,同一个少女,侧脸特写,头枕着手臂,轻柔地闭着眼睛,嘴角挂着微笑,桌上散落着未完成的画卷和诗稿。
-
进入梦乡,梦到自己站在路旁
- 古风,水墨画,少女全身站立姿态,身着浅蓝色长裙,手扶柳枝,站在一条铺满落叶的青石小径旁,远处有青山绿水。
-
王子骑马而来
- 古风,工笔画,英俊少年骑着一匹白马缓缓而来,身着金色边饰的蓝袍,眼神坚定地望向少女,背景是夕阳下的宫殿。
-
两人相谈甚欢
- 古风,水彩画,少女与少年并肩而坐于花丛之中,两人的脸上洋溢着笑容,少女手持扇子,少年正向她讲述着什么,四周开满了各色鲜花。
-
一起坐在马背上
- 古风,水墨画,两人共同骑在马上,少年在前,少女在后,少女双手环抱少年腰间,两人向着远方的山峦驰骋,背景是一片广袤的草原。
-
下课了,梦醒了
- 古风,水彩画,少女从梦中醒来,上半身特写,惊讶地看着周围熟悉的教室环境,桌上摊开着未完成的画卷,窗外天色已晚。
-
又回到了学习生活中
- 古风,工笔画,少女重新回到书桌前,专心致志地研读古籍,手中握着毛笔,桌上堆满了书籍卷轴,窗外夜幕降临,星光点点。
修改提示词
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
最后导出图片