用ControlNet+Inpaint实现stable diffusion模特换衣

在这里插入图片描述

用ControlNet+Inpaint实现stable diffusion模特换衣

  • ControlNet 训练与架构详解
    • ControlNet 的架构
    • 用于文本到图像扩散的 ControlNet
    • 训练过程
    • Zero卷积层的作用解释
  • inpaint
    • Inpaint Anything 的重要性
    • Inpaint Anything 的功能概述

在现代计算机视觉领域,稳定扩散(Stable Diffusion)技术已经成为图像修复的重要工具之一。然而,虽然稳定扩散能够有效地填补图像中的缺失区域,但是对于用户来说,对修复过程进行更精准的控制往往是一项挑战。

为了解决这一问题,我们引入了ControlNet,这是一种专门设计用于在大型预训练文本到图像扩散模型中引入空间调节控制的神经网络架构。通过结合ControlNet与稳定扩散技术,我们实现了一种全新的图像修复方法,使用户能够通过各种条件输入来精确控制修复过程,例如Canny边缘、霍夫线、用户涂鸦、人体关键点、分割图、形状法线和深度等。本研究不仅证明了ControlNet在小型和大型数据集上的稳健性,还展示了其在图像修复领域的巨大潜力,为更广泛的图像处理应用提供了全新的可能性。

在这里插入图片描述
ControlNet 是一种神经网络架构,可以通过空间局部化、特定于任务的图像条件增强大型预训练文本到图像扩散模型。我们首先介绍下ControlNet的基本结构,

然后后面描述如何将ControlNet应用到图像扩散模型Stable Diffusion,以及Inpaint的方法

ControlNet 训练与架构详解

ControlNet 的架构

ControlNet 将附加条件注入到神经网络的块中。具体来说,ControlNet 的设计目的是在预训练模型的基础上,添加可训练的副本,以便处理新的控制信息(如草图、边缘图等)。这种设计可以保留预训练模型的优点,同时增强模型的多样性和灵活性。

核心概念

  • 网络块:指一组神经层的组合,形成神经网络的一个单元,例如 ResNet 块、Conv-BN-ReLU 块、多头注意力块等。
  • 锁定参数:冻结预训练模型的参数,使其保持稳定,并将其复制为可训练的副本。
  • 零卷积:使用 1×1 卷积层,其权重和偏置初始化为零,确保初始训练时无有害噪声影响。

控制模块的添加

  1. 预训练块:

假设 F ( ⋅ ; Θ ) F(·;\Theta) F(⋅;Θ)是一个具有参数 Θ \Theta Θ的预训练神经块,将输入特征图 x x x转换为输出特征图 y y y

y = F ( x ; Θ ) y=F(x;\Theta) y=F(x;Θ)

  1. ControlNet 模块
    锁定原始块的参数 Θ \Theta Θ,并克隆为可训练副本 Θ c \Theta_c Θc

可训练副本接受外部条件向量 c c c作为输入

  1. 计算过程

ControlNet 的完整计算如下:
y c = F ( x ; Θ ) + Z ( F ( x + Z ( c ; Θ z 1 ) ; Z c ) ; Θ z 2 ) y_c = F(x;\Theta)+\Zeta(F(x+\Zeta(c;\Theta_{z1});\Zeta_c);\Theta_{z2}) yc=F(x;Θ)+Z(F(x+Z(c;Θz1);Zc);Θz2)

其中, Z ( ⋅ ; ⋅ ) \Zeta(·;·) Z(⋅;⋅)是零卷积层, Θ z 1 \Theta_{z1} Θz1 Θ z 2 \Theta _{z2} Θz2是其参数。

  1. 零卷积的初始状态
    初始训练步骤中,零卷积的权重和偏置均为零,因此计算结果也是零,使得:
    y c = y y_c = y yc=y

用于文本到图像扩散的 ControlNet

在这里插入图片描述

架构

  • Stable Diffusion:采用 U-Net 结构,包含编码器、中间块和解码器。
  • 编码器和解码器:每个包含 12 个块,总共有 25 个块。
  • ViT(视觉变换器):在主块中包含多个交叉注意力和自注意力机制。

ControlNet 的集成

  • 位置:ControlNet 结构应用于 U-Net 的每个编码器级别,共创建 12 个编码块和 1 个中间块的可训练副本。
  • 分辨率:12 个编码块有 4 种分辨率,分别为 64×64, 32×32, 16×16 和 8×8,每种分辨率重复 3 次。

效率

  • 计算效率:冻结的参数无需计算梯度,因此训练更高效。
  • 资源消耗:与不使用 ControlNet 优化的 Stable Diffusion 相比,使用 ControlNet 优化只增加约 23% 的 GPU 内存和 34% 的时间。

训练过程

训练步骤

  1. 数据准备

将输入图像逐渐添加噪声,生成噪声图像 z t z_t zt

条件包括时间步长 t t t、文本提示 c t c_t ct以及特定任务的条件 c f c_f cf

  1. 损失函数
    目标是预测添加到噪声图像中的噪声 ϵ \epsilon ϵ

L = E z 0 , t , c t , c f , ϵ ∼ N ( 0 , 1 ) [ ∣ ∣ ϵ − ϵ θ ( z t , t , c t , c f ) ∣ ∣ 2 2 ] L = E_{z_0,t,c_t,c_f,\epsilon \sim N(0,1)}[||\epsilon - \epsilon_\theta(z_t,t,c_t,c_f)||_2^2] L=Ez0,t,ct,cf,ϵN(0,1)[∣∣ϵϵθ(zt,t,ct,cf)22]

  1. 随机替换文本提示

训练过程中,随机将 50% 的文本提示替换为空字符串,以增强 ControlNet 直接识别输入调节图像语义的能力。

Zero卷积层的作用解释

在ControlNet架构中,zero卷积层起到了关键作用。具体来说,零卷积层的权重和偏置均初始化为零,这在模型的训练过程中起到了保护和稳定作用。以下是对每个zero卷积层作用的详细解释:

  1. 初始稳定性和保护作用

初始训练时刚开始的训练,前面迭代的时候,零卷积层确保新加入的可训练网络块不会干扰预训练模型的输出。这是通过将零卷积层的权重和偏置初始化为零实现的。在训练初期,由于这些层的计算结果为零,新的可训练副本不会对模型的输出产生任何影响,从而保护了模型的稳定性。

Z ( c ; Θ z 1 ) = 0 和  Z ( c ; Θ z 2 ) = 0 \Zeta(c;\Theta_{z1}) = 0 \space和\space\Zeta(c;\Theta_{z2}) = 0 Z(c;Θz1)=0  Z(c;Θz2)=0

因此,初始输出为:
y c = F ( x ; Θ ) y_c = F(x;\Theta) yc=F(x;Θ)

在初始阶段,输出仅依赖于原始预训练模型,而不会受到新条件的噪声干扰。

  1. 渐进学习和控制注入

随着训练的进行,zero卷积层逐渐学习到新的条件信息,并将其注入到模型中。这使得可训练副本能够逐步学习并适应新的控制信息,如草图、边缘图等。

具体来说,两个zero卷积层 Z ( c ; Θ z 1 ) \Zeta(c;\Theta_{z1}) Z(c;Θz1) Z ( F ( x + Z ( c ; Θ z 1 ) ; Θ c ) ; Θ z 2 ) \Zeta(F(x+\Zeta(c;\Theta_{z1});\Theta_c);\Theta_{z2}) Z(F(x+Z(c;Θz1);Θc);Θz2)

分别在两个不同的阶段起作用:

  • 第一阶段

Z ( c ; Θ z 1 ) \Zeta(c;\Theta_{z1}) Z(c;Θz1)

这个零卷积层接受外部条件向量 c c c,并将其转换为一个中间表示。

  • 第二阶段

Z ( F ( x + Z ( c ; Θ z 1 ) ; Θ c ) ; Θ z 2 ) \Zeta(F(x+\Zeta(c;\Theta_{z1});\Theta_c);\Theta_{z2}) Z(F(x+Z(c;Θz1);Θc);Θz2)

这个零卷积层接受经过第一阶段处理的输出,并进一步处理,最终将新条件信息注入到模型输出中。

随着训练的进行,这些卷积层的参数会被更新,从而使模型逐渐学习到如何在输出中包含新的控制信息。

  1. 消除初始训练步骤中的噪声

零卷积层的设计确保在训练的初始阶段,不会有随机噪声影响网络的隐藏状态。这样,初始模型能够完全依赖于预训练模型的稳定性,并在此基础上逐步学习新的控制信息。

整个过程是有监督的,因为模型在训练过程中使用了成对的条件输入和目标输出图像。通过监督学习,模型逐渐学会在给定特定条件下生成相应的图像。具体步骤如下:

  1. 输入-输出对:提供(条件输入 c i c_i ci ,目标输出 y t a r g e t y_ {target} ytarget)对。
  2. Forward Pass:通过ControlNet计算生成图像 y c y_c yc
  3. Loss Calculation:计算生成图像与目标输出之间的损失。
  4. backpropagation:根据损失更新模型参数。

通过这种有监督学习方法,ControlNet能够逐步学会在给定各种条件(如草图、深度图等)下,生成符合条件的图像,从而实现文本到图像生成的精确控制。

inpaint

论文标题:Inpaint Anything: Segment Anything Meets Image Inpainting
论文地址:https://arxiv.org/abs/2304.06790
github地址:https://github.com/geekyutao/Inpaint-Anything/tree/main

在这里插入图片描述
inpaint的作用:用户可以通过点击来选择图像中的任何对象。借助强大的视觉模型,例如,SAM、LaMa和稳定扩散(SD),Inpaint Anything能够平滑地移除对象(即,删除任何东西)。此外,在用户输入文本的提示下,Insaint Anything可以用任何期望的内容填充对象(即,填充任何东西)或任意替换它的背景(即,替换任何东西)。

Inpaint Anything 的重要性

当前图像修复的进展

目前,最先进的图像修复方法,如 LaMa、Repaint、MAT、ZITS等,已经取得了显著的进步。这些方法能够成功修复大面积区域,处理复杂的重复结构,并能够很好地适应高分辨率图像。然而,这些方法通常需要对每个掩码进行精细注释,这对于训练和推理至关重要。

Segment Anything Model (SAM) 的应用潜力

Segment Anything Model (SAM) 是一个强大的分割基础模型,能够根据点或框等输入提示生成高质量的对象蒙版,并且可以为图像中的所有对象生成全面且准确的蒙版。然而,SAM 的掩模分割预测功能在图像修复领域尚未得到充分利用。

现有方法的局限

现有的修复方法只能使用上下文填充被移除的区域。人工智能生成内容(AIGC)模型为创作开辟了新的机会,有可能满足大量需求,帮助用户生成他们所需的新内容。

综合解决方案的优势

通过结合 SAM、最先进的图像修复器和AIGC 模型的优势,论文提供了一个强大且用户友好的管道,来解决更常见的修复相关问题,如对象移除、新内容填充、背景替换等。这一综合方法不仅提高了图像修复的效果,还大大简化了用户操作,使得图像修复变得更加高效和便捷。

在这里插入图片描述在这里插入图片描述

Inpaint Anything 的功能概述

删除任何内容填充任何内容替换任何内容删除任何3D删除任何视频
- 点击一个对象- 点击一个对象- 点击一个对象- 单击源视图的第一个视图中的对象- 点击视频第一帧中的对象
- 分割模型SAM将对象分割出来- SAM将目标分割出来- SAM将目标分割出来- SAM将对象分割出来(使用三个可能的掩码)- SAM将对象分割出来(使用三个可能的掩码)
- 修复模型填补“窟窿”- 输入文字提示- 输入文字提示- 选择一个掩码- 选择一个掩码
- 文本提示引导的修复模型根据文本填充“洞”- 文本提示引导的修复模型根据文本替换背景- 利用OSTrack等跟踪模型对这些视图中的目标进行跟踪- 利用OSTrack等跟踪模型对视频中的目标进行跟踪
- SAM根据跟踪结果在每个源视图中分割出目标
- 利用LaMa等修补模型对每个源视图中的对象进行修补
- 利用NeRF等新的视图合成模型合成出不含物体的场景的新视图

填充内容代码如下 :fill_anything.py

import cv2
import sys
import argparse
import numpy as np
import torch
from pathlib import Path
from matplotlib import pyplot as plt
from typing import Any, Dict, Listfrom sam_segment import predict_masks_with_sam
from stable_diffusion_inpaint import fill_img_with_sd
from utils import load_img_to_array, save_array_to_img, dilate_mask, \show_mask, show_points, get_clicked_pointdef setup_args(parser):parser.add_argument("--input_img", type=str, required=True,help="Path to a single input img",)parser.add_argument("--coords_type", type=str, required=True,default="key_in", choices=["click", "key_in"], help="The way to select coords",)parser.add_argument("--point_coords", type=float, nargs='+', required=True,help="The coordinate of the point prompt, [coord_W coord_H].",)parser.add_argument("--point_labels", type=int, nargs='+', required=True,help="The labels of the point prompt, 1 or 0.",)parser.add_argument("--text_prompt", type=str, required=True,help="Text prompt",)parser.add_argument("--dilate_kernel_size", type=int, default=None,help="Dilate kernel size. Default: None",)parser.add_argument("--output_dir", type=str, required=True,help="Output path to the directory with results.",)parser.add_argument("--sam_model_type", type=str,default="vit_h", choices=['vit_h', 'vit_l', 'vit_b', 'vit_t'],help="The type of sam model to load. Default: 'vit_h")parser.add_argument("--sam_ckpt", type=str, required=True,help="The path to the SAM checkpoint to use for mask generation.",)parser.add_argument("--seed", type=int,help="Specify seed for reproducibility.",)parser.add_argument("--deterministic", action="store_true",help="Use deterministic algorithms for reproducibility.",)if __name__ == "__main__":"""Example usage:python fill_anything.py \--input_img FA_demo/FA1_dog.png \--coords_type key_in \--point_coords 750 500 \--point_labels 1 \--text_prompt "a teddy bear on a bench" \--dilate_kernel_size 15 \--output_dir ./results \--sam_model_type "vit_h" \--sam_ckpt sam_vit_h_4b8939.pth """parser = argparse.ArgumentParser()setup_args(parser)args = parser.parse_args(sys.argv[1:])device = "cuda" if torch.cuda.is_available() else "cpu"if args.coords_type == "click":latest_coords = get_clicked_point(args.input_img)elif args.coords_type == "key_in":latest_coords = args.point_coordsimg = load_img_to_array(args.input_img)masks, _, _ = predict_masks_with_sam(img,[latest_coords],args.point_labels,model_type=args.sam_model_type,ckpt_p=args.sam_ckpt,device=device,)masks = masks.astype(np.uint8) * 255# dilate mask to avoid unmasked edge effectif args.dilate_kernel_size is not None:masks = [dilate_mask(mask, args.dilate_kernel_size) for mask in masks]# visualize the segmentation resultsimg_stem = Path(args.input_img).stemout_dir = Path(args.output_dir) / img_stemout_dir.mkdir(parents=True, exist_ok=True)for idx, mask in enumerate(masks):# path to the resultsmask_p = out_dir / f"mask_{idx}.png"img_points_p = out_dir / f"with_points.png"img_mask_p = out_dir / f"with_{Path(mask_p).name}"# save the masksave_array_to_img(mask, mask_p)# save the pointed and masked imagedpi = plt.rcParams['figure.dpi']height, width = img.shape[:2]plt.figure(figsize=(width/dpi/0.77, height/dpi/0.77))plt.imshow(img)plt.axis('off')show_points(plt.gca(), [latest_coords], args.point_labels,size=(width*0.04)**2)plt.savefig(img_points_p, bbox_inches='tight', pad_inches=0)show_mask(plt.gca(), mask, random_color=False)plt.savefig(img_mask_p, bbox_inches='tight', pad_inches=0)plt.close()# fill the masked imagefor idx, mask in enumerate(masks):if args.seed is not None:torch.manual_seed(args.seed)mask_p = out_dir / f"mask_{idx}.png"img_filled_p = out_dir / f"filled_with_{Path(mask_p).name}"img_filled = fill_img_with_sd(img, mask, args.text_prompt, device=device)save_array_to_img(img_filled, img_filled_p)

上面代码以SAM 模型生成高质量的对象分割掩码,stable Diffusion 模型利用这些掩码和文本提示生成新内容,填补图像中的空洞。具体步骤如下:

  • 生成掩码:SAM 根据用户提供的点坐标和标签生成对象的分割掩码。
  • 膨胀掩码:对生成的掩码进行膨胀处理,以确保边缘过渡平滑。
  • 生成新内容:Stable Diffusion 模型根据膨胀后的掩码和用户提供的文本提示生成新内容,填补图像中的空洞。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序开发 tabbar组件常见问题

一、 tabbar不显示问题 问题 刚开始我在app.json中配置了下面的代码,但tabbar并没有显示。代码如下: "tabBar": {"custom": true,"color": "#7A7E83","selectedColor": "#3cc51f","…

【机器学习-08】 | Scikit-Learn工具包进阶指南:Scikit-Learn工具包之决策树算法实战分析

🎩 欢迎来到技术探索的奇幻世界👨‍💻 📜 个人主页:一伦明悦-CSDN博客 ✍🏻 作者简介: C软件开发、Python机器学习爱好者 🗣️ 互动与支持:💬评论 &…

微信H5跳小程序 wx-open-launch-weapp ios显示且正常跳转,安卓不显示不报错解决方案

前提:在一切都正常(无报错,没有写法错误等)的情况下,出现这个问题: 去你的h5项目,用浏览器打开,在network随便找一个静态文件,在response响应标头中找找,是否有Content-Security-Policy这个头&…

服务高峰期gc,导致服务不可用

随着应用程序的复杂性和负载的不断增加,对JVM进行调优,也是保障系统稳定性的一个重要方向。 需要注意,调优并非首选方案,一般来说解决性能问题还是要从应用程序本身入手(业务日志,慢请求等)&am…

struct.unpack_from()学习笔记

struct.unpack_from(fmt,b_data,offset) 按照指定的格式fmt,从偏移位置offset,对b_data开始解包,返回数据格式是一个元组(v1,v2…) fmt可以有: _struct.py: The remaining chars indicate types of args and must match exactly;…

基于Vue的验证码实现

一、验证码核心实现 创建slide-verify.vue&#xff0c;代码如下&#xff1a; <template><divclass"slide-verify":style"{ width: w px }"id"slideVerify"onselectstart"return false;"><!-- 图片加载遮蔽罩 -->&…

java项目之图书管理系统源码(springboot+vue+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的图书管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 系统主要分为管理员角色和用…

【Redis7】Redis持久化机制之RDB

文章目录 1.RDB简介2.RDB配置触发设置3.RDB的优缺点4.如何检查修复RDB文件5.如何禁用RDB6.RDB参数优化7.总结 1.RDB简介 Redis持久化机制中的RDB&#xff08;Redis Database&#xff09;是一种将Redis在某个时间点的数据以快照形式保存到磁盘上的方法。 原理&#xff1a;RDB通…

Node.js版本管理与npm镜像源管理

一、nvm —— node的版本管理工具 1.安装 nvm Windows 使用 nvm-windows点击跳转下载网站。 按照图示操作步骤下一步即可&#xff0c;对于下载位置推荐不要C盘任意即可 2.查看可用的 Node.js 版本&#xff1a; nvm list available #显示所有可以下载的版本3.安装特定的…

自动化证书管理|如何通过可管理的ACME为“90天SSL证书”做好准备?

SSL证书在保护组织的Web通信安全方面发挥着至关重要的作用。最近的趋势表明&#xff0c;在增强安全性诉求的推动下&#xff0c;SSL证书有效期逐渐缩短。这一变化需要组织耗费更多的时间和资源来进行证书更新工作&#xff0c;为了降低潜在风险并简化流程&#xff0c;自动化证书管…

windows、mac、linux中node版本的切换(nvm管理工具),解决项目兼容问题 node版本管理、国内npm源镜像切换

文章目录 在工作中&#xff0c;我们可能同时在进行2个或者多个不同的项目开发&#xff0c;每个项目的需求不同&#xff0c;进而不同项目必须依赖不同版本的NodeJS运行环境&#xff0c;这种情况下&#xff0c;对于维护多个版本的node将会是一件非常麻烦的事情&#xff0c;nvm就是…

python查找内容在文件中的第几行(利用了滑动窗口)

def find_multiline_content(file_path, multiline_content):with open(file_path, r) as file:# 文件内容file_lines file.readlines()# 待检测内容multiline_lines multiline_content.strip().split(\n)# 待检测内容总行数num_multiline_lines len(multiline_lines)matchi…

安装测缝计安装事项详解

在建筑和工程领域&#xff0c;测量缝隙和裂缝的准确性对于工程质量和安全性至关重要。测缝计作为一种专业的测量工具&#xff0c;能够帮助工程师和施工人员准确测量和监测建筑结构的缝隙情况&#xff0c;进而采取合适的修复和加固措施&#xff0c;保证建筑物的稳定性和安全性。…

PCIe协议之-Flow Control基础

✨前言&#xff1a; Flow Control即流量控制&#xff0c;这一概念起源于网络通信中。PCIe总线采用Flow Control的目的是&#xff0c;保证发送端的PCIe设备永远不会发送接收端的PCIe设备不能接收的TLP&#xff08;事务层包&#xff09;。也就是说&#xff0c;发送端在发送前可以…

Flat Ads获广东电视台报道!CEO林啸:助力更多企业实现业务全球化增长

近日,在广州举行的第四届全球产品与增长展会(PAGC2024)上,Flat Ads凭借其卓越的一站式全球化营销和创新的变现方案大放异彩,不仅吸引了众多业界目光,同时也在展会上斩获了备受瞩目的“金帆奖”,展现了其在全球化营销推广领域的卓越实力和专业服务。 在大会现场,Flat Ads的CEO林…

XMR交易所对接方案

交易所对接 XMR 充币 用户充币地址生成 使用 subaddress 即可 充币数据监测 monero-wallet-rpc 的API文档: https://web.getmonero.org/resources/developer-guides/wallet-rpc.html 步骤1 : 使用 monero-wallet-cli 的以下选项生成 incoming-only钱包: --generate-from-v…

# 全面解剖 消息中间件 RocketMQ-(2)

全面解剖 消息中间件 RocketMQ-&#xff08;2&#xff09; 一、RocketMQ – RocketMQ 各角色介绍 1、RocketMQ 各角色介绍 Producer : 消息的发送者; 举例:发信者。Consumer : 消息接收者; 举例:收信者。Broker : 暂存和传输消息; 举例:邮局。NameServer : 管理 Broker; 举例…

css动画之hamburgers

动效1 代码如下&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><body><div><label class"hamburger"><input type"checkbox"><…

BGP选路规则实验

实验拓扑及要求如下 注意&#xff1a; 在完成要求时&#xff0c;默认区域内IGP搭建完成&#xff0c;IBGP和EBGP的对等体关系建立完成 结果演示如下 IBGP内部搭建&#xff1a;使用OSPF IBGP与EBGP对等体建立 要求一&#xff1a;PreVal策略 PV属性默认值为0&#xff0c;规则是…

2024年ai知识库:特点、应用与搭建

随着科技的进步和企业的需要&#xff0c;ai知识库逐渐走进大众的视野并深受企业的青睐&#xff0c;掀起了搭建ai知识库的热潮。LookLook同学就来简单介绍一下关于ai知识库的特点、应用与发展趋势&#xff0c;带你了解2024年的ai知识库。 一、ai知识库的定义与特点 ai知识库是结…