音视频开发之旅(69)-SD图生图

目录

1. 效果展示

2. ControlNet介绍

3. 图生图流程浅析

4. SDWebui图生图代码流程

5. 参考资料

一、效果展示

图生图的应用场景非常多,比较典型的应用场景有风格转化(真人与二次元)、线稿上色、换装和对图片进行扩图等,下面我们看下几个场景的效果

原图是用上一篇文生图文章中生成的图片

1.1 应用场景1:修改背景

图片

highres,beach seaside,

Controlnet  canny +depth

1.2 应用场景2:风格变化 -- 写实转卡通

图片

highres,toon (style),

Anything模型

Controlnet  canny +depth

1.3 应用场景3:线稿上色

图片

1oldman,highres,Dark eyes,yellow skin,Chinese,

controlnet  canny

需要注意重回尺寸以及Controlnet的Preprocess Reslution要和原图一致

图片

1.4 应用场景4:人物姿态一致

图片

A  astronaut wearing a spacesuit in space,

Controlnet  openpose

图片

除此之外,还有很多其他的应用场景可以值得我们探索尝试,比如艺术二维码、创意字等

二、ControlNet介绍

2.1 工作原理

图片

图片来自:StableDiffusion-ControlNet工作原理[译]

SD UNet 中的所有参数被冻结,并克隆一份(trainable copy)到 ControlNet. 这些 trainable copy 通过一个外部条件向量(external condition vector)进行训练.

下图从整体上说明了 ControlNet 和 Stable Diffusion 如何在推理过程(采样)中协同工作

图片

2.2 控制类型

为了保证生成图片和原图的画面相关性、一致性,ControlNet是很有必要的,它可以精细的控制图片的主体、背景和风格等,ContNet有多达十几种控制类型

图片

每种控制类型,有个不同的预处理器和模型,另外ControlNet还可以多个叠加组合使用,组合方式可以达到上百种

图片

图片来自:从零开始学AI绘画,万字Stable Diffusion终极教程

下面介绍下最常用的几种控制方式: Canny(硬边缘)、Depth(深度图)、OpenPose(人体姿势)

2.2.1 Canny(硬边缘)

图片

图片

输入的原图

图片

canny边缘图

图片

生成的图

通过Canny提取出图片的边缘,然后使用canny对应的模型,结合prompt控制出图

使用场景:保持人物的风格轮廓不变,通过prompt修改背景的情况

2.2.2 Depth(深度图)

图片

输入的原图

图片

深度图

图片

生成的图片

使用 Depth 原图被灰阶色值区分,程序自动的区分图像中元素区域的远近关系,使用该控制模式生成的图片,保持了同样的深度信息。

2.2.3 OpenPose(人体姿势)

图片

原图

图片

人体姿态图

图片

生成的图片

OpenPose 可生成图像中人物的骨架图,这个骨架图可用于控制生成角色的姿态动作以及手部,OpenPos一定程度上解决了SD饱受诟病的残肢手部问题

三、图生图流程浅析

通过X/Y/Z脚本,来查看下不同生成图生图在不同采样方法的生成过程

图片

可以看到,和文生图的不同是,输入不再以Gaussian noise作为初始化,而是以加噪后的图像特征为初始化。

图生图流程如下:

图片

图片来自:AIGC专栏3——Stable Diffusion结构解析-以图像生成图像

第一步:对输入的图像进行VAE编码,获得图像的Latent space特征,然后使用该Latent特征基于DDIM Sampler进行加噪,获得输入图片加噪后的特征;

第二步:对输入的文本进行编码,获得Text Embding;

第三步:对前两步获得的图片加噪后的特征以及Text Embding 进行若干次采样和去噪;

第四步:使用VAE解码

四、SDWebui图生图代码流程

和文生图的流程类似

4.1 入口方法:modules.api.api.Api.img2imgapi

#输入的图片init_images = img2imgreq.init_images#初始化插件 eg:Contronetscript_args = self.init_script_args(img2imgreq, self.default_script_arg_img2img, selectable_scripts, selectable_script_idx, script_runner)
p.init_images = [decode_base64_to_image(x) for x in init_images]p.is_api = Truep.scripts = script_runnerp.outpath_grids = opts.outdir_img2img_gridsp.outpath_samples = opts.outdir_img2img_samples
#如果插件不为空,走插件处理流程,否则直接processif selectable_scripts is not None:    p.script_args = script_args    processed = scripts.scripts_img2img.run(p, *p.script_args) # Need to pass args as list hereelse:    p.script_args = tuple(script_args) # Need to pass args as tuple here    processed = process_images(p)

4.2 process_images 加载sd基础模型和vae模型

for k, v in p.override_settings.items():    opts.set(k, v, is_api=True, run_callbacks=False)
    #加载sd大模型    if k == 'sd_model_checkpoint':        sd_models.reload_model_weights()    #加载vae模型    if k == 'sd_vae':        sd_vae.reload_vae_weights()
#继续调用process生成图片res = process_images_inner(p)

4.3 process_images_inner  

#获得编码后的promptp.prompts = p.all_prompts[n * p.batch_size:(n + 1) * p.batch_size]p.negative_prompts = p.all_negative_prompts[n * p.batch_size:(n + 1) * p.batch_size]p.seeds = p.all_seeds[n * p.batch_size:(n + 1) * p.batch_size]p.subseeds = p.all_subseeds[n * p.batch_size:(n + 1) * p.batch_size]
#采样samples_ddim = p.sample(conditioning=p.c, unconditional_conditioning=p.uc, seeds=p.seeds, subseeds=p.subseeds, subseed_strength=p.subseed_strength, prompts=p.prompts)
#解码x_samples_ddim = decode_latent_batch(p.sd_model, samples_ddim, target_device=devices.cpu, check_for_nans=True)
#保存生成的图片images.save_image(image, p.outpath_samples, "", p.seeds[i], p.prompts[i], opts.samples_format, info=infotext(i), p=p)

五、参考资料

1. High-Resolution Image Synthesis with Latent Diffusion Models https://arxiv.org/abs/2112.10752

2. Denoising Diffusion Probabilistic Models https://arxiv.org/pdf/2006.11239.pdf

3. AIGC专栏3——Stable Diffusion结构解析-以图像生成图像(图生图,img2img)为例 https://blog.csdn.net/weixin_44791964/article/details/131992399

4. 从零开始学AI绘画,万字Stable Diffusion终极教程!https://zhuanlan.zhihu.com/p/659211251

5. 精讲stable diffusion的controlNet插件 https://caovan.com/jingjiangstable-diffusiondecontrolnetchajian/.html/3

6. StableDiffusion-ControlNet工作原理[译] https://www.aiuai.cn/aifarm2097.html

7.Stable Diffusion 超详细讲解 https://jarod.blog.csdn.net/article/details/131018599

感谢你的阅读

接下来我们继续学习输出AIGC相关内容,欢迎关注公众号“音视频开发之旅”,一起学习成长。

欢迎交流

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2808878.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【前沿热点视觉算法】-RGB-D显著目标检测的边缘感知多模态变压器

计算机视觉算法分享。问题或建议,请文章私信或者文章末尾扫码加微信留言。 1 论文题目 RGB-D显著目标检测的边缘感知多模态变压器 2 论文摘要 RGB-D显著目标检测(SOD)近年来引起了广泛的关注。特别是,变压器已被使用,并…

vmware安装centos 7.9 操作系统

vmware安装centos 7.6 操作系统 1、下载centos 7.9 操作系统镜像文件2、安装centos 7.9 操作系统3、配置centos 7.6 操作系统3.1、配置静态IP地址 和 dns3.2、查看磁盘分区3.3、查看系统版本 1、下载centos 7.9 操作系统镜像文件 本文选择centos 7.9 最小化安装镜像包 这里选…

C++ //练习 8.7 修改上一节的书店程序,将结果保存到一个文件中。将输出文件名作为第二个参数传递给main函数。

C Primer(第5版) 练习 8.7 练习 8.7 修改上一节的书店程序,将结果保存到一个文件中。将输出文件名作为第二个参数传递给main函数。 环境:Linux Ubuntu(云服务器) 工具:vim 代码块 /********…

pthread_cond_timedwait()函数

绝对时间:相对于1970年1月1日0时0分0秒 相对时间:相对于当前时间,如sleep(3);相对于当前,过3s.

RK3568平台开发系列讲解(Linux系统篇)字符设备驱动:主设备和次设备

🚀返回专栏总目录 文章目录 一、主设备和次设备的概念二、设备号的分配和释放沉淀、分享、成长,让自己和他人都能有所收获!😄 字符设备通过字符(一个接一个的字符)以流方式向用户程序传递数据,就像串行端口那样。字符设备驱动通过/dev目录下的特殊文件公开设备的属性和…

STM32单片机基本原理与应用(八)

温度传感器实验 实验内容: 单片机通过代码模拟1-Wire总线并对DS18B20进行读写,并在TFTLCD屏幕上显示当前实时温度。 电路原理图: 1-Wire总线 1-Wire总线:即单总线协议,采用单根信号线,既传输时钟&#…

模型 OIIC(目标、障碍、洞察、挑战)

系列文章 分享 模型,了解更多👉 模型_总纲目录。沟通方案工具。 1 OIIC(目标、障碍、洞察、挑战)模型的应用 1.1 OIIC 驱动的汽车配件渠道优化 一家知名的汽车配件制造商,旗下品牌拥有众多产品,其销售渠道广泛,不仅在…

USB Micro引脚及相应原理图绘制

前言:博主为实现绘制USB Micro输入口原理图,首先在 GD32F103XX的数据手册中找到引脚的功能描述,找到USBDM与USBDP功能,分别为引脚PA11与引脚PA12。然后进行相应的原理图绘制。 * USBDM。USBDM 引脚是与通用串行总线 (Universal Se…

GPT Pilot - 编写 95% 代码的开发工具!

在这篇博客介绍了GPT-pilot的研发细节,原作者将探讨GPT Pilot的技术内核 —— 一款基于GPT-4编写的开发工具,可以生成生产使用代码的应用。 你有没有想过,95%的应用代码,可以由AI编写,就像《钢铁侠》里的贾维斯一样&a…

人工智能在测绘行业的应用与挑战

目录 一、背景 二、AI在测绘行业的应用方向 1. 自动化特征提取 2. 数据处理与分析 3. 无人机测绘 4. 智能导航与路径规划 5. 三维建模与可视化 6. 地理信息系统(GIS)智能化 三、发展前景 1. 技术融合 2. 精准测绘 3. 智慧城市建设 4. 可…

ElasticSearch之bool多条件查询

写在前面 在实际的业务场景中,不可能只是简单的单值查询 ,更多的是n个条件的综合查询,就像下面的搜索: 针对这种场景我们就需要依赖于bool查询了,本文就一起来看下这部分的内容。 1:bool查询介绍 bool查…

推荐Miaoo朋友圈程序全开源版源码

Miaoo朋友圈的全开源程序源码提供了一套完整的解决方案,允许用户在前台轻松发布图文、视频和音乐内容。同时,用户可以设置地理位置信息,或者选择自定义位置。此外,系统支持将发布的内容设置为广告模式,并通过站内消息或…

RK3568平台开发系列讲解(Linux系统篇)字符设备驱动:分配和注册字符设备

🚀返回专栏总目录 文章目录 一、分配和注册字符设备二、file_operations沉淀、分享、成长,让自己和他人都能有所收获!😄 一、分配和注册字符设备 字符设备在内核中表示为struct cdev的实例。在编写字符设备驱动程序时,目标是最终创建并注册与struct file_operations关联…

【海贼王的数据航海:利用数据结构成为数据海洋的霸主】顺序表

目录 1 -> 线性表 2 -> 顺序表 2.1 -> 概念及结构 2.2 -> 接口声明 2.3 -> 接口实现 2.3.1 -> 初始化 2.3.2 -> 销毁 2.3.3 -> 检查 2.3.4 -> 打印 2.3.5 -> 尾插 2.3.6 -> 头插 2.3.7 -> 尾删 2.3.8 -> 头删 2.3.9 ->…

C习题001:顺子日期【仅供参考】

题目:小明特别喜欢顺子。顺子指的是连续的三个数字:123、456等。顺子日期指的就是在日期的yyyymmdd表示法中,存在任意连续的三位数是一个顺子的日期。例如20220123就是一个顺子日期,因为它出现了一个顺子:123&#xff…

Langchain-Chatchat部署总结

项目地址: https://github.com/chatchat-space/Langchain-Chatchat 整体安装比较方便,在阿里云购买云主机,购买的国外站点机器, 该项目运行最佳坏境为 Linux Ubuntu 22.04.5Python 版本 3.11.7CUDA 版本: 12.1torch2.1.2 使…

2024年怎么购买买 FL Studio 21最便宜

随着电子音乐的日益普及,越来越多的人开始尝试制作自己的音乐。而其中一个常用的音乐制作软件就是FL Studio。那么,对于刚入坑的萌新来说,如何选择FL Studio的版本呢? 很多打算入手正版FL Studio的新手朋友都会纠结一个问题&#…

【深度学习笔记】3_12 权重衰减

注:本文为《动手学深度学习》开源内容,部分标注了个人理解,仅为个人学习记录,无抄袭搬运意图 3.12 权重衰减 上一节中我们观察了过拟合现象,即模型的训练误差远小于它在测试集上的误差。虽然增大训练数据集可能会减轻…

445. 两数相加 II(Java)

目录 题目描述:输入:输出:代码实现: 题目描述: 给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。 你可以假设除了数字 0 之外&am…

SpringBoot Admin 详解

SpringBoot Admin 详解 一、Actuator 详解1.Actuator原生端点1.1 监控检查端点:health1.2 应用信息端点:info1.3 http调用记录端点:httptrace1.4 堆栈信息端点:heapdump1.5 线程信息端点:threaddump1.6 获取全量Bean的…