2.Datawhale AI夏令营 AIGC Task2:精读代码,实战进阶

0812

Title 1.Datawhale AI夏令营 AIGC Task2:精读代码,实战进阶

在这里插入图片描述在这里插入图片描述

1.了解 AI生图技术 的能力&局限

1.1 为什么要了解AI生图前沿?

AIGC(AI-Generated Content)是通过人工智能技术自动生成内容的生产方式

Deepfake

1.2 再来从工具视角回顾一下AI生图的历史

1.3AI生图的难点和挑战有哪些?

手:解决这个问题的相关技术,如:给图片里的人手打上标记,像把手掌、拇指、食指啥的,都给清楚地标出来;

AI生图模型获得图片生成能力主要是通过 学习 图片描述 以及 图片特征,尝试将这两者进行一一对应,存储在自己的记忆里。通过输入的文字,复现出来对应的图片特征,从而生成了我们需要的图片。

关于AI是否真正理解了图片背后所代表的世界的特征,是否理解了图片的含义,这个一直是科研界和产业界存在争议的话题,我们唯一可以确定的是——由于每个模型用于训练的数据是有限的且不一定相同的,它们能匹配的描述和特征也是有限的,所以在风格、具体事物上,不同的模型会有很大的生成差异,且可能存在诸多与现实不符的情况。

AI味:AI生成的图片和实际生活场景/艺术家创作的绘画/摄影/三维作品 相比,存在强烈的违和感,或是细节处理,或是画面逻辑性存在问题,一言就能被看出是“AI出品”

  • 观察图片的细节。仔细检查人物的面部特征,尤其是眼睛和嘴巴

  • 检查光线和阴影。分析图片中的光源是否一致,阴影的方向是否与光源相符,是否存在不自然的光线或阴影

  • 分析像素。放大图片,寻找是否有模糊或像素化的部分。

  • 注意背景。检查背景中是否有不协调的元素,比如物体边缘是否平滑,背景中是否有不自然的重复模式。

1.4 开始探索AI生图前沿

【1.2最新图像生成技术研究方向-介绍与分析】

https://www.bilibili.com/video/BV1vT421k7Qc/?share_source=copy_web&vd_source=9346d1baa752b5ddda5636787cd547f4

资料链接: https://www.modelscope.cn/headlines/article/537?from=blibli_video

1.基础文生图模型优化
DALLE-2
DALLE-2 is an advanced AI model developed by OpenAI for generating images from textual descriptions. It's part of a broader class of models known as "large language models" (LLMs) that have been extended to understand and generate visual content based on natural language inputs. DALLE-2 uses deep learning techniques to create images that match detailed and complex prompts, producing high-quality and creative visuals. This capability has various applications, from helping artists and designers come up with new ideas to generating unique images for advertising and storytelling.

Stable Diffusion
Stable Diffusion is a type of deep learning model that generates high-quality images from textual descriptions. It's an open-source tool powered by a type of neural network called a latent diffusion model. This technology allows for generating detailed and diverse images based on user inputs, making it a powerful tool for artists, designers, and content creators.One of the key features of Stable Diffusion is its ability to fine-tune the results according to specific styles or requirements. Users can guide the image generation process through detailed prompts or by adjusting the model's parameters, making it highly flexible for creative purposes. Additionally, because it's open-source, it has a rapidly growing community of users who contribute to its development and use it in innovative ways.

Diffusion Transformer
The Diffusion Transformer is a type of machine learning model that combines elements of diffusion models and transformers to generate high-quality images from textual descriptions. This approach marries the generative capabilities of diffusion models, which gradually convert random noise into coherent images, with the powerful language understanding and sequence modeling capabilities of transformers.

2.可控生成与图像编辑
ControlNet
T21-Adapter
Dreambooth
3.生成采样加速
DDIM
Consistency model
Rectified Flow

2. Part1:认识通义千问

通义千问:GPT

https://tongyi.aliyun.com/qianwen/

通义万相:文生图的工具

https://tongyi.aliyun.com/wanxiang/

2.1 通义千问的自我介绍

编程与技术支持

2.2 抱走你的AI学习助教

2.3使用操作指南

3.Part2:精读baseline——从零入门AI生图

3.1分析代码的主体架构

  1. 环境准备
  2. 数据集加载和预处理
  3. 数据清洗和过滤
  4. CLIP模型评估
  5. Pytorch数据集与数据加载器
  6. StableDiffusion图像生成

3.2 具体代码

python comment

# single-line comments

'''
multi-line comments
'''
# 安装 Data-Juicer 和 DiffSynth-Studio
!pip install simple-aesthetics-predictor # 安装simple-aesthetics-predictor
!pip install -v -e data-juicer # 安装data-juicer,A One-Stop Data Processing System for Large Language Models. 阿里巴巴集团的研究人员提出了Data-Juicer系统,它犹如一位数据魔法师,能够高效生成数据配方,探索不同数据的组合可能性,并评估其对LLM性能的影响。 https://arxiv.org/abs/2309.02033
!pip uninstall pytorch-lightning -y # 卸载pytorch-lightning
!pip install peft lightning pandas torchvision # 安装 peft lightning pandas torchvision
!pip install -e DiffSynth-Studio # 安装DiffSynth-Studio

# 从魔搭数据集中下载数据集AI-ModelScope/lowres_anime
from modelscope.msdatasets import MsDataset  #引入数据集模块msdatasets
ds = MsDataset.load(
    'AI-ModelScope/lowres_anime',
    subset_name='default',
    split='train',
    cache_dir="/mnt/workspace/kolors/data" # 指定缓存目录
) # 从魔搭数据集中下载数据集AI-ModelScope/lowres_anime,赋值给参数ds

# 生成数据集
import json, os # 导入json和os模块
from data_juicer.utils.mm_utils import SpecialTokens # 导入SpecialTokens
from tqdm import tqdm # 导入tqdm进度条管理
os.makedirs("./data/lora_dataset/train", exist_ok=True) # 创建文件夹./data/lora_dataset/train
os.makedirs("./data/data-juicer/input", exist_ok=True) # 创建文件夹./data/data-juicer/input
with open("./data/data-juicer/input/metadata.jsonl", "w") as f:
    for data_id, data in enumerate(tqdm(ds)): # 遍历数据集ds
        image = data["image"].convert("RGB") # 将数据集的图片转换为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)) # 将索引数据写入文件./data/data-juicer/input/metadata.jsonl
        f.write("\n")

# 配置data-juicer,并进行数据筛选过滤
# 配置过滤的规则
data_juicer_config = """
# global parameters
project_name: 'data-process' # 名称
dataset_path: './data/data-juicer/input/metadata.jsonl'  # 你前面生成的数据的索引文件
np: 4  # 线程数

text_keys: 'text' # 文件./data/data-juicer/input/metadata.jsonl的描述的字段名
image_key: 'image' # 文件./data/data-juicer/input/metadata.jsonl的图片字段名
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 # 最小宽度1024
        min_height: 1024 # 最小高度1024
        any_or_all: any # 符合前面条件的图片才会被保留
    - image_aspect_ratio_filter: # 图片长宽比过滤
        min_ratio: 0.5 # 最小长宽比0.5
        max_ratio: 2.0 # 最大长宽比2.0
        any_or_all: any # 符合前面条件的图片才会被保留
"""

# 保存data-juicer配置到data/data-juicer/data_juicer_config.yaml
with open("data/data-juicer/data_juicer_config.yaml", "w") as file:
    file.write(data_juicer_config.strip())
# data-juicer开始执行数据筛选
!dj-process --config data/data-juicer/data_juicer_config.yaml


# 通过前面通过data-juicer筛选的图片索引信息./data/data-juicer/output/result.jsonl,生成数据集
import pandas as pd # 导入pandas
import os, json # 导入os和json
from PIL import Image # 导入Image
from tqdm import tqdm # 导入tqdm进度条管理
texts, file_names = [], [] # 定义两个空列表,分别存储图片描述和图片名称
os.makedirs("./data/lora_dataset_processed/train", exist_ok=True) # 创建文件夹./data/lora_dataset_processed/train
with open("./data/data-juicer/output/result.jsonl", "r") as file: # 打开前面data-juicer筛选的图片索引文件./data/data-juicer/output/result.jsonl
    for data_id, data in enumerate(tqdm(file.readlines())): # 遍历文件./data/data-juicer/output/result.jsonl
        data = json.loads(data) # 将json字符串转换为对象
        text = data["text"] # 获取对象中的text属性,也就是图片的描述信息
        texts.append(text) # 将图片的描述信息添加到texts列表中
        image = Image.open(data["image"][0]) # 获取对象中的image属性,也就是图片的路径,然后用这个路径打开图片
        image_path = f"./data/lora_dataset_processed/train/{data_id}.jpg" # 生成保存图片的路径
        image.save(image_path) # 将图片保存到./data/lora_dataset_processed/train文件夹中
        file_names.append(f"{data_id}.jpg") # 将图片名称添加到file_names列表中
data_frame = pd.DataFrame() # 创建空的DataFrame
data_frame["file_name"] = file_names # 将图片名称添加到data_frame中
data_frame["text"] = texts # 将图片描述添加到data_frame中
data_frame.to_csv("./data/lora_dataset_processed/train/metadata.csv", index=False, encoding="utf-8-sig") # 将data_frame保存到./data/lora_dataset_processed/train/metadata.csv
data_frame # 查看data_frame


# 下载可图模型
from diffsynth import download_models # 导入download_models
download_models(["Kolors", "SDXL-vae-fp16-fix"]) # 下载可图模型
# DiffSynth-Studio提供了可图的Lora训练脚本,查看脚本信息
!python DiffSynth-Studio/examples/train/kolors/train_kolors_lora.py -h


# 执行可图Lora训练
import os
cmd = """
python DiffSynth-Studio/examples/train/kolors/train_kolors_lora.py \ # 选择使用可图的Lora训练脚本DiffSynth-Studio/examples/train/kolors/train_kolors_lora.py
  --pretrained_unet_path models/kolors/Kolors/unet/diffusion_pytorch_model.safetensors \ # 选择unet模型
  --pretrained_text_encoder_path models/kolors/Kolors/text_encoder \ # 选择text_encoder
  --pretrained_fp16_vae_path models/sdxl-vae-fp16-fix/diffusion_pytorch_model.safetensors \ # 选择vae模型
  --lora_rank 16 \ # lora_rank 16 表示在权衡模型表达能力和训练效率时,选择了使用 16 作为秩,适合在不显著降低模型性能的前提下,通过 LoRA 减少计算和内存的需求
  --lora_alpha 4.0 \ # 设置 LoRA 的 alpha 值,影响调整的强度
  --dataset_path data/lora_dataset_processed \ # 指定数据集路径,用于训练模型
  --output_path ./models \ # 指定输出路径,用于保存模型
  --max_epochs 1 \ # 设置最大训练轮数为 1
  --center_crop \ # 启用中心裁剪,这通常用于图像预处理
  --use_gradient_checkpointing \ # 启用梯度检查点技术,以节省内存
  --precision "16-mixed" # 指定训练时的精度为混合 16 位精度(half precision),这可以加速训练并减少显存使用
""".strip()
os.system(cmd) # 执行可图Lora训练


# 加载lora微调后的模型
from diffsynth import ModelManager, SDXLImagePipeline # 导入ModelManager和SDXLImagePipeline
from peft import LoraConfig, inject_adapter_in_model # 导入LoraConfig和inject_adapter_in_model
import torch # 导入torch
# 加载LoRA配置并注入模型
def load_lora(model, lora_rank, lora_alpha, lora_path):
    lora_config = LoraConfig(
        r=lora_rank, # 设置LoRA的秩(rank)
        lora_alpha=lora_alpha, # 设置LoRA的alpha值,控制LoRA的影响权重
        init_lora_weights="gaussian", # 初始化LoRA权重为高斯分布
        target_modules=["to_q", "to_k", "to_v", "to_out"], # 指定要应用LoRA的模块
    )
    model = inject_adapter_in_model(lora_config, model) # 将LoRA配置注入到模型中
    state_dict = torch.load(lora_path, map_location="cpu") # 加载LoRA微调后的权重
    model.load_state_dict(state_dict, strict=False) # 将权重加载到模型中,允许部分权重不匹配
    return model # 返回注入LoRA后的模型
# 加载预训练模型
model_manager = ModelManager(
    torch_dtype=torch.float16, # 设置模型的数据类型为float16,减少显存占用
    device="cuda", # 指定使用GPU进行计算
    file_path_list=[
        "models/kolors/Kolors/text_encoder", # 文本编码器的路径
        "models/kolors/Kolors/unet/diffusion_pytorch_model.safetensors", # UNet模型的路径
        "models/kolors/Kolors/vae/diffusion_pytorch_model.safetensors" # VAE模型的路径
    ]
)
# 初始化图像生成管道
pipe = SDXLImagePipeline.from_model_manager(model_manager) # 从模型管理器中加载模型并初始化管道
# 加载并应用LoRA权重到UNet模型
pipe.unet = load_lora(
    pipe.unet, 
    lora_rank=16, # 设置LoRA的秩(rank),与训练脚本中的参数保持一致
    lora_alpha=2.0, # 设置LoRA的alpha值,控制LoRA对模型的影响权重
    lora_path="models/lightning_logs/version_0/checkpoints/epoch=0-step=500.ckpt" # 指定LoRA权重的文件路径
)


# 生成图像
torch.manual_seed(0) # 设置随机种子,确保生成的图像具有可重复性。如果想要每次生成不同的图像,可以将种子值改为随机值。
image = pipe(
    prompt="二次元,一个紫色短发小女孩,在家中沙发上坐着,双手托着腮,很无聊,全身,粉色连衣裙", # 设置正向提示词,用于指导模型生成图像的内容
    negative_prompt="丑陋、变形、嘈杂、模糊、低对比度", # 设置负向提示词,模型会避免生成包含这些特征的图像
    cfg_scale=4, # 设置分类自由度 (Classifier-Free Guidance) 的比例,数值越高,模型越严格地遵循提示词
    num_inference_steps=50, # 设置推理步数,步数越多,生成的图像细节越丰富,但生成时间也更长
    height=1024, width=1024, # 设置生成图像的高度和宽度,这里生成 1024x1024 像素的图像
)
image.save("1.jpg") # 将生成的图像保存为 "1.jpg" 文件


# 图像拼接,展示总体拼接大图
import numpy as np  # 导入numpy库,用于处理数组和数值计算
from PIL import Image  # 导入PIL库中的Image模块,用于图像处理
images = [np.array(Image.open(f"{i}.jpg")) for i in range(1, 9)]  # 读取1.jpg到8.jpg的图像,转换为numpy数组,并存储在列表images中
image = np.concatenate([  # 将四组图像在垂直方向上拼接
    np.concatenate(images[0:2], axis=1),  # 将第1组(images[0:2])的两张图像在水平方向上拼接
    np.concatenate(images[2:4], axis=1),  # 将第2组(images[2:4])的两张图像在水平方向上拼接
    np.concatenate(images[4:6], axis=1),  # 将第3组(images[4:6])的两张图像在水平方向上拼接
    np.concatenate(images[6:8], axis=1),  # 将第4组(images[6:8])的两张图像在水平方向上拼接
], axis=0)  # 将四组拼接后的图像在垂直方向上拼接
image = Image.fromarray(image).resize((1024, 2048))  # 将拼接后的numpy数组转换为图像对象,并调整大小为1024x2048像素
image  # 输出最终生成的图像对象,用于显示图像

4. Part3:实战演练一一基于话剧的连环画制作

4.1数据准备

1.提示词

你是一个文生图专家,我们现在要做一个实战项目,就是要编排一个文生图话剧
话剧由8张场景图片生成,你需要输出每张图片的生图提示词

具体的场景图片
1、女主正在上课
2、开始睡着了
3、进入梦乡,梦到自己站在路旁
4、王子骑马而来
5、两人相谈甚欢
6、一起坐在马背上
7、下课了,梦醒了
8、又回到了学习生活中

生图提示词要求
1、风格为古风
2、根据场景确定是使用全身还是上半身
3、人物描述
4、场景描述
5、做啥事情

例子:
古风,水墨画,一个黑色长发少女,坐在教室里,盯着黑板,深思,上半身,红色长裙

1.2 询问通义

自己在通义的返回的基础上,多多调整,争取打磨出一个最佳的提示词

1.3 最后的话剧场景

图片编号场景描述正向提示词
图片1女主正在上课古风,水墨画风格,一位黑色长发的少女坐在古木课桌前,教室内充满光线,窗外可见远山如黛。少女穿着精致的红色长裙,上半身,专心听讲,眼神专注。
图片2开始睡着了古风,水墨画风格,黑色长发的少女趴在木制的课桌上,头枕在双臂之上,面容安详,红色长裙轻柔地覆盖在背上,教室宁静,窗外柳树摇曳。
图片3进入梦乡,梦到自己站在路旁古风,水墨画风格,黑色长发的少女站在风景如画的古道旁,两侧是古老的松树和石灯,少女身着红色长裙,面带微笑,远处有朦胧的山影,上半身。
图片4王子骑马而来古风,水墨画风格,英俊的王子穿着白色长袍,骑着白马从山间小路奔来,背景是风景秀丽的山脉和流水,马蹄溅起的水花与周围环境融为一体,全身。
图片5两人相谈甚欢古风,水墨画风格,英俊少年和黑发少女坐在林荫下的古桥上,桥下清澈的溪流潺潺,两人面对面,眼神交流充满情感,身着传统服饰,少女红裙,少年白袍,上半身。
图片6一起坐在马背上古风,水墨画风格,英俊的少年和长发的少女一同骑马,穿行在满是樱花的古道上,两人微笑交谈,少年白袍飘飘,少女红裙摇曳,全身。
图片7下课了,梦醒了古风,水墨画风格,黑色长发的少女坐在课桌旁,惊讶地睁大眼睛,从梦中醒来,教室内同学们的活动渐渐增多,背景有教室内的其它桌椅和学习用品,上半身。
图片8又回到了学习生活中古风,水墨画风格,黑色长发少女坐在木质课桌前,专心致志地看着黑板,手中拿着书写工具,周围教室布置古朴,窗外景色宁静,上半身。
图片编号场景描述正向提示词反向提示词
图片1女主正在上课古风,水墨画,一个黑色长发少女,坐在教室里,盯着黑板,深思,上半身,红色长裙丑陋,变形,嘈杂,模糊,低对比度
图片2开始睡着了古风,水墨画,一个黑色长发少女,坐在教室里,趴在桌子上睡着了,上半身,红色长裙丑陋,变形,嘈杂,模糊,低对比度
图片3进入梦乡,梦到自己站在路旁古风,水墨画,一个黑色长发少女,站在路边,上半身,红色长裙丑陋,变形,嘈杂,模糊,低对比度
图片4王子骑马而来古风,水墨画,一个英俊少年,骑着白马,上半身,白色衬衫丑陋,变形,嘈杂,模糊,低对比度
图片5两人相谈甚欢古风,水墨画,一个英俊少年,白色衬衫,一个黑色长发少女,红色长裙,两个人一起聊天,开心,上半身丑陋,变形,嘈杂,模糊,低对比度
图片6一起坐在马背上古风,水墨画,一个英俊少年,白色衬衫,一个黑色长发少女,红色长裙,两个人一起骑着马,全身丑陋,变形,嘈杂,模糊,低对比度
图片7下课了,梦醒了古风,水墨画,一个黑色长发少女,坐在教室里,下课铃声响了,同学们开始走动,从睡梦中醒来,深思,上半身,红色长裙丑陋,变形,嘈杂,模糊,低对比度
图片8又回到了学习生活中古风,水墨画,一个黑色长发少女,坐在教室里,盯着黑板,认真上课,上半身,红色长裙丑陋,变形,嘈杂,模糊,低对比度
  1. 执行Task1的30分钟速通Baseline

  2. 提示词修改

  3. 结果展示

  4. 测试美学打分

5.Part4:更多的选择一一浅尝scepter webui

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值