www.flydean.com
  • README
  • blog
    • 新版博客回归啦
    • projects
      • 一键自动化博客发布工具,用过的人都说好(简书篇)
      • 一键自动化博客发布工具,chrome和firfox详细配置
      • 一键自动化博客发布工具,用过的人都说好(segmentfault篇)
      • 一键自动化博客发布工具,用过的人都说好(oschina篇)
      • 一键自动化博客发布工具,用过的人都说好(阿里云篇)
      • 一键自动化博客发布工具,用过的人都说好(cnblogs篇)
      • 一键自动化博客发布工具,用过的人都说好(infoq篇)
      • 一键自动化博客发布工具,用过的人都说好(csdn篇)
      • 一键自动化博客发布工具,用过的人都说好(51cto篇)
      • 一键自动化博客发布工具,用过的人都说好(掘金篇)
      • 一键自动化博客发布工具,用过的人都说好(腾讯云篇)
      • 一键自动化博客发布工具,用过的人都说好(头条篇)
      • 一键自动化博客发布工具,用过的人都说好(知乎篇)
      • 一键自动化博客发布工具,用过的人都说好(公众号篇)
      • moneyPrinterPlus
        • MoneyPrinterPlus:AI自动短视频生成工具,赚钱从来没有这么容易过
        • MoneyPrinterPlus:AI自动短视频生成工具,详细使用教程
        • MoneyPrinterPlus:AI自动短视频生成工具-阿里云配置详解
        • MoneyPrinterPlus:AI自动短视频生成工具-腾讯云配置详解
        • MoneyPrinterPlus:AI自动短视频生成工具-微软云配置详解
        • 重磅!免费一键批量混剪工具它来了,一天上万短视频不是梦
        • 福利来了!MoneyPrinterPlus可以自动配置环境和自动运行了
        • 重磅来袭!MoneyPrinterPlus一键发布短视频到视频号,抖音,快手,小红书上线了
        • MoneyPrinterPlus全面支持本地Ollama大模型
        • 在MoneyPrinterPlus中使用本地chatTTS语音模型
        • fasterWhisper和MoneyPrinterPlus无缝集成
        • 再升级!MoneyPrinterPlus集成GPT_SoVITS
    • tools
      • 来了,永久免费的图床服务
      • 给picgo上传的图片加个水印
      • 手动给docusaurus添加一个搜索
  • docs
    • blockchain
      • 00-blockchain
      • 01-bitcoin
        • 01-bitcoin-overview
        • 02-bitcoin-blockchain-network
        • 03-bitcoin-consensus
        • 04-bitcoin-transactions
        • 05-bitcoin-mine-consensus
        • 06-bitcoin-in-trouble
      • 03-hyperledger
        • 01-Introduction-to-distributed-ledgers
        • 02-hyperledger-fabric-basics
        • 03-technical-advantages-fabric
        • 04-blockchain-vscode-extension
        • 05-use-vs-connect-ibc
        • 06-run-Fabric-on-ibm-Cloud
      • 04-libra
        • 01-libra-white-paper-interpretation
        • 2. Libra教程之:数据结构和存储
        • 3. Libra教程之:执行Transactions
        • 4. Libra教程之:move语言的特点和例子
        • 5. Libra教程之:Libra协议的关键概念
        • 6. Libra protocol的逻辑数据模型
        • 7. Transaction的生命周期
        • 8. 来了,你最爱的Move语言
        • 9. 运行自定义move modules
        • 10. Libra testnet使用指南
      • 02-ethereum
        • Solidity
          • 1. Solidity的Bytecode和Opcode简介
    • cryptology
      • 01-consistency-hash
      • 02-sybil-attack
      • 03-tor
      • 04-hmac
      • 05-erc20-short-address-attack
      • 06-mac-attack
      • 07-one-time-password
      • 8. DES
      • 9. AES
      • 10. 分组密码与模式
      • 11. 私钥公钥系统
      • 12-RSA算法
      • 13. 什么是中间人攻击
      • 14-混合密码系统
      • 15-单向散列函数
      • 16. 数字签名
      • 17. 一文读懂密码学中的证书
      • 18. 密钥详解
      • 19. 更加安全的密钥生成方法Diffie-Hellman
      • 20. 基于口令的密码(PBE)
      • 21. 一篇文章让你彻底弄懂SSL/TLS协议
      • 22-known-plaintext-attack
      • 23-Content-sniffing
      • 24-csrf
      • 25-SHA1-2-3
      • 26-IDEA
      • 27-memory-hard
      • 27-memory-hard_zhihu
      • 28-safer
      • 29-collision-attack
      • 30-birthday-attack
      • 30 Side Channel Attack
      • 31-feistel-cipher
      • 32-blowfish
      • 33-twofish
      • 34 Memory Bound
      • 35-MD-length-extension
      • 36 Sponge Function
      • 37 Bcrypt
      • 38-Argon2
      • 39-Pbkdf2
      • 40-scrypt
      • 41-CORS
      • 42-pki-x509
      • 43-pki-ocsp
      • 44-openssl-ocsp
      • 45-openssl-private-ca
      • 46-ASN.1
      • 47-x690-ber-cer-der
      • 48-PEM-PKCS7812
    • db
      • 01-IndexedDB-kickoff
    • java
      • java程序员从小工到专家成神之路(2024版)
      • 1-java-base
        • 前言
        • 01-string-all-in-one
        • 02-java-string-encodings
        • 03-base-shallow-copy-deep-copy
        • 04-do-you-know-class-name
        • 05-duration-period-ChronoUnit
        • 06-inner-class-inner-interface
        • 07-java-serialization
        • 8. 什么?注释里面的代码居然能够执行
        • 9. Java函数式编程和Lambda表达式
        • 10-lambda-closure
        • 11-type-inference-lambda
        • 12-marker-interface-annotation-processor
        • 13-java-jar-in-detail
        • 14-java-spi-for-extensible-app
        • 15-wordcount-in-one-line
        • 16-how-to-stop-thread
        • 17-why-use-peek
        • 18-checked-exception-in-lambda
      • 2-io-nio
        • 简介
        • 01-io-nio-overview
        • 02-io-file
        • 03-io-try-with
        • 4. 小师妹学JavaIO之:文件读取那些事
        • 5. 小师妹学JavaIO之:文件写入那些事
        • 6. 小师妹学JavaIO之:目录还是文件
        • 7. 小师妹学JavaIO之:文件系统和WatchService
        • 8. 小师妹学JavaIO之:文件File和路径Path
        • 9. 小师妹学JavaIO之:Buffer和Buff
        • 10. 小师妹学JavaIO之:File copy和File filter
        • 11. 小师妹学JavaIO之:NIO中Channel的妙用
        • 12. 小师妹学JavaIO之:MappedByteBuffer多大的文件我都装得下
        • 13. 小师妹学JavaIO之:NIO中那些奇怪的Buffer
        • 14. 小师妹学JavaIO之:用Selector来说再见
        • 15. 小师妹学JavaIO之:文件编码和字符集Unicode
      • 3-concurrent
        • 简介
        • 1. java.util.concurrent简介
        • 2. java并发中的Synchronized关键词
        • 3. java中的Volatile关键字使用
        • 4. java中wait和sleep的区别
        • 5. java中Future的使用
        • 6. java并发中ExecutorService的使用
        • 7. java中Runnable和Callable的区别
        • 8. java中ThreadLocal的使用
        • 9. java中线程的生命周期
        • 10. java中join的使用
        • 11. 怎么在java中关闭一个thread
        • 12. java中的Atomic类
        • 13. java中interrupt,interrupted和isInterrupted的区别
        • 14. java中的daemon thread
        • 15. java中ThreadPool的介绍和使用
        • 16. java 中的fork join框架
        • 17. java并发中CountDownLatch的使用
        • 18. java中CyclicBarrier的使用
        • 19. 在java中使用JMH(Java Microbenchmark Harness)做性能测试
        • 20. java中ThreadLocalRandom的使用
        • 21. java中FutureTask的使用
        • 22. java中CompletableFuture的使用
        • 23. java中使用Semaphore构建阻塞对象池
        • 24. 在java中构建高效的结果缓存
        • 25. java中CompletionService的使用
        • 26. 使用ExecutorService来停止线程服务
        • 27. 我们的线程被饿死了
        • 28. java中有界队列的饱和策略(reject policy)
        • 29. 由于不当的执行顺序导致的死锁
        • 30. 非阻塞同步机制和CAS
        • 31. 非阻塞算法(Lock-Free)的实现
        • 32. java内存模型(JMM)和happens-before
        • 33. java多线程之Phaser
        • 34. java中Locks的使用
        • 35. ABA问题的本质及其解决办法
        • 36. 并发和Read-copy update(RCU)
        • 37. 同步类的基础AbstractQueuedSynchronizer(AQS)
        • 38. java并发Exchanger的使用
      • 4-stream
        • 简介
        • 00001-java-8-streams-Introduction
        • 00002-functional-interface
        • 00003-lambda-best-practices
        • 00004-java-8-stream-ifelse
        • 00005-java-8-stream-map
        • 00006-java-rethrow
        • 00007-java-Collectors
        • 00008-java-8-stream-reduce
        • 00009-java-8-Spliterator
        • 00010-java-8-stream-foreach-break
        • 00011-java-8-predicate-chain
        • 00012-java-8-infinite-stream
        • 00013-java-8-stream-cust-pool
        • 00014-java-8-stream-peek
        • 00015-java-custom-collector
        • 00016-java-8-lambda-exception
      • 5-collections
        • 前言
        • 01-asList-arraylist
        • 02-Comparable-Comparator
        • 03-enumMap-enumSet
        • 04-Generics-in-deep
        • 05-hashMap-LinkedHashMap
        • 06-HashMap-TreeMap
        • 07-how-to-copy-list
        • 08-iterator-to-list
        • 09-java-fail-safe-fail-fast
        • 10-queue-overview
        • 11-PriorityQueue
        • 12-SynchronousQueue
        • 13-type-erase
        • 14-reference-referenceType
        • 15-skiplist-ConcurrentSkipListMap
        • 16-DelayQueue
      • 6-jvm
        • 00-java-jvm-all-in-one
        • 1. 小师妹学JVM之:JVM的架构和执行过程
        • 2. 终于我用JOL打破了你对java对象的所有想象
        • 3. 小师妹学JVM之:java的字节码byte code简介
        • 4. 小师妹学JVM之:Dirty cards和PLAB
        • 5. 小师妹学JVM之:JVM中栈的frames详解
        • 6. 如果你想写自己的Benchmark框架
        • 7. JVM详解之:java class文件的密码本
        • 8. JVM系列之:String,数组和集合类的内存占用大小
        • 9. JVM系列之:Contend注解和false-sharing
        • 10. JVM系列之:对象的锁状态和同步
        • 11. JVM系列之:String.intern和stringTable
        • 12. JVM系列之:String.intern的性能
        • 13. JVM详解之:本地变量的生命周期
        • 14. JVM详解之:HotSpot VM中的Intrinsic methods
        • 15. JVM系列之:通过一个例子分析JIT的汇编代码
        • 16. JVM详解之:类的加载链接和初始化
        • 17. 小师妹学JVM之:逃逸分析和TLAB
        • 18. JVM系列之:JIT中的Virtual Call
        • 19. JVM系列之:JIT中的Virtual Call接口
        • 20. JVM详解之:运行时常量池
        • 21. 小师妹学JVM之:JDK14中JVM的性能优化
        • 22. JVM系列之:从汇编角度分析Volatile
        • 23. JVM系列之:从汇编角度分析NullCheck
        • 24. 小师妹学JVM之:GC的垃圾回收算法
        • 25. 小师妹学JVM之:JVM中的Safepoints
        • 26. JVM系列之:再谈java中的safepoint
        • 27. troubleshoot之:用control+break解决线程死锁问题
        • 28. troubleshoot之:使用JFR解决内存泄露
        • 29. troubleshoot之:分析OutOfMemoryError异常
        • 30. troubleshoot之:使用JFR分析性能问题
        • 31. troubleshoot之:GC调优到底是什么
        • 32. JVM系列之:详解java object对象在heap中的结构
        • 33. 小师妹学JVM之:深入理解JIT和编译优化-你看不懂系列
        • 34. 小师妹学JVM之:JIT中的LogCompilation
        • 35. 小师妹学JVM之:JIT中的PrintCompilation
        • 36. 小师妹学JVM之:JIT中的PrintAssembly
        • 37. 小师妹学JVM之:JIT中的PrintAssembly续集
        • 38. 小师妹学JVM之:深入理解编译优化之循环展开和粗化锁
        • 39. 小师妹学JVM之:JIT的Profile神器JITWatch
        • 40. 小师妹学JVM之:cache line对代码性能的影响
      • 7-security
        • 00001-java-security-code-line-DOS
        • 00002-java-security-code-line-base
        • 00003-java-security-code-line-object
        • 00004-java-security-code-line-DLC
        • 00005-java-security-code-line-expresion
        • 00006-java-security-code-line-number
        • 00007-java-security-code-line-string
        • 00008-java-security-code-line-heap-pollution
        • 00009-java-security-code-line-object-copy
        • 00010-java-security-code-line-injection
        • 00011-java-security-code-line-input
        • 00012-java-security-code-line-mutability
        • 00013-java-security-code-line-method
        • 00014-java-security-code-line-exception
        • 00015-java-security-code-line-visibility-atomicity
        • 00016-java-security-code-line-lock
        • 00017-java-security-code-line-dead-lock
        • 00018-java-security-code-line-double-check-lock
        • 00019-java-security-code-line-thread
        • 00020-java-security-code-line-threadsafe
        • 00021-java-security-code-line-file-io
        • 00022-java-security-code-line-file-security
        • 00023-java-security-code-line-serialization
        • 00024-java-security-code-line-threadpool
      • 8-new-feature
        • 00-java-new-feature-all-in-one
        • 1. JDK11的重要新特性
        • 2. JDK12的五大重要新特性
        • 3. JDK13的六大重要新特性
        • 04-JDK9-java-module
        • 05-JDK9-String-Compact
        • 06-JDK9-jvm-xlog
        • 07-JDK10-var-usage
        • 08-JDK10-var-genericity-multiple-implements
        • 09-JDK10-var-anonymous-class
        • 10-JDK11-http-reactive
        • 11-JDK11-http-new
        • 12-JDK12-collectors-teeing
        • 13-JDK12-CompactNumberFormat
        • 14-JDK13-appCDS
        • 15. 一览为快,JDK14的新特性
        • 16. JDK 14的新特性:更加好用的NullPointerExceptions
        • 17-JDK14-records
        • 18-JDK14-text-block
        • 19-JDK14-switch
        • 20-JDK14-java-tools
        • 21-JDK14-jcmd
        • 22. JDK14的新特性:instanceof模式匹配
        • 23-JDK14-jfr-jmc-event-stream
        • 24-JDK15-new-features
        • 25-JDK15-release-new-features
        • 26-JDK16-new-features
        • 27-JDK17-new-features
      • 9-advanced-feature
        • 01-Java-Thread-Affinity
        • jna
          • 01-jni-overview
          • 02-jna-overview
          • 03-jna-Library-Mapping
          • 04-jna-type-mapping
          • 05-jna-type-mapping-details
          • 06-jna-memory
          • 07-jna-function
          • 08-jna-structure
          • 09-jna-callbacks
      • netty
        • 01 Netty Startup
        • 02 Netty Bytebuf
        • 03 Netty Architecture
        • 03-netty-bootstrap-ServerBootstrap
        • 04 Netty Channel
        • 04-netty-ChannelHandlerContext
        • 04-netty-ChannelPipeline
        • 04-netty-channel-group
        • 04-netty-channel-types
        • 04-netty-channel-vs-serverChannel
        • 04-netty-socketaddress
        • 05 Netty Channel Event
        • 05-netty-EventExecutor-EventExecutorGroup
        • 05-netty-eventloop-eventloopgroup
        • 05-netty-nioeventloop
        • 06 Netty Cheerup China
        • 07 Netty Stream Based Transport
        • 08 Netty Pojo Buf
        • 09 Netty Reconnect
        • 10 Netty Chat
        • 11 Netty Udp
        • 12 Netty Securechat
        • 13 Netty Customprotocol
        • 14-java-base64
        • 14-netty-ReplayingDecoder
        • 14-netty-codec-base64
        • 14-netty-codec-bytes
        • 14-netty-codec-json
        • 14-netty-codec-msg-to-bytebuf
        • 14-netty-codec-msg-to-msg
        • 14-netty-codec-object
        • 14-netty-codec-string
        • 14-netty-codec-xml
        • 14 Netty Cust Codec
        • 14-netty-frame-decoder
        • 15 Netty Buildin Frame Detection
        • 16 Netty Buildin Codec Common
        • 17-jboss-marshalling
        • 17-netty-marshalling
        • 17-netty-protobuf-UDP
        • 17 Netty Protobuf
        • 18 Netty Http Request
        • 19 Netty Http Client Request
        • 20 Netty Fileserver
        • 21 Netty Http Fileupload
        • 22 Netty Cors
        • 23 Netty Websocket Server
        • 24 Netty Websocket Server 2
        • 25 Netty Websocket Client
        • 26 Netty Secure Http 2
        • 27 Netty Http 2
        • 28 Netty Wrap Http 2
        • 29 Netty Flowcontrol
        • 30 Netty Http 2 Client
        • 31 Netty Framecodec Http 2
        • 32 Netty Http 2 Client Framecodec
        • 33 Netty Multiplex Http 2 Server
        • 34 Netty Multiple Server
        • 35 Netty Simple Proxy
        • 36 Netty Socks Support
        • 37 Netty Cust Socks Server
        • 38-netty-cust-port-unification
        • 39-netty-SelectorProvider-channelFactory
        • 40-netty-udt-support
        • 41-netty-udt-byte-message
        • 42-netty-rendezvous
        • 43-netty-reference-cound
        • 44-netty-tcp-fast-open
        • 45-netty-ByteBuf-ByteBuffer
        • 46-netty-future-executor
        • 47-netty-Thread-local-object-pool
        • 48-netty-fastThreadLocal
        • 49-netty-extensible-enum
        • 50-netty-Hashed-wheel-timer
        • 51-netty-Thread-Affinity
        • 52-netty-native-transport
        • 53-1-netty-kqueue-transport
        • 53-2-netty-epoll-transport
        • 54-netty-dns-over-tcp
        • 55-netty-dns-over-udp
        • 56-netty-dns-over-tls
        • 57-netty-dns-tcpserver
        • 58-netty-haproxy
      • 10-ORM
        • mybatis
          • 01-difference-between-#-and-$
    • reactive
      • reactive system初探
      • 02-reactive-stream
      • r2dbc
        • 01-r2dbc-introduce
        • 02-r2dbc-h2-in-depth
        • 03-r2dbc-mysql-in-depth
        • 04-spring-data-r2dbc
      • reactor
        • 01-introduction-to-reactor
        • 02-reactor-core-in-depth
        • 03-reactor-handle-errors
        • 04-reactor-thread-schedulers
    • scala
      • 00001 Scala Oo
      • 00002 Scala Base
      • 00003 Scala Functional
      • 00004 Scala Statically Typed
      • 5. 可扩展的scala
      • 00006 Scala Parameter
      • 00007 Scala Option Some Null
      • 00008 Scala Enumerations
      • 00009 Scala Partial Function
      • 00010 Scala Futures Promise
      • 00011 Scala Mutable Immutable Collection
      • 00012 Scala Either
      • 00013 Scala Covariance Contravariant
      • 00014 Scala Visibility
      • 00015 Scala Self Type
      • 00016 Scala Existential Type
      • 00017 Scala Higher Kinded
    • web-tech
      • 01-storage-api-limit
      • 02-web-storage-api
      • 03-webworker-kickoff
    • AI
      • 02-math
        • 01-singular-value
        • 02-probability-god-mod
        • 03-Turing-machine
        • 04-p-np-npc-problem
      • 03-machine-learning
        • 01-machine-learning-overview
      • 01-llma
        • langchain
          • 001-langchain-overview
          • 002-langchain-Prompts
          • 003-langchain-custprompts
          • 004-langchain-cust-example-selector
          • 005-langchain-llm
          • 006-langchain-chatmod
          • 007-langchain-output-parthcer
          • 008-langchain-retrieval-overview
          • 009-langchain-retrieval-document-loaders
    • AIGC
      • stable-diffusion
        • Stable diffusion 初学者指南
        • 构建一个优秀的Prompt
        • 轻松复现一张AI图片
        • Stable Diffusion中的常用术语解析
        • Stable diffusion中这些重要的参数你一定要会用
        • Stable Diffusion中的embedding
        • Stable diffusion中的models
        • Stable Diffusion WebUI详细使用指南
        • Stable diffusion采样器详解
        • 原来Stable Diffusion是这样工作的
        • hypernetwork在SD中是怎么工作的
        • SD中的VAE,你不能不懂
        • 手把手教你生成一幅好看的AI图片
        • 什么?这动物图片可以上国家地理?
        • After Detailer让图像自动修复
        • AI图像放大工具,图片放大无所不能
        • LoRA大模型微调的利器
    • Architecture
      • REST
        • 01 REST RES Tful
        • 02 REST Resource
        • 03 REST HATEOAS
      • auth
        • 01-SAML-startup
        • 02-openid-connect-startup
        • 03-OAuth-2.0-in-depth
        • 04-SAML-vs-OAuth2
        • 05-openid-connnect-with-onelogin
        • 06-keycloak-startup
        • 07-keycloak-saml-wildfly
        • 08-keycloak-with-other-system
        • 09-openid-Implicit-onelogin
      • common
        • 01-reactive-system
        • 02-reactive-stream
        • 03-authorization-service
        • 04-keycloak-cluster-in-depth
        • 05-concurrency-parallelism
        • 06-software-architecture
        • 07-data-flow-architecture
        • 09 Microservices Guide
        • 10 Microservices Monolith
        • 11 Serverless Architecture
      • distribution
        • 01 Basic Paxos
        • 02 Generalized Byzantine Paxos
        • 03 Cheap Paxos Fast Paxos
        • 04 Multi Paxos
        • 05 Raft
    • algorithm
      • 01-anime
        • 01-algorithm-bubble-sort
        • 02-algorithm-insertion-sort
        • 03-algorithm-selection-sort
        • 04-algorithm-merge-sort
        • 05-algorithm-quick-sort
        • 06-algorithm-count-sort
        • 07-algorithm-radix-sort
        • 08-algorithm-linked-list
        • 09-algorithm-doubly-linked-list
        • 10-algorithm-stack
        • 11-algorithm-AVL-tree
        • 12-algorithm-queue
        • 13-algorithm-dequeue
        • 14-algorithm-hashtable
        • 15-algorithm-binary-search-tree
        • algorithm-binary-heap
        • algorithm-cyclefinding
        • algorithm-fenwicktree
        • algorithm-recursion
        • algorithm-segmenttree
        • algorithm-suffix-array
        • algorithm-suffix-tree
        • algorithm-ternary-search-tree
        • algorithm-tire
    • cheatSheet
      • cheatsheet
        • 01-jdk8-GC-cheatsheet
        • 02-JDK9-GC-cheatsheet
        • 03-JDK10-GC-cheatsheet
        • 04-JDK11-GC-cheatsheet
        • 05-JDK12-13-14-GC-cheatsheet
      • mindmap
        • Architect
        • Bigdata
        • 区块链技术大合集
        • Golang
        • Java
        • Js
        • Patten
      • tips
        • 01 Db Primary Foregin Keys
        • 01-googleCloud-azure-aws
        • 02 Db Result Set Meta Data
        • 02 New Gitbook To Pdf
        • 03-semantic-version
        • 03 Swagger To Html Pdf
        • 04 Unicode Sorting
        • 05 Git Personal Access Token
        • 06-jetbrains-fleet
        • 07-git-largefile
        • 08-beidou-how-to-work
    • flutter
      • dart
        • 01-dart-variables
        • 02-dart-buildin-type
        • 03-dart-function
        • 04-dart-operator
        • 05-dart-exception
        • 06-dart-class
        • 07-dart-extend
        • 08-dart-Generics
        • 09-dart-packages
        • 10-dart-pubspec
        • 11-dart-create-package
        • 12-dart-async
        • 13-dart-generators
        • 14-dart-number-string
        • 15-dart-collection
        • 16-dart-url
        • 17-dart-date-time
        • 18-dart-math
        • 19-dart-decode-encode
        • 20-dart-html
        • 21-dart-http
        • 22-dart-websockets
        • 23-dart-file
        • 24-dart-null-safety
        • 25-dart-Isolates
        • 26-dart-extension-method
        • 27-dart-style
        • 28-dart-Libraries-effective
        • 29-dart-null-effective
        • 30-dart-collection
      • flutter
        • 01-flutter-architectural
        • 02-flutter-widget
        • 03-flutter-state
        • 04-flutter-BuildContext
        • 05-01-flutter-gestures-demo
        • 05-flutter-gestures
        • 06-flutter-Material-materialApp
        • 07-flutter-ui-layout-overview
        • 08-flutter-ui-layout-container
        • 09-flutter-ui-layout-gridview
        • 10-01-flutter-ui-layout-listview-more
        • 10-flutter-ui-layout-listview
        • 11-flutter-ui-layout-stack
        • 12-flutter-ui-layout-card
        • 13-flutter-ui-constraints
        • 14-flutter-ui-AspectRatio-FractionallySizedBox
        • 15-flutter-ui-boxes
        • 16-flutter-ui-builder
        • 17-flutter-ui-indexed-stack
        • 18-flutter-ui-wrap
        • 19-flutter-ui-offstage
        • 20-flutter-ui-flow
        • 21-flutter-ui-Transform
        • 22-flutter-ui-SliverAppBar
        • 23-flutter-ui-SliverList-SliverGrid
        • 24-flutter-ui-navigation-1
        • 25-flutter-ui-navigation-2
        • 26-flutter-ui-custom-themes
        • 26-flutter-ui-navigation-3
        • 27-flutter-ui-play-video
        • 28-flutter-ui-use-camera
        • 29-flutter-ui-animate-router
        • 30-flutter-ui-animate-resize
        • 31-flutter-ui-animate-controller
        • 32-flutter-ui-animate-download-button
        • 33-flutter-ui-animate-menu
        • 40-flutter-ui-effect-photo-filter
        • 50-flutter-MediaQuery
    • interview
      • architecture
        • 分布式系统
        • 设计模式
      • arithmetic
        • 数组字符串
        • 双指针
        • 滑动窗口
        • 矩阵
        • Hash表格
        • 区间
        • 栈
        • 链表
        • 二叉树
        • 图
        • 字典树
        • 回溯
        • 分治
        • Kadane算法
        • 二分查找
        • 堆
        • 位运算
        • 数学
        • 020-arithmetic-dynamic-planning
        • more
          • 001-arithmetic-01
          • 002-arithmetic-02
          • 算法基础面试题(三)
      • prepare
        • 经典IQ测试题
      • db
        • mysql
          • 001-mysql-01
          • 002-mysql-02
        • redis
          • 001-redis-01
      • java
        • base
          • java基础面试问题(一)
          • 面向对象
          • java基础面试问题(三)
          • Java异常面试题
          • more
            • 001-java-exception
        • collections
          • java集合面试问题(一)
          • java集合面试问题(二)
          • java集合面试问题(三)
          • java集合高级面试问题(一)
          • more
            • 深入理解java List
            • 深入理解java Map
        • concurrent
          • java并发和多线程面试题(一)
          • java并发和多线程面试题(二)
          • java并发和多线程面试题(三)
          • java并发高级面试题(一)
          • java并发高级面试题(二)
          • java并发高级面试题(三)
          • more
            • 007-java-do-you-know-lock
        • io
          • IO面试问题(一)
          • IO面试问题(二)
          • more
            • 高效IO 与 NIO
            • 高级IO应用
        • jvm
          • 001-java-jvm-01
          • 002-java-jvm-02
          • more
            • class字节码和类加载机制
            • 内存泄露
    • javascript
      • ecmascript
        • ecmascript-10
        • ecmascript-11
        • ecmascript-12
        • ecmascript-6
        • ecmascript-7
        • ecmascript-8
        • ecmascript-9
        • es6-Iterables-Iterator
        • es6-promise-generator
        • es8-shared-memory
        • es9-async-iteration
        • es9-regexp
        • js-built-in-objects-structures
        • js-closure
        • js-memory-management
        • js-modules
        • js-use-strict
        • object-oriented-js
      • koa
        • koa-startup
      • nodejs
        • 00001-nodejs-kickoff
        • 00002-nodejs-npm
        • 00003-nodejs-async
        • 00004-nodejs-http-express
        • 00005-nodejs-file-system
        • 00006-nodejs-profile
        • 00007-nodejs-docker-best-practices
        • 00008-nodejs-event
        • 00009-nodejs-event-more
        • 00010-nodejs-block-eventloop
        • 00011-nodejs-http-in-depth
        • 00012-nodejs-worker-thread
        • 00013-nodejs-childprocess
        • 00014-nodejs-cluster
        • 00015-nodejs-debug
    • python
      • 01-python-base
        • 01-python3-cheatsheet
        • 02-python-ipython
        • 03-python-number-list-string
        • 04-python-condition-control
        • 05-python-function
        • 06-python-data-structure
        • 07-python-module
        • 08-python-io
        • 09-python-error-exception
        • 10-python-class
        • 11-python-inner-obj
        • 12-Jupyter-Notebook
        • 13-python-struct-format-char
      • 02-numpy
        • 01-python-numpy-basic
        • 02-python-numpy-datatype
        • 03-python-numpy-scalar
        • 04-python-numpy-datatype-obj
        • 05-python-Structured-arrays
        • 06-python-numpy-genfromtxt
        • 07-python-numpy-broadcasting
        • 08-python-numpy-linear-algebra
        • 09-python-numpy-ndarray
        • 10-python-numpy-func
      • 03-pandas
        • 01-python-pandas-overview
        • 02-python-pandas-advanced
        • 03-python-pandas-data-structures
        • 04-python-pandas-merge
        • 05-python-pandas-reshaping-pivot
        • 06-python-pandas-text
        • 07-python-pandas-missingdata
        • 08-python-pandas-category
        • 09-python-pandas-plot
        • 10-python-pandas-statistical
        • 11-python-pandas-groupby
        • 12-python-pandas-window
        • 13-python-pandas-sparse-data
        • 14-python-pandas-options
        • 15-python-pandas-time
      • 04-flask
        • 0001-flask-overview
      • 05-statistic-demo
        • 01-pandas-titanic
        • 02-pandas-restaurant
    • server
      • computer-science
        • 01-network-and-performance
        • 02-http1.1-vs-http2
        • 03 Http 3
        • 04 Http Cache
        • 05 Http Cookie
        • 06 Web Socket
        • 07 Websocket Message
        • 08-ssl-tls-npn-alpn
        • 09 SOCKS
        • 10 SOCKS 5 More
        • 11 UDT
        • 12-MIME
        • 13-transfer-encodings
        • 14-kqueue-epoll
        • 15-stream-socket
        • 16-datagram-socket
        • 17-unix-domain-socket
        • 18-base64-encoding
        • 19-domain-name-service
        • 20-haproxy-protocol
        • 21-sctp
        • 22-sctp-package-in-detail
        • 23-memcached-text-protocol
        • 24-memcached-binary-protocol
        • 25-redis-protocol
        • 26-mqtt-protocol
        • 27-stomp-protocol
      • linux
        • 01 That Is Kill
        • 02-du-and-df
      • server
        • nginx
          • 01-nginx-http2
          • 02-nginx-proxy-protocol
        • tomcat
          • 00001-tomcat-native-startup
        • wildfly
          • 00001-wildfly-startup
          • 00002-wildfly-config-resource
          • 00003-wildfly-domain
          • 00004-wildfly-app-deployment
          • 00005-wildfly-cluster-domain
    • spring
      • 01-springbase
        • 1. Spring MVC 中的http Caching
        • 2. @SessionAttributes 和 @SessionAttribute的区别
        • 5. Spring中的IOC容器
        • 6. 在Spring中创建Bean
        • 7. 依赖注入
        • 8. Bean作用域简介
        • 9. Spring Bean 的生命周期回调
        • 10. IOC扩展
        • 11. spring中的注解
        • 12. 组件扫描
        • 13. jsr330 annotation
        • 14. Spring的Environment接口
        • 15. 事件机制
        • 16. 资源resources
        • 17. Spring中的BeanWrapper
        • 18. SpEL
        • 19. AOP
        • 20. AspectJ注解
        • 21. 基于Schema的AOP
        • 22. AOP代理
        • 23. Spring中的@Configurable
        • 24. 深入探讨Spring多级缓存:原理与性能优化
      • 02-springBoot
        • 1. Spring Boot中的测试
        • 2. Spring Boot的TestRestTemplate使用
        • 3. Spring Boot中使用Swagger CodeGen生成REST client
        • 4. 将Spring Boot应用程序注册成为系统服务
        • 5. Spring Boot中的Properties
        • 6. Spring Boot中Spring data注解的使用
        • 7. Spring Boot中使用@JsonComponent
        • 8. Shutdown SpringBoot App
        • 9. Spring Boot 之Spring data JPA简介
        • 10. Spring Boot JPA 中transaction的使用
        • 11. Spring Boot JPA中关联表的使用
        • 12. Spring Boot JPA的查询语句
        • 13. Spring Boot JPA中使用@Entity和@Table
        • 14. Spring Boot JPA中java 8 的应用
        • 15. 在Spring Boot中加载初始化数据
        • 16. 在Spring Boot中自定义filter
        • 17. 在Spring Boot中使用内存数据库
        • 18. Spring Boot国际化支持
        • 19. 在Spring Boot使用H2内存数据库
        • 20. Spring Boot 自定义banner
        • 21. 使用spring boot创建fat jar APP
        • 22. Spring Boot devtool的使用
        • 23. SpringBoot @ConfigurationProperties详解
        • 24. 自定义spring boot的自动配置
        • 25. Spring Boot的exit code
        • 26. Spring Boot注解
        • 27. Spring Boot Admin的使用
        • 00028-Spring-Boot-Starters
        • 29. Spring Boot Actuator
        • 30. 使用maven和fat jar/war运行应用程序的对比
        • 31. Maven Wrapper简介
        • 32. 自定义parent POM
        • 00033-Change-Default-Port-in-Spring-Boot
        • 00034-Bootstrap-a-Simple-Application
        • 35. 在Spring Boot中配置web app
        • 38. 从Spring迁移到Spring Boot
        • 39. Spring Boot @EnableAutoConfiguration和@Configuration的区别
        • 00040-springboot-docker-image
        • 00041-springboot-reactive-web
        • 00042-springboot-HATEOAS
        • 00043-springboot-HATEOAS-Fundamentals
      • 03-springBoot3
        • 0001-what-is-new-in-springboot3
        • 0002-use-native-image-in-springboot3
      • 04-springCloud
        • 1. Spring Cloud OpenFeign Demo
        • 2. Spring Cloud sleuth with zipkin over RabbitMQ demo
    • tools
      • gradle
        • 01-gradle-kick-off
        • 02-gradle-build-script
        • 03-gradle-incremental-build
        • 04-gradle-task-in-depth
        • 05-gradle-vs-maven
        • 06-gradle-build-java-projects
        • 07-Gradle-Nexus-Publish-Plugin
      • java
        • 1. 5个2020年你不能不知道的java IDE神器
        • 02-jvm-jconsole
        • 03-jvm-jmap-jhat
        • 04-jvm-jstack
        • 05-jvm-jstat
      • maven
        • 01-apache-maven-lifecycle
        • 02-apache-maven-toolchains
        • 03-apache-maven-git-repository
        • 04-maven-OSSRH
      • protocolbuf
        • 01 Protocolbuf Guide
        • 02 Protocolbuf Detail
        • 03 Protobuf Encoding
由 GitBook 提供支持
在本页
  • stable diffusion有什么用处?
  • stable diffusion模型
  • 训练过程
  • 稳定扩散模型Stable Diffusion model
  • 条件控制
  • Stable difussion逐步解析
  • 什么是CFG值?
  • 稳定扩散 v1.5 与 v2 比较
  • SDXL model

这有帮助吗?

  1. docs
  2. AIGC
  3. stable-diffusion

原来Stable Diffusion是这样工作的

初中生都能听懂的Stable Diffusion的工作原理,看完还不会你来找我

上一页Stable diffusion采样器详解下一页hypernetwork在SD中是怎么工作的

最后更新于11个月前

这有帮助吗?

stable diffusion是一种潜在扩散模型,可以从文本生成人工智能图像。为什么叫做潜在扩散模型呢?这是因为与在高维图像空间中操作不同,它首先将图像压缩到潜在空间中,然后再进行操作。

在这篇文章中,我们将深入了解它到底是如何工作的,还能够知道文生图的工作方式与图生图的的工作方式有何不同?CFG scale是什么?去噪强度是什么?

了解stable diffusion工作原理的好处: 可以更加正确的使用这个工具,从而实现更加可控的结果。

stable diffusion有什么用处?

简单来说,稳定扩散是一种文本到图像的模型。给它一个文本提示,它会返回一个与文本匹配的AI图像。

image-20240422121545313

stable diffusion模型

稳定扩散属于一类称为扩散模型的深度学习模型。它们是生成模型,意味着它们被设计用来生成类似于训练数据的新数据。而在stable diffusion中下,这些数据就是图像。

那么为什么它被称为扩散模型?

因为它的实现原理看起来非常像物理学中的扩散。接下来让我们看看他的底层原理实现。这里我以最常见的1girl作为例子来说明。

正向扩散

在正向扩散过程中,会向训练图像添加噪音,逐渐将其转化为不具有特征的噪音图像。正向过程会将任何1girl的图像转变为噪音图像。最终,你将无法判断它们最初到底是什么。(这很重要)

就像一滴墨水落入了一杯水中。墨水滴在水中扩散开来。几分钟后,它会随机分布在整个水中。你再也无法判断它最初是落在中心还是靠近边缘。

下面是一个图像经历正向扩散的示例。1girl的图像变成了随机噪音。

逆向扩散

正向扩展很好理解,那么接下来就是神奇的部分,如果我们能够逆向扩散呢?就像倒放视频一样,倒退时间。

从一个嘈杂、毫无意义的图像开始,逆向扩散可以恢复出一张原始的1girl的图像。这就是主要的想法。

训练过程

逆扩散的概念肯定是有创意的。但是,现在的问题是,“怎样才能实现逆扩散呢?”

为了逆转扩散,最根本的是我们需要知道图像添加了多少噪音。

diffusion中使用了一个神经网络模型来预测添加的噪音。这就是稳定扩散中的噪音预测器。它是一个U-Net模型。训练过程如下。

  • 选择一张训练图像,比如1girl的照片。

  • 生成一个随机的噪音图像。

  • 通过在训练的不同步数中添加一定的噪音图像来破坏训练图像。

  • 通过调整噪音预测器的权重,来训练噪音预测器,从而告诉他,我们添加了多少噪音。

训练后,我们有了一个能够预估图像添加的噪音的噪音预测器。

逆扩散

现在我们有了噪声预测器。如何使用它呢?

首先,我们生成一个完全随机的图像,并要求噪声预测器告诉我们噪声。然后我们从原始图像中减去这个估计的噪声。重复这个过程几次。最终你会得到一张1girl的图像。

当然现在我们还无法控制生成的图像,现在这个过程完全是随机的。

稳定扩散模型Stable Diffusion model

上面讲了那么多原理,但是其实那并不是stable diffusion的工作原理!

原因是上述扩散过程是在图像空间进行的。因为图像空间非常的大,所以计算速度非常的慢。

举个例子:一个512×512像素的图像有三个颜色通道(红色、绿色和蓝色),就是一个786,432维的空间!(你需要为一个图像指定那么多数值。)这是一个非常大的数字,在现有的GPU硬件条件下,很难快速的生成需要的图片。

所以很多公司对这个像素空间的扩散模型做了优化,比如谷歌的Imagen和Open AI的DALL-E,它们使用了一些技巧来加快模型速度,但这样还是不够的。

潜在扩散模型Latent diffusion model

Stable diffuion中引入了一个叫做潜在扩散空间的概念,从而解决在像素空间的扩散模型计算速度慢的问题。下面是它的工作原理。

稳定扩散是一种潜在扩散模型。它不是在高维图像空间中运行,而是首先将图像压缩到潜在空间中。

以上面的512×512像素的图像为例,稳定扩散模型的潜在空间是4x64x64,这个潜在空间是原图像像素空间的1/48。

因为潜在空间只有之前的1/48,因此它能够在计算更少的数字的情况下获得结果。这就是为什么它更快的原因。

变分自动编码器VAE

从像素空间到潜在空间的变化,是通过一种称为**变分自动编码器(variational autoencoder)**的技术来实现的。是的,这就是我们经常看到的VAE。

变分自动编码器(VAE)是由两部分组成:(1)编码器和(2)解码器。编码器将图像压缩到潜在空间,解码器从潜在空间恢复图像。

**我们所说的所有前向和反向扩散实际上都是在潜在空间中进行的。因此,在训练过程中,它不是生成一个嘈杂的图像,而是在潜在空间中生成一个随机张量(潜在噪声)。它不是用噪音损坏图像,而是用潜在噪声损坏图像在潜在空间中的表示。**这样做的原因是潜在空间较小,因此速度更快。

图像分辨率

图像分辨率反映在潜在图像张量的大小上。对于仅有512×512像素的图像,潜在图像的大小为4x64x64。对于768×512像素的肖像图像,潜在图像的大小为4x96x64。

这就是为什么生成更大的图像需要更长的时间和更多的VRAM。

这里想解释一下为什么我们在使用stable diffusion的时候,如果生成大于512×512像素的图像,有时候会出现双头的问题。

这是因为Stable Diffusion v1是在512×512像素图像上进行训练的。

图像放大

那么我们怎么才能生成分辨率更大的图片呢?最好的办法是保证图像至少有一边达到512像素,然后使用AI放大器或img2img的功能进行图像放大。

另外,可以使用SDXL模型。它具有更大的默认尺寸,为1024 x 1024像素。

为什么潜在空间可以工作?

你可能会想知道为什么变分自动编码器(VAE)可以将图像压缩成一个更小的潜在空间而不丢失信息。

原因是,自然图像并不是随机的,它们具有很高的规律性:一张脸遵循着眼睛、鼻子、脸颊和嘴巴之间特定的空间关系。一只狗有四条腿并且具有特定的形状。

换句话说,图像的高维度是人为的。自然图像可以很容易地压缩到更小的潜在空间而不丢失任何信息。这在机器学习中被称为流形假设。

潜在空间中的反向扩散

以下是stable diffusion中潜在空间反向扩散的工作原理。

  1. 生成一个随机潜在空间矩阵。

  2. 噪声预测器预测潜在矩阵的噪声。

  3. 然后从潜在矩阵中减去预测的噪声。

  4. 根据特定的采样步数,重复2,3这两步。

  5. VAE的解码器将潜在矩阵转换为最终图像。

什么是VAE文件?

VAE文件是在Stable Diffusion v1中用于改进眼睛和脸部的生成效果。它们是我们刚刚谈到的自动编码器的解码器。通过进一步微调解码器,模型可以绘制出更精细的细节。

之前提到自然图像并不是随机的,它们具有很高的规律性,虽然是这样,但是将图像压缩到潜在空间确实会丢失信息,因为原始的VAE没有恢复细节。而这个VAE文件或者VAE解码器的作用就是负责绘制细节。

条件控制

到这里基本上运行流程已经差不多了,但是我们还缺了一部分:我们写的文本prompt是在哪里发挥作用的呢?

这些prompt实际上就是条件控制。条件控制的目的是引导噪声预测器,使得预测的噪声在从图像中减去后能够给我们想要的结果。

txt2img(文本到图像)

以下是对txt2img如何被处理并输入到噪声预测器的说明。

首先,分词器(Tokenizer)将提示中的每个单词转换为一个称为标记的数字。然后,每个标记被转换为一个名为嵌入embedding的768值向量。这些嵌入然后被**文本变换器(text transformer)**处理,并准备好被噪声预测器使用。

接下来,让我们详细介绍每一部分的含义。

分词器Tokenizer

首先,文本提示被 CLIP 分词器进行分词。CLIP 是由 Open AI 开发的深度学习模型,用于生成任何图像的文本描述。Stable Diffusion v1 使用了 CLIP 的分词器。

分词是计算机理解单词的方法。我们人类可以读单词,但计算机只能读数字。这就是为什么文本提示中的单词首先被转换为数字的原因。分词器只能分词它在训练过程中见过的单词。例如,CLIP 模型中有“butter”和“fly”,但没有“butterfly”。分词器会将单词“butterfly”分解为两个标记“butter”和“fly”。所以一个单词并不总是意味着一个标记!

另一个细节是空格字符也是标记的一部分。在上面的情况中,短语“butter fly”产生了两个标记“butter”和“[space]fly”。这些标记与“butterfly”产生的不同,“butterfly”的标记是“butter”和“fly”(在“fly”之前没有空格)。

Stable Diffusion 模型在提示中仅限于使用75个标记。(这并不等同于75个单词)

嵌入embedding

Stable diffusion v1采用了Open AI的ViT-L/14 Clip模型。embedding嵌入是一个768值的向量。每个标记都有自己独特的嵌入向量。嵌入是由CLIP模型决定的,在训练过程中学习的。

为什么我们需要嵌入?因为一些词是密切相关的,我们希望能够充分利用这些信息。例如,man、gentleman和guy的嵌入几乎相同,因为它们可以互换使用。克劳德·莫奈、皮埃尔·奥古斯特·雷诺阿和爱德华·马奈都是印象派风格绘画的代表,但方式各有不同。所以这些名字在embedding中具有接近但不完全相同的值。

这就是我们讨论的用于通过关键词触发样式的嵌入。找到合适的嵌入可以触发任意对象和风格,这是一种称为文本反演(textual inversion)的微调技术。

embedding to noise predictor

在发送到噪声预测器之前,嵌入需要通过文本转换器进行处理处理。

转换器就像一个通用适配器,用于条件处理。在这种情况下,它的输入是文本嵌入向量,但它也可以是其他东西,比如标签、图像和深度图。

注意力机制

在Stable Diffusion AI和类似的文本到图像生成模型中,U-Net是一个关键的组件,它负责将文本提示转换成图像。U-Net是一个深度学习模型,通常用于图像到图像的任务,如图像分割。在Stable Diffusion中,U-Net利用了一种称为“注意力机制”的技术来理解和处理文本提示。

  1. 自注意力 (Self-Attention):

    • 自注意力允许模型在处理提示时识别单词之间的关系。比如一个蓝色眼睛的男人,“蓝”和“眼睛”通过自注意力机制被关联起来,这样模型就知道用户想要生成的是一个拥有蓝色眼睛的男人,而不是一个穿着蓝色衬衫的男人。

  2. 交叉注意力 (Cross-Attention):

    • 交叉注意力是文本和图像之间的桥梁。在生成图像的过程中,U-Net使用交叉注意力机制来确保生成的图像与文本提示保持一致。这意味着模型会根据文本提示中的关键词生成相应的图像特征。

超网络是一种调整稳定扩散模型的技术,它利用交叉注意力网络来插入风格。

LoRA模型修改交叉注意力模块的权重来改变风格。

仅仅修改这个模块就能调整稳定扩散模型的结果,可见这个模块是多么重要。

还有其他控制条件吗?

稳定扩散模型可以被修改和设置的方式不止文本提示一种。

除了文本提示,深度图像也可以被用来设置图像模型。

比如ControlNet就可以使用检测到的轮廓、人体姿势等来设置噪声预测器,并实现对图像生成的出色控制。

Stable difussion逐步解析

现在你已经了解了稳定扩散的所有内部机制,让我们通过一些例子来看看它在幕后到底发生了什么。

文字转图像

在文字转图像中,你输入文字,模型会返回一个生成好的AI图片。

步骤1。稳定扩散在潜在空间中生成一个随机张量。你可以通过设置随机数生成器的种子来控制这个张量。

如果你把种子设置为固定的值,那么你将始终得到相同的随机张量。

最开始的图像只是一片噪音。

步骤2。噪声预测器 U-Net 将潜在的嘈杂图像和文本提示作为输入,并在潜在空间中预测噪音。

步骤3。从潜在图像中减去潜在噪声。这就成为了您的新潜在图像。

步骤2和步骤3会重复一定数量的采样步骤,这个步骤就是你设置的sample steps。

步骤4。最后,VAE 的解码器将潜在图像转换回像素空间。这就是在运行稳定扩散后得到的图像。

噪声调度(Noise schedule)

图片从嘈杂变得清晰。是因为每一步我们都从原始latent space中减去了预测到的噪声。

每步减少多少噪声,这个减去噪声的调度过程,就叫做noise schedule。

下面是一个噪声调度的例子。

noise schedule是通过我们使用的采样器和采样步数来决定的,我们可以在每一步中减去相同量的噪声,也可以在开始阶段减去更多的噪声,就像上面的例子。

采样器在每一步中减去恰好足够的噪声,以便在下一步达到期望的噪声。

图像到图像

图像到图像的意思是使用稳定扩散将一幅图像转换成另一幅图像。

SDEdit是一种图像到图像的编辑方法,它允许用户通过结合输入图像和文本提示来控制图像生成过程。这种方法首次提出时,旨在提高对生成图像的控制能力,使得用户可以更精确地实现他们的创意愿景。SDEdit可以应用于任何扩散模型,包括Stable Diffusion。

图像到图像的输入是一幅图像和一个文本提示。生成的图像将同时受到输入图像和文本提示的影响。

比如我通过这左边的素描图加上提示词:

"photo of young woman,no suit,no shirt,no bar,on the street, rim lighting,studio lighting,looking at the camera,dslr,ultra quality,sharp focus,tack sharp,dof,film grain,Fujifilm XT3,crystal clear,8K UHD,highly detailed glossy eyes,high detailed skin,skin pores,"

就可以把它转换成一张真实的图片:

现在让我们来看看具体的步骤。

步骤1. 将输入图像编码为潜在空间。

步骤2. 将噪声添加到潜在图像。去噪强度控制添加的噪声量。

如果为0,则不添加噪声。如果为1,则添加最大量的噪声,使潜在图像变成完全随机的张量。

步骤3. 噪声预测器U-Net将潜在带噪声图像和文本提示作为输入,并预测潜在空间中的噪声。

步骤4. 从潜在图像中减去潜在噪声。这就成为了你的新潜在图像。

步骤3和步骤4会重复一定数量的采样步骤,这个步骤就是你设置的sample steps。

步骤5. 最后,VAE的解码器将潜在图像转换回像素空间。这就是你通过运行图像到图像得到的图像。

所以现在你知道图像到图像是什么了:它只是在初始潜在图像上加入一点噪声和输入图像。

将去噪强度设置为1等同于文本到图像,因为初始潜在图像完全是随机的。

图像修复

图像修复实际上只是图像到图像的特例。在需要修复的图像部分添加了噪音。噪音的数量同样由去噪强度控制。

什么是CFG值?

我们在使用stable diffusion的时候,有一个非常重要的参数叫做CFG。

在理解CFG之前,我们首先需要了解它的前身,分类器指导Classifier guidance

分类器指导Classifier guidance

分类器指导是在扩散模型中图像标签的一种整合方式。你可以使用标签来指导扩散过程。例如,标签“1girl”可以引导逆扩散过程生成女性的照片。

**分类器指导比例(**classifier guidance scale)是一个参数,用于控制扩散过程在多大程度上遵守这个分类标签。

假设我们有三组图像,分别带有“猫”、“狗”和“人类”的标签。如果扩散过程不受任何指导,模型可能会从每个类别中随机抽取样本。这可能导致生成的图像同时符合两个标签的特征,比如一个男孩正在抚摸一只狗的场景。

在classifier guidance scale指导的条件下,扩散模型产出的图像往往会倾向于典型或明确的样本。比如,当你要求模型生成一只猫的图片时,它将提供一张清晰无疑的猫的图像,而非其他任何生物。

分类器指导比例(classifier guidance scale)调节着模型遵循标签指导的严格程度,更高的值,意味着在生成图像时,模型更加严格地依据所给标签进行选择。在实际操作中,这个比例的值实际上是一个乘数,它决定了模型在生成过程中向具有特定标签的数据集偏移的程度。

无分类器引导Classifier-free guidance(CFG)

分类器引导虽然功能强大,但它需要额外的模型来提供指导,这给训练过程带来了一些挑战。

而无分类器引导是一种创新的方法,它允许实现“无需分类器的分类器引导”。通过使用图像的标题来训练一个有条件的扩散模型,将分类器的功能整合为噪声预测器U-Net的一个条件,从而实现了一种无需单独图像分类器的图像生成引导。

另外,文本提示为文本到图像的生成提供了一种引导机制,使得模型能够根据文本描述生成相应的图像。

无分类器引导规模(CFG scale)

现在,我们有一个使用条件控制的无分类器扩散过程。我们如何控制AI生成的图像应该多大程度上遵循引导?

无分类器引导规模(CFG scale)是一个控制文本提示如何引导扩散过程的值。当CFG规模设置为0时,AI图像生成是无条件的(即忽略提示)。较高的CFG规模会将扩散引导到提示方向。

稳定扩散 v1.5 与 v2 比较

模型差异

SD v2使用OpenClip进行文本嵌入。SD v1使用Open AI的CLIP ViT-L/14进行文本嵌入。这一变化的原因是:

  • OpenClip比原先的模型大了多达五倍。更大的文本编码器模型可以提高图像质量。

  • 虽然Open AI的CLIP模型是开源的,但这些模型是使用专有数据进行训练的。转换到OpenClip模型能够让研究人员在研究和优化模型时更加透明。这对于长期发展是更有利的。

v2模型有两种版本。

  • 512版本生成512×512像素的图像

  • 768版本生成768×768像素的图像

训练数据差异

SD v1.4 是在名为 laion2B-en 的数据集上,以 256×256 的分辨率进行了 237,000 次训练迭代。

接着,在 laion-high-resolution 数据集上,以 512×512 的分辨率进行了 194,000 次训练迭代。

在“laion-aesthetics v2 5+”数据集上,同样以 512×512 的分辨率,进行了 225,000 次训练迭代,同时在文本条件中降低了 10% 的权重。

SD v2 则是在 LAION-5B 数据集的子集上,经过去除了显式NSFW内容的筛选,并应用了 LAION-NSFW 分类器,以 punsafe=0.1 的参数和 aesthetic score >=4.5 的条件下,进行了 550,000 次训练迭代。

此外,该模型还在相同数据集上以 256x256 的分辨率进行了 850,000 次训练迭代,但这次只包括图片分辨率大于或等于 512x512 的样本。

之后,模型使用了 v-objective 目标函数,在相同数据集上进行了额外的 150,000 次训练迭代。

最后,在 768x768 的图片上继续进行了 140,000 次训练迭代。

SD v2.1 是在 v2.0 的基础上进行了微调,先是以 punsafe=0.1 的参数额外训练了 55,000 步,然后又以 punsafe=0.98 的参数额外训练了 155,000 步。

值得注意的是,在最终的训练阶段,NSFW的过滤器被关闭了。

输出表现的差异

人们在使用SD v2 来控制风格和生成名人图像时,会更加的困难。因为虽然 Stability AI 并没有明确排除艺术家和名人的名字,但在 v2 版本中,这些名字的效果要弱得多。这很可能是因为训练数据的差异所致。Open AI 的专有数据可能包含更多的艺术作品和名人照片,而且这些数据很可能经过了高度筛选,以确保每件作品和每位人物都看起来都非常美观。

因为这种原因,SD V2 和v2.1并没有流行起来,用户们更倾向于使用经过精细调整的 v1.5 和 SDXL 模型。

SDXL model

作为一个规模更大的模型,在人工智能领域,人们普遍认为其性能会更为出色。SDXL 模型的参数总数达到了惊人的 66 亿,而相比之下,v1.5 模型的参数总数则为 9.8 亿。

  • 实际上,SDXL 模型由两个模型组成:基础模型和细化模型。基础模型负责构建整体构图,而细化模型则在此基础上添加更精细的细节。

    基础模型可以独立运行,不依赖细化模型。

    SDXL 基础模型的改进包括:

    • 文本编码器结合了最大的 OpenClip 模型(ViT-G/14)和 OpenAI 的专有 CLIP ViT-L。这样的选择让 SDXL 更易于引导,同时保持了强大的性能,并且能够使用 OpenClip 进行训练。

    • 新的图像尺寸调节旨在使用小于 256×256 的训练图像。这通过不丢弃 39% 的图像,显著增加了训练数据量。

    • U-Net 的规模是 v1.5 模型的三倍。

    • 默认的图像尺寸为 1024×1024,是 v1.5 模型 512×512 的四倍。

image-20240422123002139
image-20240422154548041
image-20240422160214496
image-20240422172146404
image-20240422203502407
image-20240422184029011
image-20240422203533236
image-20240422204010632
image-20240422204531142
image-20240422204647493
image-20240422232635503
image-20240422232959011
image-20240422233409529
image-20240422233517705
image-20240422204531142
image-20240422233755177
SDXL model pipeline