当前位置:AIGC资讯 > AIGC > 正文

Datawhale AI夏令营第四期 魔搭-AIGC方向 task02笔记

1:精读baseline

   这里我使用了ChatGPT 4o对吧baseline文件代码进行了解析(不知道为啥我的通义千问无法使用)。

GPT代码解析结果如下:

1. 环境设置与依赖安装

!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

!pip install simple-aesthetics-predictor: 安装一个名为 simple-aesthetics-predictor 的 Python 包,可能用于图像美学预测。 !pip install -v -e data-juicer: 安装 data-juicer 包,该包可能用于数据处理,-v 是显示详细信息的参数,-e 表示在编辑模式下安装。 !pip uninstall pytorch-lightning -y: 卸载 pytorch-lightning 包,-y 表示自动确认卸载。 !pip install peft lightning pandas torchvision: 安装一些库,如 peft (可能是某个轻量级的优化框架),lightning (用于训练深度学习模型),pandas (用于数据处理),torchvision (用于计算机视觉任务)。 !pip install -e DiffSynth-Studio: 安装 DiffSynth-Studio 包,可能用于合成或生成模型。

2. 数据加载与预处理

python

复制代码

from modelscope.msdatasets import MsDataset

ds = MsDataset.load(

    'AI-ModelScope/lowres_anime',

    subset_name='default',

    split='train',

    cache_dir="/mnt/workspace/kolors/data"

)

from modelscope.msdatasets import MsDataset: 从 modelscope.msdatasets 模块中导入 MsDataset 类,用于数据集加载。 ds = MsDataset.load(...): 加载名为 lowres_anime 的数据集,subset_name 为 default,split 为 train,数据缓存目录为 /mnt/workspace/kolors/data。这一步是为了获取低分辨率的动漫图像数据集。

3. 数据处理与保存

python

复制代码

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")

import json, os: 导入 json 和 os 模块,分别用于处理 JSON 数据和进行文件操作。 from data_juicer.utils.mm_utils import SpecialTokens: 从 data_juicer 包中导入 SpecialTokens 类,可能用于特殊标记的处理。 from tqdm import tqdm: 导入 tqdm,用于显示循环的进度条。 os.makedirs(...): 创建目录 ./data/lora_dataset/train 和 ./data/data-juicer/input,exist_ok=True 表示如果目录已存在,不会报错。 with open(...) as f:: 打开一个文件 ./data/data-juicer/input/metadata.jsonl 用于写入数据。 for data_id, data in enumerate(tqdm(ds)):: 遍历数据集 ds,使用 tqdm 显示进度。 image = data["image"].convert("RGB"): 将数据中的图像转换为 RGB 格式。 image.save(...): 将图像保存到指定路径。 metadata = {...}: 创建一个包含文本描述和图像路径的元数据字典。 f.write(json.dumps(metadata)): 将元数据转换为 JSON 格式并写入文件。

4. 配置文件的生成与数据过滤

python

复制代码

data_juicer_config = """

# global parameters

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())

data_juicer_config = """...""": 定义一个多行字符串 data_juicer_config,这是 data-juicer 工具的配置文件内容。 with open(...) as file:: 打开 data_juicer_config.yaml 文件,用于写入配置内容。 file.write(data_juicer_config.strip()): 将配置内容写入文件并去除首尾空白字符。

5. 执行数据处理

python

复制代码

!dj-process --config data/data-juicer/data_juicer_config.yaml

!dj-process --config data/data-juicer/data_juicer_config.yaml: 使用 dj-process 命令运行 data-juicer 的数据处理工具,按照之前定义的配置文件 data_juicer_config.yaml 执行数据过滤和处理。

6. 处理结果并保存为 CSV 文件

python

复制代码

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

import pandas as pd: 导入 pandas,用于数据操作和分析。 import os, json: 再次导入 os 和 json 模块。 from PIL import Image: 从 PIL (Python Imaging Library) 导入 Image 类,用于图像处理。 from tqdm import tqdm: 再次导入 tqdm,用于显示进度条。 texts, file_names = [], []: 初始化两个空列表,分别存储文本和文件名。 os.makedirs(...): 创建一个目录,用于存储输出的图像。 with open(...) as f:: 打开处理后的 JSON 文件。 for line in tqdm(f):: 遍历 JSON 文件中的每一行数据,显示进度条。 metadata = json.loads(line): 将每一行数据解析为 JSON 格式。 texts.append(metadata["text"]): 将文本信息添加到 texts 列表中。 file_names.append(metadata["image"][0]): 将图像文件路径添加到 file_names 列表中。 df = pd.DataFrame(...): 使用 pandas 创建一个数据框 df,包含 text 和 file_name 两列。 df.to_csv(...): 将数据框保存为 CSV 文件 result.csv。 df: 显示数据框内容。

7. 使用 CLIP 模型进行图像与文本相似度分析

python

复制代码

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

probs = logits_per_image.softmax(dim=1)

probs

from transformers import CLIPProcessor, CLIPModel: 从 transformers 库中导入 CLIPProcessor 和 `CLIP

2:实战演练

      这里实战演练,我选择了自己很喜欢的一本科幻小说中的名场面《三体》中三体人的水滴探测器毁灭地球宇宙防卫舰队的故事。我选择了将这个片段丢给ChatGPT让他给我总结8个场面的提示词。

以下是GPT的回答:

最后我根据Task02的教学文档,让GPT仿照整理出来场景表格。

最后如愿得到了关于这个情节的8个提示词。

图片1

场景描述:水滴在太空中出现

正向提示词:科幻,宇宙,深空,星空背景,一个银白色的完美球体——水滴,表面光滑如镜,反射微弱星光,小巧但充满力量,具有威胁性的气息。 反向提示词:模糊,低对比度,噪点,变形,杂乱

图片2

场景描述:人类舰队整齐排列,准备迎敌

正向提示词:科幻,宇宙,庞大的太空战舰,排列整齐,背景为黑暗的宇宙和闪烁的星光,舰队指挥官紧张地盯着前方的水滴,战斗气氛紧张。 反向提示词:破损,变形,杂乱,暗淡,低质量

图片3

场景描述:水滴高速冲向人类舰队

正向提示词:科幻,宇宙,银白色的水滴以难以置信的速度向人类舰队冲来,模糊的星光背景,人类战舰发射激光和导弹,水滴无视攻击,保持完整和光滑。 反向提示词:模糊,失焦,失控,低对比度,杂乱

图片4

场景描述:水滴无视所有攻击,继续前进

正向提示词:科幻,宇宙,水滴穿越激光网和导弹阵,表面依旧光滑如镜,背景中的战舰火力全开,但对水滴无效,显得无比渺小和无力。 反向提示词:破碎,变形,低对比度,暗淡,模糊

图片5

场景描述:水滴突破舰队防线,接近指挥舰

正向提示词:科幻,宇宙,水滴接近人类舰队指挥舰,水滴的表面清晰映出指挥舰和远处的星辰,紧张感弥漫,末日氛围扑面而来。 反向提示词:失焦,低对比度,模糊,杂乱,无序

图片6

场景描述:水滴瞬间摧毁指挥舰,引发舰队连锁爆炸

正向提示词:科幻,宇宙,水滴穿透指挥舰,巨大的火球在太空中爆发,碎片四散,整个舰队被毁灭性的打击摧毁,背景为明亮的爆炸光芒和黑暗的宇宙。 反向提示词:模糊,低质量,暗淡,失控,杂乱

图片7

场景描述:宇宙中的废墟,曾经的辉煌舰队变为残骸

正向提示词:科幻,宇宙,废墟漂浮在无尽的星空中,残破的战舰碎片散落四周,背景为沉寂的星空,气氛压抑和沉重。 反向提示词:变形,杂乱,模糊,低对比度,噪点

图片8

场景描述:水滴离开,消失在宇宙深处

正向提示词:科幻,宇宙,水滴在远处的宇宙中逐渐消失,背景为无尽的星海和寂静的深空,水滴的表面仍然光滑无暇,带着毁灭的使命离去。 反向提示词:模糊,低对比度,噪点,变形,杂乱

在我将这些正向提示词和反向提示词输入到baseline文件中。

执行后得到的结果并不如意。这是我第一次得到的AI图。

那么很显然这个AI图片与原著的描述差距是很大的。但是我观察这些图片,发现是正向提示词以及反向提示词不够细节,不够全面。于是我总结了图片中的问题,发给GPT让其完善提示词。

于是GPT帮我重新改善了提示词。

我在baseline重新替换新的提示词然后得到了以下的结果

这里其中的一些图片生成还是不错的,不过还是有很多的问题。比如水滴的形状是银白色,无比光滑的水滴形状的小型飞行器。这里可以看出AI生图的效果还是比较一般。但是由于本人的时间关系我就没有继续调试探索。

总结

**文章总结**
本文详细概述了使用ChatGPT 4模型对baseline文件代码进行解析并应用于一个具体的实战演练——通过AI生成基于《三体》中“水滴探测器毁灭地球宇宙防卫舰队”情节的图像。文章主要分为两大部分:
### 第一部分:Baseline 代码解析
1. **环境设置与依赖安装**:
- 安装了一系列Python库,包括`simple-aesthetics-predictor`、`data-juicer`、`peft`、`lightning`、`pandas`、`torchvision`及`DiffSynth-Studio`,这些库可能用于图像美学预测、数据处理、模型训练及图像生成。
2. **数据加载与预处理**:
- 使用`modelscope.msdatasets`加载低分辨率的动漫图像数据集`lowres_anime`,并将数据预处理后保存到本地目录,同时生成包含图像信息的元数据文件。
3. **数据处理与保存**:
- 遍历已加载的数据集,将图像转换为RGB格式并保存到指定路径,并生成包含图像路径和文本描述的JSON文件作为数据集的输入。
4. **配置文件的生成与数据过滤**:
- 创建并编写`data-juicer`工具的配置文件,定义了包括数据集路径、处理参数等在内的全局参数。
5. **执行数据处理**:
- 使用`dj-process`命令按照配置文件处理数据,进行诸如图像尺寸、宽高比等筛选。
6. **处理结果并保存为CSV文件**:
- 从处理后的文件中读取数据,并创建包含文本和文件名的数据框,最后保存为CSV文件。
7. **使用CLIP模型进行图像与文本相似度分析**:
- 导入CLIP模型和处理器,加载预训练模型,并根据文本和图像生成相似度概率,查看生成结果与描述的匹配程度。
### 第二部分:实战演练
1. **场景总结与提示词生成**:
- 通过ChatGPT总结《三体》中特定情节,生成8个场景的详细提示词,包括正向和反向提示词,以增强图像生成的准确性。
2. **初步生成与效果评估**:
- 将提示词输入到baseline文件中执行,但首次生成的图像效果并不理想,与原著描述存在较大差距,提示词细节不足。
3. **提示词优化与再生成**:
- 基于首次结果反馈,调整和完善提示词后再次生成图像,生成的部分图像质量有所提升,但整体效果仍显一般。
4. **结论**:
- 通过实战验证了AI图像生成的有效性,但也显示了技术上的局限性和进一步优化的必要性。由于时间限制,作者没有继续深入调试和优化流程。

更新时间 2024-08-19