首页 > 其他分享 >Datawhale X 魔搭 AI夏令营 AIGC方向 task2笔记

Datawhale X 魔搭 AI夏令营 AIGC方向 task2笔记

时间:2024-08-14 20:58:17浏览次数:18  
标签:task2 prompt AI image AIGC juicer images import data

     纯小白,自学!从零入门AI生图(AIGC方向)基于魔搭社区“可图Kolors-LoRA风格故事挑战赛”开展实践学习。#Datawhale X 魔搭 AI夏令营#

一、利用AI精读baseline学习代码

     task2的目的是精读baseline,从代码层面理解AI生图,直播演示了用通义千问解析代码,我也用GPT-4o,文心一言解析代码,看看区别。

    这个是文生图代码的框架结构:

baseline中的所有代码:

!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

from modelscope.msdatasets import MsDataset

ds = MsDataset.load(
    'AI-ModelScope/lowres_anime',
    subset_name='default',
    split='train',
    cache_dir="/mnt/workspace/kolors/data"
)

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

data_juicer_config = """
# global parameters
project_name: 'data-process'
dataset_path: './data/data-juicer/input/metadata.jsonl'  # path to your dataset directory or file
np: 4  # number of subprocess to process your dataset

text_keys: 'text'
image_key: 'image'
image_special_token: '<__dj__image>'

export_path: './data/data-juicer/output/result.jsonl'

# process schedule
# a list of several process operators with their arguments
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

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

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  # this is the image-text similarity score
probs = logits_per_image.softmax(dim=1)  # we can take the softmax to get the probabilities

probs

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)

import torch
from diffusers import StableDiffusionPipeline

torch.manual_seed(1)
pipe = StableDiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v-1-4", torch_dtype=torch.float16)
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

from PIL import Image

torch.manual_seed(1)
image = pipe(
    prompt="二次元,日系动漫,演唱会的观众席,人山人海,一个紫色短发小女孩穿着粉色吊带漏肩连衣裙坐在演唱会的观众席,舞台上衣着华丽的歌星们在唱歌",
    negative_prompt="丑陋、变形、嘈杂、模糊、低对比度",
    cfg_scale=4,
    num_inference_steps=50, height=1024, width=1024,
)
image.save("1.jpg")

torch.manual_seed(1)
image = pipe(
    prompt="二次元,一个紫色短发小女孩穿着粉色吊带漏肩连衣裙坐在演唱会的观众席,露出憧憬的神情",
    negative_prompt="丑陋、变形、嘈杂、模糊、低对比度,色情擦边",
    cfg_scale=4,
    num_inference_steps=50, height=1024, width=1024,
)
image.save("2.jpg")

torch.manual_seed(2)
image = pipe(
    prompt="二次元,一个紫色短发小女孩穿着粉色吊带漏肩连衣裙坐在演唱会的观众席,露出憧憬的神情",
    negative_prompt="丑陋、变形、嘈杂、模糊、低对比度,色情擦边",
    cfg_scale=4,
    num_inference_steps=50, height=1024, width=1024,
)
image.save("3.jpg")

torch.manual_seed(5)
image = pipe(
    prompt="二次元,一个紫色短发小女孩穿着粉色吊带漏肩连衣裙,对着流星许愿,闭着眼睛,十指交叉,侧面",
    negative_prompt="丑陋、变形、嘈杂、模糊、低对比度,扭曲的手指,多余的手指",
    cfg_scale=4,
    num_inference_steps=50, height=1024, width=1024,
)
image.save("4.jpg")

torch.manual_seed(0)
image = pipe(
    prompt="二次元,一个紫色中等长度头发小女孩穿着粉色吊带漏肩连衣裙,在练习室练习唱歌",
    negative_prompt="丑陋、变形、嘈杂、模糊、低对比度",
    cfg_scale=4,
    num_inference_steps=50, height=1024, width=1024,
)
image.save("5.jpg")

torch.manual_seed(1)
image = pipe(
    prompt="二次元,一个紫色长发小女孩穿着粉色吊带漏肩连衣裙,在练习室练习唱歌,手持话筒",
    negative_prompt="丑陋、变形、嘈杂、模糊、低对比度",
    cfg_scale=4,
    num_inference_steps=50, height=1024, width=1024,
)
image.save("6.jpg")

torch.manual_seed(7)
image = pipe(
    prompt="二次元,紫色长发少女,穿着黑色连衣裙,试衣间,心情忐忑",
    negative_prompt="丑陋、变形、嘈杂、模糊、低对比度",
    cfg_scale=4,
    num_inference_steps=50, height=1024, width=1024,
)
image.save("7.jpg")

torch.manual_seed(0)
image = pipe(
    prompt="二次元,紫色长发少女,穿着黑色礼服,连衣裙,在台上唱歌",
    negative_prompt="丑陋、变形、嘈杂、模糊、低对比度",
    cfg_scale=4,
    num_inference_steps=50, height=1024, width=1024,
)
image.save("8.jpg")

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. 分析代码的主体架构

  2. GPT、文心一言输入的Prompt

  3. 你是一个优秀的python开发工程师,现在我们需要你帮我们分析这个代码的主体框架,你需要把代码按照工作流分成几部分,用中文回答我的问题。{此处替换前面的代码}

    GPT的分析

这个代码可以分为几个主要的工作流程部分,每个部分的作用如下:

### 1. **环境准备和依赖安装**
   - 安装所需的Python库和依赖。

!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

### 2. **数据集加载与处理**
   - 加载低分辨率的动漫数据集并进行处理,生成用于训练的数据。

from modelscope.msdatasets import MsDataset

ds = MsDataset.load(
    'AI-ModelScope/lowres_anime',
    subset_name='default',
    split='train',
    cache_dir="/mnt/workspace/kolors/data"
)

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

### 3. **数据过滤与配置**
   - 配置数据过滤器,对生成的图像数据进行尺寸和比例过滤。

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 schedule
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

### 4. **结果处理与导出**
   - 处理过滤后的数据,并将结果保存为CSV文件。

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

### 5. **CLIP模型推理**
   - 使用CLIP模型进行图像和文本的相似度计算。

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

### 6. **自定义数据集与批量处理**
   - 定义自定义数据集类,并使用DataLoader进行批量数据处理。
   

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)

### 7. **Stable Diffusion生成图像**
   - 使用Stable Diffusion生成高分辨率的二次元图像。

import torch
from diffusers import StableDiffusionPipeline

torch.manual_seed(1)
pipe = StableDiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v-1-4", torch_dtype=torch.float16)
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

### 8. **拼接图像**
   - 将生成的多张图像拼接成一张大图。

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. 环境配置与依赖安装
    • 使用pip命令安装和卸载必要的Python库,包括simple-aesthetics-predictordata-juicer(以可编辑模式安装)、peftlightningpandastorchvisionDiffSynth-Studio
    • 卸载pytorch-lightning库,避免版本冲突。
  2. 数据准备
    • 使用modelscope.msdatasets从AI-ModelScope加载低分辨率动漫数据集,并指定缓存目录。
    • 创建数据目录结构,将加载的数据集图片保存到指定路径,并生成对应的元数据文件(metadata.jsonl),包含图片路径和文本标签。
  3. 数据预处理
    • 编写data_juicer配置文件,定义数据处理的参数和流程,如图片尺寸和宽高比过滤。
    • 使用dj-process命令和配置文件对数据进行预处理,生成过滤后的结果集。
  4. 数据处理与CSV导出
    • 从预处理结果中读取元数据,将文本和图片路径信息提取出来,保存到Pandas DataFrame中。
    • 将DataFrame导出为CSV文件,方便后续处理。
  5. 图像文本相似度评估
    • 加载CLIP模型和处理器,用于计算图像和文本之间的相似度。
    • 使用CLIP模型对预处理后的数据集进行图像和文本的相似度评估,并打印结果。
  6. 自定义数据集与数据加载
    • 定义了一个继承自torch.utils.data.DatasetCustomDataset类,用于加载自定义的图像和文本数据。
    • 实例化CustomDataset并使用DataLoader进行批量加载,以便在训练或评估中使用。
  7. 图像生成
    • 使用StableDiffusionPipelinediffusers库生成基于给定提示(prompt)的图像。
    • 通过调整不同的提示、负向提示(negative_prompt)、配置(cfg_scale)和推理步数(num_inference_steps)等参数,生成多个不同的图像,并保存到本地。
  8. 图像拼接与展示
    • 读取之前生成的多个图像,将它们拼接成一个大的图像。
    • 展示拼接后的图像。

这个代码框架涵盖了从数据准备、预处理、评估到图像生成的完整流程,展示了在AI模型开发中,特别是基于文本到图像生成任务中的典型工作流程。

二、实战演练一一基于话剧的连环画制作

1.让通义千问帮我编一个8张图的故事:

提示词没啥大毛病,不过根据需要要加风格提示词和负面提示词

负面提示词:丑陋,变形,嘈杂,模糊,低对比度

2.执行Task1的30分钟速通Baseline

3.替换prompt

4.生成图片并保存

TASK2总结:学会了使用AI分析程序代码,相对于封装好的Stable diffusion,从代码层面详细了解了AI图片生成过程,但是对代码的设计具体操作依然不了解,想知道更多代码的具体应用,比如导入不同库和基础模型的方法,库和模型的获取方法等等,代码调用和Stable diffusion 秋叶WebUI生图的区别等等。

标签:task2,prompt,AI,image,AIGC,juicer,images,import,data
From: https://blog.csdn.net/weixin_43914529/article/details/141188937

相关文章

  • Sakana 推出开源AI Scientist:科研论文编写一条龙搞定
    你有没有想过,未来的科研会是怎样的?想象一下,一个不眠不休的研究助手,能够在没有人类监督的情况下,独立进行科学研究,从提出新想法到执行实验,再到撰写论文,全部自动完成。这听起来像科幻电影的情节,但在SakanaAI的努力下,这一愿景正在一步步变为现实。在现代科学研究中,科研人员常......
  • SenseCraft 部署模型到Grove Vision AI V2图像处理模块
    GroveVisionAIV2图像处理模块开箱测评摘要今天教大家快速上手GroveVisionAIV2图像处理模块,我们将一起探讨如何利用SenseCraft部署AI模型,和如何通过XIAOESP32C3调用这些模型,轻松实现智能视觉功能!原文链接:FreakStudio的博客往期推荐:学嵌入式的你,还不会面向对......
  • 产品经理用AI,跟普通人有什么不同?
    最近跟一个产品经理朋友聊天,他们公司最近单独拉一个只有产品经理的team,要在接下来半年把过去几年火过的产品工具,“加上AI驱动”重新做一遍。美其名曰“抓住AI浪潮的红利”。这不是今天的重点,重点是他在高频的用AI设计产品一段时间后,对“使用AI”这件事有了全新的......
  • AI浪潮下的程序员:重塑核心竞争力,共舞人机协作新纪元
    目录引言一、AI辅助编程对程序员工作的影响二、程序员应重点发展的核心能力三、人机协作模式下的职业发展规划结语引言在人工智能(AI)技术日新月异的今天,特别是随着AIGC(人工智能生成内容)和大语言模型的兴起,编程世界正经历着前所未有的变革。ChatGPT、Midjourney、Claud......
  • 【AI 生图赢奖】用函数计算绘出「少年江湖」,与热播网剧梦幻联动
    在这个数字化时代,人工智能不再只是科幻小说中的幻想,创意与技术的界限正在被重新定义。摩拳擦掌研究AI的你,是否想用自己的新技术和创造力一试身手呢?阿里云联合优酷推出【少年白马醉春风·AI江湖创作大赛】,无论您是开发者、设计师、还是AI绘画爱好者,都可以使用阿里云函数计......
  • Fal.ai Flux 1-Pro/Viva.ai/哩布哩布AI:AI绘图部分免费工具+原图提示词Prompt
    目录#1找软件#2懂提示词#3更难的一步,会英文我个人认为,想要玩文生图,你要会3个步骤:#1找软件主流文生图软件:Midjourney、StableDiffusion、Dall-E3巧了,我用的都是小众、免费的画笔工具:国内的哩布哩布(我的老师引领我入门的第一款软件)、通义千问、刚出道的Fal.ai的FLU......
  • 文心快码 Baidu Comate 前端工程师观点分享:行业现状(一)
    本系列视频来自百度工程效能部的前端研发经理杨经纬,她在由开源中国主办的“AI编程革新研发效能”OSC源创会·杭州站·105期线下沙龙活动上,从一款文心快码(BaiduComate)前端工程师的角度,分享了关于智能研发工具本身的研发历程和理念。​​​​​​​本视频是关于【AI编程行业......
  • 文心快码 Baidu Comate 前端工程师观点分享:行业现状(二)
    本系列视频来自百度工程效能部的前端研发经理杨经纬,她在由开源中国主办的“AI编程革新研发效能”OSC源创会·杭州站·105期线下沙龙活动上,从一款文心快码(BaiduComate)前端工程师的角度,分享了关于智能研发工具本身的研发历程和理念。以下视频是关于【AI编程行业现状】的观点2。......
  • 2024 中国开发者调查报告出炉:通义灵码是开发者最常用的 AI 编码辅助工具
    日前,CSDN&《新程序员》发起了一份围绕开发者现状、人工智能和开源的深度调查问卷,最终形成了一份详尽的《2024中国开发者调查报告》。报告中提到,AI技术的确已成为许多开发者工作中不可或缺的一部分,有69%的开发者表示,他们正在使用AI工具。聚焦到开发者日常编码辅助工具上......
  • 2024 中国开发者调查报告出炉:通义灵码是开发者最常用的 AI 编码辅助工具
    日前,CSDN&《新程序员》发起了一份围绕开发者现状、人工智能和开源的深度调查问卷,最终形成了一份详尽的《2024中国开发者调查报告》。报告中提到,AI技术的确已成为许多开发者工作中不可或缺的一部分,有69%的开发者表示,他们正在使用AI工具。聚焦到开发者日常编码辅助工具上......