Datawhale X 魔搭 AI夏令营 第四期 AIGC 笔记1

  • Datawhale 夏令营第四期 AIGC 笔记1

    • 赛事介绍

      • 题目

        • 可图Kolors-LoRA风格故事挑战赛

      • 任务

        • 1. 参赛者需在可图Kolors 模型的基础上训练LoRA 模型,生成无限风格,如水墨画风格、水彩风格、赛博朋克风格、日漫风格......

        • 2. 基于LoRA模型生成 8 张图片组成连贯故事,故事内容可自定义;基于8图故事,评估LoRA风格的美感度及连贯性

        • 样例:偶像少女养成日记

      • 评分规则

        • 1、主观评分。由评委对参赛作品进行投票,评审标准可以从技术运用(40%)、组图风格连贯性(30%)、整体视觉效果(30%)几方面进行评判投票。

        • 2、客观评分。美学分数仅作评价提交是否有效的标准,其中美学分数小于6(阈值可能根据比赛的实际情况调整,解释权归主办方所有)的提交被视为无效提交,无法参与主观评分。

    • 背景介绍

      • 文生图的历史

        • 早期探索 (20世纪60年代-20世纪90年代)

          • 文生图的概念最早出现于计算机视觉和图像处理的早期研究中。 早期的图像生成技术主要依赖于规则和模板匹配,通过预定义的规则将文本转换为简单的图形。 然而,由于计算能力和算法的限制,这一阶段的技术能力非常有限,生成的图像质量较低,应用场景也非常有限。

        • 基于统计模型的方法 (2000年代)

          • 进入2000年代,随着统计模型和机器学习技术的发展,文生图技术开始得到更多关注。 研究者们开始利用概率图模型和统计语言模型来生成图像。尽管这一阶段的技术在生成图像的多样性和质量上有了一定提升,但由于模型的复杂性和计算资源的限制,生成的图像仍然较为粗糙,不够逼真。

        • 深度学习的崛起 (2010年代)

          • 2010年代是文生图技术发展的一个重要转折点。随着深度学习,尤其是卷积神经网络(CNN)和生成对抗网络(GAN)的发展,文生图技术取得了突破性进展。2014年,Goodfellow等人提出的GAN模型通过生成器和判别器的对抗训练,极大地提升了图像生成的质量。随后,各类变种GAN模型被提出,如DCGAN、Pix2Pix等,使得文生图技术在生成逼真图像方面达到了前所未有的高度。

        • 大规模预训练模型 (2020年代)

          • 进入2020年代,大规模预训练模型如OpenAI的CLIP、DALL-E以及Stable Diffusion等的出现,标志着文生图技术进入了一个新的时代。 CLIP通过大规模的文本和图像配对数据训练,能够理解和生成高度一致的文本和图像;DALL-E和Stable Diffusion进一步提升了生成图像的创意和细节表现能力,使得通过简单的文本描述生成高质量、复杂图像成为可能。 这些技术的应用范围从艺术创作、广告设计到辅助医疗诊断,展现了广泛的商业价值和社会影响力。

      • 文生图基础知识介绍

        • 提示词

          • 提示词很重要,一般写法:主体描述,细节描述,修饰词,艺术风格,艺术家

        • Lora

          • Stable Diffusion中的Lora(LoRA)模型是一种轻量级的微调方法,它代表了“Low-Rank Adaptation”,即低秩适应。Lora不是指单一的具体模型,而是指一类通过特定微调技术应用于基础模型的扩展应用。在Stable Diffusion这一文本到图像合成模型的框架下,Lora被用来对预训练好的大模型进行针对性优化,以实现对特定主题、风格或任务的精细化控制。

        • ComfyUI

          • ComfyUI 是一个工作流工具,主要用于简化和优化 AI 模型的配置和训练过程。通过直观的界面和集成的功能,用户可以轻松地进行模型微调、数据预处理、图像生成等任务,从而提高工作效率和生成效果。

        • 参考图控制

          • ControlNet是一种用于精确控制图像生成过程的技术组件。它是一个附加到预训练的扩散模型(如Stable Diffusion模型)上的可训练神经网络模块。扩散模型通常用于从随机噪声逐渐生成图像的过程,而ControlNet的作用在于引入额外的控制信号,使得用户能够更具体地指导图像生成的各个方面(如姿势关键点、分割图、深度图、颜色等)。

          • 参考图控制类型

            • OpenPose姿势控制

              • 输入是一张姿势图片(或者使用真人图片提取姿势)作为AI绘画的参考图,输入prompt后,之后AI就可以依据此生成一副相同姿势的图片;

            • Canny精准绘制

              • 输入是一张线稿图作为AI绘画的参考图,输入prompt后,之后AI就可以根据此生成一幅根据线稿的精准绘制。

            • Hed绘制

              • Hed是一种可以获取渐变线条的线稿图控制方式,相比canny更加的灵活。

            • 深度图Midas

              • 输入是一张深度图,输入prompt后,之后AI就可以根据此生成一幅根据深度图的绘制。

            • 颜色color控制

              • 通过参考图控制和颜色控制,实现更加精准和个性化的图像生成效果。

    • 代码简介

      • 代码结构

        • 1. 导入库:首先,代码导入了需要用到的库,包括 data-juicer 和微调的工具 DiffSynth-Studio

        • 2. 数据集构建:下载数据集kolors,处理数据集

        • 3. 模型微调:模型微调训练,以及加载训练后的模型

        • 4. 图片生成:调用训练好的模型生成图片

      • !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/lora_dataset_processed/train", exist_ok=True)
        with open("./data/data-juicer/output/result.jsonl", "r") as file:
            for data_id, data in enumerate(tqdm(file.readlines())):
                data = json.loads(data)
                text = data["text"]
                texts.append(text)
                image = Image.open(data["image"][0])
                image_path = f"./data/lora_dataset_processed/train/{data_id}.jpg"
                image.save(image_path)
                file_names.append(f"{data_id}.jpg")
        data_frame = pd.DataFrame()
        data_frame["file_name"] = file_names
        data_frame["text"] = texts
        data_frame.to_csv("./data/lora_dataset_processed/train/metadata.csv", index=False, encoding="utf-8-sig")
        data_frame
        
        # 下载模型
        from diffsynth import download_models
        download_models(["Kolors", "SDXL-vae-fp16-fix"])
        
        #模型训练
        import os
        
        cmd = """
        python DiffSynth-Studio/examples/train/kolors/train_kolors_lora.py \
          --pretrained_unet_path models/kolors/Kolors/unet/diffusion_pytorch_model.safetensors \
          --pretrained_text_encoder_path models/kolors/Kolors/text_encoder \
          --pretrained_fp16_vae_path models/sdxl-vae-fp16-fix/diffusion_pytorch_model.safetensors \
          --lora_rank 16 \
          --lora_alpha 4.0 \
          --dataset_path data/lora_dataset_processed \
          --output_path ./models \
          --max_epochs 1 \
          --center_crop \
          --use_gradient_checkpointing \
          --precision "16-mixed"
        """.strip()
        
        os.system(cmd)
        
        from diffsynth import ModelManager, SDXLImagePipeline
        from peft import LoraConfig, inject_adapter_in_model
        import torch
        
        
        def load_lora(model, lora_rank, lora_alpha, lora_path):
            lora_config = LoraConfig(
                r=lora_rank,
                lora_alpha=lora_alpha,
                init_lora_weights="gaussian",
                target_modules=["to_q", "to_k", "to_v", "to_out"],
            )
            model = inject_adapter_in_model(lora_config, model)
            state_dict = torch.load(lora_path, map_location="cpu")
            model.load_state_dict(state_dict, strict=False)
            return model
        
        
        # Load models
        model_manager = ModelManager(torch_dtype=torch.float16, device="cuda",
                                     file_path_list=[
                                         "models/kolors/Kolors/text_encoder",
                                         "models/kolors/Kolors/unet/diffusion_pytorch_model.safetensors",
                                         "models/kolors/Kolors/vae/diffusion_pytorch_model.safetensors"
                                     ])
        pipe = SDXLImagePipeline.from_model_manager(model_manager)
        
        # Load LoRA
        pipe.unet = load_lora(
            pipe.unet,
            lora_rank=16, # This parameter should be consistent with that in your training script.
            lora_alpha=2.0, # lora_alpha can control the weight of LoRA.
            lora_path="models/lightning_logs/version_0/checkpoints/epoch=0-step=500.ckpt"
        )
        
        
        torch.manual_seed(0)
        image = pipe(
            prompt="二次元,一个紫色短发小女孩,在家中沙发上坐着,双手托着腮,很无聊,全身,粉色连衣裙",
            negative_prompt="丑陋、变形、嘈杂、模糊、低对比度",
            cfg_scale=4,
            num_inference_steps=50, height=1024, width=1024,
        )
        image.save("1.jpg")
      • 生成结果:

    • 参考资料

      • 1. AIGC专题视频课程:https://space.bilibili.com/1069874770/channel/collectiondetail?sid=3369551

      • 2. AIGC专题品牌馆:https://www.modelscope.cn/topic/cf0de97eb6284e16812d7c54fbe29fe7/pub/summary

      • 3. 模型训练入口:https://modelscope.cn/aigc/modelTraining

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值