2023-05-16 08:24:18
在 ControlNet 出现之前,AI 绘画更像开盲盒,在图像生成前,你永远都不知道它会是一张怎样的图。ControlNet 的出现,真正意义上让 AI 绘画上升到生产力级别。简单来说可以用 ControlNet 精准控制 AI 图像的生成效果。
ControlNet 就是在大型扩散生成模型的基础上,再加上一个结构,使得扩散生成模型能够接受一个新的 “图像输入”。并且对模型的输出起到控制作用,使其与输入图像类似。
在实际的 AI 绘图,用户要解决 2 个关键问题:
无论你使用再准确的提示词再好的微调模型也是无法实现的。而通过 ControlNet 的应用模型,可以让这 2 个问题获得解决。所以不仅是常见的人物画像,在建筑、室内、产品图、平面设计、海报等等领域都可以提高生产力甚至做出设计师难以做出的效果。
需要先安装扩展,点击「Extensions」Tab 下的「Install from URL」子 Tab,然后输入:https://github.com/Mikubill/sd-webui-controlnet,再点击「Install」,在提示安装完成后,点击「Applyand restart UI」按钮重启 UI。
接着需要下载应用模型。我使用了最新的 ControlNet-v1-1-nightly 的模型:
wget https://huggingface.co/lllyasviel/ControlNet-v1-1/resolve/main/control_v11e_sd15_ip2p.pth -P ~/workspace/stable-diffusion-webui/models/ControlNet wget https://huggingface.co/lllyasviel/ControlNet-v1-1/resolve/main/control_v11e_sd15_shuffle.pth -P ~/workspace/stable-diffusion-webui/models/ControlNet wget https://huggingface.co/lllyasviel/ControlNet-v1-1/resolve/main/control_v11e_sd15_tile.pth -P ~/workspace/stable-diffusion-webui/models/ControlNet wget https://huggingface.co/lllyasviel/ControlNet-v1-1/resolve/main/control_v11e_sd15_depth.pth -P ~/workspace/stable-diffusion-webui/models/ControlNet wget https://huggingface.co/lllyasviel/ControlNet-v1-1/resolve/main/control_v11f1e_sd15_tile.pth -P ~/workspace/stable-diffusion-webui/models/ControlNet wget https://huggingface.co/lllyasviel/ControlNet-v1-1/resolve/main/control_v11f1p_sd15_depth.pth -P ~/workspace/stable-diffusion-webui/models/ControlNet wget https://huggingface.co/lllyasviel/ControlNet-v1-1/resolve/main/control_v11p_sd15_canny.pth -P ~/workspace/stable-diffusion-webui/models/ControlNet wget https://huggingface.co/lllyasviel/ControlNet-v1-1/resolve/main/control_v11p_sd15_inpaint.pth -P ~/workspace/stable-diffusion-webui/models/ControlNet wget https://huggingface.co/lllyasviel/ControlNet-v1-1/resolve/main/control_v11p_sd15_lineart.pth -P ~/workspace/stable-diffusion-webui/models/ControlNet wget https://huggingface.co/lllyasviel/ControlNet-v1-1/resolve/main/control_v11p_sd15_mlsd.pth -P ~/workspace/stable-diffusion-webui/models/ControlNet wget https://huggingface.co/lllyasviel/ControlNet-v1-1/resolve/main/control_v11p_sd15_normalbae.pth -P ~/workspace/stable-diffusion-webui/models/ControlNet wget https://huggingface.co/lllyasviel/ControlNet-v1-1/resolve/main/control_v11p_sd15_openpose.pth -P ~/workspace/stable-diffusion-webui/models/ControlNet wget https://huggingface.co/lllyasviel/ControlNet-v1-1/resolve/main/control_v11p_sd15_scribble.pth -P ~/workspace/stable-diffusion-webui/models/ControlNet wget https://huggingface.co/lllyasviel/ControlNet-v1-1/resolve/main/control_v11p_sd15_seg.pth -P ~/workspace/stable-diffusion-webui/models/ControlNet wget https://huggingface.co/lllyasviel/ControlNet-v1-1/blob/main/control_v11p_sd15_softedge.pth -P ~/workspace/stable-diffusion-webui/models/ControlNet wget https://huggingface.co/lllyasviel/ControlNet-v1-1/blob/main/control_v11p_sd15s2_lineart_anime.pth -P ~/workspace/stable-diffusion-webui/models/ControlNet wget https://huggingface.co/lllyasviel/ControlNet-v1-1/resolve/main/control_v11p_sd15_softedge.pth -P ~/workspace/stable-diffusion-webui/models/ControlNet wget https://huggingface.co/lllyasviel/ControlNet-v1-1/resolve/main/control_v11p_sd15s2_lineart_anime.pth -P ~/workspace/stable-diffusion-webui/models/ControlNet |
这些模型文件都在 1.3G 左右,文件比较大,可以按需下载。
我在安装这个插件时,发现报错了:
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun |
需要安装 Mac 开发工具再重新安装:
➜ xcode-select --install
➜ cd ~/workspace/stable-diffusion-webui
➜ venv/bin/pip install svglib fvcore
|
我们通过一个李多惠的照片在 txt2img 模式下生成图片作为例子:
这个招聘的动作其实是复杂的,用提示词不可能表达出来,现在有了 ControlNet 就非常容易还原,下面是用 canny、openpose 这个两个不同的应用模型,加上对应大模型和提示词最终生成的图:
Counterfeit:
ReV Animated:
可以看到每个图都固定对了动作,衣服结构、头发等细节也都非常还原。
另外这次我们只讨论动作是不是正确,手部问题一直是 AI 绘画的难点 (SD 很难理解人应该有 5 个手指🤦🏻♀️),负面提示词也很难解决,我之后会专门写一篇文章介绍怎么修复。
接着了解一下各个参数及其意义:
ControlNet 包含多个应用模型,这小节介绍几个主要的模型。这节的内容大部分来自于延伸阅读链接 5,我觉得比我之前的写的好,所以直接替换了。
通过姿势识别,达到精准控制人体动作。除了生成单人的姿势,它还可以生成多人的姿势,此外还有手部骨骼模型,解决手部绘图不精准问题。以下图为例:左侧为参考图像,经 OpenPose 精准识别后,得出中间的骨骼姿势,再用文生图功能,描述主体内容、场景细节和画风后,就能得到一张同样姿势,但风格完全不同的图。
Canny 模型可以根据边缘检测,从原始图片中提取线稿,再根据提示词,来生成同样构图的画面,也可以用来给线稿上色。
跟 Canny 类似,但自由发挥程度更高。HED 边界保留了输入图像中的细节,绘制的人物明暗对比明显,轮廓感更强,适合在保持原来构图的基础上对画面风格进行改变时使用。
涂鸦成图,比 HED 和 Canny 的自由发挥程度更高,也可以用于对手绘线稿进行着色处理。
2023-05-16 08:23:23
现在终于可以介绍 Stable Diffusion 除了文生图 (txt2img) 之外最重要的功能:图生图 (img2img)。顾名思义,除了根据正向和反向提示词之外,还需要基于一张图片生成图。这个模式下功能很多我们挨个说
图生图模式下的默认功能,我们先看一下主界面:
上面还是正面提示词和负面提示词,接着是一个上传图片的区域,写着「Drop Image Here - or - Click to Upload」。然后就是相关参数,大部分在文生图里面已经见过,只有Resize mode
、Denoising strength
是新增的,我们挨个介绍:
先具体说说Resize mode
(当然上传的图片最好与生图设置的一致):
这个模式下最主要的就是调Denoising strength
参数。我们用下面这张从网上找的新垣结衣的照片来体验:
首先注意,我选择这个图是有 2 个原因的:
我希望通过 SD 把这个真人照片做出动漫的效果,咱们先来个较大的Denoising strength
的值,为了方便对比我用了固定的 Seed:
我直接把生成参数列出来:
a woman with a short hair and a white shirt is posing for a picture with her hand on her chin, a photorealistic painting, Ayami Kojima, precisionism, perfect face
Negative prompt: dongwm-nt,bad finger, bad body
Steps: 20, Sampler: DPM++ 2M Karras, CFG scale: 8, Seed: 2345567052, Size: 512x512, Model hash: cbfba64e66, Model: CounterfeitV30_v30, Denoising strength: 0.65, Clip skip: 2
这里有一点需要特别的提一下,正面提示词不是我写的。在图生图模式里,生成按钮左边有 2 个选项,分别是「Interrogate CLIP」和「Interrogate DeepBooru」。在上传图片后,可以通过「Interrogate CLIP」反推出提示词,我这个就是这么生成的。另外也说一下「Interrogate DeepBooru」,这说的是一个开源的女孩图片特征提取器,上传图片可以获得图片的标签,我已经把链接都放在了延伸阅读里面:
PS: 如果你选择DeepBooru
反推,不能直接使用那些标签,你需要从中筛选需要的、合理的标签,否则结果会完全偏离。
好的,说回来。之前已经说过,Denoising strength
的值越大越和原图不符,所以如果你希望「微调」,这个值不应该大于 0.4,现在我们先取了一个更大的值,你可以看到生成图的人物手部的结果是有问题的。而且注意,负面提示词dongwm-nt
本身是包含bad finger,bad body
这些的。
是的,这是我的体验。这个模式下如果你想要生成你想要的效果,对于大模型、微调模型、提示词、参数等都有要求,在前期,你很可能生成奇怪的图,你需要不断尝试总结经验。
我们使用 x/y/z 脚本试试不同的重绘幅度值看看生成的效果:
可以看到随着 Denoising strength 变大,越来越不像原图了。
同时,我们还可以重叠各种微调模型,下面是使用了 VAE、Lora 和 HyperNetwork 后的效果:
这就是微调模型的作用,不过注意,微调后手部后两张还是会有问题。
PS,这个例子用的主模型是:https://civitai.com/models/4468/counterfeit-v30
第二个 Tab 是 Sketch,他适合有美术基础的用户,可以给一张现有的图加东西,或者画出你想要的东西,然后再输入提示词完善,我这个没有画画细胞的人基本不用,在这里也举 2 个例子 (我也就这个水平啦)。
因为我们一会要用笔刷编辑图片,我需要用到颜色,所以加启动参数,重启 webui:
./webui.sh --disable-safe-unpickle --gradio-img2img-tool color-sketch
Ok, 先尝试基于现有图做修改的,我用了下面这张图:
上传后就进入了编辑模式,然后我用笔刷选了个粉色的把头发涂变色 (当然提示词中并没有提到粉色头发):
可以看到Denoising strength
到了 0.7 才看起来正常,前面的那个「涂」的效果很明显。所以如果你使用和原图差别很大的颜色涂,那么需要更大的重绘幅度值,但是相对的,生成图和原图差别很大。如果选择对比色较少的例如黑色,那么重绘幅度 0.4 可能就够了。
接着我们试试完全从零画一幅画 (叫「涂鸦」更合适),为了展示 SD 的厉害之处,我特意选择了一个「复杂」的构图,在本灵魂画手非常努力作画后,看一下生成图的效果这样的:
注意哈,因为这个模式需要上传图,所以我这里只是截了个终端的黑色区域作为背景图。我知道大家看不懂我的 Sketch🤦🏻 ♀️,解释一下,这幅画我希望展示蓝天白云,下面是草地和几棵树 (提示词也非常直白),草地中间还有一点小溪(实在不知道溪水用什么颜色就直接换个绿区别一下)中间黑色的是背景我没涂东西,主要想看看 SD 会怎么理解。
这个效果我还是很满意的,可以说 0.65 的图已经完全达到我的预想了。
PS: 这种绘画的方法需要更大的Denoising strength
值,否则用户就得具有极强的画画天赋啦
用户指定在图像中特定区域进行修改,而保证其他区域不变。这个我认为图生图模式下最又实用价值的模式,类似换脸、换衣服、换背景等等需要都可以通过它来实现。在上面的 Sketch 里面的例子一,我曾经想给新垣结衣换头发颜色,但是需要Denoising strength
值比较大才会看起来正常,但是通过也和原图差别非常大了。而局部绘制可以平缓的给新垣结衣换头发颜色。来试试:
我涂黑了头发,当然差不多就可以,SD 会清楚你想把头发改颜色,另外要在提示词加上pink hair
让 SD 朝着粉色头发来。可以看到随着Denoising strength
增大,头发越来越粉。
接着看一下参数:
![](https://user...
2023-05-16 08:21:57
这节我们专门介绍 Stable Diffusion 里面各个微调模型。
如果你点开 C 站的过滤器,你会发现模型的类型很多:
除了类型为 Checkpoint 的主模型,以外还有非常多的模型,有些你可能听过有些也是第一次看到,当然,未来还会出现更多类型的这种微调模型。根据我的学习,先解释下为什么会有这么多类型的模型。
这么多模型是模型发展历史的产物。在一开始,Stable Diffusion 是从无到有训练大模型,成本很高。因为训练通用大模型非常烧钱,之前我看其他文章,GPT-3 训练一次的成本约为 140 万美元,对于一些更大的 LLM(大型语言模型),训练成本介于 200 万美元至 1200 万美元之间。除了花钱,也非常耗时间,需要一个专门团队维护。
虽然这种基础模型并没不好用,但是他们打下了很好地基础,之后 Stable Diffusion 所有的模型都是在这种模型基础上微调出来的。不过随着 Stable Diffusion 越来越流行,大模型生成的图越来越不满意不同用户的需求,所以就开始诞生各种调整技术的出现。
一开始是对大模型的参数的训练,这就诞生了在 C 站看到的各个 Checkpoint 类型的模型,这种 Checkpoint 主模型需要的 GPU、时间、人员相对于大模型来说已经非常经济了,但是,Checkpoint 只满足一(多)个类用户的需求,但是细分下去还是细节和准确度不够,也不够灵活,势必出现非常垂直的解决方案。
接着出现了 Embedding 模型,由于它只训练负责的文本理解的模块,体积很小,训练也没什么门槛,效果却不错,逐渐被用户接受。然后相继出现了兼顾效果、文件体积、训练时间、训练难度等方面的 Lora、Hypernetwork。就是这样新模型不断涌现,最近几个月最热门的是 Lora,而最近一个月 Lycoris 效果也非常好。
Textual Inversion 之前已经专门写过一篇,而 Controlnet 之后会专门写,所以这篇仅介绍美学梯度、Lora、Hypernetworks、LyCORIS 这几个模型。
它的思路是在通过一张或者几张参考图生成一个美学模型,最终对提示词进行调整和加权。
原项目是:https://github.com/vicgalle/stable-diffusion-aesthetic-gradients,其中 aesthetic_embeddings 目录下有一些准备好的 Embedding。
如果你想要使用它,需要使用https://github.com/AUTOMATIC1111/stable-diffusion-webui-aesthetic-gradients这个扩展,这样就可以在「Aesthetic imgs embedding」里面选择对应的 Embedding。
现在它已经是落后的模型方案了,效果相对于其他方案来说比较差,且大模型可能以及集成它的算法,现在已经没什么人用了。
LoRA(全称 Low-Rank Adaptation of large language models)直译为大型语言模型的低阶自适应,通过矩阵分解的方式,微调少量参数,并加总在整体参数上,所以它现在主要用来控制很多特定场景的内容生成。
当然我们不需要理解它的算法,你可以简单的认为它是特定概念 (例如画风、动作、特定对象、角色等特征) 图片的训练集即可,他会引导 SD 生成符合训练结果的图片,而不会让 SD 自由发挥。它的模型大小普遍在几十到上百 M,它比较热门的主要原因我觉得是训练难度低且效果非常好。
通过例子看效果,还是用blindbox(大概是盲盒)
: https://civitai.com/models/25995/blindbox。对比下不用 LoRA 和用 LoRA 的区别:
Hypernetwork 是 NovelAI 软件开发员 Kurumuz 在 2021 年创造的一个单独的神经网络模型,它和 LoRA 很类似,它是让梯度作用于模型的扩散 (Diffusion) 过程。扩散过程中的每一步都通过一个额外的小网络来调整去噪过程的结果。这个模型主要用于画风。
通过例子看效果,用InCase style
: https://civitai.com/models/5124/incase-style-hypernetwork。对于下不用Hypernetwork和用Hypernetwork的区别:
但是和 Textual Inversion 一样,由于其效果和训练难度的原因(需要设置网络结构、训练参数等),目前并没有成为主流选择。
LyCORIS (Lora beYond Conventional methods) 是最近开始流行的一种新的模型,如其名字是一种超越传统方法的 Lora,但是要比 LoRA 能够微调的层级多,它的前身是 LoCon (LoRA for convolution layer)。
LoCon 和 LoHA (LoRA with Hadamard Product representation) 都是 LyCORIS 的模型算法,如果 C 站模型下载页面如果明确说是 LoCon 那就是 LoHA
现在 stable-diffusion-webui 还没有自带它,所以需要先安装扩展:https://github.com/KohakuBlueleaf/a1111-sd-webui-lycoris。 首先点「Extensions」,再点「Install from URL」把地址输入后点「Install」等待提示完成。
注意和其他扩展不同,安装不能点击「Apply and restart UI」不能...
2023-05-03 09:46:04
这小节我们开始学习 Stable Diffusion 里面的 VAE,它的全称是变分自动编码器 (Variational Auto-Encoder),是机器学习中的一种人工神经网络结构。当然我们都不必了解的它的原理,只需要理解它是在 SD 模型的基础做微调的,类似于我们熟悉的滤镜,让生成的图片调整饱和度。
stable-diffusion-webui 默认页面并没有显示 VAE 设置部分,所以需要先设置一下。首先点击「Settings」,然后点左侧菜单的「User interface」这个 Tab,拉到下面有个选项叫做Quicksettings list
,在输入框里面添加,sd_vae,CLIP_stop_at_last_layers
:
最后点击上面的「Apply settings」,在点「Reload UI」就会重新刷新页面,即可看到头部的 VAE 区域:
另外我也顺手打开了Clip skip
,在 C 站的图片参数中都有Clip skip
选项,默认是 1,需要改成常用的 2,可以简单的理解这个值越高,AI 就会省略越多的分类细项。
目前我们还没有任何的 VAE 模型,需要下载再使用。VAE 主要是从 Huggingface 下载,而 C 站 VAE 比较少,并没有一个专门的过滤分类,只能通过搜索框输入 vae 过滤:
另外一个方式是看主模型下的提示,很多知名主模型里面会有 VAE 相关的内容,例如有打包 VAE 的模型 (自带的就不需要额外加了),或者在描述中建议你使用什么 VAE。
举个例子: RealDosMix 的描述中提到:
https://huggingface.co/stabilityai/sd-vae-ft-mse-original/blob/main/vae-ft-mse-840000-ema-pruned.ckpt https://huggingface.co/AIARTCHAN/aichan_blend/tree/main/vae Apply VAE. You will get better color results.
所以我们把这些 VAE 模型下载并把它放入到models/VAE
目录下:
wget https://huggingface.co/stabilityai/sd-vae-ft-mse-original/resolve/main/vae-ft-mse-840000-ema-pruned.ckpt -O ~/workspace/stable-diffusion-webui/models/VAE/vae-ft-mse-840000-ema-pruned.ckpt
wget https://huggingface.co/AIARTCHAN/aichan_blend/resolve/main/vae/Anything-V3.0.vae.safetensors -O ~/workspace/stable-diffusion-webui/models/VAE/Anything-V3.0.vae.safetensors
wget "https://huggingface.co/AIARTCHAN/aichan_blend/resolve/main/vae/Berry's%20Mix.vae.safetensors" -O ~/workspace/stable-diffusion-webui/models/VAE/BerrysMix.vae.safetensors
|
下载好,然后点击 VAE 设置项右边的刷新按钮就可以看到这些模型了: ...
2023-05-01 22:49:35
这节主要介绍 stable-diffusion-webui 提供的脚本 (script) 功能。脚本和扩展一样也被独立出来,脚本主要是涉及生成图片的逻辑上,不涉及生成算法,类似于 Python 语言的装饰器的用途,可以在生成图片前按照规则调整提示词、参数值等内容,对于执行的每个步骤插入更多的操作。
按我的理解,扩展是为了扩充 stable-diffusion-webui 的 UI 界面,所以会涉及前端的静态文件 (如 javascript、CSS 等),所以它会在 Web UI 页面上新增 Tab。
而脚本如其名字,是实现某个功能的 Python 脚本,突出轻便简单,写代码时需要继承scripts.Script
这个基类,按照对应的方法编写对应逻辑。
项目的 wiki 有专门的页面:https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Custom-Scripts
这里面列出来当前全部的扩展,但是我还没有用到。目前只用到了官方项目中自带的一些:
ls ~/workspace/stable-diffusion-webui/scripts poor_mans_outpainting.py prompts_from_file.py prompt_matrix.py custom_code.py postprocessing_codeformer.py sd_upscale.py img2imgalt.py postprocessing_gfpgan.py xyz_grid.py loopback.py postprocessing_upscale.py outpainting_mk_2.py |
这些脚本有的可以在txt2img
和img2img
模式下都可以使用,有的只能用于img2img
模式,请注意。
接下来我重点介绍几个常用的脚本,其他的欢迎大家补充用途和用法
如其名字,按照不同的提示词生成图片矩阵。我们过去写提示词,就是一些标签然后逗号隔开。但是如果你想要了解或者不确定几个提示词的组合效果,那么可能你得多次生成,效率低也不方便。
而启用这个脚本后,可以使用|
语法分割词,这样会组成多个提示词组合让你一次性的看到效果:
可以看到正面提示词最后 2 个,用的是headphones|,<lora:blindbox_v1_mix:1>| <lora:iu_V35:1>
,这样就可以生成一个矩阵图完整的看到这两种 lora 模型以及是否戴耳机的效果:
图里面分别是戴耳机用blindbox
、戴耳机用iu
、不戴耳机用blindbox
、不戴耳机用iu
。Btw,可以看到换个 Lora 会让效果差别极大~
无论是初学者还是有一定经验使用 SD 的用户很多时候也不能确定各个参数到底取那个值是最符合需求的,按过去的模式只能是修改参数,然后生成图保存下来,在修改参数然后生成图。不断地循环,最终尝试出最佳的值。但是这个过程是非常漫长繁琐的,而这个X/Y/Z plot
脚本可以快速的放我们了解这些功能参数的意义和效果。接下来我们通过调整各个参数生成一个矩阵图,这样非常方便对比出参数的效果。
首先看页面的选择 (提示词等还是用了之前生产的 一张图 ,额外加了个负面次nsfw
,也就是not safe from work
,除此之外我指定了 seed 方便对比):
这个例子里 x/y/z 三个维度我都选择了,分别是:
5-15 (+3)
表示从 5-12 范围内,按照 + 3 的方式递增,也就是 5,8,11,14
这 4 个值。20-35 [3]
是另外一种表达方式,是从 20-35 范围内,找 3 个值,也就是 20,27,35
这 3 个值。注意,你选择的范围越大就越耗时(这是相乘的关系),例如采样器本来有二十多种,我只选择了 3 种。可以通过这样的方式小范围的了解不同参数的值的效果,我这里是一个比较极端的例子 (完成生成大概花了 1 个小时),如果经验多了会慢慢的知道不同参数什么值会更合理。
它的结果的图很大,我截个整体的图,在截取 step 为 27 的子图:
另外不一定需要三个轴都选择,可以只选 2 个甚至 1 个指标,然后生成参数值变化时对图的影响,但是要注意需要固定 seed。
目前安装脚本也有三种方法,没有推荐偏向,按个人习惯即可。
第一种是直接把项目中的脚本拷贝到scripts
目录下,例如https://github.com/memes-forever/Stable-diffusion-webui-video
可以这样:
```bash wget https://raw.githubusercontent.com/memes-forever/Stable-diffusion-webui-video/main/videos.py -O ~/workspace/stable-diffusion-webui/scripts/vid...
2023-04-26 21:47:36
这节主要介绍 stable-diffusion-webui 提供的扩展 (extension) 功能。stable-diffusion-webui 为了只保证核心功能并便于管理,将非核心功能解耦并转为扩展和脚本形式提供,这在很多知名项目都有相关实践。这节先介绍扩展。
项目的 wiki 有专门的页面:https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Extensions
这里面列出来当前全部的扩展,比如常用的:
目前安装扩展有三种方法,没有推荐偏向,按个人习惯即可。
如官方文档说明,直接克隆代码到 extensions 目录即可
git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui-aesthetic-gradients extensions/aesthetic-gradients |
点最后一个 Tab「Extensions」,再点「Install from URL」,和上面的方法差不多,UI 稍微封装了一下:
然后点「Installed」的「Apply and restart UI」重...