论文阅读:SDXL Improving Latent Diffusion Models for High-Resolution Image Synthesis

SDXL Improving Latent Diffusion Models for High-Resolution Image Synthesis

论文链接
代码链接

介绍

  • 背景:Stable Diffusion在合成高分辨率图片方面表现出色,但是仍然需要提高
  • 本文提出了SD XL,使用了更大的UNet网络,以及增加了一个Refinement Model,以进一步提高图片质量。

提高SD的措施

  • 用户偏好调查比较
    Comparing user preferences between SDXL and Stable Diffusion 1.5 & 2.1
    可以看到,在不增加Refiner模型的情况下,SD XL的效果已经比SD 1.5和2.1好很多了。
  • SD XL的模型结构
    Visualization of the two-stage pipeline
    可以看到,SD XL由一个SD base模型和一个Refiner模型组成,二者共用一个提示词输入,前者的输出同时也是后者的输入。Refiner模型其实是一个图片编辑模型。
  1. Architecture & Scale

    Comparison of SDXL and older Stable Diffusion models

    • transformer block方面,忽略高层级的块,而使用低层级的2和10特征块(不懂)
    • 使用两个Text Encoder并将它们的输出特征拼接到一起
    • 额外使用了Pooled text emb作为条件输入(不懂)
  2. Micro-Conditioning

    • Conditioning the Model on Image Size:过去的方法要么选择忽略小于特定尺寸的图片,要么选择放缩图片,前者忽略了大量的图片,后者可能造成图片模糊。SD XL中,将图片尺寸也当做条件输入,这样在推理阶段,用户就可以指定生成图片的尺寸,如图5所示。
      The effects of varying the size-conditioning

    • Conditioning the Model on Cropping Parameters

      由于SD 1和2系列使用了图片裁剪的方式进行数据增强,导致了生成的图片中有些物体只展现了一部分,如图4所示。SD XL通过将左上方 的裁剪坐标当做条件输入,让模型学到了裁剪坐标的信息。在推理的过程中,将裁剪坐标条件输入设置为(0,0)即可输出物体在图片中间的图片。
      Comparison of the output of SDXL with previous versions of Stable Diffusion
      Varying the crop conditioning as discussed in Sec. 2.2.

  3. Multi-Aspect Training
    常见情况下SD模型的输出是一个方形的图片,但是在实际应用中,图片的尺寸比例会有不同的要求。为了适应这一需求,SD XL将训练图片按照长宽比划分为不同的数据桶。在训练过程中,每个batch中的图片都来自同一个桶,每个训练步数中的数据在不同桶中之间交替选择。此外,桶的中数据的尺寸也被作为条件输入。

  4. Improved Autoencoder
    SD XL重新训练了一个更大的autoencoder,可以提高生成图片的局部高频细节。从表3中可以看到,使用提升后的autoencoder后,SD XL的重构性能在多个方面都比SD 1和2有所提高。
    Autoencoder reconstruction performance onthe COCO2017

  5. Putting Everything Together
    最终的SD XL是使用前面的所有策略共同训练得到的。
    Refinement Stage:使用上述方法训练的模型有些时候仍然会生成低质量的图片,因此为了提高生成高分辨率的图片的能力,SD XL使用图片编辑技术,添加了一个Refiner模型,这个模型是可选的。

未来的工作

作者认为未来还值得研究方向如下:

  • 单阶段:SD XL是一个两阶段的模型,时间和空间开销更大。研究一个同样效果或更好效果的单阶段模型很有必要。
  • 文本合成:SD XL中采用了更多和更大的text encoder,也取得了更好的效果。使用byte-level tokenizers [52, 27]或者只是使用更大规模的文本编码器是提高SD XL文本处理能力的可能途径。
  • 结构:作者们尝试过一些Transformer-based的模型,比如UViT [16] and DiT [33],但是没有发现好的效果。然而,作者们仍然认为,Transformer为主的模型是一个方向。(新的Stable Diffusion 3正是采用了DiT [33]的技术,说明作者们坚持的优化方向是正确的)
  • 蒸馏:使用模型蒸馏技术,减小模型的体积,减少空间和时间开销。事实上,SD系列一直有蒸馏版本的模型,比如SD XL Turbo。
  • SD XL是在离散时间模式下训练的,需要偏移噪声预测以生成美观的图片。EDM-framework是一个很有潜力的工作,其支持连续时间,可以提高采样灵活性而不需要噪音校对。(不是很懂)

其它

  • 重要的相关工作
    • 图片编辑模型:SDEdit: Guided Image Synthesis and Editing with Stochastic Differential Equations

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MyBatis的#{}和${}:安全与灵活并存的SQL之道

MyBatis的#{}和${}:安全与灵活并存的SQL之道 MyBatis是一款广泛使用的Java持久化框架,提供了强大的SQL映射和数据库操作功能。在编写MyBatis的SQL语句时,我们经常会遇到#{}和${}两种不同的占位符语法。本文将详细解析#{}和${}的区别以及它们在…

今天面了一个来字节要求月薪23K,明显感觉他背了很多面试题...

最近有朋友去字节面试,面试前后进行了20天左右,包含4轮电话面试、1轮笔试、1轮主管视频面试、1轮hr视频面试。 据他所说,80%的人都会栽在第一轮面试,要不是他面试前做足准备,估计都坚持不完后面几轮面试。 其实&…

迭代器失效问题(C++)

迭代器失效就是迭代器指向的位置已经不是原来的含义了,或者是指向的位置是非法的。以下是失效的几种情况: 删除元素: 此处发生了迭代器的失效,因为erase返回的是下一个元素的位置的迭代器,所以在删除1这个元素的时候&…

JavaEE之volatile关键字

一.内存可见性问题 什么是内存可见性问题 计算机运行的程序/代码,往往需要访问数据。这些数据往往存在于内存中。 cup使用此变量时,就会把内存中的数据先读出来,加载到cpu寄存器中,再去参与运算。 但是,关键是cpu读…

MySQL 教程 2.4

MySQL UNION 操作符 本教程为大家介绍 MySQL UNION 操作符的语法和实例。 描述 MySQL UNION 操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集合,并去除重复的行。 UNION 操作符必须由两个或多个 SELECT 语句组成,每个 SELECT 语句的列数…

【kubernetes】关于k8s集群如何将pod调度到指定node节点?

目录 一、k8s的watch机制 二、scheduler的调度策略 Predicate(预选策略) 常见算法: priorities(优选策略)常见的算法有: 三、k8s的标签管理之增删改查 四、k8s的将pod调度到指定node的方法 方案一&am…

P1308 [NOIP2011 普及组] 统计单词数

题目描述: 思路: 1、首先判断一下,此字符是不是字母,因为题目给出有可能有空格的存在,如果是字母,全部变成小写字母,这样方便后面比较 2、把文章全部变为字符串,用字符串数组来存&…

Pytorch学习 day05(RandomCrop、Transforms工具使用总结)

RandomCrop 将PIL或Tensor格式的输入图片,随机裁剪指定尺寸的部分输入尺寸可以为序列或单个整形数字代码如下: from PIL import Image from torchvision import transforms from torch.utils.tensorboard import SummaryWriterimg Image.open("i…

《剑指offer》76--删除链表中重复的结点[C++]

目录 题目: 思路: 贴代码: 代码输出 题目: 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,最后返回链表头指针。 如: 链表1->…

.Net6使用JWT认证和授权

文章目录 目的实现案例一.项目所需包:二.配置项目 appsettings.json 文件:三.创建Model文件夹,添加AppConfig类和UserRole类1.AppConfig类获取appsettings.json文件中的值2.UserRole类用于区分用户信息和权限 四.主体代码案例:1.L…

kasan排查kernel内存越界示例(linux5.18.11)

参考资料: 1,内核源码目录中的Documentation\dev-tools\kasan.rst 2,KASAN - Kernel Address Sanitizer | Naveen Naidu (naveenaidu.dev) 一、kasan实现原理 KASAN(Kernel Address SANitizer)是一个动态内存非法访…

C#与python交互(flask发送Get/Post请求)

先运行python,再运行C# **ps: 注意修改端口号**python发送Get/Post请求 # -*- coding: utf-8 -*- # Time : 2024/1/25 15:52 # Author : YY # File : post_test.py # Content:提交数据给客户端 from flask import Flask, request, jsonify, redirect…

使用Kali搭建钓鱼网站教程

一、前言 使用kali工具一分钟制作出和目标网站一模一样的钓鱼网站。目标用户使用钓鱼网站登录自己的账号,账号密码将被自动劫持。 二、钓鱼网站的制作过程 1.在虚拟机VMvare中登录kali linux 2.准备一个目标网址 3.在kail中搜索使用工具 4.在弹出的选项中选择第一…

C++初阶:初识C++

目录 1. 前言:C 与 C语言2. C对于C语言语法的完善与补充2.1 命名冲突与命名空间2.1.1 命名空间的定义2.1.2 调用方式 2.3 补充:流的概念2.4 缺省参数2.4.1 缺省参数的使用 2.5 函数重载2.5.1 什么是函数重载2.5.2 函数重载的使用2.5.3 特殊情况&#xff…

Docker基础教程 - 1 Docker简介

更好的阅读体验:点这里 ( www.doubibiji.com ) 1 Docker简介 Docker是一个强大的容器化平台,让你能够更轻松地构建、部署和运行应用程序。 下面我们来学习 Docker。 1.1 Docker是什么 1 现在遇到的问题 每次部署一台服务器&…

OpenAI 大声朗读出来

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

Kubernetes-3

Kubernetes学习第3天 Kubernetes-31、查看实时的cpu和内存消耗1.1、kubectl top node 2、卷的使用2.1、什么是卷?1. 解决数据持久性问题2. Kubernetes 中的卷抽象概念3. 共享数据示例4. Kubernetes 中的卷使用5. 不同类型的卷6. 灵活、可靠的数据管理 2.2、联想到do…

[设计模式Java实现附plantuml源码~行为型]定义算法的框架——模板方法模式

前言: 为什么之前写过Golang 版的设计模式,还在重新写Java 版? 答:因为对于我而言,当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言,更适合用于学习设计模式。 为什么类图要附上uml 因为很…

在 SpringBoot3 中使用 Mybatis-Plus 报错

在 SpringBoot3 中使用 Mybatis-Plus 报错 Property ‘sqlSessionFactory’ or ‘sqlSessionTemplate’ are required Caused by: java.lang.IllegalArgumentException: Property sqlSessionFactory or sqlSessionTemplate are requiredat org.springframework.util.Assert.no…

Android随手记

activity的生命周期 创建时 onCreate() - onStart() - onResume() - onPause() - onStop() - onDestroy() 切换时 a切换到b a.onCreate() - a.onStart() - a.onResume - a.onPause - b.onCreate() - b.onStart() - b.onResume() - a.onStop() b切换回a b.onPause() - a.onR…