Datawhale AI夏令营第四期魔搭- AIGC文生图方向 task01笔记

news2024/9/19 9:52:15

目录

分任务1:跑通baseline

第一步——搭建代码环境

第二步——报名赛事

第三步——在魔搭社区创建PAI实例

分任务2:相关知识学习以及赛题理解

赛题理解:

文生图基本认识:

1. Diffusion  Model(扩散模型)

2. LDMs(潜空间扩散模型)

3.基础文生图模型优化的三大方向

4.LORA(Low-Rank Adaptation) ——轻量级大模型微调方法


附:

DataWhale开源组织网站主页:Datawhale

DataWhaleAI夏令营第四期AIGC方向学习手册:Doc

赛事链接:可图Kolors-LoRA风格故事挑战赛_创新应用大赛_天池大赛-阿里云天池的赛制

分任务1:跑通baseline

第一步——搭建代码环境

1. 进入阿里云免费试用区,免费使用算力时:

阿里云社区icon-default.png?t=N7T8https://free.aliyun.com/?spm=5176.14066474.J_4683019720.1.8646754cugXKWo&scm=20140722.M_988563._.V_1&productCode=learn

2. 登录or注册自己的阿里云账号:

3. 点击立即试用

领取成功之后关闭页面即可

4 .进入魔搭社区授权

魔搭社区icon-default.png?t=N7T8https://www.modelscope.cn/my/mynotebook/authorization

第二步——报名赛事

可图Kolors-LoRA风格故事挑战赛icon-default.png?t=N7T8https://tianchi.aliyun.com/competition/entrance/532254

第三步——在魔搭社区创建PAI实例

创建完成之后返回魔搭社区,如下图所示,就已经绑定好实例了:

点击打开,因为我这里点击打开没有反应,索性就使用了第二种方法——魔搭的免费notebook

那么实际上,可能是因为魔搭社区的流量限制,使得访问速度很慢,那么我们也可以通过阿里云官网进入实例,

step1:进入阿里云官网

Step2:进入控制台

step3:左侧栏中有DSW这个选择

step4:在这里点击打开,进入实例,速度比魔搭社区要快

总之,无论是从A,B还是C进入,都是为了进入我们的notebook实例中。

进入notebook之后,要先git下来我们的baseline文件,在哪git呢??

需要进入我们的终端Terminal

git lfs install
git clone https://www.modelscope.cn/datasets/maochase/kolors.git

然后就可以跟着教程一步一步进行baseline的运行了,注意,如果出现运行不成功的情况,可以restart一下。

至于运行,有两种方式,可以选中一个代码块,同时按下ctrl+enter,或者是点击左边的运行键。

运行成功之后左边会出现绿色的小对号,即代表我们运行成功了这个代码块。

这是我运行完全部代码块后,最终的部分效果:

在赛事官网提交相关信息:

魔搭社区-创建模型

分任务2:相关知识学习以及赛题理解

赛题理解:

事实上,我们的赛题作出了以下几点要求:

1

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

2参赛者可以根据自己审美,任意选择自己喜欢的文生图风格,例如水墨风、国风、日漫风等。
3

要求参赛者在赛事官网提交微调后的LoRA 模型文件、LORA 模型的介绍、以及使用该模型生成的至少8张图片和对应 prompt

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

 我们需要注意的是,必须保证我们的美学分数高于6,这样我们的作品才能视为有效作品,可以使用以下代码进行美学评分。


import torch, os
from PIL import Image
from transformers import CLIPProcessor
from aesthetics_predictor import AestheticsPredictorV2Linear
from modelscope import snapshot_download


model_id = snapshot_download('AI-ModelScope/aesthetics-predictor-v2-sac-logos-ava1-l14-linearMSE', cache_dir="models/")
predictor = AestheticsPredictorV2Linear.from_pretrained(model_id)
processor = CLIPProcessor.from_pretrained(model_id)
device = "cuda"
predictor = predictor.to(device)


def get_aesthetics_score(image):
    inputs = processor(images=image, return_tensors="pt")
    inputs = {k: v.to(device) for k, v in inputs.items()}
    with torch.no_grad():
        outputs = predictor(**inputs)
    prediction = outputs.logits
    return prediction.tolist()[0][0]


def evaluate(folder):
    scores = []
    for file_name in os.listdir(folder):
        if os.path.isfile(os.path.join(folder, file_name)):
            image = Image.open(os.path.join(folder, file_name))
            scores.append(get_aesthetics_score(image))
    if len(scores) == 0:
        return 0
    else:
        return sum(scores) / len(scores)


score = evaluate("./images")
print(score)

文生图基本认识:

提到文生图,我脑海中蹦出的第一个词就是Stable Diffusion(稳定扩散)

Stable Diffusion是文生图技术的一种实现,它是一种基于Latent Diffusion Models(LDMs)实现的文生图(text-to-image)算法模型,通过模拟物理世界中的扩散过程,将噪声逐渐转化为具有特定结构和纹理的图像。

这里的LDMs,则是在DM(Diffusion Model,扩散模型)基础上发展起来的。

与传统的图像生成方法相比,Stable Diffusion具有更高的灵活性和可扩展性,能够生成更加真实、细腻的图像。在训练过程中,Stable Diffusion使用深度学习技术,通过大量的图像数据来优化模型的参数,利用卷积神经网络(CNN)提取图像特征,并通过扩散模型生成具有这些特征的图像。

相信大家应该捕捉到了一些关键字眼:比如DM,LDMs ,这是SD的基本原理。

1. Diffusion  Model(扩散模型)

从技术角度来看,AI绘画热潮的兴起要归功于扩散模型的引入。然而,作为一项早在2015年于国际机器学习会议(ICML)上提出的理论构想,其初现并未引起广泛的关注。

直至2020年6月,来自加州大学伯克利分校的一篇题为DDPM(去噪扩散概率模型)的论文,在更加庞大的数据集上展现出与当时最优的生成对抗网络(GAN)模型相媲美的性能,研究人员方才逐渐领悟到扩散模型在内容创作领域所蕴藏的威力与前景。

此后,不同国家的研究人员一直在进行着不断地探索,而他的真正出圈,是由于OpenAI 2022年发布的DALLE-2,其呈现出的前所未有的理解和创造能力,加之OpenAI 公司的开放API,使得文生图技术彻底走向大众视野。

  • DM扩散模型』工作原理:通过向原始图像中,连续添加高斯噪声来破坏训练数据,然后通过反转这个噪声过程,来学习恢复数据。简单来说,包含两个过程:「前向扩散」和「逆向扩散」。

  • 1)前向扩散:前向扩散过程是不断往输入图片中添加高斯噪声,直到原图像模糊;

  • 2)逆向扩散;反向(逆向)扩散过程是将噪声不断还原为原始图片,这一举措会得到一个【模型】(令为模型A),这个模型训练并稳定下来,就能实现在线预测了,即给模型一个 文本提示或原始图像,它就能基于这个模型生成另一幅图像。

2. LDMs(潜空间扩散模型)

笔者认为提出LDMs的主要原因是,我们需要对训练图片进行像素级的处理,而图像的像素空间是巨大的,对于512x512大小RBG三通道的彩色图片,这将是一个768,432(512x512x3)维度的空间。(意味着为了生成一张图,你需要确定768,432个值)

可想而知,这会消耗大量的时间和资源,因此提出了潜空间扩散模型(LDMs)何为潜空间??

由于图像像素之间的信息是大量冗余的,我们训练一个自编码器将图片进行压缩。

大概可以理解成是和像素空间对应的空间,但是容积比像素空间小,即,通过潜空间,我们实现了对原本像素数据的压缩。

然后我们在潜空间中进行扩散操作。

因此S-D处理的并不是直接的像素图像,而是潜空间中的张量(即4*64*64的噪声图),在训练中,我们在潜空间的图像添加潜空间的噪声,而不是像素图添加像素噪声,这样就使得执行速度有了大幅提升。

与此同时,随着隐空间编码带来的速度提升,它的缺点也暴露出来,就是对于图像信息的压缩,会产生一定的损失,那么,对于图像精度要求比较高的场景(高清的街景),解码器输出的图片可能会出现比例失真,肢体扭曲等问题。

3.基础文生图模型优化的三大方向

1. 更大的模型容量

2. 更强的prompt following ability

3. 模型架构选择?

更大的模型容量:通过对比SD 1.4/1.5 ---> SD 2.0/2.1---->SDXL,我们可以发现,参数量的提升确实带来的生成质量的提高。

更强的prompt following ability-----指令遵循能力

啥意思呢??就是(模型生成图片所描述的内容)——【实际得到的】 与(你所给出的文本引导提示)——【你所期望的】的匹配程度。

怎么提高prompt following ability 呢?

方法有二:

其一,使用更长更详细的image caption ,在open AI 官网中关于DELL-E-3的pdf介绍中,建立了一个可以对图像进行精准描述的打标器,我们使用打标器对于训练数据重新生成图像的caption,并进行训练,从而提高模型的prompt following ability 。下图是DELE-E-3论文中对于图像的更加精细的描述。

其二,使用更大更多的text encoder ,可以看到SD 3已经使用三个文本编码器,且嵌入维度也成倍增加。

模型架构的选择——Transformer?or Unet?

对于NLP任务,Transformer 架构具有一骑绝尘的地位,但是在图像领域,SD系列模型采用的是Unet架构。

而对于今年推出的视频生成模型Sora ,则是采用了DIT架构,即 Diffusion transformer 架构

4.LORA(Low-Rank Adaptation) ——轻量级大模型微调方法

大模型的研发是昂贵的,对于小公司或者个人而言,如何调整大模型为自己所用,是我们专注的问题所在。

lora ,顾名思义,就是一种低秩微调的方式,也就意味着我们可以使用少量的权重,进行大模型的微调,对于下图而言,r的维度始终是小于d和k的,在实际训练中,lora可以直接和Transformer中的FFN层对接,也就是下图的左半部分是FFN层,右半部分就是我们训练的Lora,这样的话,不会对原来的权重造成影响,直接加到模型中即可。

基于大模型的内在低秩特性,增加旁路矩阵来模拟全参数微调,LoRA 通过简单有效的方案来达成轻量微调的目的,可以将现在的各种大模型通过轻量微调变成各个不同领域的专业模型。这里推荐阅读http://t.csdnimg.cn/bqbGd,里面有更加通俗详细的lora技术原理。

目前 LORA 已经被 HuggingFace 集成在了 PEFT(Parameter-Efficient Fine-Tuning) 代码库里。

在AI绘画领域,我们可以使用SD模型+LoRA模型的组合微调训练方式,只训练参数量很小的LoRA模型,就能在一些细分任务中取得不错的效果。

接下来就实现一下lora:

#导入需要的模块
import torch
import torch.nn as nn
import torch.nn.functional as F
import math

class LoRALinear(nn.Module):
    #merge:使用预训练层的时候,要不要把预训练层的参数合并到lora层中,相当于一个开关
    #rank:lora层的rank,要降到多少位
    #lora_alpha:lora层的缩放系数,即究竟使用怎样的比例和原始的权重进行相加,如果太大的话,可能会对原始权重造成影响


    def __init__(self, in_features, out_features, merge,rank=16, lora_alpha=1, dropout=0.5):
        super(LoRALinear, self).__init__()
        self.in_features = in_features
        self.out_features = out_features
        self.merge = merge
        self.rank = rank
        self.lora_alpha = lora_alpha
        self.dropout_rate = dropout
        
        #构建一个线性映射的层
        self.linear = nn.Linear(in_features, out_features)
        if rank >0:
            #使用zero初始化参数
            self.lora_B = nn.Parameter(torch.zeros(rank, out_features))
            self.lora_A = nn.Parameter(torch.zeros(in_features, rank))
            self.scale = self.lora_alpha / self.rank   #究竟以什么样的权重系数放缩之后加入原始权重中
            self.linear.weight.requires_grad = False  #不需要更新原始权重
        
        # 如果dropout大于0,则构建一个dropout层
        if self.dropout_rate > 0:
            self.dropout = nn.Dropout(self.dropout_rate)
        else:
            self.dropout = None
        self.intial_weight()
    #对lora_A的权重进行初始化
    def intial_weight(self):
        #海明窗初始化
        nn.init.kaiming_uniform_(self.lora_A, a=math.sqrt(5))
        nn.init.zeros_(self.lora_B)
    #前向传播
    def forward(self, x):
        if self.merge and self.rank > 0:
            #如果merge为True,则使用原始权重和lora权重相加
            #lora_a 矩阵乘法 lora_b ,所以说我们的原始权重是 wx+b  w是out_features*in_features,,x 是in_features*batch_size(几维)
            output=F.linear(x,self.linear.weight + self.lora_B @ self.lora_A*self.scale,self.linear.bias) 
            output=self.dropout(output)
            return output
        else:
            #如果merge为False,则使用原始权重
            return self.linear(x)
    



参考资料:

【翻译】How Stable Diffusion Work - 给小白看的StableDiffusion原理介绍

Stable Diffusion一周年:这份扩散模型编年简史值得拥有

什么是 GAN?

深入浅出完整解析LoRA(Low-Rank Adaptation)模型核心基础知

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2076987.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

嵌入式Linux学习笔记

1.文件操作命令 2.VI编辑器的部分命令 3.Uboot命令设置环境变量 4. uboot 的顶层 Makefile的重点是“make xxx_defconfig”和“make”这两个命令 ,分别如下: 5.在串口SecureCRT中利用uboot启动Linux内核的两种方式 6.Linux内核移植到开发板上也可以反…

常见错误导引 不锈钢螺钉的正确选购和使用分析

紧固件或螺钉是用于固定物体的机械工具。它们用于各种场景,从建造房屋、用具、玩具等。紧固件由多种材料制成,所有这些材料都有特定用途紧固件和用途。一些用于制造螺丝的材料包括不锈钢、铁、铜、铝和塑料。它通常会进行某种表面处理以提高其防锈性和/或…

day-40 合并区间

思路 将二维数组按照第一列升序排列&#xff0c;把intervals[0][0]作为第一个区间的起点&#xff0c;将 intervals[0][1]和intervals[1][0]进行比较&#xff0c;如果intervals[0][1]<intervals[1][0]&#xff0c;则不能合并&#xff0c;否则可以合并&#xff0c;将Math.max(…

绝对不能错过的60个Python日常高频写法总结!

一、 数字 1 求绝对值 绝对值或复数的模 In [1]: abs(-6)Out[1]: 62 进制转化 十进制转换为二进制&#xff1a; In [2]: bin(10)Out[2]: 0b1010十进制转换为八进制&#xff1a; In [3]: oct(9)Out[3]: 0o11十进制转换为十六进制&#xff1a; In [4]: hex(15)Out[4]: 0xf…

[ICS] 物理安全

工业控制系统安全气泡类比 这个理念是&#xff0c;为了防御那些无法更新到最新安全控制措施的旧系统&#xff0c;或者由于设备资源有限而无法处理安全控制措施的系统&#xff0c;帮助可视化这种设备的安全策略可以将它们放置在一个肥皂泡或玻璃泡中。泡中的系统和设备彼此信任…

Spring Cloud Stream与Kafka(一)

Spring Cloud Stream与Kafka&#xff08;一&#xff09; ​ 在实际开发过程中&#xff0c;消息中间件用于解决应用解耦&#xff0c;异步消息&#xff0c;流量削峰等问题&#xff0c;实现高可用、高性能、可伸缩和最终一致性架构。不同的消息中间件实现方式不同&#xff0c;内部…

遥感反演保姆级教程:SPSS筛选因子之后如何采用python建模和反演整个研究区?(以反演生物量为例)

SPSS筛选因子之后如何采用python建模和反演整个研究区?&#xff08;以反演生物量为例&#xff09; 引言 在遥感数据分析中&#xff0c;因子筛选和建模是关键步骤。筛选出与目标变量&#xff08;如生物量&#xff09;显著相关的因子&#xff0c;不仅可以提高模型的预测精度&a…

编程世界的平衡术:日常编码与自我提升的和谐共生

前言 在快速迭代的编程世界中&#xff0c;程序员的角色日益复杂且充满挑战&#xff0c;他们不仅是代码的编织者&#xff0c;更是技术进步的推动者。面对日常编码工作的繁重与个人成长的迫切需求&#xff0c;寻找两者之间的平衡点成为了每位程序员必须深思的问题。以下是我的详细…

C++初学者指南-5.标准库(第二部分)–特殊容器

C初学者指南-5.标准库(第二部分)–特殊容器 pair<A , B> 包含两个相同或不同类型的值 tuple<A , B> C11 包含许多相同或不同类型的值 optional C17 包含一个类型为 T 的值或没有值 variant<A,B,C,…> C17 包含一个类型为A、B或C的值…… any C17 包含任…

《花100块做个摸鱼小网站! 》第四篇—前端应用搭建和完成第一个热搜组件

⭐️基础链接导航⭐️ 服务器 → ☁️ 阿里云活动地址 看样例 → &#x1f41f; 摸鱼小网站地址 学代码 → &#x1f4bb; 源码库地址 一、前言 在本系列文章的早期章节中&#xff0c;我们已经成功地购买了服务器并配置了MySQL、Redis等核心中间件。紧接着&#xff0c;我们不仅…

用AI来学习英语口语(白嫖,所以稍微麻烦些)

写在前面 本文看下如何使用AI来免费学习英语口语。 1&#xff1a;正文 首先&#xff0c;我们点击这里来到一个对话窗口&#xff0c;你可以在这个窗口中使用英语来询问你的问题&#xff0c;比如what can i do when i am not happy&#xff1a; 接着复制机器人回答内容&#…

datawhale AI夏令营第五期 深度学习入门 Task1 了解机器学习

机器学习基础 定义 学习一般是只有人才具备的能力&#xff0c;机器学习就是通过某种方式让机器具备人才有的学习能力&#xff0c;这里的某种方式是机器具备找一个函数的能力 比如说证件照背景颜色更换&#xff0c;那么机器需要找到图片中的背景在哪里&#xff0c;再替换成目…

pandas操作Excel文件

pandas操作Excel文件 一、前言二、指定读取的工作表与header设置2.1指定工作表2.2header设置 三、读取Excel数据3.1iloc读取数据3.2read_excel读取数据3.3loc读取数据 四、DataFrame数据筛选4.1根据列标签对整列进行筛选4.2使用iloc对区域进行筛选4.3自定义筛选 五、DataFrame类…

2024年8月26日(线上考试系统,虚拟化技术部署,使用link)

[rootdocker ~]# systemctl start docker [rootdocker ~]# docker pull mysql 一、线上考试系统 虚拟化技术部署 1、部署前端服务器 project_exam_system.sql数据库文件 dist网络资源 1.将资源上传到服务器 C:\Users\89765>scp -r "D:\青岛实训\project_exam_system\d…

C语言典型例题52

《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 题目&#xff1a; 例题4.4 相传古代印度国王舍罕要褒奖他聪明能干的宰相达依尔&#xff08;国际象棋发明者&#xff09;&#xff0c;问他需要什么&#xff0c;达依尔回答说&#xff1a;“国王只要在国际象棋的棋盘的…

Shader 中的渲染顺序

1、深度测试和深度写入 有了深度测试和深度写入发挥作用让我们不需要关心不透明物体的渲染顺序比如一个物体A 挡住了 物体B&#xff0c;即使底层逻辑中 先渲染A&#xff0c;后渲染B&#xff0c;我们也不用担心 B的颜色会把A覆盖&#xff0c;因为在进行深度测试时&#xff0c;远…

电池管理系统SOX算法资料优化目录2024.8.26

这篇文章主要写一下这一次更新的几个地方&#xff0c;有对原来的代码及模型进行优化的部分&#xff0c;也有新增加的代码和模型&#xff0c;我就把几个比较典型的给列了出来。但是还有好多的更新没有在下面展示出来&#xff0c;因为一个个展示出来太复杂了。如果你对更新的内容…

如何使用ssm实现基于 SSM 框架的宠物用品电子商务平台设计与实现+vue

TOC ssm258基于 SSM 框架的宠物用品电子商务平台设计与实现vue 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科…

黑神话悟空妖怪平生录

黑神话悟空是一部特别好玩的单机游戏。上一个我这么喜欢的国产单机还是古剑奇谭三。 虽然黑神话的战斗系统和地图系统尚不完善&#xff0c;但是这里面的游记是真的做得很认真。 203个妖怪&#xff0c;203首小诗&#xff0c;203个妖生故事&#xff0c;带你去看妖怪的喜怒哀乐。…

freemarker模版注入

Freemarker模版注入漏洞 模版注入漏洞根因&#xff08;SSTI&#xff0c;服务器端模版注入&#xff09;freemarker介绍Freemarker模版注入漏洞关键点漏洞复现环境引入依赖poc 修复方案完整代码&#xff08;包含修复&#xff09;参考 模版注入漏洞根因&#xff08;SSTI&#xff0…