来源:DeepHub IMBA
本文约1500字,建议阅读6分钟本文将要介绍整合HuggingFace的diffusers 包和ControlNet调节生成文本到图像,可以更好地控制文本到图像的生成。

ControlNet是一种通过添加额外条件来控制扩散模型的神经网络结构。它提供了一种增强稳定扩散的方法,在文本到图像生成过程中使用条件输入,如涂鸦、边缘映射、分割映射、pose关键点等。可以让生成的图像将更接近输入图像,这比传统的图像到图像生成方法有了很大的改进。

ControlNet 模型可以在使用小数据集进行训练。然后整合任何预训练的稳定扩散模型来增强模型,来达到微调的目的。

  • ControNet 的初始版本带有以下预训练权重。‍‍

  • Canny edge — 黑色背景上带有白色边缘的单色图像。

  • Depth/Shallow areas — 灰度图像,黑色代表深区域,白色代表浅区域。

  • Normal map — 法线贴图图像。

  • Semantic segmentation map——ADE20K 的分割图像。

  • HED edge  — 黑色背景上带有白色软边缘的单色图像。

  • Scribbles — 黑色背景上带有白色轮廓的手绘单色涂鸦图像。

  • OpenPose (姿势关键点)— OpenPose 骨骼图像。

  • M-LSD  — 仅由黑色背景上的白色直线组成的单色图像。

下面我们开始进行整合:

设置

建议在安装包之前创建一个新的虚拟环境。

diffusers

激活虚拟环境,执行以下命令:

pip install diffusers

ControlNet要求diffusers>=0.14.0。

accelerate

pip install accelerate

本教程包含一些依赖于accelerate>=0.17.0,需要使用下面命令安装最新版本:

pip install git+https://github.com/huggingface/accelerate

opencv-python

为了简单起见,我们使用canny边缘处理器,所以它需要opencv-python包。

Opencv-python有4个不同的包。官方文档推荐使用opencv-contrib-python包,但也可以使用以下任何包进行:

  • opencv-python主包;

  • opencv-contrib-python -完整包(附带contrib/额外模块);

  • opencv-python-headless -没有GUI的主包;

  • opencv-contrib-python-headless -没有GUI的完整包。

所以我们这里使用完整包:

pip install opencv-contrib-python

controlnet-aux

OpenPose处理器需要controlnet-aux包。执行如下命令安装:

pip install controlnet-aux

xformers(可选)

xformers包可以提高了推理速度。最新版本为PyTorch 1.13.1提供了pip wheels支持。

pip install -U xformers

conda可以安装支持torch1.12.1或torch1.13.1。

conda install xformers

好了,这里的环境就设置完毕了。

canny edge图像生成

下面就是利用canny edge ControlNet进行图像生成。它需要一个精细的边缘图像作为输入。

创建一个名为canny_inference.py的新文件,并添加以下导入语句:

import cv2import numpy as npfrom PIL import Image

然后,继续添加以下代码片段,从现有图像创建一个canny edge图像:

import cv2import numpy as npfrom PIL import Imageimage = Image.open('input.png')image = np.array(image)low_threshold = 100high_threshold = 200image = cv2.Canny(image, low_threshold, high_threshold)image = image[:, :, None]image = np.concatenate([image, image, image], axis=2)canny_image = Image.fromarray(image)canny_image.save('canny.png')

保存文件后执行如下命令将图像转换为canny edge图像。

python canny_inference.py

看看下面的例子:‍

下一步是使用刚才生成的canny图像作为条件输入执行推理。

import cv2import torchimport numpy as npfrom PIL import Imagefrom diffusers import StableDiffusionControlNetPipeline, ControlNetModel, DPMSolverMultistepScheduler

初始化ControlNet和Stable Diffusion管道:

canny_image = Image.fromarray(image)# canny_image.save('canny.png')# for deterministic generationgenerator = torch.Generator(device='cuda').manual_seed(12345)controlnet = ControlNetModel.from_pretrained("lllyasviel/sd-controlnet-canny",torch_dtype=torch.float16)pipe = StableDiffusionControlNetPipeline.from_pretrained("runwayml/stable-diffusion-v1-5",controlnet=controlnet,torch_dtype=torch.float16)# change the schedulerpipe.scheduler = DPMSolverMultistepScheduler.from_config(pipe.scheduler.config)# enable xformers (optional), requires xformers installationpipe.enable_xformers_memory_efficient_attention()# cpu offload for memory saving, requires accelerate>=0.17.0pipe.enable_model_cpu_offload()

运行推理并保存生成的图像:‍‍

# cpu offload for memory saving, requires accelerate>=0.17.0pipe.enable_model_cpu_offload()image = pipe("a beautiful lady, celebrity, red dress, dslr, colour photo, realistic, high quality",negative_prompt="cropped, out of frame, worst quality, low quality, jpeg artifacts, ugly, blurry, bad anatomy, bad proportions",num_inference_steps=20,generator=generator,image=canny_image,controlnet_conditioning_scale=0.5).images[0]image.save('output.png')

StableDiffusionControlNetPipeline接受以下参数:

controlnet_conditioning_scale -在将controlnet的输出添加到原始unet的剩余部分之前,将它们乘以controlnet_conditioning_scale。默认为1.0,接受0.0-1.0之间的任何值。

运行脚本,可以得到类似下面输出:

让我们用不同的输入图像和设置重新运行脚本:

image = pipe("a beautiful lady wearing blue yoga pants working out on beach, realistic, high quality",negative_prompt="cropped, out of frame, worst quality, low quality, jpeg artifacts, ugly, blurry, bad anatomy, bad proportions",num_inference_steps=20,generator=generator,image=canny_image,controlnet_conditioning_scale=1.0).images[0]image.save('tmp/output.png')

结果如下:


OpenPose

下面可以尝试使用OpenPose图像作为条件输入:

controlnet-aux 模块支持将图像转换为 OpenPose 骨骼图像。我们创建一个名为 pose_inference.py 的新 Python 文件并添加以下导入:

import torchfrom PIL import Imagefrom controlnet_aux import OpenposeDetectorfrom diffusers import StableDiffusionControlNetPipeline, ControlNetModel, DPMSolverMultistepScheduler

继续添加以下代码:

image = Image.open('input.png')openpose = OpenposeDetector.from_pretrained('lllyasviel/ControlNet')pose_image = openpose(image)pose_image.save('pose.png')

执行以下图像转换为OpenPose图像:‍

python pose_inference.py

结果如下:

下面我们开始根据OpenPose生成图像:

# for deterministic generationgenerator = torch.Generator(device='cuda').manual_seed(12345)controlnet = ControlNetModel.from_pretrained("lllyasviel/sd-controlnet-openpose",torch_dtype=torch.float16)pipe = StableDiffusionControlNetPipeline.from_pretrained("runwayml/stable-diffusion-v1-5",controlnet=controlnet,torch_dtype=torch.float16)# change the schedulerpipe.scheduler = DPMSolverMultistepScheduler.from_config(pipe.scheduler.config)# enable xformers (optional), requires xformers installationpipe.enable_xformers_memory_efficient_attention()# cpu offload for memory saving, requires accelerate>=0.17.0pipe.enable_model_cpu_offload()# cpu offload for memory saving, requires accelerate>=0.17.0pipe.enable_model_cpu_offload()image = pipe("a beautiful hollywood actress wearing black dress attending award winning event, red carpet stairs at background",negative_prompt="cropped, out of frame, worst quality, low quality, jpeg artifacts, ugly, blurry, bad anatomy, bad proportions",num_inference_steps=20,generator=generator,image=pose_image,controlnet_conditioning_scale=1.0).images[0]image.save('output.png')

结果如下:

总结

可以看到ControlNet是一个非常强大的神经网络结构,通过添加额外的条件来控制扩散模型。目前还不支持Multi-ControlNet,开源社区有消息说正在积极开发中。这个新功能提供了可以使用多个控制网络,并将他们的输出一起用于图像生成,允许更好地控制整个图像。

作者:Ng Wai Foong

编辑:黄继彦

校对:林亦霖

使用ControlNet 控制 Stable Diffusion相关推荐

  1. 在GPU云服务器中部署Stable Diffusion web UI

    在GPU云服务器中部署Stable Diffusion web UI 1. 前言 2. 关于云服务器的选择 3. 关于机器的选择 4. 部署Stable Diffusion Python和CUDA 检 ...

  2. AI生成二维码Stable diffusion生成可识别二维码【附完整教程】【附完整案例】

    前言 最近的炫酷QR比较火,所以今天给大家分享一下如何实现.首先我们知道QR二维码已经改变了信息的共享和获取方式.但是,QR码的视觉外观可能并不总是符合设计或艺术品的美学要求.为了解决这个问题,Con ...

  3. 【Stable Diffusion】ControlNet基本教程(三)

    接上篇[Stable Diffusion]ControlNet基本教程(二),本篇再介绍两个ControlNet常见的基本用法,更多用法欢迎关注博主,博主还会更新更多有趣的内容. 3.3更换物体皮肤 ...

  4. Stable Diffusion 准确绘制人物动作及手脚细节(需ControlNet扩展)

    目前AI绘图还是比较像开盲盒,虽然能根据语义提供惊艳的图片,但是与设计师所构思的目标还是有一定距离. 那像我们这种没有绘画功底的程序员想要制作出心中的人物(尤其手脚)姿态,该怎样减少随机开盒的次数呢? ...

  5. AI绘图实战(十):制作线稿矢量图之包头巾的女人,画矢量图/生成矢量图/导出矢量图/直出svg/vector studio插件使用 | Stable Diffusion成为设计师生产力工具

    S:AI能取代设计师么? I :至少在设计行业,目前AI扮演的主要角色还是超级工具,要顶替?除非甲方对设计效果无所畏惧~~ 预先学习: 安装及其问题解决参考:<Windows安装Stable D ...

  6. Stable Diffusion使用入门教程

    本文参考bilibili的链接:B站第一套系统的AI绘画课!零基础学会Stable Diffusion,这绝对是你看过的最容易上手的AI绘画教程 | SD WebUI 保姆级攻略_哔哩哔哩_bilib ...

  7. AIGC - Stable Diffusion 学习踩坑实录总结

    学习路径 淘宝拼多多找教程就没必要了,我踩过坑,还跟店主纠缠过,付了钱,不过都退了,淘宝平台介入,啥都能解决,现在卖得都是搬运的 B 站里面的大佬视频,我目前正在不断关注 B 站大佬的各种课程,探索更 ...

  8. 【stable diffusion 小白最全详细使用教程+大模型资源】

    文章目录 一.前言 二.安装 1.解压后点击启动器运行依赖,然后点击A启动器 2.更新本体和扩展 3.把controlnet1.1放入stable diffusion 中 三.使用界面参数 1.提示词 ...

  9. Stable Diffusion 提示词词缀使用指南(Prompt)

    基本知识: 安装webui<Windows安装Stable Diffusion WebUI及问题解决记录>. 运行使用时问题<Windows使用Stable Diffusion时遇到 ...

最新文章

  1. Java for LeetCode 067 Add Binary
  2. 宏的使用 extern
  3. python集合与字典区别_Python中的字典与集合
  4. linux 删除带a的文件格式,linux基础命令练习题
  5. jupyter notebook
  6. 学linux需要关闭防火墙,一起学习linux 关闭防火墙命令
  7. mysql志新计划,在使用Perl DBI迭代结果集时更新MySQL表是否安全?
  8. 【ElasticSearch】Es 源码之 UsageService 源码解读
  9. 客户端Blazor中的应用程序设置
  10. 谷歌技术帮助美军方无人机识别更精准
  11. 已收藏!java面试知识点整理
  12. virtualmin修改php.ini,virtualmin安装和配置使用
  13. IDC:阿里云安全能力和IaaS市场份额双项领先
  14. 使用Java实现邮件的发送
  15. 电子商务概论【0351】
  16. 六爻预测,前沿科学?伪科学?
  17. B站网页端下载视频,直接浏览器下载或者Java实现下载
  18. dnf 台服服务器pvf修改器,求教怎么用pvf修改器自制装备
  19. [4G5G专题-78]:流程 - 4G LTE 核心网的Attach流程
  20. ASURO机器人电机干扰造成MCU误报电量低(LVLV)问题

热门文章

  1. linux查看权限命令
  2. slam过去与未来1_what_salm
  3. 一款告诉你历史价格的插件,双11购物神器!
  4. 还没用过这12款建筑设计软件?你OUT了
  5. 【转载】Android开发规范
  6. UE4学习之路【三】制作一个简易门(下)
  7. Web App开发技巧
  8. 用python写英雄联盟的源代码
  9. 上海交通卡因可疑记录无法充值和退钱
  10. 墨者学院-安卓手机文件分析取证(陌陌ID号)