ControlNet 模型搭建与初体验
1.ControlNet原理介绍
ControlNet 是一个新的神经网络概念,通过额外的输入来控制预训练的大模型比如 stable diffusion。其本质就是端对端的训练,早在2017年就有类似的AI模型出现,只不过这一次因为加入了 SD 这样优质的大模型,让这种端对端的训练有更好的应用空间。它很好的解决了文生图大模型的关键问题:单纯的关键词控制方式无法满足对细节精确控制的需要。
ControlNet是一种端到端的神经网络架构,用于控制大型图像扩散模型(例如 Stable Diffusion),以学习任务特定的输入条件。ControlNet 将大型扩散模型的权重分为“可训练副本”和“锁定副本”:锁定副本保留了从数十亿图像中学到的网络能力,而可训练副本则通过对任务特定数据集的训练来学习条件控制。可训练和锁定的神经网络模块通过一种称为“零卷积”的独特卷积层连接,其中卷积权重以一种学习的方式从零逐渐增长到优化的参数。由于保留了生产就绪的权重,训练在不同规模的数据集上具有鲁棒性。由于零卷积不会给深层特征增加新的噪声,与从头开始训练新层相比,训练速度与微调扩散模型的速度相当快。
ControlNet(控制网络)通过操纵神经网络块的输入条件来进一步控制整个神经网络的整体行为。在这里,"网络块"是指作为经常使用的单元组合在一起构建神经网络的一组神经层,例如"resnet"块、"conv-bn-relu"块、多头注意力块、Transformer 块等。Θ 表示原始神经网络中的参数,c 为进行控制的输入,作者将 Θ 中的所有参数锁定,并将其复制为一个可训练的副本 Θc。复制的 Θc 使用外部条件向量 c 进行训练。在本文中,作者将原始参数和新参数称为"锁定副本"和"可训练副本"。制作这样的副本而不是直接训练原始权重的动机是为了避免在数据集较小时过拟合,并保留从数十亿张图像中学习到的大型模型的生产就绪质量。
其中 Z 表神经网络块通过一种称为"零卷积"的独特卷积层连接,即 1×1 卷积层,其权重和偏置都初始化为零。通过这种零卷积设计,可以使得 ControlNet 在训练之初完全等价于初始网络,获得一个更好的初始化。如下图是根据 Stable Diffusion 设计的一个 完整ControlNet。
2.ControlNet使用
2.1 本地运行
1.执行环境安装,假如有无法使用的用pip安装。
2.无奈服务器的Cuda驱动是10.1 无法升级,需要安装对应的torch版本。
pip install torch==1.8.1+cu101 torchvision==0.9.1+cu101 torchaudio==0.8.1 -f https://download.pytorch.org/whl/torch_stable.html
3.使用的时候遇到不支持get_autocast_gpu_dtype 错误。
AttributeError: module 'torch' has no attribute 'get_autocast_gpu_dtype'
将对应的代码注释:
ctx.gpu_autocast_kwargs = {"enabled": torch.is_autocast_enabled()}
# "dtype": torch.get_autocast_gpu_dtype(),
# "cache_enabled": torch.is_autocast_cache_enabled()}
4.不支持autocast.
AttributeError: module 'torch' has no attribute 'autocast'
修改代码为:
with torch.cuda.amp.autocast(enabled=False):
5.想要在公开网络运行:
block.launch(server_name='0.0.0.0',share=True)
之后就可以正常访问。
2.2 在AWS中的SD环境中使用
1.在 CloudFormation-堆栈-输出中(参考 文章: 基于Amaozn SageMaker Notebook快速搭建Stable Diffusion–AI作画可视化环境 4.3 第 12 步),找到 NotebookURL 链接,并打开 SageMaker Notebook Instance。
2.打开一个终端,依次点击 File->New->Terminal。
3.输入:
cd SageMaker/sd-webui
./download-controlnet-models.sh
4.等待下载完成,回到 Stable Diffusion Web UI 界面,在 ControlNet 中点击“刷新”按钮,即完成了模型下载与安装。
2.3 使用介绍:
1. 启用(Enable)
勾选此选项后,点击 “生成” 按钮时,ControlNet 才会生效。
2. 反色模式(Invert Input Color)
将图像颜色进行反转后应用。
3. RGB 转 BGR(RGB to BGR)
把颜色通道进行反转,在 NormalMap 模式可能会用到。
4. 低显存优化(Low VRAM)
低显存模式,如果你的显卡内存小于等于4GB,建议勾选此选项。
5. 无提示词的猜测模式(Guess Mode)
也就是盲盒模式,不需要任何正面与负面提示词,出图效果随机,很有可能产生意想不到的惊喜效果!
6. 预处理器(Preprocessor)
在此列表我们可选择需要的预处理器,每个 ControlNet 的预处理器都有不同的功能,后续将会详细介绍。
7. 模型(Model)
配套各预处理器需要的专属模型。该列表内的模型必须与预处理选项框内的名称选择一致,才能保证正确生成预期结果。如果预处理与模型不致其实也可以出图,但效果无法预料,且一般效果并不理想。
8. 权重(Weight)
权重,代表使用 ControlNet 生成图片时被应用的权重占比。
9. 引导介入时机(Guidance Start(T))
在理解此功能之前,我们应该先知道生成图片的 Sampling steps 采样步数功能,步数代表生成一张图片要刷新计算多少次,Guidance Start(T) 设置为 0 即代表开始时就介入,默认为 0,设置为 0.5 时即代表 ControlNet 从 50% 步数时开始介入计算。
10. 引导退出时机(Guidance End(T))
和引导介入时机相对应,如设置为1,则表示在100%计算完时才会退出介入也就是不退出,默认为 1,可调节范围 0-1,如设置为 0.8 时即代表从80% 步数时退出介入。
11. 缩放模式(Resize Mode)
用于选择调整图像大小的模式:默认使用(Scale to Fit (Inner Fit))缩放至合适即可,将会自动适配图片。
一共三个选项:Just Resize,Scale to Fit (Inner Fit),Envelope (Outer Fit)
12. 画布宽度和高度(Canvas Width 和 Canvas Height)
画布宽高设置,请注意这里的宽高,并不是指 SD 生成图片的图像宽高比。该宽高代表 ControlNet 引导时所使用的控制图像的分辨率,假如你用 SD 生成的图片是 1000x2000 分辨率,那么使用 ControlNet 引导图像时,对显存的消耗将是非常大的;我们可以将引导控制图像的分辨率设置为 500x1000 ,也就是缩放为原本图像一半的分辨率尺寸去进行引导,这有利于节省显存消耗。
13. 创建空白画布(Create Blank Canvas)
如果之前使用过 ControlNet 功能,那么将会在 ControlNet 的图像区域留有历史图片,点击该按钮可以清空之前的历史,也就是创建一张空白的画布。
14. 预览预处理结果(Preview Annotator Result)
点击该按钮可以预览生成的引导图。例如:如果使用 Canny 作为预处理器,那么点击该按钮之后,可以看到一张通过 Canny 模型提取的边缘线图片。
15. 隐藏预处理结果(Hide Annotator Result)
点击该按钮可以隐藏通过 Preview 按钮生成的预览图像窗口(不建议隐藏)
使用效果:
3.参考文献
1. 原始论文地址
4.模型下载(5G版) https:// huggingface.co/lllyasvi el/ControlNet/tree/main/models
5.模型下载(700m版) https:// huggingface.co/webui/Co ntrolNet-modules-safetensors/tree/main