1. 搭建模型:
2. baseline基础架构:
# 安装simple-aesthetics-predictor包
!pip install simple-aesthetics-predictor
# 安装data-juicer包,-v表示详细输出,-e表示以可编辑模式安装
!pip install -v -e data-juicer
# 卸载pytorch-lightning包
!pip uninstall pytorch-lightning -y
# 安装peft, lightning, pandas, torchvision包
!pip install peft lightning pandas torchvision
# 安装DiffSynth-Studio包
!pip install -e DiffSynth-Studio
# 导入ModelScope的数据集模块
from modelscope.msdatasets import MsDataset
# 加载数据集
ds = MsDataset.load(
'AI-ModelScope/lowres_anime', # 数据集名称
subset_name='default', # 子集名称
split='train', # 分割类型(训练集)
cache_dir="/mnt/workspace/kolors/data" # 缓存目录
)
# 导入json和os模块
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)):
# 转换图像为RGB格式,并保存
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 = """
# 全局参数
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'
# 处理计划
# 包含多个处理操作符及其参数的列表
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
# 导入pandas, os, json模块
import pandas as pd
import os, json
# 导入PIL的Image模块
from PIL import Image
# 导入进度条工具
from tqdm import tqdm
# 创建存放处理后图像的目录
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])
# 创建DataFrame
df = pd.DataFrame({"text": texts, "file_name": file_names})
# 保存为CSV文件
df.to_csv("./data/data-juicer/output/result.csv", index=False)
# 显示DataFrame的内容
df
# 导入CLIP模型和处理器
from transformers import CLIPProcessor, CLIPModel
# 导入torch
import torch
# 加载预训练的CLIP模型
model = CLIPModel.from_pretrained("openai/clip-vit-base-patch32")
# 加载预训练的CLIP处理器
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
# 导入PyTorch数据集和数据加载器
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)
# 导入torch
import torch
# 导入StableDiffusionPipeline
from diffusers import StableDiffusionPipeline
# 设置随机种子
torch.manual_seed(1)
# 加载预训练的StableDiffusion模型
pipe = StableDiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v-1-4", torch_dtype=torch.float16)
# 将模型移到GPU
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
# 重复生成图像的过程
# ...
# 合并生成的图像
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
(1)代码详解可利用通义千问
例如:你是一个优秀的python开发工程师,现在我们需要你帮我们分析这个代码的主体框架,你需要把代码按照工作流分成几部分,用中文回答我的问题。{此处替换前面的代码}
(2)继续追问可以使用类似:我对其中{替换成你的问题}还是不太理解,给我再详细介绍一下
3.撰写提示词
利用通义千问:
你是一个文生图专家,我们现在要做一个实战项目,就是要编排一个文生图话剧
话剧由8张场景图片生成,你需要输出每张图片的生图提示词
具体的场景图片
1、女主正在上课
2、开始睡着了
3、进入梦乡,梦到自己站在路旁
4、王子骑马而来
5、两人相谈甚欢
6、一起坐在马背上
7、下课了,梦醒了
8、又回到了学习生活中
生图提示词要求
1、风格为古风
2、根据场景确定是使用全身还是上半身
3、人物描述
4、场景描述
5、做啥事情
例子:
古风,水墨画,一个黑色长发少女,坐在教室里,盯着黑板,深思,上半身,红色长裙
通义千问回答:
结合ai生成完整的:
图片编号 | 场景描述 | 正向提示词 | 反向提示词 |
---|---|---|---|
1 | 女主正在上课 |
| 丑陋,变形,嘈杂,模糊,低对比度 |
2 | 开始睡着了 |
| 丑陋,变形,嘈杂,模糊,低对比度 |
3 | 进入梦乡,梦到自己站在路旁 |
| 丑陋,变形,嘈杂,模糊,低对比度 |
4 | 白色头发少女骑马而来 |
| 丑陋,变形,嘈杂,模糊,低对比度 |
5 | 两人相谈甚欢 |
| 丑陋,变形,嘈杂,模糊,低对比度 |
6 | 一起坐在马背上 |
| 丑陋,变形,嘈杂,模糊,低对比度 |
7 | 下课了,梦醒了 |
| 丑陋,变形,嘈杂,模糊,低对比度 |
8 | 又回到了学习生活中 |
| 丑陋,变形,嘈杂,模糊,低对比度 |