Datawhale X 魔搭 AI夏令营-AIGC Task 02 精读代码,实战进阶 --笔记 ...

打印 上一主题 下一主题

主题 522|帖子 522|积分 1566

媒介
Task 01 通过预训练模子的调用,在baseline上跑通模子,实现内容→图片。即,根据prompt中输入的文本形貌,模子天生对应的图片。Task 02 深入学习。

  
一、AI生图技术

1.1 基础点

AIGC(AI-Generated Content)是通过AI技术自动天生内容的生产方式。AI生图是最早被大众所知且广泛认可的AIGC范畴。
简单的明确,AI生图,就是训练模子实现 图片形貌图片特征匹配。比如说,输入文本“狗狗”,然后给模子狗狗的照片。通过大量的样本训练,让模子知道文本“狗狗”对应的照片是什么样的,当下次输入“狗狗”后,可以或许天生对应的图片。
1.2 技术难点

信赖大家也在网上见过一些AI天生令人涕笑的图片,图中存在不符常识的细节。如下图

这不由得令人深思,模子是否真正明确内容与特征之间含义?以上图为例,模子是否真的明确“正常人类的手”到底具有什么特征(几根手指、指甲的样子…)。天生图内容的“逻辑性”是一较难降服的难点。
1.3 题外话(补充知识点:天生对抗网络)

不用于PS的P图,这里涉及到Deepfake技术,一种使用AI技术天生的伪造媒体,包括图片、视频、音频等。随着近几年AI天生技术的精近,天生的图片等也是愈发真实,令人迷惑,难以辨别。这不由得想起天生对抗网络(GANs),只不外现在屏幕前的人似乎就像模子中的“鉴别器”,面对天生的可以或许以假乱真的样本,难以给出正确的判断结果。论及GAN,再整理点小笔记。
GAN模子
GAN大概是2014年左右Goodfellow提出的模子,其核心思想为实现二人零和博弈。模子基础架构如下:

构成:
天生器(G)和 鉴别器(D) 。Z 为noise,随机噪声,一般可从正态分布或其他分布随机天生。X 为真实的样本数据,G(Z)G 天生的样本。
思想:
天生器 G 学习 ZG(Z) 的映射过程,学习并天生可以或许以假乱真的天生样本 G(Z) ;鉴别器 D 判断其输入是来自真实样本的 X 还是 G(Z)
训练(如何实现):


  • 先训练D。利用 G 天生样本数据 G(Z),将其标为0(告诉 D 这是假数据),并将真实数据X标为1(告诉 D 这是真数据),将上述数据输入 D 进行训练,通过损失函数、反向传播等对D进行权重更新。(一个简单的分类器)
  • 再通过D训练GD 训练完成后,固定参数,不进行权重更新。此时,同样 G天生样本数据 G(Z)但将其标为1!,输入 D 中,根据损失更新 G 的参数。(告诉 D 这是真数据,但是 D 已训练完成知道真数据和假数据的特征, D 能信吗?相应的 D 会给出自己的判断,也就是 G 权重优化的依据)
如此,循环训练。两者本领不断增强,当 G 完成 ZG(Z) ,天生的样本非常真实,真实到 D 难以分辨(问D,这是真的还是假的,D说大概是真的,大概是假的,真假概率都是0.5)。此时,达到抱负的状态,纳什均衡点(理论上),天生的数据完美符合最初的要求。
二、代码精读

Task 01中的baseline代码精读与学习。随着大语言模子的广泛应用,对广大学习者来说是个福音。利用诸如chatgpt、文心一言进行代码解读已并非难事,Task 02中推荐的是通义千问。无论用什么工具,能对代码深入明确学习就行。
一个模子的代码,说白了就是利用某种编程语言,构建逻辑布局模块,利用计算机算力,实现某种目标。这个过程,必要什么?


  • 数据集。对DL来说,主要作训练和测试用。将数据集划分为训练集和测试集,训练集数据用于训练模子,调整模子参数。训练完后,用未到场训练的测试集数据对模子进行测试,客观评估模子泛化本领。
  • 模子算法。核心环节。对Python来说,目前构建模子算法可以直接调用一些成熟的DL框架,pytorch、tensorflow,国内百度的paddle。框架内有许多封装好的函数,一些常用的模块都可以直接调用,如LSTM、CNN,调用完组网就可以直接构建一些简单模子了。一些基础的ML模子甚至可以直接用,如SVR、XGBoost。如有必要可以直接在网上搜索,很多模子算法甚至直接有python包。
  • 计算机算力。计算机强盛的算力是其产生的原因。单纯靠人类计算,费时费力。CPU、GPU,个人电脑算力不足可以用云服务器。
对于这个Task,厘清


  • 目标是什么?
    实现图片天生,在prompt中输入关键词,模子天生对应的图片。
  • 怎么实现?
    数据?算法模子?算力?
    提供数据。利用预训练模子和微调手段,Kolors和Lora。阿里云服务器。
代码分块分析

pip装一些必要的资源包。
  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
复制代码
导包全写一起
  1. import json, os
  2. from data_juicer.utils.mm_utils import SpecialTokens
  3. from tqdm import tqdm
  4. import pandas as pd
  5. from PIL import Image
  6. import torch
  7. from diffusers import StableDiffusionPipeline
复制代码
(1)导入数据集,从modelscope的MsDataset里载入数据集lowres_anime,用于后面训练。
  1. from modelscope.msdatasets import MsDataset
  2. ds = MsDataset.load(
  3.     'AI-ModelScope/lowres_anime', # 载入指定数据集
  4.     subset_name='default',
  5.     split='train', # 数据集的模式,应该是分了train和test之类
  6.     cache_dir="/mnt/workspace/kolors/data" # 数据集的保存位置
  7. )
复制代码
数据预处理。下载完训练数据之后,必要对数据进行预处理,一般来说,包括数据清洗、筛选、处理异常值等。数据包中的数据一般都已经经过这些开端处理,要做的就是按照模子的必要处理数据。这里主要是对载入的数据包内容进行拆分,图片,形貌性文本对应保存,设定data_juicer规则对数据进行筛选过滤。
  1. os.makedirs("./data/lora_dataset/train", exist_ok=True)
  2. os.makedirs("./data/data-juicer/input", exist_ok=True)
  3. with open("./data/data-juicer/input/metadata.jsonl", "w") as f:
  4.     for data_id, data in enumerate(tqdm(ds)):  # ds即导入数据,对ds进行遍历处理,进行后面的操作
  5.         image = data["image"].convert("RGB") # 转换成RGB,即彩色图
  6.         image.save(f"/mnt/workspace/kolors/data/lora_dataset/train/{data_id}.jpg") #  以jpg形式保存图片,名为图片的索引
  7.         metadata = {"text": "二次元", "image": [f"/mnt/workspace/kolors/data/lora_dataset/train/{data_id}.jpg"]} # 生成图片对应的索引数据
  8.         f.write(json.dumps(metadata)) # 索引数据写入json文件
  9.         f.write("\n")
  10. data_juicer_config = """
  11. # global parameters
  12. project_name: 'data-process'
  13. dataset_path: './data/data-juicer/input/metadata.jsonl'  # path to your dataset directory or file
  14. np: 4  # number of subprocess to process your dataset
  15. text_keys: 'text'
  16. image_key: 'image'
  17. image_special_token: '<__dj__image>'
  18. export_path: './data/data-juicer/output/result.jsonl'
  19. # process schedule
  20. # a list of several process operators with their arguments
  21. process:
  22.     - image_shape_filter:
  23.         min_width: 1024
  24.         min_height: 1024
  25.         any_or_all: any
  26.     - image_aspect_ratio_filter:
  27.         min_ratio: 0.5
  28.         max_ratio: 2.0
  29.         any_or_all: any
  30. """
  31. with open("data/data-juicer/data_juicer_config.yaml", "w") as file:
  32.     file.write(data_juicer_config.strip())
  33. !dj-process --config data/data-juicer/data_juicer_config.yaml
复制代码
通过之前的json文件metadata,把数据集中的形貌内容text(二次元)和文件名image(.jpg)对应起来,并创建了一个DataFrame情势保存,导出csv。
  1. texts, file_names = [], []
  2. os.makedirs("./data/lora_dataset_processed/train", exist_ok=True)
  3. with open("./data/data-juicer/output/result.jsonl", "r") as file:
  4.     for data_id, data in enumerate(tqdm(file.readlines())):
  5.         data = json.loads(data)
  6.         text = data["text"]
  7.         texts.append(text)
  8.         image = Image.open(data["image"][0])
  9.         image_path = f"./data/lora_dataset_processed/train/{data_id}.jpg"
  10.         image.save(image_path)
  11.         file_names.append(f"{data_id}.jpg")
  12. data_frame = pd.DataFrame()
  13. data_frame["file_name"] = file_names
  14. data_frame["text"] = texts
  15. data_frame.to_csv("./data/lora_dataset_processed/train/metadata.csv", index=False, encoding="utf-8-sig")
  16. data_frame
复制代码
(2)下载模子Kolors
  1. from diffsynth import download_models
  2. download_models(["Kolors", "SDXL-vae-fp16-fix"])
复制代码
实行Loras训练。
  1. cmd = """
  2. python DiffSynth-Studio/examples/train/kolors/train_kolors_lora.py \
  3.   --pretrained_unet_path models/kolors/Kolors/unet/diffusion_pytorch_model.safetensors \
  4.   --pretrained_text_encoder_path models/kolors/Kolors/text_encoder \
  5.   --pretrained_fp16_vae_path models/sdxl-vae-fp16-fix/diffusion_pytorch_model.safetensors \
  6.   --lora_rank 16 \
  7.   --lora_alpha 4.0 \
  8.   --dataset_path data/lora_dataset_processed \
  9.   --output_path ./models \
  10.   --max_epochs 1 \
  11.   --center_crop \
  12.   --use_gradient_checkpointing \
  13.   --precision "16-mixed"
  14. """.strip()
  15. os.system(cmd)
复制代码
  1. # 定义load_lora函数
  2. def load_lora(model, lora_rank, lora_alpha, lora_path):
  3.     lora_config = LoraConfig(
  4.         r=lora_rank,
  5.         lora_alpha=lora_alpha,
  6.         init_lora_weights="gaussian",
  7.         target_modules=["to_q", "to_k", "to_v", "to_out"],
  8.     )
  9.     model = inject_adapter_in_model(lora_config, model)
  10.     state_dict = torch.load(lora_path, map_location="cpu")
  11.     model.load_state_dict(state_dict, strict=False)
  12.     return model
  13. # Load 模型
  14. model_manager = ModelManager(torch_dtype=torch.float16, device="cuda",
  15.                              file_path_list=[
  16.                                  "models/kolors/Kolors/text_encoder",                              "models/kolors/Kolors/unet/diffusion_pytorch_model.safetensors",
  17. "models/kolors/Kolors/vae/diffusion_pytorch_model.safetensors"])
  18. pipe = SDXLImagePipeline.from_model_manager(model_manager)
  19. # 利用定义的load_lora函数,导入lora微调参数
  20. pipe.unet = load_lora(
  21.     pipe.unet,
  22.     lora_rank=16,
  23.     lora_alpha=2.0,
  24.     lora_path="models/lightning_logs/version_0/checkpoints/epoch=0-step=500.ckpt"
  25. )
复制代码
(3)天生图像。prompt即 输入的文本特征,negative_prompt 是不希望图片有的特征。
  1. torch.manual_seed(0)
  2. image = pipe(
  3.     prompt="二次元,一个黑色长发少女,在家中沙发上斜躺着,看书,全身,白色连衣裙",
  4.     negative_prompt="丑陋、变形、嘈杂、模糊、低对比度",
  5.     cfg_scale=4,
  6.     num_inference_steps=50, height=1024, width=1024,
  7. )
  8. image.save("1.jpg")
复制代码
图片拼接。baseline里天生并保存了8张照片。拼接成2×4的情势。
  1. import numpy as np
  2. from PIL import Image
  3. images = [np.array(Image.open(f"{i}.jpg")) for i in range(1, 9)]
  4. image = np.concatenate([
  5.     np.concatenate(images[0:2], axis=1),
  6.     np.concatenate(images[2:4], axis=1),
  7.     np.concatenate(images[4:6], axis=1),
  8.     np.concatenate(images[6:8], axis=1),
  9. ], axis=0)
  10. image = Image.fromarray(image).resize((1024, 2048))
  11. image
复制代码
三、实战演练逐一基于话剧的连环画制作

做了一个小test
  1. torch.manual_seed(0)
  2. image = pipe(
  3.     prompt="现代风,一个穿着休闲装束的短发少女,一个身穿学生制服的长发少女,学校的一角,有几棵老树和长椅,少年正在给少女讲笑话,少女捂嘴轻笑",
  4.     negative_prompt="丑陋、变形、嘈杂、模糊、低对比度",
  5.     cfg_scale=4,
  6.     num_inference_steps=50, height=1024, width=1024,
  7. )
  8. image.save("1.jpg")
复制代码
对应生图。咋一看没什么问题,短发少女的耳朵貌似存在点…

去掉“现代风”的限制,生图如下。

进行一系列的实验后,有些生图确实精美,一些则存在不足。在prompt的输入中,必要多加留意,尽量输入成模子可以或许明确的短词。
话剧正文

老套剧情

结果图如下

配上文字,如下

四、浅尝scepter webui

魔搭体验网址:Scepter万能图片编辑天生
进入网站后,可直接点击“推理”

模子管理中可选择模子。在输入框内输入“形貌”,点击天生,即可天生图像。实验输入“a cute rabbit”,得到了一只可爱的兔子:

当形貌为中文,“一只可爱的兔子”,天生:

在天生下方,另有许多选项可供选择,使用咒语、微调、控制等,均可进行实验,网页中也提供了视频进行学习。

稍微研究了一下这些内容。咒语书实在就是教大家如何进行prompt工程,对自己想要天生的图片进行适当的形貌,让模子可以或许明确你的input,使得天生的图片可以或许满足要求。

那么试试看,选择“可爱的3D角色”,利用提示的模版,加上"rabbit",会天生怎样的图片?

再试试微调模子,选择铅笔素描,获取示例提示词。

按照提示词,对原先的“a cute rabbit”进行修改,生图

有兴趣的可以试试。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

tsx81429

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表