元素同典:确实不完全科学的魔导书 批注
annotation-target:: [[元素同典:确实不完全科学的魔导书.pdf]]
annotation-target:: [[元素同典:确实不完全科学的魔导书.pdf]]
黑曜石注释器
这是 Obsidian (https://obsidian.md) 的插件。它允许您打开和注释 PDF 和 EPUB 文件。
该插件基于 https://web.hypothes.is/,但经过修改后将注释存储在本地 markdown 文件中,而不是存储在 Internet 上。
示范
警告! 在上面的 gif 中,我使用 Dataview 语法来指定 annotation-target。如果你没有安装 dataview 插件,则必须在 frontmatter 中编写 annotation-target,如下所示:
1 | --- |
开始
将属性 annotation-target
添加到黑曜石便笺的 frontmatter
中,其值对应于 EPUB/PDF 文件的位置。该位置可以是 Vault 中的文件(如
Pdf/mypdf.pdf
),也可以是联机文件(如
https://arxiv.org/pdf/2104.13478.pdf
)
然后,您可以在打开的注释窗格中,选择 “more options”(右上角的三个点),并且应该有一个新选项 “annotate” 可用。
该插件会自动尝试根据文件路径确定文件是 epub
还是
pdf
,但如果这不起作用,您还可以添加属性
annotation-target-type
并手动指定它是 epub
还是 pdf
。
如果您安装了 dataview,则还可以使用 dataview 属性指定注释目标。在这种情况下,可以使用 obsidian 样式的链接来代替纯文本路径。
WARNING! Don't rename an original pdf or epub file! The plugin is going to lose the connection between annotations and file in that case.
警告!不要重命名原始 PDF 或 epub 文件!在这种情况下,插件将失去 annotation 和 file 之间的连接。
注释 Annotation is self-explanatory. Select text with your mouse to
get started.
注释是不言自明的。用鼠标选择文本以开始使用。
In the future, it would be nice to add colored highlights and
image/region highlights. These features will have to be added to
hypothes.is first, however. See these relevant issues: hypothesis/product-backlog#198,
hypothesis/product-backlog#669
将来,添加彩色高光和图像/区域高光会很好。但是,必须先将这些功能添加到
hypothes.is 中。请参阅以下相关问题: hypothesis/product-backlog#198
, hypothesis/product-backlog#669
markdown 中的注解
To return to the regular obsidian markdown editing mode, you can
select more options
→ Open as MD
. Each
annotation has an associated quote block with a block reference. Be
careful with modifying these blocks. Minor edits to PREFIX, HIGHLIGHT,
and POSTFIX are typically ok. But if the edits are too major, hypothesis
may no longer be able to identify the corresponding text.
要返回常规的 obsidian markdown 编辑模式,你可以选择
Open as MD
→ 更多选项
。每个注释都有一个带有块引用的关联 quote 块。修改这些块时要小心。对
PREFIX、HIGHLIGHT 和 POSTFIX
进行次要编辑通常是可以的。但是,如果编辑过于严重,假设可能无法再识别相应的文本。
The COMMENT region can be freely edited. (but ensure that it is still
part of the quote block.)
COMMENT 区域可以自由编辑。(但请确保它仍然是 quote 块的一部分。
The TAGS region should consist of a comma-separated list of obsidian
tags. (like #tag1, #tag2, #tag3
)
TAGS 区域应由以逗号分隔的黑曜石标签列表组成。(如
#tag1、#tag2 #tag3
)
深色模式
The plugin has built-in dark mode support. To toggle dark mode,
select more options
→ Toggle Dark Mode
while
annotating. You can also tweak the dark mode behavior in the settings
tab for the plugin.
该插件具有内置的暗模式支持。要切换深色模式,请在注释时选择更多选项
→ Toggle Dark Mode(切换深色模式
)。您还可以在插件的
settings (设置) 选项卡中调整暗模式行为。
链接到注释
An obsidian link to an annotation block-reference will, when clicked,
open the corresponding file and scroll to the associated highlight. If
the file is already open in a pane, then the link will cause the
existing pane to scroll instead.
单击指向注释块引用的黑曜石链接将打开相应的文件并滚动到关联的高亮显示。如果文件已在窗格中打开,则该链接将导致现有窗格滚动。
贡献
Visit CONTRIBUTING.md
for information on building from source or contribution improvements. To
report a bug, ask a question or suggest an improvement for this plugin,
you can create an issue.
请访问 CONTRIBUTING.md
以获取有关从源构建或贡献改进的信息。要报告错误、提出问题或建议此插件的改进,您可以创建一个问题
。
在前端开发中,我们经常会遇到一些性能瓶颈,比如一些复杂的计算,或者一些需要大量计算的算法,这时候我们可以考虑使用WebAssembly来提高性能。
WebAssembly是一种新的低级字节码格式,可以在现代浏览器中运行,它可以让我们在浏览器中运行其他语言编写的代码,比如C、C++、Rust等。
Rust 因为其安全性可靠性以及高性能,以及跨平台的特性,非常适合用来编写WebAssembly模块。
1 | ### [Rust 和 WebAssembly 用例](https://developer.mozilla.org/zh-CN/docs/WebAssembly/Guides/Rust_to_Wasm#rust_%E5%92%8C_webassembly_%E7%94%A8%E4%BE%8B#rust_和_webassembly_用例) |
MDN网站上本身有一个简明的教程,用于介绍如何将Rust编写的程序打包为WebAssembly模块,然后在JavaScript中调用:编译 Rust 为 WebAssembly - WebAssembly | MDN
MDN这篇文章写的非常通俗易懂,基本上是面向于零基础的读者, 但是问题是,这篇文章里面仍然有很多容易踩的坑,所以说,我在这结合我自己的实践、以及所遇到的问题,来写一篇更加详细的教程。
所以说这篇文章的大部分内容将会和 MDN 的文章一致,但是我会对其的一些内容进行删改,以及添加一些我认为有必要的内容。
在本教程中,我们将使用 Rust 的 npm 包构建工具 wasm-pack
来构建一个 npm 包。这个包只包含 WebAssembly 和 JavaScript
代码,以便包的用户无需安装 Rust 就能使用。他们甚至不需要知道这里包含
WebAssembly!
之后我们会使用 vite
框架来引入这个npm包,然后在前端项目中调用这个WebAssembly模块。
让我们看看安装 Rust 环境的所有必要步骤。
前往 Install
Rust 页面并跟随指示安装
Rust。这里会安装一个名为“rustup”的工具,这个工具能让你管理多个不同版本的
Rust。默认情况下,它会安装用于惯常 Rust 开发的 stable 版本 Rust
Release。Rustup 会安装 Rust 的编译器 rustc
、Rust
的包管理工具 cargo
、Rust 的标准库 rust-std
以及一些有用的文档 rust-docs
。
备注: 需要注意,在安装完成后,你需要把 cargo 的
bin
目录添加到你系统的
PATH
。一般来说它会自动添加,但需要你重启终端后才会生效。
要构建我们的包,我们需要一个额外工具
wasm-pack
。它会帮助我们把我们的代码编译成 WebAssembly
并制造出正确的 npm
包。使用下面的命令可以下载并安装它:
1 | cargo install wasm-pack |
在这个例子中我们将会构建一个 npm 包,因此你需要确保安装 Node.js 和 npm 已经安装。
另外,我们将会把包发布到 npm 上,因此你还需要一个 npm 账号。它们是免费的。发布这个包并不是必须的,但是发布它非常简单,因此在本例中我们默认你会发布这个包。
这一步主要是为了,让你能够在本地测试你的WebAssembly模块,以及发布到npm上。之后其他的项目可以直接通过npm来同步更新你的WebAssembly模块,而无需手动操作。
在 Get npm! 页面按照说明下载并安装 Node.js 和 npm。在选择版本时,选择一个你喜欢的版本;本例不限定特定版本。
在 npm signup page 注册 npm 账户,并填写表格。
接下来,在命令行中运行 npm adduser
:
1 | > npm adduser |
你需要完善你的用户名,密码和邮箱。如果成功了,你将会看到:
1 | Logged in as yournpmusername on https://registry.npmjs.org/. |
在这里你可能会遇到两个问题: 1. 你被重定向到了 cnpm 而不是 npm 的网站。cnpm不支持公开账号的注册,它只允许你注册一个私人账号。
遇到这个问题是因为你之前可能遇到过 npm 无法安装某些模块的问题,之后在教程的指引下,使用了npmmirrow 淘宝镜像作为 npm 的源,当更改npm的源的时候,账号验证的源也会被设置为淘宝的镜像源。
解决方式有两个,一个是直接切换npm的源,但是这样,当你下次又有无法安装的而模块的时候,你又需要切换回来,最好的办法是自己手动指定一下登入账号使用的源:
1 | npm login --registry http://registry.npmjs.com |
使用
1 | npm login --username <username> --password <password> --email <email> |
可以在命令行就指定这些参数,方便检查有无出错。 但是请注意请不要将这行命令添加到公开的文件里,以保护你的账号安全。
万事俱备,来创建一个新的 Rust 包吧。打开你用来存放你私人项目的目录,做这些事:
1 | $ cargo new --lib hello-wasm |
这里会在名为 hello-wasm
的子目录里创建一个新的库,里面有下一步之前你所需要的一切:
1 | +-- Cargo.toml |
首先,我们有一个 Cargo.toml
文件,这是我们配置构建的方式。如果你用过 Bundler 的 Gemfile
或者 npm 的 package.json
,你应该会感到很熟悉。Cargo
的用法和它们类似。
接下来,Cargo 在 src/lib.rs
生成了一些 Rust 代码:
1 | #[cfg(test)] |
我们完全不需要使用这些测试代码,所以继续吧,我们删掉它。
让我们在 src/lib.rs
写一些代码替换掉原来的:
1 | extern crate wasm_bindgen; |
上面是MDN给的代码,它在后面给出了每个部分的解释,你可以点击这里跳转到原文进行查看:来写点 Rust 代码吧!
不过我认为将注释和代码放在一起会更方便于参考,读者可以自行决定使用哪种方式。这里将会给出一个缺少部分细节的高级说明;如果想要了解更多 Rust 知识,请查看在线书籍 The Rust Programming Language。
1 | /* |
为了能够正确的编译我们的代码,首先我们需要配置
Cargo.toml
。打开这个文件,将内容改为如下所示:
Cargo.toml
1 | [package] |
你需要改为自己的仓库,同时 Cargo 需要通过 git
来完善
authors
部分。
最重要的是添加底下的部分。第一个部分 — [lib]
— 告诉 Rust
为我们的包建立一个 cdylib
版本;在本教程中我们不会讲解它的含义。有关更多信息,请参阅 Cargo 和 Rust Linkage
文档。
第二个部分是 [dependencies]
部分。在这里我们告诉 Cargo
我们需要依赖哪个版本的 wasm-bindgen
;在这个例子中,它是
0.2.z
版本的 (不是 0.3.0
或者其他版本)。
现在我们已经完成了所有配置项,开始构建吧!在命令行输入以下命令:
1 | wasm-pack build --scope mynpmusername |
或者
1 | wasm-pack build |
上面的方式会附带你的签名。
这个命令将做一系列事情 (这会花一些时间,特别是当你第一次运行
wasm-pack
)。想了解详细情况,查看这篇在 Mozilla
Hacks 上的文章。简单来说,wasm-pack build
将做以下几件事:
wasm-bindgen
,生成一个 JavaScript 文件将 WebAssembly
文件包装成一个模块以便 npm 能够识别它。pkg
文件夹并将 JavaScript 文件和生成的
WebAssembly 代码移到其中。Cargo.toml
并生成相应的
package.json
。README.md
(如果有的话) 到文件夹中。最后的结果?你在 pkg
文件夹下有了一个 npm 包。
教程的说明就截止到上面了,但是大概率,你报错了。
MDN的文章毕竟面对的是全球的开发者,但是在国内有一个比较烦的问题就是网络的访问,在执行wasm-pack build
的时候,它会这样报错:
1 | E:\_Project\Rust\hello-wasm>wasm-pack build |
这里它说是无法下载 wasm-opt 这个东西,但是实际上我直接通过链接是能够直接下载的,网上说更改代理能够解决问题,我这里没有尝试这种方式,但是我还是将这种方法贴在这里:
如果你尝试通过cargo 去提前下载好 wasm-opt
的话,就会遇到另外一个问题,它一会给你报错无法找到c++编译器,但是实际上我的电脑里面安装了vs2019,所以说实际上根本不应该存在这个问题。当我将vs2019的cl.exe添加到环境变量之后,它又会报错说无法找到clang,之后我又去llvm的官网下载了clang,但是它又报错说c++ 'algorithm' file not found
,这个问题我解决不了,暂时也不知道是为什么,这让我浪费了很多时间。
对于新学者来说,最好的办法就是按照它的提示的后者,将wasm-opt = false
添加到你的Cargo.toml
文件中,这样就可以跳过这个步骤,直接编译你的WebAssembly模块。wasm-opt
是一个优化工具,它会对你的WebAssembly模块进行优化,但是实际上,这个优化工具并不是必须的,你可以直接跳过这个步骤,直接编译你的WebAssembly模块。
对了,还有一个问题,就是它虽然叫你需要在 package metadata
中添加wasm-opt = false
,但是实际上,你并不知道在哪里添加,需要翻阅官方文档:Cargo.toml
Configuration - Hello wasm-pack!
wasm-pack
可以通过Cargo.toml
中的package.metadata.wasm-pack
键进行配置。 每个选项都有一个默认值,不是必需的。共有三个配置文件:
dev
、profiling
和release
。 这些对应于传递给wasm-pack build
的--dev
、--profiling
和--release
标志。可用的配置选项及其默认值如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 [package.metadata.wasm-pack.profile.dev]
# Should `wasm-opt` be used to further optimize the wasm binary generated after
# the Rust compiler has finished? Using `wasm-opt` can often further decrease
# binary size or do clever tricks that haven't made their way into LLVM yet.
#
# Configuration is set to `false` by default for the dev profile, but it can
# be set to an array of strings which are explicit arguments to pass to
# `wasm-opt`. For example `['-Os']` would optimize for size while `['-O4']`
# would execute very expensive optimizations passes
wasm-opt = ['-O']
[package.metadata.wasm-pack.profile.dev.wasm-bindgen]
# Should we enable wasm-bindgen's debug assertions in its generated JS glue?
debug-js-glue = true
# Should wasm-bindgen demangle the symbols in the "name" custom section?
demangle-name-section = true
# Should we emit the DWARF debug info custom sections?
dwarf-debug-info = false
[package.metadata.wasm-pack.profile.profiling]
wasm-opt = ['-O']
[package.metadata.wasm-pack.profile.profiling.wasm-bindgen]
debug-js-glue = false
demangle-name-section = true
dwarf-debug-info = false
# `wasm-opt` is on by default in for the release profile, but it can be
# disabled by setting it to `false`
[package.metadata.wasm-pack.profile.release]
wasm-opt = false
[package.metadata.wasm-pack.profile.release.wasm-bindgen]
debug-js-glue = false
demangle-name-section = true
dwarf-debug-info = false
通过翻阅文档,我们知道,我们需要在package.metadata.wasm-pack.profile.release
中添加wasm-opt = false
,这样就可以跳过这个步骤了。
修改后的Cargo.toml
文件如下:
1 | [package] |
如果你检查生成的 WebAssembly 文件体积,它可能有几百 kB。我们没有让 Rust 去压缩生成的代码,从而大大减少生成包的体积。这和本次教程主题无关,但如果你想了解更多,查看 Rust WebAssembly 工作组文档上关于 减少 .wasm 体积 的说明。
把我们的新包发布到 npm registry:
1 | cd pkg |
我们现在有了一个 npm 包,使用 Rust 编写,但已经被编译为 WebAssembly 了。 现在这个包已经可以被 JavaScript 使用了,而且使用它完全不需要用户安装 Rust;包中的代码是 WebAssembly 代码,而不是 Rust 源码!
让我们建立一个使用我们包的网站!人们通过各种打包工具使用 npm
包,在本教程中,我们将使用
vite
。它比其他某些打包工具要更为的便捷,但是你可以使用任何你喜欢的工具。
从这里开始,将会和MDN的教程有所不同,因为我没有使用webpack,而是使用vite,所以说这里将会给出使用vite的教程。
让我们离开pkg
目录,并创建一个新目录site
,尝试以下操作:
1 | cd ../.. |
创建一个新文件 package.json
,然后输入如下代码:
1 | { |
如果上面你并没有将自己的包发布到npm上,那么你需要手动将上一步生成的pkg
文件夹拷贝到site
文件夹下,然后在package.json
中将dependencies
中的@mynpmusername/hello-wasm
改为file:./pkg
。
这样它将会从本地的pkg
文件夹中引入你的WebAssembly模块。
如果上面你将自己的包发布到npm上了,那么请注意,你需要在依赖项部分的
@
之后填写自己的用户名。
接下来,我们需要配置 Vite 来使用 WebAssembly。创建一个新文件
vite.config.js
,并输入如下内容:
1 | import { defineConfig } from 'vite' |
这里的optimizeDeps
是为了解决一个问题,就是vite会将你的WebAssembly模块当作一个模块来处理,但是实际上它并不是一个模块,所以说我们需要将它排除在外,防止vite对它进行处理,使得模块找不到对应的文件。
vite-plugin-wasm 是一个 Vite 插件,它会帮助你加载 WebAssembly 模块。vite-plugin-top-level-await 是一个 Vite 插件,它会帮助你使用顶层 await。
接下来,我们需要一个 HTML
文件。创建一个index.html
并写入如下内容:
1 | <!doctype html> |
需要注意的是,MDN
里面使用的是<script src="./index.js"></script>
,但是实际上,vite是不支持这种方式的,你需要使用<script type="module" src="./index.js"></script>
这种方式来引入你的js文件。
这样的话,你可以在index.js
中直接使用import {greet} from '@mynpmusername/hello-wasm'
来引入你的WebAssembly模块,而不需要额外的处理。
现在我们来写index.js
文件:
1 | import * as wasm from "hello-wasm"; |
加载后,它将从该模块调用greet
函数,并传入字符串“WebAssembly”参数。注意这里看上去没有什么特别的,但是我们正在调用
Rust 代码!就 JavaScript 代码所知,这只是一个普通模块。
我们已经完成了所有的文件!让我们试一下:
1 | npm install |
这将启动一个 Web 服务器。访问 vite
给出的链接,比如,http://localhost:5178/
你应该会在屏幕上看到一个内容为 Hello, WebAssembly!
的警告框。点击按钮时也会看到这个警告框。
我们已经成功地从 JavaScript 调用了 Rust,并从 Rust 调用了 JavaScript。
本教程到此结束。希望你觉得它有用。
非常感谢来自 Rust 和 WebAssembly 社区的所有人,他们的工作使得这一切成为可能。 同样也非常感谢这位作者,他的文章非常通俗易懂,且提供了github上的代码仓库,让我们可以直接下载代码进行测试: 我使用 vue3 + WebAssembly 做了个文件校验网站,性能提升600%_vue webassembly-CSDN博客 jethroHuang/fast_hash
它的这里面还使用了worker来进一步提高性能,这里就不再赘述了,有兴趣的可以去看看。关于worker的内容,可以参考这篇文章:Web Workers API - Web APIs | MDN
之前一直苦恼于 electron 打包出来的体积太大,总是想要使其的体积更小,对于使用者更加友好。
最近发现了一个新的框架:Tauri,它是一个基于 Rust 的框架,可以将 Rust 代码编译成一个可执行文件,然后将这个可执行文件和前端代码打包成一个可执行文件。
本身我就对 Rust 比较感兴趣,所以就尝试了一下。
但是结果就是……Tauri的开发体验简直是糟糕。
一开始使用一个简单的命令就可以创建一个基础的项目:
1 | tauri create my-app |
在选择了一些配置项之后,就可以运行这个项目了:
1 | cd my-app |
这个命令会启动一个开发服务器,然后打开一个窗口,显示你的应用。
一步步走到这里,一切都顺利,但是问题是:然后呢?
下面是它的文档的目录:
1 | - 快速开始 |
在配置完前端(我使用的是vite)之后呢?让我们继续看看下面的非快速开始的内容:
1 | - 核心概念 |
进程间通信这里,它在概述里面介绍了它使用的是类似于 IPC 的方式,但是问题是具体的调用方式在哪里呢?它没有举例子,而文档直到后面的 从 Rust 调用前端 才有介绍。
而且它也没讲解入口文件是哪个?主进程和渲染进程中主进程是在哪个文件中启动的?
更为好笑的是:
1 | import {invoke} from '@tauri-apps/api/tauri' |
这个示例用的代码无法运行,因为它找不到这个模块。为什么找不到呢?因为它安装tauri的时候并不默认包含它的api,而是需要手动安装:
1 | npm install @tauri-apps/api |
欸,你认为这就结束了吗?不,它的文档也没有提到这个模块到底是哪里的,它在:
1 | import {invoke} from '@tauri-apps/api/core' |
这个模块中。而不是教程中的 @tauri-apps/api/tauri
。
初次之外,类似的事情还在文件系统上,在文档中它说:
1 | # 文件系统 |
但是在另外一处,它说:
1 | # 文件系统 |
但是实际上这种方式是无法使用的,因为它需要先安装
@tauri-apps/api/fs
,而不是
@tauri-apps/plugin-fs
。
欸,但是 2.0 版本的 fs 模块已经被默认移除了,需要使用 plugin-fs。
## 缺失的功能
我写的程序为了优化性能,使用了creatlink而非copy,但是在tauri中并没有这个功能,所以我需要自己写一个rust后端来实现这个功能并且还需要处理多平台的问题,要么就是仍然使用 nodejs 作为依赖。
但是这样的话,tauri的优势就没有了,因为我还是需要依赖 nodejs。
……
只能说未来可期,但是现在的体验真的是太差了,文档不全,不清晰,而且还有很多坑,不建议使用。
不过rust的编程的思路很有意思,虽然说编程的时候碍手碍脚的,但是因为其稳定性和性能,还是值得一试的。
#
AI绘画
## Day 2:提示词与参数优化
学习目标:掌握提示词编写技巧,调整参数提升生成质量。
- 实践步骤: 1.
提示词公式:使用“主体+细节+风格+质量”结构(如“a knight
in armor, detailed armor texture, dark fantasy style, 8k,
masterpiece”)。 2.
权重控制:用(keyword:1.5)
增强权重,[keyword]
降低权重。
3. 参数调整: -
采样方法:推荐DPM++ 2M Karras
(速度快且稳定)。 -
迭代步数:20-30步(平衡速度与质量)。 - 提示词相关性(CFG
Scale):7-12(值越高越贴近描述,但可能过锐化)。 -
检验成果:生成一张符合复杂提示词描述的图片(如“科幻城市夜景,赛博朋克风格”)。
为此我研读了这本书,元素同典:确实不完全科学的魔导书
我会在另外一篇文章里面分享自己的 结合书本中的知识以的实战经历[[元素同典:确实不完全科学的魔导书 批注]]
这里,大佬给了一个非常棒的风格模板,后面加上想要的提示词大概率能出非常好的图像效果:
1 | (masterpiece, extremely detailed 8k wallpaper,best quality),(best illumination, best shadow, extremely delicate and beautiful),dynamic angle,floating,finely detail,Depth of field (bloom),(shine),glinting stars,classic,(illustration),(painting),(sketch),1girl,solo,bare shoulders,medium breasts,areola,red eyes,beautiful detailed cold face,black hair,straight_hair,short hair,extremely delicate and beautiful girls,beautiful detailed eyes,(((rose))),cage,bandage,(red rope), |
在控制同一个seed的情况下,我们可以用 X/Y参照来生成对比图像:
这里,我用提示词为:
1 | masterpiece,1 girl,cute face,black short hair,red eyes,[SFW:(NSFW:1):0.1], |
1 | lowres,bad anatomy,bad hands,text,error,missing fingers,extra digit, |
close up、close shot、medium view、panorama 这几个镜头控制十分好用
常见的吟唱方式有三种: 1. 字节式 ## 提示词的分割
提示词是用于提示ai需要生成什么样式的图片的引导词,ai会根据你的提示词生成图片。
为什么提示词会有效我们可以从文生图的原理说起: SD等模型使用的都是让使用将一个带有若干个标签的图片,通过不断参杂噪声,让其变为一张纯噪声图作为正向过程让ai去学习,而这个参杂的过程在一定程度上是可逆的,所以说将ai通过这种方式得到的一系列参数求一个逆,我们就可以得到一个能够从一个噪声图生成为我们想要的图片的模型。
也就是说,提示词本质上就是一开始用来训练ai的图片上面带着的标签,了解训练ai的数据的来源,我们可以直到每个标签大概指的是什么意思:Danbooru: Anime Image Board
但是它们可能有的好用有的不好用,一般引用数大于2000的tag都能够出比较好的效果。
这里还有一些小伙伴们自己收集的比较好的tag资料: https://kdocs.cn/l/cre0TwbMkdx3 https://pan.baidu.com/s/11SE4uW0TiXqrHotBfT3hsQ?pwd=pdlk
然后这里是一些比较好的提示词组合,可以以此为范例: 元素法典 第二点五卷——Novel AI 元素魔法全收录 元素法典 第二卷——Novel AI 元素魔法全收录 等等
权重控制在咒语中非常重要,这关系着你想要的东西是否合乎心意的获得了AI的重视。
最基础的权重控制为控制prompt在咒语中的位置。越靠前的词汇越受到重视。
权重控制可以通过对prompt加括号进行。() 或 {} 为加强权重,[] 为减弱权重,括号可以一次扩多个词条。(1girl:1.5)括号后对添加 ":1.5"是对词条直接赋予权重,数字即为权重大小。数字越大权重越大,默认1,通常为0-2之间。
目前在webui中()为对其中内容权重乘以1.1,[]为对其中内容除以1.1,而{}在webui版本中不生效。虽然多重括号也能生效,但是这种方法低效且不优雅,例如((((girl))))进行了4次括号,但是只对girl权重增加到了1.4641。
这里强烈推荐使用(prompt:权重数)的方式来进行权重调整。
比如,你可以在提示词中加入[],然后在括号中加入权重数,这样就可以对整个括号内的词条进行权重调整。
此外,webui还支持快速调节:选中一组词,然后按方向键上下(根据编译器版本不同可能是ctrl+方向键)可以直接完成权重调整。
除了上面的方法可以调整权重之外,还可以使用·
1 | [from:to:step] |
它可以在步数进行到 某一阶段时,将prompt 从 from 变成 to。
比如我个人觉得比较好用的一个是[SFW:NSFW:0.1]
,这样可以在推理的早些阶段,生成一个 SFW
的底图,之后,在经过了整体步数的 10% 之后,再转换为 NSFW 的图像。
这样可以保证擦边球的图像不会在早期就生成,而是在后期生成,从而保证了生成的图像的质量。
上面是单个词的方法,但是实际上我们需要的画面并不能使用寥寥几个词就能够描述,想要生成出好的效果,往往需要在多个方面去对于画面进行描述,对于画面中的元素进行控制,这就需要我们将多个提示词组合起来,构成一整句“咒语”。
这里直接引用 [[元素同典:确实不完全科学的魔导书.pdf]] 里面的原文了:
咏唱大致有着三种不同形式——最常见的直接咏唱、稍不常见的短句咏唱和堪称行为艺术一般的长咏唱。
假设要生成一个有着黄色头发、蓝色眼眸、白色上衣、红色裙子、黑色裤袜的全身坐姿二次元美少女,且强调服饰颜色,那么这三种咏唱分别看上去大概是这样的:
直接咏唱(pitch 式咏唱):
masterpiece, best quality, 1 girl, (blue eyes), (yellow hair), (white clothes), (red skirt), (black leggings), sitting, full body
短句咏唱(AND 强调咏唱):
masterpiece, best quality, 1 girl, (blue eyes) AND (yellow hair), (white clothes) AND (red skirt) AND (black leggings), sitting, full body
注意短句咏唱的 AND 必须是三个大写字母,AND 两侧的小括号是不必要的(但建议加上),这是一个专用语法,不过因为效果仍未明晰所以不单独介绍。此外,该语法并不能应用于所有采样方法,例如 DDIM 就不支持 AND,会导致报错。
这里似乎有点问题,大写“AND”会导致碎片化图片,但是小写“and”反而可以正常出图,估计是版本更新的问题
长咏唱(自然语言咏唱):
masterpiece, best quality, (1 girl with blue eyes and yellow hair wearing white clothes and red skirt with black leggings), sitting, full body
学习目标:完成Stable
Diffusion本地部署,生成第一张AI图片。 - 实践步骤: 1.
下载秋葉整合包(解压密码:bilibili@秋葉aaaki
),安装.NET依赖项,双击启动器一键运行。
2.
打开WebUI界面(默认地址http://127.0.0.1:7860
),输入简单提示词(如“1
girl, masterpiece”),生成测试图。 3.
熟悉界面功能:模型切换、提示词输入区、生成参数(采样方法、迭代步数)。 -
检验成果:成功生成一张基础图片(如猫或人物)。 -
学习资料: - 秋葉整合包安装教程:CSDN博客。
- 界面功能速查表(见下文)。
我从今天开始正式立一个小的目标要开始入门学习AI绘画入门,这一篇文章主要是作为提纲挈领的作用,用于为我自己明确目标并且梳理学习的路径。
达到类似于这样的效果:
嗯,我对于背景没有太大的要求,上面的图来自于这两个账号:
(13) さがわ/sagawa (@sagawa_gawa) / X (13) lilium (@lilydisease) / X
虽然这几张图都有或多或少的问题,但是对于光影的把控已经非常到位了,对于肉感也有非常好的刻画。
我现在想要将我的目标拆分为几个小的目标,但是我对这个并不熟悉,所以我希望使用ai帮我规划一下学习路线:
1 | 你好,现在请你扮演一位对于AI绘画拥有丰富了解的学姐,现在我希望你能够帮助我入门ai绘画,我拥有 4060ti16G 以及 48G的内存,对于ai绘画的入门应该够用了。 |
DeepSeek的回答: ### AI绘画入门学习路线规划(7天实践版) 硬件说明:你的配置(RTX 4060Ti 16G显存 + 48G内存)完全满足Stable Diffusion本地部署需求,可高效运行模型和插件。
根据你的需求,目标可总结为: 1. 基础生成:能通过文本描述生成指定内容的图片。 2. 风格控制:调整画面风格(如动漫、写实、油画等)。 3. 角色控制:精准生成特定角色(自定义或已有IP)。 4. 场景与动作控制:控制构图、人物动作、场景细节。
学习核心工具:秋葉aaaki整合包(Stable Diffusion WebUI中文版)+ ControlNet插件 + LoRA模型。
[[AI绘画入门学习-第一天]] 学习目标:完成Stable
Diffusion本地部署,生成第一张AI图片。 - 实践步骤: 1.
下载秋葉整合包(解压密码:bilibili@秋葉aaaki
),安装.NET依赖项,双击启动器一键运行。
2.
打开WebUI界面(默认地址http://127.0.0.1:7860
),输入简单提示词(如“1
girl, masterpiece”),生成测试图。 3.
熟悉界面功能:模型切换、提示词输入区、生成参数(采样方法、迭代步数)。 -
检验成果:成功生成一张基础图片(如猫或人物)。 -
学习资料: - 秋葉整合包安装教程:CSDN博客。
- 界面功能速查表(见下文)。
[[AI绘画入门学习-第二天]]
学习目标:掌握提示词编写技巧,调整参数提升生成质量。 -
实践步骤: 1.
提示词公式:使用“主体+细节+风格+质量”结构(如“a knight
in armor, detailed armor texture, dark fantasy style, 8k,
masterpiece”)。 2.
权重控制:用(keyword:1.5)
增强权重,[keyword]
降低权重。
3. 参数调整: -
采样方法:推荐DPM++ 2M Karras
(速度快且稳定)。 -
迭代步数:20-30步(平衡速度与质量)。 - 提示词相关性(CFG
Scale):7-12(值越高越贴近描述,但可能过锐化)。 -
检验成果:生成一张符合复杂提示词描述的图片(如“科幻城市夜景,赛博朋克风格”)。
- 学习资料: - 提示词手册(附常用风格关键词):CSDN资源包。
学习目标:切换不同大模型(底模)和LoRA插件调整画风。
- 实践步骤: 1. 下载模型:从Civitai下载风格化大模型(如动漫风Anything V5
、写实风Realistic Vision
)。
2.
加载模型:将.safetensors
文件放入models/Stable-diffusion
文件夹,在WebUI中切换。
3.
使用LoRA:下载角色/风格LoRA模型(如Genshin Impact角色LoRA
),在提示词中添加触发词(如<lora:genshin_zhongli:0.8>
)。
-
检验成果:用同一提示词生成不同风格的图片(如“古风少女”分别用动漫和写实模型输出)。
- 学习资料: - 模型管理教程:SD
WebUI文档。
学习目标:通过ControlNet插件固定角色形象,结合LoRA定制角色。
- 实践步骤: 1.
安装ControlNet:在秋葉整合包中启用插件,下载预处理器和模型文件。
2.
线稿控制:上传角色线稿,启用ControlNet
的Canny
或Lineart
模式,生成与线稿一致的角色。
3.
训练自定义LoRA:使用Kohya脚本训练个人角色(需准备20-30张角色多角度图片)。
-
检验成果:生成与线稿或自定义LoRA匹配的角色(如“我的自设角色,蓝色长发,机械臂”)。
- 学习资料: - ControlNet教程:B站视频。
学习目标:利用ControlNet控制构图、人物姿势、场景深度。
- 实践步骤: 1.
姿势控制:使用OpenPose
预处理器,上传姿势参考图,生成相同动作的角色。
2.
场景控制:用Depth
模式输入场景深度图,控制画面层次感。
3.
分镜提示词:结合分镜描述(如“人物站在悬崖边,左手持剑,右手指向远方”)。
-
检验成果:生成指定动作和场景的图片(如“骑士骑马冲锋,背景是雪山”)。
- 学习资料: - ControlNet高级用法:ComfyUI教程。
学习目标:结合所有技能生成复杂作品,优化细节。 - 实践步骤: 1. 设计完整场景(如“赛博朋克酒吧,女黑客坐在吧台,霓虹灯闪烁”)。 2. 分阶段调整:先用ControlNet固定构图,再通过提示词细化细节(服装、光影)。 3. 使用高清修复(Hires. fix)提升分辨率(2倍放大)。 - 检验成果:输出一张高完成度的综合作品(含角色、场景、风格)。
学习目标:探索高级插件(如动态扩散、工作流优化)。 -
推荐方向: -
动态模型转换:生成连续动作帧(如转身、行走)。 -
批量生成:用XYZ脚本生成多组参数对比图。 -
效率工具:安装Tiled Diffusion
插件减少显存占用。
类型 | 资源链接 | 用途 |
---|---|---|
整合包 | 秋葉整合包下载 | 本地部署SD |
提示词 | AIGC提示词手册 | 风格与细节控制 |
模型库 | Civitai | 下载大模型与LoRA |
进阶教程 | ControlNet全解 | 精准控制画面 |
按此路线实践,一周后可熟练运用AI绘画工具完成创作需求。遇到问题可随时查阅秋葉整合包的社区讨论(B站/CSDN),或私信我进一步解答! 🎨