对于task2里的这几句话本人还是十分赞成的
定期关注AI生图的最新能力情况都十分重要:
对于普通人来说,可以避免被常见的AI生图场景欺骗,偶尔也可以通过相关工具绘图
对于创作者来说,通过AI生图的工具可以提效,快速制作自己所需要的内容
对于技术人来说,了解AI生图的能力的玩法,可以更好地针对自己的业务进行开发和使用,甚至攻克难题开发更实用的工具
Task2:精读代码,实战进阶 - 飞书云文档 (feishu.cn)https://datawhaler.feishu.cn/wiki/KxI2wIeAJiRQWhkRt9dcqlNVnFR
通义千问
然后我们使用通义千问进行我们的代码解读
如何使用通义千问呢?
首先我们需要链接到通义千问
通义tongyi.ai_你的全能AI助手 (aliyun.com)https://tongyi.aliyun.com/qianwen/?sessionId=0823c3da49cc4cb08da81e2676df5c88连接到通义千问,然后就可以根据task2中在通义千问中如何进行代码解释的提问,如:
1.你是一个优秀的python开发工程师,现在我们需要你帮我们分析这个代码的主体框架,你需要把代码按照工作流分成几部分,用中文回答我的问题{代码段}
或者
2.你是一个优秀的python开发工程师,现在我们需要你帮我们逐行分析这个代码,用中文回答我的问题。{代码段}
分析代码的主体框架
如下就是根据通义千问进行的问答1
1. 环境准备与依赖安装
这一部分包括了使用 pip
命令来安装或卸载所需的Python包。这些命令通常在脚本的开始部分执行以确保所有必需的库都已安装。
主要操作:
安装simple-aesthetics-predictor
, data-juicer
, peft
, lightning
, pandas
, torchvision
和 DiffSynth-Studio
。 卸载并重新安装 pytorch-lightning
。 2. 数据集加载与预处理
这部分代码从 ModelScope 中加载了一个名为 lowres_anime
的数据集,并将其转换为适用于后续处理的格式。
主要操作:
加载lowres_anime
数据集。 遍历数据集中的每个样本,将图像保存到磁盘上,并构建一个包含图像路径和文本描述的元数据文件。 3. 数据过滤与处理
这一部分使用 data-juicer
工具对数据进行进一步的处理,例如过滤掉不符合要求的图像(如尺寸过小或宽高比不合适)。
主要操作:
编写配置文件以定义数据处理规则。 使用data-juicer
对数据集进行处理,输出经过筛选后的结果。 4. 数据分析与特征提取
在这一步骤中,使用 CLIP 模型来计算文本和图像之间的相似度,并创建一个 PyTorch 数据集用于后续训练或其他处理。
主要操作:
读取处理过的数据,并使用 CLIP 模型计算文本与图像间的相似度。 创建一个CustomDataset
类来封装数据集,并使用 DataLoader
进行批处理。 5. 图像生成
最后,利用 diffusers
库中的 StableDiffusionPipeline
生成一系列基于不同提示的图像。
主要操作:
初始化StableDiffusionPipeline
。 根据不同的提示生成图像,并保存到磁盘上。 6. 图像拼接展示
最后一段代码是将之前生成的所有图像拼接在一起形成一个大图,并调整大小以便展示。
主要操作:
将多个生成的图像加载为 NumPy 数组。 将这些数组按行和列拼接起来形成一个大图像,并调整其大小。整个流程包括环境搭建、数据集加载与预处理、数据过滤与处理、数据分析与特征提取、图像生成以及最终的图像展示。
逐行解释代码
如下就是根据通义千问进行的问答2
1. 环境准备与依赖安装
1!pip install simple-aesthetics-predictor 2!pip install -v -e data-juicer 3!pip uninstall pytorch-lightning -y 4!pip install peft lightning pandas torchvision 5!pip install -e DiffSynth-Studio
第一行安装 simple-aesthetics-predictor
包。 第二行以可编辑模式 (-e
) 安装 data-juicer
并显示详细信息 (-v
)。 第三行卸载 pytorch-lightning
。 第四行安装 peft
(可能是指 peft
或者其他库的缩写), lightning
(可能是 pytorch-lightning
的最新版本), pandas
, 和 torchvision
。 第五行以可编辑模式安装 DiffSynth-Studio
。 2. 数据集加载与预处理
1from modelscope.msdatasets import MsDataset 2 3ds = MsDataset.load( 4 'AI-ModelScope/lowres_anime', 5 subset_name='default', 6 split='train', 7 cache_dir="/mnt/workspace/kolors/data" 8)
导入 MsDataset
类。 加载 lowres_anime
数据集,并指定子集名称为 default
,数据集切分为训练集,缓存目录为 /mnt/workspace/kolors/data
。 1import json, os 2from data_juicer.utils.mm_utils import SpecialTokens 3from tqdm import tqdm 4 5os.makedirs("./data/lora_dataset/train", exist_ok=True) 6os.makedirs("./data/data-juicer/input", exist_ok=True) 7with open("./data/data-juicer/input/metadata.jsonl", "w") as f: 8 for data_id, data in enumerate(tqdm(ds)): 9 image = data["image"].convert("RGB") 10 image.save(f"/mnt/workspace/kolors/data/lora_dataset/train/{data_id}.jpg") 11 metadata = {"text": "二次元", "image": [f"/mnt/workspace/kolors/data/lora_dataset/train/{data_id}.jpg"]} 12 f.write(json.dumps(metadata)) 13 f.write("\n")
导入 json
, os
模块,SpecialTokens
类,和进度条库 tqdm
。 创建两个目录,如果它们已经存在则不会报错。 遍历数据集,将每张图片转换为 RGB 模式,并保存至指定目录。 构建一个 JSONL 文件,其中每一行包含一个 JSON 对象,该对象描述了一张图片的路径和一个固定的文字标签 "二次元"。 3. 数据过滤与处理
1data_juicer_config = """ 2# global parameters 3project_name: 'data-process' 4dataset_path: './data/data-juicer/input/metadata.jsonl' # path to your dataset directory or file 5np: 4 # number of subprocess to process your dataset 6 7text_keys: 'text' 8image_key: 'image' 9image_special_token: '<__dj__image>' 10 11export_path: './data/data-juicer/output/result.jsonl' 12 13# process schedule 14# a list of several process operators with their arguments 15process: 16 - image_shape_filter: 17 min_width: 1024 18 min_height: 1024 19 any_or_all: any 20 - image_aspect_ratio_filter: 21 min_ratio: 0.5 22 max_ratio: 2.0 23 any_or_all: any 24""" 25with open("data/data-juicer/data_juicer_config.yaml", "w") as file: 26 file.write(data_juicer_config.strip()) 27 28!dj-process --config data/data-juicer/data_juicer_config.yaml
定义一个 YAML 配置文件,用于指定数据处理的细节,包括数据源路径、输出路径、过滤器设置等。 写入配置文件到磁盘。 调用 data-juicer
的命令行工具来处理数据。 4. 数据分析与特征提取
1import pandas as pd 2import os, json 3from PIL import Image 4from tqdm import tqdm 5 6texts, file_names = [], [] 7 8os.makedirs("./data/data-juicer/output/images", exist_ok=True) 9 10with open("./data/data-juicer/output/result.jsonl", "r") as f: 11 for line in tqdm(f): 12 metadata = json.loads(line) 13 texts.append(metadata["text"]) 14 file_names.append(metadata["image"][0]) 15 16df = pd.DataFrame({"text": texts, "file_name": file_names}) 17df.to_csv("./data/data-juicer/output/result.csv", index=False) 18 19df
导入 pandas
用于数据处理,再次导入 os
, json
和 tqdm
。 读取处理后的数据,并将其转换为 DataFrame。 保存 DataFrame 到 CSV 文件。 1from transformers import CLIPProcessor, CLIPModel 2import torch 3 4model = CLIPModel.from_pretrained("openai/clip-vit-base-patch32") 5processor = CLIPProcessor.from_pretrained("openai/clip-vit-base-patch32") 6 7images = [Image.open(img_path) for img_path in df["file_name"]] 8inputs = processor(text=df["text"].tolist(), images=images, return_tensors="pt", padding=True) 9 10outputs = model(**inputs) 11logits_per_image = outputs.logits_per_image # this is the image-text similarity score 12probs = logits_per_image.softmax(dim=1) # we can take the softmax to get the probabilities 13 14probs
导入 CLIPProcessor
和 CLIPModel
用于文本-图像匹配任务。 加载预训练的 CLIP 模型和处理器。 读取图像,构建输入数据,计算文本与图像的相似度得分。 计算概率分布。 5. 创建 PyTorch 数据集
1from torch.utils.data import Dataset, DataLoader 2 3class CustomDataset(Dataset): 4 def __init__(self, df, processor): 5 self.texts = df["text"].tolist() 6 self.images = [Image.open(img_path) for img_path in df["file_name"]] 7 self.processor = processor 8 9 def __len__(self): 10 return len(self.texts) 11 12 def __getitem__(self, idx): 13 inputs = self.processor(text=self.texts[idx], images=self.images[idx], return_tensors="pt", padding=True) 14 return inputs 15 16dataset = CustomDataset(df, processor) 17dataloader = DataLoader(dataset, batch_size=8) 18 19for batch in dataloader: 20 outputs = model(**batch) 21 logits_per_image = outputs.logits_per_image 22 probs = logits_per_image.softmax(dim=1) 23 print(probs)
定义一个自定义的数据集类 CustomDataset
,继承自 torch.utils.data.Dataset
。 实现 __init__
, __len__
, 和 __getitem__
方法。 创建数据集实例和数据加载器。 遍历数据加载器,计算每个批次的相似度得分。 6. 图像生成
1import torch 2from diffusers import StableDiffusionPipeline 3 4torch.manual_seed(1) 5pipe = StableDiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v-1-4", torch_dtype=torch.float16) 6pipe = pipe.to("cuda") 7 8prompt = "二次元,一个紫色长发小女孩穿着粉色吊带漏肩连衣裙,在练习室练习唱歌,手持话筒" 9negative_prompt = "丑陋、变形、嘈杂、模糊、低对比度" 10guidance_scale = 4 11num_inference_steps = 50 12 13image = pipe( 14 prompt=prompt, 15 negative_prompt=negative_prompt, 16 guidance_scale=guidance_scale, 17 num_inference_steps=num_inference_steps, 18 height=1024, 19 width=1024, 20).images[0] 21 22image.save("example_image.png") 23image
导入 torch
和 StableDiffusionPipeline
。 设置随机种子以保证结果的一致性。 加载预训练的 Stable Diffusion 模型。 设置模型运行在 GPU 上。 生成一张图像,并保存到磁盘。 接下来的部分重复了图像生成的过程,但每次使用不同的提示。
7. 图像拼接展示
1import numpy as np 2from PIL import Image 3 4images = [np.array(Image.open(f"{i}.jpg")) for i in range(1, 9)] 5image = np.concatenate([ 6 np.concatenate(images[0:2], axis=1), 7 np.concatenate(images[2:4], axis=1), 8 np.concatenate(images[4:6], axis=1), 9 np.concatenate(images[6:8], axis=1), 10], axis=0) 11image = Image.fromarray(image).resize((1024, 2048)) 12image
导入 numpy
和 PIL.Image
。 加载之前生成的图像,将它们组合成一个大的图像。 调整大小并展示。 通义千问提示词生成
场景1:女主正在上课
古风,工笔画,一个黑色长发少女,坐在教室里,专心听讲,上半身,身穿蓝色绣花长袍。场景2:开始睡着了
古风,淡墨渲染,一个黑色长发少女,趴在书桌上,开始打盹,上半身,身穿蓝色绣花长袍。场景3:进入梦乡,梦到自己站在路旁
古风,细腻工笔,一个黑色长发少女,站在幽静的小道旁,眺望远方,全身,身穿蓝色绣花长袍,背景是竹林与石桥。场景4:王子骑马而来
古风,线条流畅,一个英俊的青年骑着白马缓缓而来,少女静静等待,全身,少女身穿蓝色绣花长袍,青年身着白色锦衣,背景是桃花盛开的小径。场景5:两人相谈甚欢
古风,色彩鲜明,少女与青年并肩而坐于亭中,交谈甚欢,上半身,少女身穿蓝色绣花长袍,青年身着白色锦衣,背景是精致的亭台楼阁。场景6:一起坐在马背上
古风,线条流畅,少女与青年共乘一匹白马,两人并肩而笑,全身,少女身穿蓝色绣花长袍,青年身着白色锦衣,背景是蜿蜒的山路与远山。场景7:下课了,梦醒了
古风,淡墨渲染,一个黑色长发少女,睁开双眼,从梦中醒来,上半身,身穿蓝色绣花长袍,背景是教室内的书桌与同学。场景8:又回到了学习生活中
古风,细致描绘,一个黑色长发少女,坐在书桌前,认真读书写字,上半身,身穿蓝色绣花长袍,背景是书架与教室的窗户。从图片可以看出第一幅图和第八幅图的服饰没太大区别,但第二幅图与第七幅图的区别相差较大。
星火对代码的解释
下面是对代码的详细解释:
安装所需的Python库:
!pip install simple-aesthetics-predictor
:安装simple-aesthetics-predictor库,用于预测图像的审美特征。 !pip install -v -e data-juicer
:安装data-juicer库,用于处理和转换数据集。 !pip uninstall pytorch-lightning -y
:卸载pytorch-lightning库。 !pip install peft lightning pandas torchvision
:安装peft、lightning、pandas和torchvision库,这些库在后续的处理中会用到。 !pip install -e DiffSynth-Studio
:安装DiffSynth-Studio库,这是一个用于生成动漫风格图片的工具。 从ModelScope下载数据集:
使用MsDataset.load()
方法从ModelScope下载名为"AI-ModelScope/lowres_anime"的数据集。 将下载的数据集转换为适用于Diffusion Studio的数据格式。 准备数据:
创建一个名为"lora_dataset/train"的文件夹,用于存储转换后的图像。 创建一个名为"data/data-juicer/input"的文件夹,用于存储元数据文件。 遍历数据集,将每个图像转换为RGB格式,并将其保存到"lora_dataset/train"文件夹中。同时,为每个图像创建一个包含文本提示和图像路径的元数据字典,并将这些字典写入一个名为"metadata.jsonl"的文件。配置data-juicer:
创建一个名为"data/data-juicer/data_juicer_config.yaml"的配置文件,用于指定数据处理流程。 配置文件中定义了全局参数、输入输出路径、处理操作等。使用data-juicer处理数据:
运行!dj-process --config data/data-juicer/data_juicer_config.yaml
命令,根据配置文件处理数据。 读取处理后的数据:
读取"data/data-juicer/output/result.jsonl"文件中的数据,提取文本提示和图像路径。 将这些数据存储在一个名为"df"的Pandas DataFrame中,并将其导出为CSV文件。使用CLIP模型计算相似度得分:
加载预训练的CLIP模型和处理器。 使用CLIP模型计算每个图像与给定文本提示之间的相似度得分。自定义数据集类:
创建一个名为CustomDataset的类,继承自torch.utils.data.Dataset。 在这个类中,定义如何获取图像和文本数据,以及如何处理它们。创建数据加载器:
使用DataLoader类创建一个数据加载器,用于批量加载数据。使用Diffusion Studio生成图片:
加载预训练的稳定扩散模型(StableDiffusionPipeline)。 根据给定的文本提示(prompt)和负面提示(negative_prompt),生成一组二次元动漫风格的图片。 设置Guidance scale和Number of inference steps参数,控制生成过程的细节程度。 将生成的图片保存到本地文件系统中。整合生成的图片:
将所有生成的图片合并成一个大图,并将其调整为合适的尺寸。星火提示词生成
古风,水墨画,一个黑色长发少女,坐在教室里,专心听讲,上半身,蓝色学生装。 古风,水墨画,一个黑色长发少女,在教室的座位上开始打瞌睡,全身,蓝色学生装。 古风,水墨画,一个黑色长发少女,站在一条古道旁,全身,穿着梦幻般的长裙。 古风,水墨画,一位英俊的青年骑马而来,全身,身着华丽的古装。 古风,水墨画,两人面对面站立,相谈甚欢,全身,青年穿着华丽的古装,少女穿着梦幻般的长裙。 古风,水墨画,两人一起坐在马背上,全身,青年身着华丽的古装,少女穿着梦幻般的长裙。 古风,水墨画,一个黑色长发少女,坐在教室的座位上,梦醒了,上半身,蓝色学生装。 古风,水墨画,一个黑色长发少女,坐在教室里,回归学习生活,上半身,蓝色学生装。由此看得出星火提示词的描述词较少导致了图片之间的区别还是挺大的,提示词还是需要进行详细的描述
修改后的提示词
古风,水墨画,一个黑色长发少女,坐在教室里的第一排,专心听讲,手中拿着笔记录着老师的讲解,上半身,穿着一件蓝色的学生装,背景是一片模糊的黑板和粉笔字。
古风,水墨画,一个黑色长发少女,在教室的座位上开始打瞌睡,头微微下垂,全身,穿着蓝色的学生装,周围是同学们忙碌的身影和散落的书籍。
古风,水墨画,一个黑色长发少女,站在一条蜿蜒的古道旁,全身,穿着一袭飘逸的梦幻般的长裙,周围是青山绿水和飞鸟掠过的景象。
古风,水墨画,一位英俊的青年骑马而来,马匹健壮,全身,青年身着华丽的古装,头戴玉冠,手持马鞭,背景是落日余晖下的古城轮廓。
古风,水墨画,两人面对面站立,相谈甚欢,全身,青年穿着华丽的古装,腰间佩剑,少女穿着梦幻般的长裙,手中捧着一本书,背景是一片花海和远处的亭台楼阁。
古风,水墨画,两人一起坐在马背上,全身,青年身着华丽的古装,少女穿着梦幻般的长裙,他们手牵手,马儿悠闲地行走在一条小径上,周围是翠绿的竹林和流水潺潺。
古风,水墨画,一个黑色长发少女,坐在教室的座位上,梦醒了,上半身,蓝色学生装,她揉了揉眼睛,四周是同学们依旧埋头苦读的场景。
古风,水墨画,一个黑色长发少女,坐在教室里,回归学习生活,上半身,穿着蓝色的学生装,她认真地翻阅着书籍,旁边是一杯冒着热气的茶和窗外飘进的几片落叶。
修改后发现效果还行,就是对于第六张图的青年的脸的处理并不好。
总结
数据集clipjsonclidiffusiontpupytorchpromptpandasgitstablediffusioncto提示词aml文本提示kol二次元预训练csvpython