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 和 `CLIP2:实战演练
这里实战演练,我选择了自己很喜欢的一本科幻小说中的名场面《三体》中三体人的水滴探测器毁灭地球宇宙防卫舰队的故事。我选择了将这个片段丢给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图像生成的有效性,但也显示了技术上的局限性和进一步优化的必要性。由于时间限制,作者没有继续深入调试和优化流程。